makit 0.0.157 → 0.0.158

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.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -41
  3. data/exe/makit +5 -5
  4. data/lib/makit/apache.rb +28 -28
  5. data/lib/makit/auto.rb +48 -48
  6. data/lib/makit/azure/blob_storage.rb +257 -257
  7. data/lib/makit/azure/cli.rb +284 -284
  8. data/lib/makit/cli/base.rb +17 -17
  9. data/lib/makit/cli/build_commands.rb +500 -500
  10. data/lib/makit/cli/generators/base_generator.rb +74 -74
  11. data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
  12. data/lib/makit/cli/generators/generator_factory.rb +49 -49
  13. data/lib/makit/cli/generators/node_generator.rb +50 -50
  14. data/lib/makit/cli/generators/ruby_generator.rb +77 -77
  15. data/lib/makit/cli/generators/rust_generator.rb +50 -50
  16. data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
  17. data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
  18. data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
  19. data/lib/makit/cli/generators/templates/ruby/gemspec.rb +41 -41
  20. data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
  21. data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
  22. data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
  23. data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
  24. data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
  25. data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
  26. data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
  27. data/lib/makit/cli/main.rb +78 -78
  28. data/lib/makit/cli/pipeline_commands.rb +311 -311
  29. data/lib/makit/cli/project_commands.rb +868 -868
  30. data/lib/makit/cli/repository_commands.rb +661 -661
  31. data/lib/makit/cli/strategy_commands.rb +207 -207
  32. data/lib/makit/cli/utility_commands.rb +521 -521
  33. data/lib/makit/commands/factory.rb +359 -359
  34. data/lib/makit/commands/middleware/base.rb +73 -73
  35. data/lib/makit/commands/middleware/cache.rb +248 -248
  36. data/lib/makit/commands/middleware/command_logger.rb +312 -312
  37. data/lib/makit/commands/middleware/validator.rb +269 -269
  38. data/lib/makit/commands/request.rb +316 -316
  39. data/lib/makit/commands/result.rb +323 -323
  40. data/lib/makit/commands/runner.rb +386 -386
  41. data/lib/makit/commands/strategies/base.rb +171 -171
  42. data/lib/makit/commands/strategies/child_process.rb +162 -162
  43. data/lib/makit/commands/strategies/factory.rb +136 -136
  44. data/lib/makit/commands/strategies/synchronous.rb +139 -139
  45. data/lib/makit/commands.rb +50 -50
  46. data/lib/makit/configuration/dotnet_project.rb +48 -48
  47. data/lib/makit/configuration/gitlab_helper.rb +61 -61
  48. data/lib/makit/configuration/project.rb +292 -292
  49. data/lib/makit/configuration/rakefile_helper.rb +43 -43
  50. data/lib/makit/configuration/step.rb +34 -34
  51. data/lib/makit/configuration/timeout.rb +74 -74
  52. data/lib/makit/configuration.rb +21 -21
  53. data/lib/makit/content/default_gitignore.rb +7 -7
  54. data/lib/makit/content/default_gitignore.txt +225 -225
  55. data/lib/makit/content/default_rakefile.rb +13 -13
  56. data/lib/makit/content/gem_rakefile.rb +16 -16
  57. data/lib/makit/context.rb +1 -1
  58. data/lib/makit/data.rb +49 -49
  59. data/lib/makit/directories.rb +170 -170
  60. data/lib/makit/directory.rb +262 -262
  61. data/lib/makit/docs/files.rb +89 -89
  62. data/lib/makit/docs/rake.rb +102 -102
  63. data/lib/makit/dotnet/cli.rb +69 -69
  64. data/lib/makit/dotnet/project.rb +217 -217
  65. data/lib/makit/dotnet/solution.rb +38 -38
  66. data/lib/makit/dotnet/solution_classlib.rb +239 -239
  67. data/lib/makit/dotnet/solution_console.rb +264 -264
  68. data/lib/makit/dotnet/solution_maui.rb +354 -354
  69. data/lib/makit/dotnet/solution_wasm.rb +275 -275
  70. data/lib/makit/dotnet/solution_wpf.rb +304 -304
  71. data/lib/makit/dotnet.rb +102 -102
  72. data/lib/makit/email.rb +90 -90
  73. data/lib/makit/environment.rb +142 -142
  74. data/lib/makit/examples/runner.rb +370 -370
  75. data/lib/makit/exceptions.rb +45 -45
  76. data/lib/makit/fileinfo.rb +32 -32
  77. data/lib/makit/files.rb +43 -43
  78. data/lib/makit/gems.rb +40 -40
  79. data/lib/makit/git/cli.rb +78 -54
  80. data/lib/makit/git/repository.rb +100 -100
  81. data/lib/makit/git.rb +104 -104
  82. data/lib/makit/gitlab/pipeline.rb +857 -857
  83. data/lib/makit/gitlab/pipeline_service_impl.rb +1535 -1535
  84. data/lib/makit/gitlab_runner.rb +59 -59
  85. data/lib/makit/humanize.rb +218 -218
  86. data/lib/makit/indexer.rb +47 -47
  87. data/lib/makit/io/filesystem.rb +111 -111
  88. data/lib/makit/io/filesystem_service_impl.rb +337 -337
  89. data/lib/makit/lint.rb +212 -212
  90. data/lib/makit/logging/configuration.rb +309 -309
  91. data/lib/makit/logging/format_registry.rb +84 -84
  92. data/lib/makit/logging/formatters/base.rb +39 -39
  93. data/lib/makit/logging/formatters/console_formatter.rb +140 -140
  94. data/lib/makit/logging/formatters/json_formatter.rb +65 -65
  95. data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
  96. data/lib/makit/logging/formatters/text_formatter.rb +64 -64
  97. data/lib/makit/logging/log_request.rb +119 -119
  98. data/lib/makit/logging/logger.rb +199 -199
  99. data/lib/makit/logging/sinks/base.rb +91 -91
  100. data/lib/makit/logging/sinks/console.rb +72 -72
  101. data/lib/makit/logging/sinks/file_sink.rb +92 -92
  102. data/lib/makit/logging/sinks/structured.rb +123 -123
  103. data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
  104. data/lib/makit/logging.rb +578 -578
  105. data/lib/makit/markdown.rb +75 -75
  106. data/lib/makit/mp/basic_object_mp.rb +17 -17
  107. data/lib/makit/mp/command_mp.rb +13 -13
  108. data/lib/makit/mp/command_request.mp.rb +17 -17
  109. data/lib/makit/mp/project_mp.rb +199 -199
  110. data/lib/makit/mp/string_mp.rb +205 -205
  111. data/lib/makit/nuget.rb +74 -74
  112. data/lib/makit/podman/podman.rb +458 -458
  113. data/lib/makit/podman/podman_service_impl.rb +1081 -1081
  114. data/lib/makit/port.rb +32 -32
  115. data/lib/makit/process.rb +377 -377
  116. data/lib/makit/protoc.rb +112 -112
  117. data/lib/makit/rake/cli.rb +196 -196
  118. data/lib/makit/rake/trace_controller.rb +174 -174
  119. data/lib/makit/rake.rb +81 -81
  120. data/lib/makit/ruby/cli.rb +185 -185
  121. data/lib/makit/ruby.rb +25 -25
  122. data/lib/makit/rubygems.rb +137 -0
  123. data/lib/makit/secrets/azure_key_vault.rb +322 -322
  124. data/lib/makit/secrets/azure_secrets.rb +183 -183
  125. data/lib/makit/secrets/local_secrets.rb +72 -72
  126. data/lib/makit/secrets/secrets_manager.rb +105 -105
  127. data/lib/makit/secrets.rb +16 -16
  128. data/lib/makit/serializer.rb +130 -130
  129. data/lib/makit/services/builder.rb +186 -186
  130. data/lib/makit/services/error_handler.rb +226 -226
  131. data/lib/makit/services/repository_manager.rb +367 -367
  132. data/lib/makit/services/validator.rb +112 -112
  133. data/lib/makit/setup/classlib.rb +101 -101
  134. data/lib/makit/setup/gem.rb +268 -268
  135. data/lib/makit/setup/pages.rb +11 -11
  136. data/lib/makit/setup/razorclasslib.rb +101 -101
  137. data/lib/makit/setup/runner.rb +54 -54
  138. data/lib/makit/setup.rb +5 -5
  139. data/lib/makit/show.rb +110 -110
  140. data/lib/makit/storage.rb +126 -126
  141. data/lib/makit/symbols.rb +175 -175
  142. data/lib/makit/task_info.rb +130 -130
  143. data/lib/makit/tasks/at_exit.rb +15 -15
  144. data/lib/makit/tasks/build.rb +22 -22
  145. data/lib/makit/tasks/bump.rb +7 -7
  146. data/lib/makit/tasks/clean.rb +13 -13
  147. data/lib/makit/tasks/configure.rb +10 -10
  148. data/lib/makit/tasks/format.rb +10 -10
  149. data/lib/makit/tasks/hook_manager.rb +443 -443
  150. data/lib/makit/tasks/info.rb +368 -368
  151. data/lib/makit/tasks/init.rb +49 -49
  152. data/lib/makit/tasks/integrate.rb +60 -56
  153. data/lib/makit/tasks/pull_incoming.rb +13 -13
  154. data/lib/makit/tasks/secrets.rb +7 -7
  155. data/lib/makit/tasks/setup.rb +16 -16
  156. data/lib/makit/tasks/sync.rb +14 -17
  157. data/lib/makit/tasks/tag.rb +27 -27
  158. data/lib/makit/tasks/task_monkey_patch.rb +81 -81
  159. data/lib/makit/tasks/test.rb +22 -22
  160. data/lib/makit/tasks/update.rb +18 -18
  161. data/lib/makit/tasks/version.rb +6 -6
  162. data/lib/makit/tasks.rb +24 -24
  163. data/lib/makit/test_cache.rb +239 -239
  164. data/lib/makit/tree.rb +37 -37
  165. data/lib/makit/v1/configuration/project_service_impl.rb +370 -370
  166. data/lib/makit/v1/git/git_repository_service_impl.rb +295 -295
  167. data/lib/makit/v1/makit.v1_pb.rb +35 -35
  168. data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
  169. data/lib/makit/v1/services/repository_manager_service_impl.rb +572 -572
  170. data/lib/makit/version.rb +661 -503
  171. data/lib/makit/version_util.rb +21 -21
  172. data/lib/makit/wix.rb +95 -95
  173. data/lib/makit/yaml.rb +29 -29
  174. data/lib/makit/zip.rb +17 -17
  175. data/lib/makit copy.rb +44 -44
  176. data/lib/makit.rb +115 -114
  177. metadata +3 -2
@@ -1,368 +1,368 @@
1
- # frozen_string_literal: true
2
-
3
- require "pathname"
4
- require "open3"
5
-
6
- desc "Display information about the current project"
7
- task :info do
8
- # Start timing for debug logging
9
- start_time = Time.now
10
- is_debug = Makit::Logging.current_log_level == :debug
11
-
12
- if is_debug
13
- Makit::Logging.debug("rake info task started")
14
- end
15
-
16
- # Get verbosity level
17
- verbosity = Makit::Logging.current_verbosity
18
-
19
- # Get GIT_REMOTE_URL - try multiple sources (optimized: check constant first, avoid slow operations)
20
- git_remote_url_start = Time.now if is_debug
21
- git_remote_url = if defined?(GIT_REMOTE_URL) && !GIT_REMOTE_URL.nil? && !GIT_REMOTE_URL.empty?
22
- GIT_REMOTE_URL
23
- elsif Dir.exist?(".git") || File.exist?(".git")
24
- # Fast check: directly check for .git directory/file instead of calling Makit::Git.git_repo?
25
- # which executes multiple git commands. Then directly get remote URL.
26
- begin
27
- # Direct git command execution - much faster than going through repository state
28
- remote_url_output, _stderr, status = Open3.capture3('git', 'remote', 'get-url', 'origin')
29
- if status.success? && remote_url_output && !remote_url_output.strip.empty?
30
- remote_url_output.strip
31
- else
32
- nil
33
- end
34
- rescue
35
- nil
36
- end
37
- elsif File.exist?(".makit.json")
38
- # Only load project config if .makit.json exists (avoid creating it unnecessarily)
39
- begin
40
- project = Makit::Configuration::Project.default
41
- project.git_remote_url unless project.git_remote_url.nil? || project.git_remote_url.empty?
42
- rescue
43
- nil
44
- end
45
- else
46
- nil
47
- end
48
- if is_debug
49
- elapsed = Time.now - git_remote_url_start
50
- Makit::Logging.debug("GIT_REMOTE_URL lookup took #{sprintf('%.3f', elapsed)} seconds")
51
- end
52
-
53
- # Get VERSION and VERSION_FILE - using same logic as rake version
54
- # This ensures consistency between rake info and rake version
55
- # Optimized: Use Makit::Directories::PROJECT_ROOT directly, check specific files before glob
56
- version_start = Time.now if is_debug
57
- version_file = nil
58
- version = nil
59
-
60
- begin
61
- # Use Makit::Directories::PROJECT_ROOT directly (already loaded, fast)
62
- project_root = Makit::Directories::PROJECT_ROOT
63
-
64
- if project_root && Dir.exist?(project_root)
65
- # Check for manually defined VERSION_FILE constant first
66
- if defined?(VERSION_FILE) && !VERSION_FILE.nil?
67
- version_file = File.expand_path(VERSION_FILE, project_root)
68
- version_file = nil unless File.exist?(version_file)
69
- end
70
-
71
- # If no VERSION_FILE constant, search for common version files
72
- # Optimized: Check specific files first (fast File.exist?) before using glob (slower)
73
- unless version_file
74
- # Check specific files first (much faster than glob patterns)
75
- specific_files = [
76
- "Directory.Build.props",
77
- "Cargo.toml",
78
- "package.json",
79
- "pyproject.toml",
80
- "pom.xml"
81
- ]
82
-
83
- specific_files.each do |filename|
84
- file_path = File.join(project_root, filename)
85
- if File.exist?(file_path)
86
- version_file = file_path
87
- break
88
- end
89
- end
90
-
91
- # Only use glob for gemspec if no specific file found (glob can be slow on large dirs)
92
- unless version_file
93
- gemspec_matches = Dir.glob(File.join(project_root, "*.gemspec"))
94
- version_file = gemspec_matches.first unless gemspec_matches.empty?
95
- end
96
- end
97
-
98
- # Extract version from the file if found (same logic as Makit::Version.extract_version_from_ssot_file)
99
- if version_file && File.exist?(version_file)
100
- case File.basename(version_file)
101
- when /\.gemspec$/
102
- content = File.read(version_file)
103
- match = content.match(/spec\.version\s*=\s*["']([^"']+)["']/)
104
- version = match[1] if match
105
- when "Directory.Build.props"
106
- content = File.read(version_file)
107
- match = content.match(%r{<Version>([^<]+)</Version>})
108
- version = match[1] if match
109
- when "Cargo.toml"
110
- content = File.read(version_file)
111
- match = content.match(/version\s*=\s*["']([^"']+)["']/)
112
- version = match[1] if match
113
- when "package.json"
114
- require "json"
115
- json = JSON.parse(File.read(version_file))
116
- version = json["version"]
117
- when "pyproject.toml"
118
- content = File.read(version_file)
119
- match = content.match(/\[project\]\s*version\s*=\s*["']([^"']+)["']/)
120
- version = match[1] if match
121
- unless version
122
- match = content.match(/\[tool\.poetry\]\s*version\s*=\s*["']([^"']+)["']/)
123
- version = match[1] if match
124
- end
125
- when "pom.xml"
126
- content = File.read(version_file)
127
- match = content.match(%r{<version>([^<]+)</version>})
128
- version = match[1] if match
129
- end
130
-
131
- # Convert to relative path for display (same as Makit::Version.info)
132
- if version_file && project_root
133
- # Normalize paths to use forward slashes for consistency (Windows-safe)
134
- normalized_version_file = version_file.gsub(/\\/, "/")
135
- normalized_project_root = project_root.gsub(/\\/, "/")
136
- version_file = normalized_version_file.sub(normalized_project_root + "/", "")
137
- end
138
- end
139
- end
140
- rescue => e
141
- # Silently handle errors - fall back to VERSION constant
142
- end
143
-
144
- # Fallback to Rakefile VERSION constant or Makit::Version.version if no version file found
145
- unless version
146
- version = defined?(VERSION) ? VERSION : Makit::Version.version
147
- end
148
- if is_debug
149
- elapsed = Time.now - version_start
150
- Makit::Logging.debug("VERSION and VERSION_FILE lookup took #{sprintf('%.3f', elapsed)} seconds")
151
- end
152
-
153
- # Get BRANCH - from git if available (optimized, Windows-safe)
154
- # Reuse git repo check from GIT_REMOTE_URL lookup to avoid duplicate check
155
- branch_start = Time.now if is_debug
156
- branch = if git_remote_url || Dir.exist?(".git") || File.exist?(".git")
157
- # Fast check: directly execute git branch command instead of calling Makit::Git.branch
158
- # which executes the expensive get_repository_state with multiple git commands
159
- begin
160
- branch_output, _stderr, status = Open3.capture3('git', 'branch', '--show-current')
161
- current_branch = if status.success? && branch_output && !branch_output.strip.empty?
162
- branch_output.strip
163
- else
164
- '(unknown)'
165
- end
166
-
167
- # Check if current branch is the default branch (Windows-safe error handling)
168
- if current_branch != '(unknown)'
169
- begin
170
- # Get default branch from remote (Windows-safe: use Open3 for proper error handling)
171
- default_branch_output, _stderr, status = Open3.capture3('git', 'symbolic-ref', 'refs/remotes/origin/HEAD')
172
- if status.success? && default_branch_output && !default_branch_output.strip.empty?
173
- default_branch = default_branch_output.strip.sub('refs/remotes/origin/', '')
174
- if current_branch == default_branch
175
- current_branch = "#{current_branch} (default)"
176
- end
177
- end
178
- rescue
179
- # Silently fail if we can't determine default branch
180
- end
181
- end
182
-
183
- current_branch
184
- rescue
185
- '(unknown)'
186
- end
187
- else
188
- '(not a git repo)'
189
- end
190
- if is_debug
191
- elapsed = Time.now - branch_start
192
- Makit::Logging.debug("BRANCH lookup took #{sprintf('%.3f', elapsed)} seconds")
193
- end
194
-
195
- # Display information with colors
196
- display_start = Time.now if is_debug
197
- name_color = :grey
198
- value_color = :green
199
- label_width = 20 # Fixed width for label column
200
-
201
- git_remote_display = git_remote_url || '(not set)'
202
-
203
- # Always show basic info
204
- label1 = 'GIT_REMOTE_URL'.rjust(label_width).colorize(name_color)
205
- value1 = git_remote_display.colorize(value_color)
206
- puts " #{label1} #{value1}"
207
-
208
- label2 = 'VERSION'.rjust(label_width).colorize(name_color)
209
- value2 = version.to_s.colorize(value_color)
210
- puts " #{label2} #{value2}"
211
-
212
- if version_file
213
- label_version_file = 'VERSION_FILE'.rjust(label_width).colorize(name_color)
214
- value_version_file = version_file.colorize(value_color)
215
- puts " #{label_version_file} #{value_version_file}"
216
- end
217
-
218
- label3 = 'BRANCH'.rjust(label_width).colorize(name_color)
219
- value3 = branch.colorize(value_color)
220
- puts " #{label3} #{value3}"
221
-
222
- # Show LOG_LEVEL and VERBOSITY for normal and above
223
- if [:normal, :verbose, :debug].include?(verbosity)
224
- log_level = Makit::Logging.current_log_level.to_s
225
- verbosity_str = verbosity.to_s
226
-
227
- label4 = 'LOG_LEVEL'.rjust(label_width).colorize(name_color)
228
- value4 = log_level.colorize(value_color)
229
- puts " #{label4} #{value4}"
230
-
231
- label5 = 'VERBOSITY'.rjust(label_width).colorize(name_color)
232
- value5 = verbosity_str.colorize(value_color)
233
- puts " #{label5} #{value5}"
234
- end
235
-
236
- # Show additional sections for verbose and debug
237
- if [:verbose, :debug].include?(verbosity)
238
- # Project section
239
- begin
240
- project = Makit::Configuration::Project.default
241
- project_root = Makit::Directories::PROJECT_ROOT
242
- project_root_display = if project_root && Dir.exist?(project_root)
243
- # Show relative path if possible
244
- begin
245
- Pathname.new(project_root).relative_path_from(Pathname.new(Dir.pwd)).to_s
246
- rescue
247
- project_root
248
- end
249
- else
250
- '(not found)'
251
- end
252
-
253
- puts ""
254
- puts "Project:".colorize(:cyan)
255
- display_field('NAME', project.name || '(not set)', label_width, name_color, value_color)
256
- display_field('TYPE', project.project_type || '(not set)', label_width, name_color, value_color)
257
- display_field('ROOT', project_root_display, label_width, name_color, value_color)
258
- display_field('AUTHORS', project.authors || '(not set)', label_width, name_color, value_color)
259
- display_field('LICENSE', project.license_expression || '(not set)', label_width, name_color, value_color)
260
- rescue => e
261
- # Silently handle errors loading project info
262
- end
263
-
264
- # Git section (optimized: reuse branch from main section, avoid expensive git operations)
265
- if branch && branch != '(not a git repo)'
266
- begin
267
- # Reuse branch from main section (already optimized)
268
- verbose_branch = branch
269
-
270
- # Get git status and commit info (optimized: direct git commands instead of get_repository_state)
271
- begin
272
- # Check if clean using direct git command (faster than Makit::Git.clean?)
273
- status_output, _stderr, status = Open3.capture3('git', 'status', '--porcelain')
274
- status = status.success? && status_output.strip.empty? ? 'clean' : 'dirty'
275
- rescue
276
- status = 'unknown'
277
- end
278
-
279
- begin
280
- # Get commit SHA using direct git command (faster than Makit::Git.commitsha)
281
- commit_output, _stderr, commit_status = Open3.capture3('git', 'rev-parse', 'HEAD')
282
- commit = commit_status.success? && commit_output ? commit_output.strip : nil
283
- commit_display = commit ? commit[0, 7] : '(unknown)'
284
- rescue
285
- commit_display = '(unknown)'
286
- end
287
-
288
- puts ""
289
- puts "Git:".colorize(:cyan)
290
- display_field('BRANCH', verbose_branch, label_width, name_color, value_color)
291
- display_field('STATUS', status, label_width, name_color, value_color)
292
- display_field('COMMIT', commit_display, label_width, name_color, value_color)
293
- rescue => e
294
- # Silently handle errors loading git info
295
- end
296
- end
297
-
298
- # Environment section
299
- begin
300
- ruby_version = RUBY_VERSION
301
- os = Makit::Environment.get_os || '(unknown)'
302
- makit_version = Makit::Version.version rescue '0.0.0'
303
-
304
- puts ""
305
- puts "Environment:".colorize(:cyan)
306
- display_field('RUBY_VERSION', ruby_version, label_width, name_color, value_color)
307
- display_field('OS', os, label_width, name_color, value_color)
308
- display_field('MAKIT_VERSION', makit_version, label_width, name_color, value_color)
309
- rescue => e
310
- # Silently handle errors loading environment info
311
- end
312
- end
313
-
314
- # Show debug-only sections
315
- if verbosity == :debug
316
- # Secrets section
317
- begin
318
- secrets_manager = Makit::Secrets.new
319
- backend_type = secrets_manager.instance_variable_get(:@secrets_backend).class.name.split("::").last
320
- secrets_file = secrets_manager.get_secrets_filename rescue nil
321
- secrets_hash = secrets_manager.get_secrets_hash rescue {}
322
- secret_count = secrets_hash.keys.count rescue 0
323
-
324
- puts ""
325
- puts "Secrets:".colorize(:cyan)
326
- display_field('BACKEND', backend_type, label_width, name_color, value_color)
327
- if secrets_file
328
- display_field('SECRETS_FILE', secrets_file, label_width, name_color, value_color)
329
- end
330
- display_field('SECRET_COUNT', secret_count.to_s, label_width, name_color, value_color)
331
- rescue => e
332
- # Silently handle errors loading secrets info
333
- end
334
-
335
- # Paths section
336
- begin
337
- log_dir = Makit::Directories::LOG
338
- artifacts_dir = Makit::Directories::PROJECT_ARTIFACTS || '(not set)'
339
- project_root = Makit::Directories::PROJECT_ROOT || '(not found)'
340
-
341
- puts ""
342
- puts "Paths:".colorize(:cyan)
343
- display_field('LOG_DIR', log_dir, label_width, name_color, value_color)
344
- display_field('ARTIFACTS', artifacts_dir, label_width, name_color, value_color)
345
- display_field('PROJECT_ROOT', project_root, label_width, name_color, value_color)
346
- rescue => e
347
- # Silently handle errors loading paths info
348
- end
349
- end
350
-
351
- if is_debug
352
- display_elapsed = Time.now - display_start
353
- Makit::Logging.debug("Display operations took #{sprintf('%.3f', display_elapsed)} seconds")
354
- end
355
-
356
- # Log total execution time in debug mode
357
- if is_debug
358
- elapsed_time = Time.now - start_time
359
- Makit::Logging.debug("rake info task completed in #{sprintf('%.3f', elapsed_time)} seconds")
360
- end
361
- end
362
-
363
- # Helper method to display a field with consistent formatting
364
- def display_field(label, value, label_width, name_color, value_color)
365
- label_str = label.rjust(label_width).colorize(name_color)
366
- value_str = value.to_s.colorize(value_color)
367
- puts " #{label_str} #{value_str}"
368
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require "open3"
5
+
6
+ desc "Display information about the current project"
7
+ task :info do
8
+ # Start timing for debug logging
9
+ start_time = Time.now
10
+ is_debug = Makit::Logging.current_log_level == :debug
11
+
12
+ if is_debug
13
+ Makit::Logging.debug("rake info task started")
14
+ end
15
+
16
+ # Get verbosity level
17
+ verbosity = Makit::Logging.current_verbosity
18
+
19
+ # Get GIT_REMOTE_URL - try multiple sources (optimized: check constant first, avoid slow operations)
20
+ git_remote_url_start = Time.now if is_debug
21
+ git_remote_url = if defined?(GIT_REMOTE_URL) && !GIT_REMOTE_URL.nil? && !GIT_REMOTE_URL.empty?
22
+ GIT_REMOTE_URL
23
+ elsif Dir.exist?(".git") || File.exist?(".git")
24
+ # Fast check: directly check for .git directory/file instead of calling Makit::Git.git_repo?
25
+ # which executes multiple git commands. Then directly get remote URL.
26
+ begin
27
+ # Direct git command execution - much faster than going through repository state
28
+ remote_url_output, _stderr, status = Open3.capture3('git', 'remote', 'get-url', 'origin')
29
+ if status.success? && remote_url_output && !remote_url_output.strip.empty?
30
+ remote_url_output.strip
31
+ else
32
+ nil
33
+ end
34
+ rescue
35
+ nil
36
+ end
37
+ elsif File.exist?(".makit.json")
38
+ # Only load project config if .makit.json exists (avoid creating it unnecessarily)
39
+ begin
40
+ project = Makit::Configuration::Project.default
41
+ project.git_remote_url unless project.git_remote_url.nil? || project.git_remote_url.empty?
42
+ rescue
43
+ nil
44
+ end
45
+ else
46
+ nil
47
+ end
48
+ if is_debug
49
+ elapsed = Time.now - git_remote_url_start
50
+ Makit::Logging.debug("GIT_REMOTE_URL lookup took #{sprintf('%.3f', elapsed)} seconds")
51
+ end
52
+
53
+ # Get VERSION and VERSION_FILE - using same logic as rake version
54
+ # This ensures consistency between rake info and rake version
55
+ # Optimized: Use Makit::Directories::PROJECT_ROOT directly, check specific files before glob
56
+ version_start = Time.now if is_debug
57
+ version_file = nil
58
+ version = nil
59
+
60
+ begin
61
+ # Use Makit::Directories::PROJECT_ROOT directly (already loaded, fast)
62
+ project_root = Makit::Directories::PROJECT_ROOT
63
+
64
+ if project_root && Dir.exist?(project_root)
65
+ # Check for manually defined VERSION_FILE constant first
66
+ if defined?(VERSION_FILE) && !VERSION_FILE.nil?
67
+ version_file = File.expand_path(VERSION_FILE, project_root)
68
+ version_file = nil unless File.exist?(version_file)
69
+ end
70
+
71
+ # If no VERSION_FILE constant, search for common version files
72
+ # Optimized: Check specific files first (fast File.exist?) before using glob (slower)
73
+ unless version_file
74
+ # Check specific files first (much faster than glob patterns)
75
+ specific_files = [
76
+ "Directory.Build.props",
77
+ "Cargo.toml",
78
+ "package.json",
79
+ "pyproject.toml",
80
+ "pom.xml"
81
+ ]
82
+
83
+ specific_files.each do |filename|
84
+ file_path = File.join(project_root, filename)
85
+ if File.exist?(file_path)
86
+ version_file = file_path
87
+ break
88
+ end
89
+ end
90
+
91
+ # Only use glob for gemspec if no specific file found (glob can be slow on large dirs)
92
+ unless version_file
93
+ gemspec_matches = Dir.glob(File.join(project_root, "*.gemspec"))
94
+ version_file = gemspec_matches.first unless gemspec_matches.empty?
95
+ end
96
+ end
97
+
98
+ # Extract version from the file if found (same logic as Makit::Version.extract_version_from_ssot_file)
99
+ if version_file && File.exist?(version_file)
100
+ case File.basename(version_file)
101
+ when /\.gemspec$/
102
+ content = File.read(version_file)
103
+ match = content.match(/spec\.version\s*=\s*["']([^"']+)["']/)
104
+ version = match[1] if match
105
+ when "Directory.Build.props"
106
+ content = File.read(version_file)
107
+ match = content.match(%r{<Version>([^<]+)</Version>})
108
+ version = match[1] if match
109
+ when "Cargo.toml"
110
+ content = File.read(version_file)
111
+ match = content.match(/version\s*=\s*["']([^"']+)["']/)
112
+ version = match[1] if match
113
+ when "package.json"
114
+ require "json"
115
+ json = JSON.parse(File.read(version_file))
116
+ version = json["version"]
117
+ when "pyproject.toml"
118
+ content = File.read(version_file)
119
+ match = content.match(/\[project\]\s*version\s*=\s*["']([^"']+)["']/)
120
+ version = match[1] if match
121
+ unless version
122
+ match = content.match(/\[tool\.poetry\]\s*version\s*=\s*["']([^"']+)["']/)
123
+ version = match[1] if match
124
+ end
125
+ when "pom.xml"
126
+ content = File.read(version_file)
127
+ match = content.match(%r{<version>([^<]+)</version>})
128
+ version = match[1] if match
129
+ end
130
+
131
+ # Convert to relative path for display (same as Makit::Version.info)
132
+ if version_file && project_root
133
+ # Normalize paths to use forward slashes for consistency (Windows-safe)
134
+ normalized_version_file = version_file.gsub(/\\/, "/")
135
+ normalized_project_root = project_root.gsub(/\\/, "/")
136
+ version_file = normalized_version_file.sub(normalized_project_root + "/", "")
137
+ end
138
+ end
139
+ end
140
+ rescue => e
141
+ # Silently handle errors - fall back to VERSION constant
142
+ end
143
+
144
+ # Fallback to Rakefile VERSION constant or Makit::Version.version if no version file found
145
+ unless version
146
+ version = defined?(VERSION) ? VERSION : Makit::Version.version
147
+ end
148
+ if is_debug
149
+ elapsed = Time.now - version_start
150
+ Makit::Logging.debug("VERSION and VERSION_FILE lookup took #{sprintf('%.3f', elapsed)} seconds")
151
+ end
152
+
153
+ # Get BRANCH - from git if available (optimized, Windows-safe)
154
+ # Reuse git repo check from GIT_REMOTE_URL lookup to avoid duplicate check
155
+ branch_start = Time.now if is_debug
156
+ branch = if git_remote_url || Dir.exist?(".git") || File.exist?(".git")
157
+ # Fast check: directly execute git branch command instead of calling Makit::Git.branch
158
+ # which executes the expensive get_repository_state with multiple git commands
159
+ begin
160
+ branch_output, _stderr, status = Open3.capture3('git', 'branch', '--show-current')
161
+ current_branch = if status.success? && branch_output && !branch_output.strip.empty?
162
+ branch_output.strip
163
+ else
164
+ '(unknown)'
165
+ end
166
+
167
+ # Check if current branch is the default branch (Windows-safe error handling)
168
+ if current_branch != '(unknown)'
169
+ begin
170
+ # Get default branch from remote (Windows-safe: use Open3 for proper error handling)
171
+ default_branch_output, _stderr, status = Open3.capture3('git', 'symbolic-ref', 'refs/remotes/origin/HEAD')
172
+ if status.success? && default_branch_output && !default_branch_output.strip.empty?
173
+ default_branch = default_branch_output.strip.sub('refs/remotes/origin/', '')
174
+ if current_branch == default_branch
175
+ current_branch = "#{current_branch} (default)"
176
+ end
177
+ end
178
+ rescue
179
+ # Silently fail if we can't determine default branch
180
+ end
181
+ end
182
+
183
+ current_branch
184
+ rescue
185
+ '(unknown)'
186
+ end
187
+ else
188
+ '(not a git repo)'
189
+ end
190
+ if is_debug
191
+ elapsed = Time.now - branch_start
192
+ Makit::Logging.debug("BRANCH lookup took #{sprintf('%.3f', elapsed)} seconds")
193
+ end
194
+
195
+ # Display information with colors
196
+ display_start = Time.now if is_debug
197
+ name_color = :grey
198
+ value_color = :green
199
+ label_width = 20 # Fixed width for label column
200
+
201
+ git_remote_display = git_remote_url || '(not set)'
202
+
203
+ # Always show basic info
204
+ label1 = 'GIT_REMOTE_URL'.rjust(label_width).colorize(name_color)
205
+ value1 = git_remote_display.colorize(value_color)
206
+ puts " #{label1} #{value1}"
207
+
208
+ label2 = 'VERSION'.rjust(label_width).colorize(name_color)
209
+ value2 = version.to_s.colorize(value_color)
210
+ puts " #{label2} #{value2}"
211
+
212
+ if version_file
213
+ label_version_file = 'VERSION_FILE'.rjust(label_width).colorize(name_color)
214
+ value_version_file = version_file.colorize(value_color)
215
+ puts " #{label_version_file} #{value_version_file}"
216
+ end
217
+
218
+ label3 = 'BRANCH'.rjust(label_width).colorize(name_color)
219
+ value3 = branch.colorize(value_color)
220
+ puts " #{label3} #{value3}"
221
+
222
+ # Show LOG_LEVEL and VERBOSITY for normal and above
223
+ if [:normal, :verbose, :debug].include?(verbosity)
224
+ log_level = Makit::Logging.current_log_level.to_s
225
+ verbosity_str = verbosity.to_s
226
+
227
+ label4 = 'LOG_LEVEL'.rjust(label_width).colorize(name_color)
228
+ value4 = log_level.colorize(value_color)
229
+ puts " #{label4} #{value4}"
230
+
231
+ label5 = 'VERBOSITY'.rjust(label_width).colorize(name_color)
232
+ value5 = verbosity_str.colorize(value_color)
233
+ puts " #{label5} #{value5}"
234
+ end
235
+
236
+ # Show additional sections for verbose and debug
237
+ if [:verbose, :debug].include?(verbosity)
238
+ # Project section
239
+ begin
240
+ project = Makit::Configuration::Project.default
241
+ project_root = Makit::Directories::PROJECT_ROOT
242
+ project_root_display = if project_root && Dir.exist?(project_root)
243
+ # Show relative path if possible
244
+ begin
245
+ Pathname.new(project_root).relative_path_from(Pathname.new(Dir.pwd)).to_s
246
+ rescue
247
+ project_root
248
+ end
249
+ else
250
+ '(not found)'
251
+ end
252
+
253
+ puts ""
254
+ puts "Project:".colorize(:cyan)
255
+ display_field('NAME', project.name || '(not set)', label_width, name_color, value_color)
256
+ display_field('TYPE', project.project_type || '(not set)', label_width, name_color, value_color)
257
+ display_field('ROOT', project_root_display, label_width, name_color, value_color)
258
+ display_field('AUTHORS', project.authors || '(not set)', label_width, name_color, value_color)
259
+ display_field('LICENSE', project.license_expression || '(not set)', label_width, name_color, value_color)
260
+ rescue => e
261
+ # Silently handle errors loading project info
262
+ end
263
+
264
+ # Git section (optimized: reuse branch from main section, avoid expensive git operations)
265
+ if branch && branch != '(not a git repo)'
266
+ begin
267
+ # Reuse branch from main section (already optimized)
268
+ verbose_branch = branch
269
+
270
+ # Get git status and commit info (optimized: direct git commands instead of get_repository_state)
271
+ begin
272
+ # Check if clean using direct git command (faster than Makit::Git.clean?)
273
+ status_output, _stderr, status = Open3.capture3('git', 'status', '--porcelain')
274
+ status = status.success? && status_output.strip.empty? ? 'clean' : 'dirty'
275
+ rescue
276
+ status = 'unknown'
277
+ end
278
+
279
+ begin
280
+ # Get commit SHA using direct git command (faster than Makit::Git.commitsha)
281
+ commit_output, _stderr, commit_status = Open3.capture3('git', 'rev-parse', 'HEAD')
282
+ commit = commit_status.success? && commit_output ? commit_output.strip : nil
283
+ commit_display = commit ? commit[0, 7] : '(unknown)'
284
+ rescue
285
+ commit_display = '(unknown)'
286
+ end
287
+
288
+ puts ""
289
+ puts "Git:".colorize(:cyan)
290
+ display_field('BRANCH', verbose_branch, label_width, name_color, value_color)
291
+ display_field('STATUS', status, label_width, name_color, value_color)
292
+ display_field('COMMIT', commit_display, label_width, name_color, value_color)
293
+ rescue => e
294
+ # Silently handle errors loading git info
295
+ end
296
+ end
297
+
298
+ # Environment section
299
+ begin
300
+ ruby_version = RUBY_VERSION
301
+ os = Makit::Environment.get_os || '(unknown)'
302
+ makit_version = Makit::Version.version rescue '0.0.0'
303
+
304
+ puts ""
305
+ puts "Environment:".colorize(:cyan)
306
+ display_field('RUBY_VERSION', ruby_version, label_width, name_color, value_color)
307
+ display_field('OS', os, label_width, name_color, value_color)
308
+ display_field('MAKIT_VERSION', makit_version, label_width, name_color, value_color)
309
+ rescue => e
310
+ # Silently handle errors loading environment info
311
+ end
312
+ end
313
+
314
+ # Show debug-only sections
315
+ if verbosity == :debug
316
+ # Secrets section
317
+ begin
318
+ secrets_manager = Makit::Secrets.new
319
+ backend_type = secrets_manager.instance_variable_get(:@secrets_backend).class.name.split("::").last
320
+ secrets_file = secrets_manager.get_secrets_filename rescue nil
321
+ secrets_hash = secrets_manager.get_secrets_hash rescue {}
322
+ secret_count = secrets_hash.keys.count rescue 0
323
+
324
+ puts ""
325
+ puts "Secrets:".colorize(:cyan)
326
+ display_field('BACKEND', backend_type, label_width, name_color, value_color)
327
+ if secrets_file
328
+ display_field('SECRETS_FILE', secrets_file, label_width, name_color, value_color)
329
+ end
330
+ display_field('SECRET_COUNT', secret_count.to_s, label_width, name_color, value_color)
331
+ rescue => e
332
+ # Silently handle errors loading secrets info
333
+ end
334
+
335
+ # Paths section
336
+ begin
337
+ log_dir = Makit::Directories::LOG
338
+ artifacts_dir = Makit::Directories::PROJECT_ARTIFACTS || '(not set)'
339
+ project_root = Makit::Directories::PROJECT_ROOT || '(not found)'
340
+
341
+ puts ""
342
+ puts "Paths:".colorize(:cyan)
343
+ display_field('LOG_DIR', log_dir, label_width, name_color, value_color)
344
+ display_field('ARTIFACTS', artifacts_dir, label_width, name_color, value_color)
345
+ display_field('PROJECT_ROOT', project_root, label_width, name_color, value_color)
346
+ rescue => e
347
+ # Silently handle errors loading paths info
348
+ end
349
+ end
350
+
351
+ if is_debug
352
+ display_elapsed = Time.now - display_start
353
+ Makit::Logging.debug("Display operations took #{sprintf('%.3f', display_elapsed)} seconds")
354
+ end
355
+
356
+ # Log total execution time in debug mode
357
+ if is_debug
358
+ elapsed_time = Time.now - start_time
359
+ Makit::Logging.debug("rake info task completed in #{sprintf('%.3f', elapsed_time)} seconds")
360
+ end
361
+ end
362
+
363
+ # Helper method to display a field with consistent formatting
364
+ def display_field(label, value, label_width, name_color, value_color)
365
+ label_str = label.rjust(label_width).colorize(name_color)
366
+ value_str = value.to_s.colorize(value_color)
367
+ puts " #{label_str} #{value_str}"
368
+ end