makit 0.0.168 → 0.0.169

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 (179) 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/azure-pipelines.rb +187 -187
  9. data/lib/makit/cli/base.rb +17 -17
  10. data/lib/makit/cli/build_commands.rb +500 -500
  11. data/lib/makit/cli/generators/base_generator.rb +74 -74
  12. data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
  13. data/lib/makit/cli/generators/generator_factory.rb +49 -49
  14. data/lib/makit/cli/generators/node_generator.rb +50 -50
  15. data/lib/makit/cli/generators/ruby_generator.rb +77 -77
  16. data/lib/makit/cli/generators/rust_generator.rb +50 -50
  17. data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
  18. data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
  19. data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
  20. data/lib/makit/cli/generators/templates/ruby/gemspec.rb +41 -41
  21. data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
  22. data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
  23. data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
  24. data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
  25. data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
  26. data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
  27. data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
  28. data/lib/makit/cli/main.rb +78 -78
  29. data/lib/makit/cli/pipeline_commands.rb +311 -311
  30. data/lib/makit/cli/project_commands.rb +868 -868
  31. data/lib/makit/cli/repository_commands.rb +661 -661
  32. data/lib/makit/cli/strategy_commands.rb +207 -207
  33. data/lib/makit/cli/utility_commands.rb +521 -521
  34. data/lib/makit/commands/factory.rb +359 -359
  35. data/lib/makit/commands/middleware/base.rb +73 -73
  36. data/lib/makit/commands/middleware/cache.rb +248 -248
  37. data/lib/makit/commands/middleware/command_logger.rb +312 -312
  38. data/lib/makit/commands/middleware/validator.rb +269 -269
  39. data/lib/makit/commands/request.rb +316 -316
  40. data/lib/makit/commands/result.rb +323 -323
  41. data/lib/makit/commands/runner.rb +386 -386
  42. data/lib/makit/commands/strategies/base.rb +171 -171
  43. data/lib/makit/commands/strategies/child_process.rb +162 -162
  44. data/lib/makit/commands/strategies/factory.rb +136 -136
  45. data/lib/makit/commands/strategies/synchronous.rb +139 -139
  46. data/lib/makit/commands.rb +50 -50
  47. data/lib/makit/configuration/dotnet_project.rb +48 -48
  48. data/lib/makit/configuration/gitlab_helper.rb +61 -61
  49. data/lib/makit/configuration/project.rb +292 -292
  50. data/lib/makit/configuration/rakefile_helper.rb +43 -43
  51. data/lib/makit/configuration/step.rb +34 -34
  52. data/lib/makit/configuration/timeout.rb +74 -74
  53. data/lib/makit/configuration.rb +21 -21
  54. data/lib/makit/content/default_gitignore.rb +7 -7
  55. data/lib/makit/content/default_gitignore.txt +225 -225
  56. data/lib/makit/content/default_rakefile.rb +13 -13
  57. data/lib/makit/content/gem_rakefile.rb +16 -16
  58. data/lib/makit/context.rb +1 -1
  59. data/lib/makit/data.rb +49 -49
  60. data/lib/makit/directories.rb +170 -170
  61. data/lib/makit/directory.rb +262 -262
  62. data/lib/makit/docs/files.rb +89 -89
  63. data/lib/makit/docs/rake.rb +102 -102
  64. data/lib/makit/dotnet/cli.rb +224 -224
  65. data/lib/makit/dotnet/project.rb +217 -217
  66. data/lib/makit/dotnet/solution.rb +38 -38
  67. data/lib/makit/dotnet/solution_classlib.rb +239 -239
  68. data/lib/makit/dotnet/solution_console.rb +264 -264
  69. data/lib/makit/dotnet/solution_maui.rb +354 -354
  70. data/lib/makit/dotnet/solution_wasm.rb +275 -275
  71. data/lib/makit/dotnet/solution_wpf.rb +304 -304
  72. data/lib/makit/dotnet.rb +110 -110
  73. data/lib/makit/email.rb +90 -90
  74. data/lib/makit/environment.rb +142 -142
  75. data/lib/makit/examples/runner.rb +370 -370
  76. data/lib/makit/exceptions.rb +45 -45
  77. data/lib/makit/fileinfo.rb +32 -32
  78. data/lib/makit/files.rb +43 -43
  79. data/lib/makit/gems.rb +49 -49
  80. data/lib/makit/git/cli.rb +103 -103
  81. data/lib/makit/git/repository.rb +100 -100
  82. data/lib/makit/git.rb +104 -104
  83. data/lib/makit/github_actions.rb +202 -202
  84. data/lib/makit/gitlab/pipeline.rb +857 -857
  85. data/lib/makit/gitlab/pipeline_service_impl.rb +1535 -1535
  86. data/lib/makit/gitlab_runner.rb +59 -59
  87. data/lib/makit/humanize.rb +218 -218
  88. data/lib/makit/indexer.rb +47 -47
  89. data/lib/makit/io/filesystem.rb +111 -111
  90. data/lib/makit/io/filesystem_service_impl.rb +337 -337
  91. data/lib/makit/lint.rb +212 -212
  92. data/lib/makit/logging/configuration.rb +309 -309
  93. data/lib/makit/logging/format_registry.rb +84 -84
  94. data/lib/makit/logging/formatters/base.rb +39 -39
  95. data/lib/makit/logging/formatters/console_formatter.rb +140 -140
  96. data/lib/makit/logging/formatters/json_formatter.rb +65 -65
  97. data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
  98. data/lib/makit/logging/formatters/text_formatter.rb +64 -64
  99. data/lib/makit/logging/log_request.rb +119 -119
  100. data/lib/makit/logging/logger.rb +199 -199
  101. data/lib/makit/logging/sinks/base.rb +91 -91
  102. data/lib/makit/logging/sinks/console.rb +72 -72
  103. data/lib/makit/logging/sinks/file_sink.rb +92 -92
  104. data/lib/makit/logging/sinks/structured.rb +123 -123
  105. data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
  106. data/lib/makit/logging.rb +578 -578
  107. data/lib/makit/markdown.rb +75 -75
  108. data/lib/makit/mp/basic_object_mp.rb +17 -17
  109. data/lib/makit/mp/command_mp.rb +13 -13
  110. data/lib/makit/mp/command_request.mp.rb +17 -17
  111. data/lib/makit/mp/project_mp.rb +199 -199
  112. data/lib/makit/mp/string_mp.rb +205 -205
  113. data/lib/makit/nuget.rb +460 -458
  114. data/lib/makit/podman/podman.rb +458 -458
  115. data/lib/makit/podman/podman_service_impl.rb +1081 -1081
  116. data/lib/makit/port.rb +32 -32
  117. data/lib/makit/process.rb +377 -377
  118. data/lib/makit/protoc.rb +112 -112
  119. data/lib/makit/rake/cli.rb +196 -196
  120. data/lib/makit/rake/trace_controller.rb +174 -174
  121. data/lib/makit/rake.rb +81 -81
  122. data/lib/makit/ruby/cli.rb +185 -185
  123. data/lib/makit/ruby.rb +25 -25
  124. data/lib/makit/rubygems.rb +137 -137
  125. data/lib/makit/secrets/azure_key_vault.rb +322 -322
  126. data/lib/makit/secrets/azure_secrets.rb +221 -221
  127. data/lib/makit/secrets/local_secrets.rb +72 -72
  128. data/lib/makit/secrets/secrets_manager.rb +105 -105
  129. data/lib/makit/secrets.rb +96 -96
  130. data/lib/makit/serializer.rb +130 -130
  131. data/lib/makit/services/builder.rb +186 -186
  132. data/lib/makit/services/error_handler.rb +226 -226
  133. data/lib/makit/services/repository_manager.rb +367 -367
  134. data/lib/makit/services/validator.rb +112 -112
  135. data/lib/makit/setup/classlib.rb +101 -101
  136. data/lib/makit/setup/gem.rb +268 -268
  137. data/lib/makit/setup/pages.rb +11 -11
  138. data/lib/makit/setup/razorclasslib.rb +101 -101
  139. data/lib/makit/setup/runner.rb +54 -54
  140. data/lib/makit/setup.rb +5 -5
  141. data/lib/makit/show.rb +110 -110
  142. data/lib/makit/storage.rb +126 -126
  143. data/lib/makit/symbols.rb +175 -175
  144. data/lib/makit/task_info.rb +130 -130
  145. data/lib/makit/tasks/at_exit.rb +15 -15
  146. data/lib/makit/tasks/build.rb +22 -22
  147. data/lib/makit/tasks/bump.rb +7 -7
  148. data/lib/makit/tasks/clean.rb +13 -13
  149. data/lib/makit/tasks/configure.rb +10 -10
  150. data/lib/makit/tasks/format.rb +10 -10
  151. data/lib/makit/tasks/hook_manager.rb +443 -443
  152. data/lib/makit/tasks/info.rb +368 -368
  153. data/lib/makit/tasks/init.rb +49 -49
  154. data/lib/makit/tasks/integrate.rb +60 -60
  155. data/lib/makit/tasks/pull_incoming.rb +13 -13
  156. data/lib/makit/tasks/secrets.rb +7 -7
  157. data/lib/makit/tasks/setup.rb +16 -16
  158. data/lib/makit/tasks/sync.rb +14 -14
  159. data/lib/makit/tasks/tag.rb +27 -27
  160. data/lib/makit/tasks/task_monkey_patch.rb +81 -81
  161. data/lib/makit/tasks/test.rb +22 -22
  162. data/lib/makit/tasks/update.rb +21 -21
  163. data/lib/makit/tasks/version.rb +6 -6
  164. data/lib/makit/tasks.rb +24 -24
  165. data/lib/makit/test_cache.rb +239 -239
  166. data/lib/makit/tree.rb +37 -37
  167. data/lib/makit/v1/configuration/project_service_impl.rb +370 -370
  168. data/lib/makit/v1/git/git_repository_service_impl.rb +295 -295
  169. data/lib/makit/v1/makit.v1_pb.rb +35 -35
  170. data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
  171. data/lib/makit/v1/services/repository_manager_service_impl.rb +572 -572
  172. data/lib/makit/version.rb +661 -661
  173. data/lib/makit/version_util.rb +21 -21
  174. data/lib/makit/wix.rb +95 -95
  175. data/lib/makit/yaml.rb +29 -29
  176. data/lib/makit/zip.rb +17 -17
  177. data/lib/makit copy.rb +44 -44
  178. data/lib/makit.rb +121 -121
  179. metadata +2 -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