makit 0.0.163 → 0.0.165
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +41 -41
- data/exe/makit +5 -5
- data/lib/makit/apache.rb +28 -28
- data/lib/makit/auto.rb +48 -48
- data/lib/makit/azure/blob_storage.rb +257 -257
- data/lib/makit/azure/cli.rb +284 -284
- data/lib/makit/cli/base.rb +17 -17
- data/lib/makit/cli/build_commands.rb +500 -500
- data/lib/makit/cli/generators/base_generator.rb +74 -74
- data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
- data/lib/makit/cli/generators/generator_factory.rb +49 -49
- data/lib/makit/cli/generators/node_generator.rb +50 -50
- data/lib/makit/cli/generators/ruby_generator.rb +77 -77
- data/lib/makit/cli/generators/rust_generator.rb +50 -50
- data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
- data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
- data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
- data/lib/makit/cli/generators/templates/ruby/gemspec.rb +41 -41
- data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
- data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
- data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
- data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
- data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
- data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
- data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
- data/lib/makit/cli/main.rb +78 -78
- data/lib/makit/cli/pipeline_commands.rb +311 -311
- data/lib/makit/cli/project_commands.rb +868 -868
- data/lib/makit/cli/repository_commands.rb +661 -661
- data/lib/makit/cli/strategy_commands.rb +207 -207
- data/lib/makit/cli/utility_commands.rb +521 -521
- data/lib/makit/commands/factory.rb +359 -359
- data/lib/makit/commands/middleware/base.rb +73 -73
- data/lib/makit/commands/middleware/cache.rb +248 -248
- data/lib/makit/commands/middleware/command_logger.rb +312 -312
- data/lib/makit/commands/middleware/validator.rb +269 -269
- data/lib/makit/commands/request.rb +316 -316
- data/lib/makit/commands/result.rb +323 -323
- data/lib/makit/commands/runner.rb +386 -386
- data/lib/makit/commands/strategies/base.rb +171 -171
- data/lib/makit/commands/strategies/child_process.rb +162 -162
- data/lib/makit/commands/strategies/factory.rb +136 -136
- data/lib/makit/commands/strategies/synchronous.rb +139 -139
- data/lib/makit/commands.rb +50 -50
- data/lib/makit/configuration/dotnet_project.rb +48 -48
- data/lib/makit/configuration/gitlab_helper.rb +61 -61
- data/lib/makit/configuration/project.rb +292 -292
- data/lib/makit/configuration/rakefile_helper.rb +43 -43
- data/lib/makit/configuration/step.rb +34 -34
- data/lib/makit/configuration/timeout.rb +74 -74
- data/lib/makit/configuration.rb +21 -21
- data/lib/makit/content/default_gitignore.rb +7 -7
- data/lib/makit/content/default_gitignore.txt +225 -225
- data/lib/makit/content/default_rakefile.rb +13 -13
- data/lib/makit/content/gem_rakefile.rb +16 -16
- data/lib/makit/context.rb +1 -1
- data/lib/makit/data.rb +49 -49
- data/lib/makit/directories.rb +170 -170
- data/lib/makit/directory.rb +262 -262
- data/lib/makit/docs/files.rb +89 -89
- data/lib/makit/docs/rake.rb +102 -102
- data/lib/makit/dotnet/cli.rb +224 -224
- data/lib/makit/dotnet/project.rb +217 -217
- data/lib/makit/dotnet/solution.rb +38 -38
- data/lib/makit/dotnet/solution_classlib.rb +239 -239
- data/lib/makit/dotnet/solution_console.rb +264 -264
- data/lib/makit/dotnet/solution_maui.rb +354 -354
- data/lib/makit/dotnet/solution_wasm.rb +275 -275
- data/lib/makit/dotnet/solution_wpf.rb +304 -304
- data/lib/makit/dotnet.rb +110 -110
- data/lib/makit/email.rb +90 -90
- data/lib/makit/environment.rb +142 -142
- data/lib/makit/examples/runner.rb +370 -370
- data/lib/makit/exceptions.rb +45 -45
- data/lib/makit/fileinfo.rb +32 -32
- data/lib/makit/files.rb +43 -43
- data/lib/makit/gems.rb +49 -49
- data/lib/makit/git/cli.rb +103 -103
- data/lib/makit/git/repository.rb +100 -100
- data/lib/makit/git.rb +104 -104
- data/lib/makit/gitlab/pipeline.rb +857 -857
- data/lib/makit/gitlab/pipeline_service_impl.rb +1535 -1535
- data/lib/makit/gitlab_runner.rb +59 -59
- data/lib/makit/humanize.rb +218 -218
- data/lib/makit/indexer.rb +47 -47
- data/lib/makit/io/filesystem.rb +111 -111
- data/lib/makit/io/filesystem_service_impl.rb +337 -337
- data/lib/makit/lint.rb +212 -212
- data/lib/makit/logging/configuration.rb +309 -309
- data/lib/makit/logging/format_registry.rb +84 -84
- data/lib/makit/logging/formatters/base.rb +39 -39
- data/lib/makit/logging/formatters/console_formatter.rb +140 -140
- data/lib/makit/logging/formatters/json_formatter.rb +65 -65
- data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
- data/lib/makit/logging/formatters/text_formatter.rb +64 -64
- data/lib/makit/logging/log_request.rb +119 -119
- data/lib/makit/logging/logger.rb +199 -199
- data/lib/makit/logging/sinks/base.rb +91 -91
- data/lib/makit/logging/sinks/console.rb +72 -72
- data/lib/makit/logging/sinks/file_sink.rb +92 -92
- data/lib/makit/logging/sinks/structured.rb +123 -123
- data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
- data/lib/makit/logging.rb +578 -578
- data/lib/makit/markdown.rb +75 -75
- data/lib/makit/mp/basic_object_mp.rb +17 -17
- data/lib/makit/mp/command_mp.rb +13 -13
- data/lib/makit/mp/command_request.mp.rb +17 -17
- data/lib/makit/mp/project_mp.rb +199 -199
- data/lib/makit/mp/string_mp.rb +205 -205
- data/lib/makit/nuget.rb +454 -429
- data/lib/makit/podman/podman.rb +458 -458
- data/lib/makit/podman/podman_service_impl.rb +1081 -1081
- data/lib/makit/port.rb +32 -32
- data/lib/makit/process.rb +377 -377
- data/lib/makit/protoc.rb +112 -112
- data/lib/makit/rake/cli.rb +196 -196
- data/lib/makit/rake/trace_controller.rb +174 -174
- data/lib/makit/rake.rb +81 -81
- data/lib/makit/ruby/cli.rb +185 -185
- data/lib/makit/ruby.rb +25 -25
- data/lib/makit/rubygems.rb +137 -137
- data/lib/makit/secrets/azure_key_vault.rb +322 -322
- data/lib/makit/secrets/azure_secrets.rb +221 -183
- data/lib/makit/secrets/local_secrets.rb +72 -72
- data/lib/makit/secrets/secrets_manager.rb +105 -105
- data/lib/makit/secrets.rb +96 -16
- data/lib/makit/serializer.rb +130 -130
- data/lib/makit/services/builder.rb +186 -186
- data/lib/makit/services/error_handler.rb +226 -226
- data/lib/makit/services/repository_manager.rb +367 -367
- data/lib/makit/services/validator.rb +112 -112
- data/lib/makit/setup/classlib.rb +101 -101
- data/lib/makit/setup/gem.rb +268 -268
- data/lib/makit/setup/pages.rb +11 -11
- data/lib/makit/setup/razorclasslib.rb +101 -101
- data/lib/makit/setup/runner.rb +54 -54
- data/lib/makit/setup.rb +5 -5
- data/lib/makit/show.rb +110 -110
- data/lib/makit/storage.rb +126 -126
- data/lib/makit/symbols.rb +175 -175
- data/lib/makit/task_info.rb +130 -130
- data/lib/makit/tasks/at_exit.rb +15 -15
- data/lib/makit/tasks/build.rb +22 -22
- data/lib/makit/tasks/bump.rb +7 -7
- data/lib/makit/tasks/clean.rb +13 -13
- data/lib/makit/tasks/configure.rb +10 -10
- data/lib/makit/tasks/format.rb +10 -10
- data/lib/makit/tasks/hook_manager.rb +443 -443
- data/lib/makit/tasks/info.rb +368 -368
- data/lib/makit/tasks/init.rb +49 -49
- data/lib/makit/tasks/integrate.rb +60 -60
- data/lib/makit/tasks/pull_incoming.rb +13 -13
- data/lib/makit/tasks/secrets.rb +7 -7
- data/lib/makit/tasks/setup.rb +16 -16
- data/lib/makit/tasks/sync.rb +14 -14
- data/lib/makit/tasks/tag.rb +27 -27
- data/lib/makit/tasks/task_monkey_patch.rb +81 -81
- data/lib/makit/tasks/test.rb +22 -22
- data/lib/makit/tasks/update.rb +21 -21
- data/lib/makit/tasks/version.rb +6 -6
- data/lib/makit/tasks.rb +24 -24
- data/lib/makit/test_cache.rb +239 -239
- data/lib/makit/tree.rb +37 -37
- data/lib/makit/v1/configuration/project_service_impl.rb +370 -370
- data/lib/makit/v1/git/git_repository_service_impl.rb +295 -295
- data/lib/makit/v1/makit.v1_pb.rb +35 -35
- data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
- data/lib/makit/v1/services/repository_manager_service_impl.rb +572 -572
- data/lib/makit/version.rb +661 -661
- data/lib/makit/version_util.rb +21 -21
- data/lib/makit/wix.rb +95 -95
- data/lib/makit/yaml.rb +29 -29
- data/lib/makit/zip.rb +17 -17
- data/lib/makit copy.rb +44 -44
- data/lib/makit.rb +119 -119
- metadata +2 -2
data/lib/makit/dotnet/cli.rb
CHANGED
|
@@ -1,224 +1,224 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Makit
|
|
4
|
-
class DotNet
|
|
5
|
-
class CLI
|
|
6
|
-
def self.is_installed?
|
|
7
|
-
File.exist?(Makit::Environment.which("dotnet"))
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def self.new_solution(name)
|
|
11
|
-
if File.exist? "#{name}.sln"
|
|
12
|
-
# puts "Solution #{name}.sln already exists".colorize(:yellow)
|
|
13
|
-
else
|
|
14
|
-
"dotnet new sln --name #{name}".run
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def self.sln_add_projects(sln_name)
|
|
19
|
-
raise "Solution #{sln_name}.sln does not exist" unless File.exist? "#{sln_name}.sln"
|
|
20
|
-
|
|
21
|
-
sln_path = "#{sln_name}.sln"
|
|
22
|
-
sln_content = File.read(sln_path)
|
|
23
|
-
Dir.glob("**/*.csproj").each do |project_path|
|
|
24
|
-
project_name = File.basename(project_path, ".csproj")
|
|
25
|
-
if sln_content.include?("\"#{project_name}\"")
|
|
26
|
-
# puts " #{project_name}".colorize(:green) + " is in ".colorize(:grey) + "#{sln_path}".colorize(:green)
|
|
27
|
-
else
|
|
28
|
-
"dotnet sln #{sln_path} add #{project_path}".run
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Installs a .NET global tool if it's not already installed
|
|
34
|
-
#
|
|
35
|
-
# @param tool_name [String] The name of the tool to install (e.g., "docfx", "dotnet-outdated-tool")
|
|
36
|
-
# @return [Boolean] true if the tool was installed or already exists, false if installation failed
|
|
37
|
-
def self.install_global_tool(tool_name)
|
|
38
|
-
raise ArgumentError, "tool_name is required" if tool_name.nil? || tool_name.strip.empty?
|
|
39
|
-
|
|
40
|
-
tool_name = tool_name.strip
|
|
41
|
-
|
|
42
|
-
# Check if tool is already installed
|
|
43
|
-
# Parse the output to find exact tool name matches
|
|
44
|
-
list_output = `dotnet tool list --global 2>&1`
|
|
45
|
-
if $CHILD_STATUS.success?
|
|
46
|
-
# The output format is typically:
|
|
47
|
-
# Package Id Version Commands
|
|
48
|
-
# ----------------------------------------
|
|
49
|
-
# docfx 2.x.x docfx
|
|
50
|
-
# Parse lines to find exact tool name matches
|
|
51
|
-
installed = list_output.lines.any? do |line|
|
|
52
|
-
# Match tool name at the start of a line (after optional whitespace)
|
|
53
|
-
# or as a word boundary to avoid substring matches
|
|
54
|
-
line.strip.split(/\s+/).first == tool_name
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
if installed
|
|
58
|
-
Makit::Logging.default_logger.info("Global tool '#{tool_name}' is already installed")
|
|
59
|
-
return true
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Install the tool
|
|
64
|
-
Makit::Logging.default_logger.info("Installing global tool '#{tool_name}'...")
|
|
65
|
-
"dotnet tool install --global #{tool_name}".run
|
|
66
|
-
$CHILD_STATUS.success?
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Gets the currently installed version of a global tool
|
|
70
|
-
#
|
|
71
|
-
# @param tool_name [String] The name of the tool
|
|
72
|
-
# @return [String, nil] The installed version, or nil if not installed
|
|
73
|
-
def self.get_installed_tool_version(tool_name)
|
|
74
|
-
list_output = `dotnet tool list --global 2>&1`
|
|
75
|
-
return nil unless $CHILD_STATUS.success?
|
|
76
|
-
|
|
77
|
-
# Skip header lines
|
|
78
|
-
list_output.lines.each do |line|
|
|
79
|
-
line_stripped = line.strip
|
|
80
|
-
next if line_stripped.empty?
|
|
81
|
-
next if line_stripped.start_with?("Package") || line_stripped.start_with?("-")
|
|
82
|
-
|
|
83
|
-
# Split by whitespace - columns are: Package Id, Version, Commands
|
|
84
|
-
parts = line_stripped.split(/\s+/)
|
|
85
|
-
next if parts.empty?
|
|
86
|
-
|
|
87
|
-
# Match tool name at the start of the line
|
|
88
|
-
if parts.first == tool_name && parts.length >= 2
|
|
89
|
-
# Version is the second column
|
|
90
|
-
return parts[1]
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
nil
|
|
95
|
-
end
|
|
96
|
-
private_class_method :get_installed_tool_version
|
|
97
|
-
|
|
98
|
-
# Gets the latest available version of a tool from NuGet
|
|
99
|
-
#
|
|
100
|
-
# @param tool_name [String] The name of the tool
|
|
101
|
-
# @return [String, nil] The latest version, or nil if not found
|
|
102
|
-
def self.get_latest_tool_version(tool_name)
|
|
103
|
-
search_output = `dotnet tool search #{tool_name} --take 1 2>&1`
|
|
104
|
-
return nil unless $CHILD_STATUS.success?
|
|
105
|
-
|
|
106
|
-
# Parse output format:
|
|
107
|
-
# Package ID Latest Version Authors Downloads Verified
|
|
108
|
-
# -------------------------------------------------------------------------------------------------
|
|
109
|
-
# docfx 2.78.4 .NET Foundation and Contributors 4091347 x
|
|
110
|
-
search_output.lines.each do |line|
|
|
111
|
-
line_stripped = line.strip
|
|
112
|
-
next if line_stripped.empty?
|
|
113
|
-
next if line_stripped.start_with?("Package") || line_stripped.start_with?("-")
|
|
114
|
-
|
|
115
|
-
# Split by whitespace - columns are: Package ID, Latest Version, Authors, Downloads, Verified
|
|
116
|
-
parts = line_stripped.split(/\s+/)
|
|
117
|
-
next if parts.empty?
|
|
118
|
-
|
|
119
|
-
# Match tool name at the start of the line
|
|
120
|
-
if parts.first == tool_name && parts.length >= 2
|
|
121
|
-
# Latest Version is the second column
|
|
122
|
-
return parts[1]
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
nil
|
|
127
|
-
end
|
|
128
|
-
private_class_method :get_latest_tool_version
|
|
129
|
-
|
|
130
|
-
# Updates a .NET global tool to the latest version if a newer version is available
|
|
131
|
-
#
|
|
132
|
-
# If a newer version is available, the tool will be uninstalled and then reinstalled
|
|
133
|
-
# to ensure the latest version is installed.
|
|
134
|
-
#
|
|
135
|
-
# @param tool_name [String] The name of the tool to update (e.g., "docfx", "dotnet-outdated-tool")
|
|
136
|
-
# @return [Boolean] true if the tool was updated or already at latest version, false if update failed
|
|
137
|
-
def self.update_global_tool(tool_name)
|
|
138
|
-
raise ArgumentError, "tool_name is required" if tool_name.nil? || tool_name.strip.empty?
|
|
139
|
-
|
|
140
|
-
tool_name = tool_name.strip
|
|
141
|
-
|
|
142
|
-
# Get currently installed version
|
|
143
|
-
installed_version = get_installed_tool_version(tool_name)
|
|
144
|
-
|
|
145
|
-
if installed_version.nil?
|
|
146
|
-
Makit::Logging.default_logger.info("Global tool '#{tool_name}' is not installed, installing...")
|
|
147
|
-
return install_global_tool(tool_name)
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
# Get latest available version
|
|
151
|
-
latest_version = get_latest_tool_version(tool_name)
|
|
152
|
-
|
|
153
|
-
if latest_version.nil?
|
|
154
|
-
Makit::Logging.default_logger.warn("Could not determine latest version for '#{tool_name}', skipping update")
|
|
155
|
-
return false
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
# Compare versions
|
|
159
|
-
begin
|
|
160
|
-
versions_to_compare = [installed_version, latest_version]
|
|
161
|
-
highest_version = Makit::Version.get_highest_version(versions_to_compare)
|
|
162
|
-
|
|
163
|
-
if highest_version == installed_version
|
|
164
|
-
Makit::Logging.default_logger.info("Global tool '#{tool_name}' is already at latest version (#{installed_version})")
|
|
165
|
-
return true
|
|
166
|
-
end
|
|
167
|
-
rescue => e
|
|
168
|
-
Makit::Logging.default_logger.warn("Could not compare versions for '#{tool_name}': #{e.message}, attempting update anyway")
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
# Newer version available - uninstall and reinstall
|
|
172
|
-
Makit::Logging.default_logger.info("Updating global tool '#{tool_name}' from #{installed_version} to #{latest_version}...")
|
|
173
|
-
|
|
174
|
-
# Uninstall the tool
|
|
175
|
-
Makit::Logging.default_logger.info("Uninstalling global tool '#{tool_name}'...")
|
|
176
|
-
"dotnet tool uninstall --global #{tool_name}".run
|
|
177
|
-
unless $CHILD_STATUS.success?
|
|
178
|
-
Makit::Logging.default_logger.error("Failed to uninstall global tool '#{tool_name}'")
|
|
179
|
-
return false
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
# Install the latest version
|
|
183
|
-
Makit::Logging.default_logger.info("Installing global tool '#{tool_name}' version #{latest_version}...")
|
|
184
|
-
"dotnet tool install --global #{tool_name}".run
|
|
185
|
-
$CHILD_STATUS.success?
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
#
|
|
189
|
-
# generate docs/DotNet.md
|
|
190
|
-
#
|
|
191
|
-
def self.generate_docs
|
|
192
|
-
content = "# DotNet\n\n"
|
|
193
|
-
content += "## Projects\n\n"
|
|
194
|
-
# scan for .csproj files in src directory
|
|
195
|
-
src_projects = Dir.glob("src/**/*.csproj")
|
|
196
|
-
src_projects.each do |project_path|
|
|
197
|
-
File.basename(project_path, ".csproj")
|
|
198
|
-
# "dotnet tool update --global dotnet-aspnet-codegenerator".run
|
|
199
|
-
# "dotnet aspnet-codegenerator controller --name #{project_name}Controller --output ~/Projects/makit/src/makit/Controllers --controllerName #{project_name}Controller --useAsyncActions --relativeFolderPath Controllers".run
|
|
200
|
-
end
|
|
201
|
-
content += "## Packages\n\n"
|
|
202
|
-
# scan for packages.config files in src directory
|
|
203
|
-
src_packages = Dir.glob("src/**/packages.config")
|
|
204
|
-
src_packages.each do |packages_path|
|
|
205
|
-
File.basename(packages_path, ".packages.config")
|
|
206
|
-
end
|
|
207
|
-
content += "## References\n\n"
|
|
208
|
-
# scan for project.json files in src directory
|
|
209
|
-
src_references = Dir.glob("src/**/project.json")
|
|
210
|
-
src_references.each do |references_path|
|
|
211
|
-
File.basename(references_path, ".project.json")
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
# write content to docs/DotNet.md file
|
|
215
|
-
if File.exist?("docs/DotNet.md")
|
|
216
|
-
existing_content = File.read("docs/DotNet.md")
|
|
217
|
-
File.write("docs/DotNet.md", content) if existing_content != content
|
|
218
|
-
else
|
|
219
|
-
File.write("docs/DotNet.md", content)
|
|
220
|
-
end
|
|
221
|
-
end
|
|
222
|
-
end
|
|
223
|
-
end
|
|
224
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Makit
|
|
4
|
+
class DotNet
|
|
5
|
+
class CLI
|
|
6
|
+
def self.is_installed?
|
|
7
|
+
File.exist?(Makit::Environment.which("dotnet"))
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.new_solution(name)
|
|
11
|
+
if File.exist? "#{name}.sln"
|
|
12
|
+
# puts "Solution #{name}.sln already exists".colorize(:yellow)
|
|
13
|
+
else
|
|
14
|
+
"dotnet new sln --name #{name}".run
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.sln_add_projects(sln_name)
|
|
19
|
+
raise "Solution #{sln_name}.sln does not exist" unless File.exist? "#{sln_name}.sln"
|
|
20
|
+
|
|
21
|
+
sln_path = "#{sln_name}.sln"
|
|
22
|
+
sln_content = File.read(sln_path)
|
|
23
|
+
Dir.glob("**/*.csproj").each do |project_path|
|
|
24
|
+
project_name = File.basename(project_path, ".csproj")
|
|
25
|
+
if sln_content.include?("\"#{project_name}\"")
|
|
26
|
+
# puts " #{project_name}".colorize(:green) + " is in ".colorize(:grey) + "#{sln_path}".colorize(:green)
|
|
27
|
+
else
|
|
28
|
+
"dotnet sln #{sln_path} add #{project_path}".run
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Installs a .NET global tool if it's not already installed
|
|
34
|
+
#
|
|
35
|
+
# @param tool_name [String] The name of the tool to install (e.g., "docfx", "dotnet-outdated-tool")
|
|
36
|
+
# @return [Boolean] true if the tool was installed or already exists, false if installation failed
|
|
37
|
+
def self.install_global_tool(tool_name)
|
|
38
|
+
raise ArgumentError, "tool_name is required" if tool_name.nil? || tool_name.strip.empty?
|
|
39
|
+
|
|
40
|
+
tool_name = tool_name.strip
|
|
41
|
+
|
|
42
|
+
# Check if tool is already installed
|
|
43
|
+
# Parse the output to find exact tool name matches
|
|
44
|
+
list_output = `dotnet tool list --global 2>&1`
|
|
45
|
+
if $CHILD_STATUS.success?
|
|
46
|
+
# The output format is typically:
|
|
47
|
+
# Package Id Version Commands
|
|
48
|
+
# ----------------------------------------
|
|
49
|
+
# docfx 2.x.x docfx
|
|
50
|
+
# Parse lines to find exact tool name matches
|
|
51
|
+
installed = list_output.lines.any? do |line|
|
|
52
|
+
# Match tool name at the start of a line (after optional whitespace)
|
|
53
|
+
# or as a word boundary to avoid substring matches
|
|
54
|
+
line.strip.split(/\s+/).first == tool_name
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
if installed
|
|
58
|
+
Makit::Logging.default_logger.info("Global tool '#{tool_name}' is already installed")
|
|
59
|
+
return true
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Install the tool
|
|
64
|
+
Makit::Logging.default_logger.info("Installing global tool '#{tool_name}'...")
|
|
65
|
+
"dotnet tool install --global #{tool_name}".run
|
|
66
|
+
$CHILD_STATUS.success?
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Gets the currently installed version of a global tool
|
|
70
|
+
#
|
|
71
|
+
# @param tool_name [String] The name of the tool
|
|
72
|
+
# @return [String, nil] The installed version, or nil if not installed
|
|
73
|
+
def self.get_installed_tool_version(tool_name)
|
|
74
|
+
list_output = `dotnet tool list --global 2>&1`
|
|
75
|
+
return nil unless $CHILD_STATUS.success?
|
|
76
|
+
|
|
77
|
+
# Skip header lines
|
|
78
|
+
list_output.lines.each do |line|
|
|
79
|
+
line_stripped = line.strip
|
|
80
|
+
next if line_stripped.empty?
|
|
81
|
+
next if line_stripped.start_with?("Package") || line_stripped.start_with?("-")
|
|
82
|
+
|
|
83
|
+
# Split by whitespace - columns are: Package Id, Version, Commands
|
|
84
|
+
parts = line_stripped.split(/\s+/)
|
|
85
|
+
next if parts.empty?
|
|
86
|
+
|
|
87
|
+
# Match tool name at the start of the line
|
|
88
|
+
if parts.first == tool_name && parts.length >= 2
|
|
89
|
+
# Version is the second column
|
|
90
|
+
return parts[1]
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
nil
|
|
95
|
+
end
|
|
96
|
+
private_class_method :get_installed_tool_version
|
|
97
|
+
|
|
98
|
+
# Gets the latest available version of a tool from NuGet
|
|
99
|
+
#
|
|
100
|
+
# @param tool_name [String] The name of the tool
|
|
101
|
+
# @return [String, nil] The latest version, or nil if not found
|
|
102
|
+
def self.get_latest_tool_version(tool_name)
|
|
103
|
+
search_output = `dotnet tool search #{tool_name} --take 1 2>&1`
|
|
104
|
+
return nil unless $CHILD_STATUS.success?
|
|
105
|
+
|
|
106
|
+
# Parse output format:
|
|
107
|
+
# Package ID Latest Version Authors Downloads Verified
|
|
108
|
+
# -------------------------------------------------------------------------------------------------
|
|
109
|
+
# docfx 2.78.4 .NET Foundation and Contributors 4091347 x
|
|
110
|
+
search_output.lines.each do |line|
|
|
111
|
+
line_stripped = line.strip
|
|
112
|
+
next if line_stripped.empty?
|
|
113
|
+
next if line_stripped.start_with?("Package") || line_stripped.start_with?("-")
|
|
114
|
+
|
|
115
|
+
# Split by whitespace - columns are: Package ID, Latest Version, Authors, Downloads, Verified
|
|
116
|
+
parts = line_stripped.split(/\s+/)
|
|
117
|
+
next if parts.empty?
|
|
118
|
+
|
|
119
|
+
# Match tool name at the start of the line
|
|
120
|
+
if parts.first == tool_name && parts.length >= 2
|
|
121
|
+
# Latest Version is the second column
|
|
122
|
+
return parts[1]
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
nil
|
|
127
|
+
end
|
|
128
|
+
private_class_method :get_latest_tool_version
|
|
129
|
+
|
|
130
|
+
# Updates a .NET global tool to the latest version if a newer version is available
|
|
131
|
+
#
|
|
132
|
+
# If a newer version is available, the tool will be uninstalled and then reinstalled
|
|
133
|
+
# to ensure the latest version is installed.
|
|
134
|
+
#
|
|
135
|
+
# @param tool_name [String] The name of the tool to update (e.g., "docfx", "dotnet-outdated-tool")
|
|
136
|
+
# @return [Boolean] true if the tool was updated or already at latest version, false if update failed
|
|
137
|
+
def self.update_global_tool(tool_name)
|
|
138
|
+
raise ArgumentError, "tool_name is required" if tool_name.nil? || tool_name.strip.empty?
|
|
139
|
+
|
|
140
|
+
tool_name = tool_name.strip
|
|
141
|
+
|
|
142
|
+
# Get currently installed version
|
|
143
|
+
installed_version = get_installed_tool_version(tool_name)
|
|
144
|
+
|
|
145
|
+
if installed_version.nil?
|
|
146
|
+
Makit::Logging.default_logger.info("Global tool '#{tool_name}' is not installed, installing...")
|
|
147
|
+
return install_global_tool(tool_name)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Get latest available version
|
|
151
|
+
latest_version = get_latest_tool_version(tool_name)
|
|
152
|
+
|
|
153
|
+
if latest_version.nil?
|
|
154
|
+
Makit::Logging.default_logger.warn("Could not determine latest version for '#{tool_name}', skipping update")
|
|
155
|
+
return false
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Compare versions
|
|
159
|
+
begin
|
|
160
|
+
versions_to_compare = [installed_version, latest_version]
|
|
161
|
+
highest_version = Makit::Version.get_highest_version(versions_to_compare)
|
|
162
|
+
|
|
163
|
+
if highest_version == installed_version
|
|
164
|
+
Makit::Logging.default_logger.info("Global tool '#{tool_name}' is already at latest version (#{installed_version})")
|
|
165
|
+
return true
|
|
166
|
+
end
|
|
167
|
+
rescue => e
|
|
168
|
+
Makit::Logging.default_logger.warn("Could not compare versions for '#{tool_name}': #{e.message}, attempting update anyway")
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Newer version available - uninstall and reinstall
|
|
172
|
+
Makit::Logging.default_logger.info("Updating global tool '#{tool_name}' from #{installed_version} to #{latest_version}...")
|
|
173
|
+
|
|
174
|
+
# Uninstall the tool
|
|
175
|
+
Makit::Logging.default_logger.info("Uninstalling global tool '#{tool_name}'...")
|
|
176
|
+
"dotnet tool uninstall --global #{tool_name}".run
|
|
177
|
+
unless $CHILD_STATUS.success?
|
|
178
|
+
Makit::Logging.default_logger.error("Failed to uninstall global tool '#{tool_name}'")
|
|
179
|
+
return false
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# Install the latest version
|
|
183
|
+
Makit::Logging.default_logger.info("Installing global tool '#{tool_name}' version #{latest_version}...")
|
|
184
|
+
"dotnet tool install --global #{tool_name}".run
|
|
185
|
+
$CHILD_STATUS.success?
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
#
|
|
189
|
+
# generate docs/DotNet.md
|
|
190
|
+
#
|
|
191
|
+
def self.generate_docs
|
|
192
|
+
content = "# DotNet\n\n"
|
|
193
|
+
content += "## Projects\n\n"
|
|
194
|
+
# scan for .csproj files in src directory
|
|
195
|
+
src_projects = Dir.glob("src/**/*.csproj")
|
|
196
|
+
src_projects.each do |project_path|
|
|
197
|
+
File.basename(project_path, ".csproj")
|
|
198
|
+
# "dotnet tool update --global dotnet-aspnet-codegenerator".run
|
|
199
|
+
# "dotnet aspnet-codegenerator controller --name #{project_name}Controller --output ~/Projects/makit/src/makit/Controllers --controllerName #{project_name}Controller --useAsyncActions --relativeFolderPath Controllers".run
|
|
200
|
+
end
|
|
201
|
+
content += "## Packages\n\n"
|
|
202
|
+
# scan for packages.config files in src directory
|
|
203
|
+
src_packages = Dir.glob("src/**/packages.config")
|
|
204
|
+
src_packages.each do |packages_path|
|
|
205
|
+
File.basename(packages_path, ".packages.config")
|
|
206
|
+
end
|
|
207
|
+
content += "## References\n\n"
|
|
208
|
+
# scan for project.json files in src directory
|
|
209
|
+
src_references = Dir.glob("src/**/project.json")
|
|
210
|
+
src_references.each do |references_path|
|
|
211
|
+
File.basename(references_path, ".project.json")
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# write content to docs/DotNet.md file
|
|
215
|
+
if File.exist?("docs/DotNet.md")
|
|
216
|
+
existing_content = File.read("docs/DotNet.md")
|
|
217
|
+
File.write("docs/DotNet.md", content) if existing_content != content
|
|
218
|
+
else
|
|
219
|
+
File.write("docs/DotNet.md", content)
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
end
|