makit 0.0.164 → 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.
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 +224 -224
  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 +110 -110
  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 +49 -49
  79. data/lib/makit/git/cli.rb +103 -103
  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 +454 -454
  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 -137
  123. data/lib/makit/secrets/azure_key_vault.rb +322 -322
  124. data/lib/makit/secrets/azure_secrets.rb +221 -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 +96 -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 -60
  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 -14
  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 +21 -21
  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 -661
  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 +119 -119
  177. metadata +2 -2
@@ -1,45 +1,45 @@
1
- # frozen_string_literal: true
2
-
3
- module Makit
4
- # Base exception class for all Makit errors
5
- class Error < StandardError; end
6
-
7
- # Raised when a directory operation fails
8
- class DirectoryError < Error; end
9
-
10
- # Raised when a git operation fails
11
- class GitError < Error; end
12
-
13
- # Raised when a clone operation fails
14
- class CloneError < GitError; end
15
-
16
- # Raised when a pull operation fails
17
- class PullError < GitError; end
18
-
19
- # Raised when a commit is invalid
20
- class InvalidCommitError < GitError; end
21
-
22
- # Raised when a build operation fails
23
- class BuildError < Error; end
24
-
25
- # Raised when a configuration is invalid
26
- class ConfigurationError < Error; end
27
-
28
- # Raised when a file operation fails
29
- class FileError < Error; end
30
-
31
- # Raised when a network operation fails
32
- class NetworkError < Error; end
33
-
34
- # Raised when a timeout occurs
35
- class TimeoutError < Error; end
36
-
37
- # Raised when a dependency is missing
38
- class DependencyError < Error; end
39
-
40
- # Raised when a command execution fails
41
- class CommandError < Error; end
42
-
43
- # Raised when a validation fails
44
- class ValidationError < Error; end
45
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Makit
4
+ # Base exception class for all Makit errors
5
+ class Error < StandardError; end
6
+
7
+ # Raised when a directory operation fails
8
+ class DirectoryError < Error; end
9
+
10
+ # Raised when a git operation fails
11
+ class GitError < Error; end
12
+
13
+ # Raised when a clone operation fails
14
+ class CloneError < GitError; end
15
+
16
+ # Raised when a pull operation fails
17
+ class PullError < GitError; end
18
+
19
+ # Raised when a commit is invalid
20
+ class InvalidCommitError < GitError; end
21
+
22
+ # Raised when a build operation fails
23
+ class BuildError < Error; end
24
+
25
+ # Raised when a configuration is invalid
26
+ class ConfigurationError < Error; end
27
+
28
+ # Raised when a file operation fails
29
+ class FileError < Error; end
30
+
31
+ # Raised when a network operation fails
32
+ class NetworkError < Error; end
33
+
34
+ # Raised when a timeout occurs
35
+ class TimeoutError < Error; end
36
+
37
+ # Raised when a dependency is missing
38
+ class DependencyError < Error; end
39
+
40
+ # Raised when a command execution fails
41
+ class CommandError < Error; end
42
+
43
+ # Raised when a validation fails
44
+ class ValidationError < Error; end
45
+ end
@@ -1,32 +1,32 @@
1
- # frozen_string_literal: true
2
-
3
- # This module provides classes for the Makit gem.
4
- module Makit
5
- # This class provide methods for working with the system Environment.
6
- #
7
- class FileInfo
8
- attr_accessor :name, :mtime, :size
9
-
10
- def initialize(name:, mtime:, size:)
11
- @name = name
12
- @mtime = mtime
13
- @size = size
14
- end
15
-
16
- def to_h
17
- {
18
- name: @name,
19
- mtime: @mtime,
20
- size: @size
21
- }
22
- end
23
-
24
- def self.get_file_infos(filenames)
25
- filenames.map do |filename|
26
- FileInfo.new(name: filename, mtime: File.mtime(filename), size: File.size(filename))
27
- rescue StandardError
28
- next
29
- end
30
- end
31
- end
32
- end
1
+ # frozen_string_literal: true
2
+
3
+ # This module provides classes for the Makit gem.
4
+ module Makit
5
+ # This class provide methods for working with the system Environment.
6
+ #
7
+ class FileInfo
8
+ attr_accessor :name, :mtime, :size
9
+
10
+ def initialize(name:, mtime:, size:)
11
+ @name = name
12
+ @mtime = mtime
13
+ @size = size
14
+ end
15
+
16
+ def to_h
17
+ {
18
+ name: @name,
19
+ mtime: @mtime,
20
+ size: @size
21
+ }
22
+ end
23
+
24
+ def self.get_file_infos(filenames)
25
+ filenames.map do |filename|
26
+ FileInfo.new(name: filename, mtime: File.mtime(filename), size: File.size(filename))
27
+ rescue StandardError
28
+ next
29
+ end
30
+ end
31
+ end
32
+ end
data/lib/makit/files.rb CHANGED
@@ -1,43 +1,43 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "directory"
4
- require_relative "environment"
5
- require_relative "protoc"
6
- require_relative "nuget"
7
- require_relative "version"
8
- require "rake"
9
-
10
- # This module provides classes for the Makit gem.
11
- module Makit
12
- # This class provide methods for working with the system Environment.
13
- #
14
- module Files
15
- if Makit::Directories::PROJECT_ROOT.nil?
16
- CSPROJ = [].freeze
17
- else
18
- Dir.chdir(Makit::Directories::PROJECT_ROOT) do
19
- CSPROJ = Dir.glob("**/*.csproj")
20
- end
21
- end
22
-
23
- # show all the files constants in a nicely formatted table format with the name of the constant and the value
24
- def self.show
25
- # Array of constant names (symbols)
26
- constant_names = [:CSPROJ]
27
-
28
- # Find the length of the longest constant name and add 1
29
- max_length = constant_names.map(&:to_s).max_by(&:length).length + 1
30
-
31
- # Iterate through each constant name
32
- constant_names.each do |constant_name|
33
- constant_value = const_get(constant_name) # Fetch the value of the constant
34
- constant_value = constant_value.colorize(:green) if !constant_value.nil? && File.exist?(constant_value)
35
- # Print the constant name right justified to the max_length
36
- puts "#{constant_name.to_s.rjust(max_length)} = #{constant_value}"
37
- rescue NameError
38
- # Handle the case where the constant is not defined
39
- puts "#{constant_name.to_s.rjust(max_length)} = [Constant not defined]"
40
- end
41
- end
42
- end
43
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "directory"
4
+ require_relative "environment"
5
+ require_relative "protoc"
6
+ require_relative "nuget"
7
+ require_relative "version"
8
+ require "rake"
9
+
10
+ # This module provides classes for the Makit gem.
11
+ module Makit
12
+ # This class provide methods for working with the system Environment.
13
+ #
14
+ module Files
15
+ if Makit::Directories::PROJECT_ROOT.nil?
16
+ CSPROJ = [].freeze
17
+ else
18
+ Dir.chdir(Makit::Directories::PROJECT_ROOT) do
19
+ CSPROJ = Dir.glob("**/*.csproj")
20
+ end
21
+ end
22
+
23
+ # show all the files constants in a nicely formatted table format with the name of the constant and the value
24
+ def self.show
25
+ # Array of constant names (symbols)
26
+ constant_names = [:CSPROJ]
27
+
28
+ # Find the length of the longest constant name and add 1
29
+ max_length = constant_names.map(&:to_s).max_by(&:length).length + 1
30
+
31
+ # Iterate through each constant name
32
+ constant_names.each do |constant_name|
33
+ constant_value = const_get(constant_name) # Fetch the value of the constant
34
+ constant_value = constant_value.colorize(:green) if !constant_value.nil? && File.exist?(constant_value)
35
+ # Print the constant name right justified to the max_length
36
+ puts "#{constant_name.to_s.rjust(max_length)} = #{constant_value}"
37
+ rescue NameError
38
+ # Handle the case where the constant is not defined
39
+ puts "#{constant_name.to_s.rjust(max_length)} = [Constant not defined]"
40
+ end
41
+ end
42
+ end
43
+ end
data/lib/makit/gems.rb CHANGED
@@ -1,49 +1,49 @@
1
- # frozen_string_literal: true
2
-
3
- # This module provides classes for the Makit gem.
4
- require "English"
5
-
6
- module Makit
7
- # This class provide methods for working with the system Environment.
8
- #
9
- module Gems
10
- def self.install_latest_gem(gem_name)
11
- if is_gem_installed(gem_name)
12
- latest_version = get_latest_gem_version(gem_name)
13
- installed_version = get_installed_gem_version(gem_name)
14
- if installed_version == latest_version
15
- puts " #{gem_name} gem is up to date".colorize(:green)
16
- else
17
- "gem install #{gem_name}".run
18
- puts " #{gem_name} gem updated to #{latest_version}".colorize(:green)
19
- end
20
- else
21
- "gem install #{gem_name}".run
22
- puts " #{gem_name} gem installed".colorize(:green)
23
- end
24
- end
25
-
26
- def self.is_gem_installed(gem_name)
27
- `gem list #{gem_name}`
28
- $CHILD_STATUS.success?
29
- end
30
-
31
- def self.get_installed_gem_version(gem_name)
32
- versions = `gem list #{gem_name}`.split("(")[1].split(")")[0].split(",")
33
- versions.first.strip
34
- end
35
-
36
- def self.get_latest_gem_version(gem_name)
37
- output = `gem search #{gem_name} --remote --exact 2>&1`
38
- return nil unless $CHILD_STATUS.success?
39
-
40
- # Parse output like: "makit (0.0.160)"
41
- match = output.match(/\(([^)]+)\)/)
42
- return match[1] if match
43
-
44
- nil
45
- rescue StandardError
46
- nil
47
- end
48
- end
49
- end
1
+ # frozen_string_literal: true
2
+
3
+ # This module provides classes for the Makit gem.
4
+ require "English"
5
+
6
+ module Makit
7
+ # This class provide methods for working with the system Environment.
8
+ #
9
+ module Gems
10
+ def self.install_latest_gem(gem_name)
11
+ if is_gem_installed(gem_name)
12
+ latest_version = get_latest_gem_version(gem_name)
13
+ installed_version = get_installed_gem_version(gem_name)
14
+ if installed_version == latest_version
15
+ puts " #{gem_name} gem is up to date".colorize(:green)
16
+ else
17
+ "gem install #{gem_name}".run
18
+ puts " #{gem_name} gem updated to #{latest_version}".colorize(:green)
19
+ end
20
+ else
21
+ "gem install #{gem_name}".run
22
+ puts " #{gem_name} gem installed".colorize(:green)
23
+ end
24
+ end
25
+
26
+ def self.is_gem_installed(gem_name)
27
+ `gem list #{gem_name}`
28
+ $CHILD_STATUS.success?
29
+ end
30
+
31
+ def self.get_installed_gem_version(gem_name)
32
+ versions = `gem list #{gem_name}`.split("(")[1].split(")")[0].split(",")
33
+ versions.first.strip
34
+ end
35
+
36
+ def self.get_latest_gem_version(gem_name)
37
+ output = `gem search #{gem_name} --remote --exact 2>&1`
38
+ return nil unless $CHILD_STATUS.success?
39
+
40
+ # Parse output like: "makit (0.0.160)"
41
+ match = output.match(/\(([^)]+)\)/)
42
+ return match[1] if match
43
+
44
+ nil
45
+ rescue StandardError
46
+ nil
47
+ end
48
+ end
49
+ end
data/lib/makit/git/cli.rb CHANGED
@@ -1,103 +1,103 @@
1
- # frozen_string_literal: true
2
-
3
- require "open3"
4
-
5
- # This module provides classes for the Makit gem.
6
- module Makit
7
- class Git
8
- # This class provides methods for executing git commands and operations
9
- # that modify repository state.
10
- class CLI
11
- def self.integrate
12
- return unless Repository.git_repo? && !Repository.detached
13
-
14
- ## check for unstaged or untracked files
15
- unstaged_files = `git status --porcelain`.split("\n")
16
- untracked_files = `git ls-files --others --exclude-standard`.split("\n")
17
- return unless unstaged_files.length.positive? || untracked_files.length.positive?
18
-
19
- "git add .".run
20
- "git commit -m \"integrate\"".run unless Repository.clean?
21
- end
22
-
23
- def self.sync
24
- return unless Repository.git_repo? && !Repository.detached
25
-
26
- "git pull".try
27
- # Fetch tags explicitly to ensure we have the latest remote tag information
28
- "git fetch --tags origin".try
29
- "git push origin".try
30
-
31
- # Check which tags need to be pushed (exist locally but not remotely)
32
- local_tags = `git tag -l`.strip.split("\n").reject(&:empty?)
33
- # Use Open3 for cross-platform stderr handling (Windows doesn't support 2>/dev/null)
34
- remote_tags_output, _stderr, _status = Open3.capture3("git", "ls-remote", "--tags", "origin")
35
- remote_tags_output = remote_tags_output.strip
36
- remote_tags = if remote_tags_output.empty?
37
- []
38
- else
39
- # Extract tag names, removing refs/tags/ prefix and ^{} suffix, then get unique values
40
- remote_tags_output.split("\n")
41
- .map { |line| line.split("\t").last }
42
- .select { |ref| ref.start_with?('refs/tags/') && !ref.end_with?('^{}') }
43
- .map { |ref| ref.sub('refs/tags/', '') }
44
- .uniq
45
- end
46
-
47
- tags_to_push = local_tags - remote_tags
48
-
49
- if tags_to_push.empty?
50
- Makit::Logging.default_logger.info("All tags already exist on remote, skipping tag push")
51
- else
52
- # Limit to 5 tags per sync to avoid overwhelming the remote
53
- tags_to_push_limited = tags_to_push.first(5)
54
- remaining_count = tags_to_push.length - tags_to_push_limited.length
55
-
56
- if remaining_count.positive?
57
- Makit::Logging.default_logger.info("Pushing #{tags_to_push_limited.length} of #{tags_to_push.length} tag(s) to remote (limited to 5 per sync): #{tags_to_push_limited.join(', ')}")
58
- Makit::Logging.default_logger.info("#{remaining_count} tag(s) will be pushed in subsequent sync operations")
59
- else
60
- Makit::Logging.default_logger.info("Pushing #{tags_to_push_limited.length} tag(s) to remote: #{tags_to_push_limited.join(', ')}")
61
- end
62
-
63
- tags_to_push_limited.each do |tag|
64
- # Double-check that tag doesn't exist on remote before pushing
65
- # This prevents pushing tags that were added to remote between the ls-remote check and now
66
- # Use Open3 for cross-platform stderr handling (Windows doesn't support 2>/dev/null)
67
- remote_tag_check, _stderr, _status = Open3.capture3("git", "ls-remote", "--tags", "origin", "refs/tags/#{tag}")
68
- remote_tag_check = remote_tag_check.strip
69
- if remote_tag_check.empty?
70
- "git push origin #{tag}".try
71
- else
72
- Makit::Logging.default_logger.info("Tag #{tag} already exists on remote, skipping push")
73
- end
74
- end
75
- end
76
- end
77
-
78
- def self.pull
79
- return unless Repository.git_repo? && !Repository.detached
80
-
81
- "git pull".try
82
- end
83
-
84
- def self.zip_source_files(zipfilename)
85
- "git archive --format zip --output #{zipfilename} HEAD".run
86
- end
87
-
88
- def self.tag(version)
89
- # only tag if the repo is not read only
90
- if Repository.read_only?
91
- puts " cannot tag a read only repo".colorize(:red)
92
- return
93
- end
94
- # check if a tag for the current version already exists
95
- if `git tag -l v#{version}`.strip.length.positive?
96
- puts " tag v#{version} already exists".colorize(:red)
97
- else
98
- "git tag -a v#{version} -m \"version #{version}\"".run
99
- end
100
- end
101
- end
102
- end
103
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ # This module provides classes for the Makit gem.
6
+ module Makit
7
+ class Git
8
+ # This class provides methods for executing git commands and operations
9
+ # that modify repository state.
10
+ class CLI
11
+ def self.integrate
12
+ return unless Repository.git_repo? && !Repository.detached
13
+
14
+ ## check for unstaged or untracked files
15
+ unstaged_files = `git status --porcelain`.split("\n")
16
+ untracked_files = `git ls-files --others --exclude-standard`.split("\n")
17
+ return unless unstaged_files.length.positive? || untracked_files.length.positive?
18
+
19
+ "git add .".run
20
+ "git commit -m \"integrate\"".run unless Repository.clean?
21
+ end
22
+
23
+ def self.sync
24
+ return unless Repository.git_repo? && !Repository.detached
25
+
26
+ "git pull".try
27
+ # Fetch tags explicitly to ensure we have the latest remote tag information
28
+ "git fetch --tags origin".try
29
+ "git push origin".try
30
+
31
+ # Check which tags need to be pushed (exist locally but not remotely)
32
+ local_tags = `git tag -l`.strip.split("\n").reject(&:empty?)
33
+ # Use Open3 for cross-platform stderr handling (Windows doesn't support 2>/dev/null)
34
+ remote_tags_output, _stderr, _status = Open3.capture3("git", "ls-remote", "--tags", "origin")
35
+ remote_tags_output = remote_tags_output.strip
36
+ remote_tags = if remote_tags_output.empty?
37
+ []
38
+ else
39
+ # Extract tag names, removing refs/tags/ prefix and ^{} suffix, then get unique values
40
+ remote_tags_output.split("\n")
41
+ .map { |line| line.split("\t").last }
42
+ .select { |ref| ref.start_with?('refs/tags/') && !ref.end_with?('^{}') }
43
+ .map { |ref| ref.sub('refs/tags/', '') }
44
+ .uniq
45
+ end
46
+
47
+ tags_to_push = local_tags - remote_tags
48
+
49
+ if tags_to_push.empty?
50
+ Makit::Logging.default_logger.info("All tags already exist on remote, skipping tag push")
51
+ else
52
+ # Limit to 5 tags per sync to avoid overwhelming the remote
53
+ tags_to_push_limited = tags_to_push.first(5)
54
+ remaining_count = tags_to_push.length - tags_to_push_limited.length
55
+
56
+ if remaining_count.positive?
57
+ Makit::Logging.default_logger.info("Pushing #{tags_to_push_limited.length} of #{tags_to_push.length} tag(s) to remote (limited to 5 per sync): #{tags_to_push_limited.join(', ')}")
58
+ Makit::Logging.default_logger.info("#{remaining_count} tag(s) will be pushed in subsequent sync operations")
59
+ else
60
+ Makit::Logging.default_logger.info("Pushing #{tags_to_push_limited.length} tag(s) to remote: #{tags_to_push_limited.join(', ')}")
61
+ end
62
+
63
+ tags_to_push_limited.each do |tag|
64
+ # Double-check that tag doesn't exist on remote before pushing
65
+ # This prevents pushing tags that were added to remote between the ls-remote check and now
66
+ # Use Open3 for cross-platform stderr handling (Windows doesn't support 2>/dev/null)
67
+ remote_tag_check, _stderr, _status = Open3.capture3("git", "ls-remote", "--tags", "origin", "refs/tags/#{tag}")
68
+ remote_tag_check = remote_tag_check.strip
69
+ if remote_tag_check.empty?
70
+ "git push origin #{tag}".try
71
+ else
72
+ Makit::Logging.default_logger.info("Tag #{tag} already exists on remote, skipping push")
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ def self.pull
79
+ return unless Repository.git_repo? && !Repository.detached
80
+
81
+ "git pull".try
82
+ end
83
+
84
+ def self.zip_source_files(zipfilename)
85
+ "git archive --format zip --output #{zipfilename} HEAD".run
86
+ end
87
+
88
+ def self.tag(version)
89
+ # only tag if the repo is not read only
90
+ if Repository.read_only?
91
+ puts " cannot tag a read only repo".colorize(:red)
92
+ return
93
+ end
94
+ # check if a tag for the current version already exists
95
+ if `git tag -l v#{version}`.strip.length.positive?
96
+ puts " tag v#{version} already exists".colorize(:red)
97
+ else
98
+ "git tag -a v#{version} -m \"version #{version}\"".run
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end