makit 0.0.164 → 0.0.166

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 (178) 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 +139 -0
  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/gitlab/pipeline.rb +857 -857
  84. data/lib/makit/gitlab/pipeline_service_impl.rb +1535 -1535
  85. data/lib/makit/gitlab_runner.rb +59 -59
  86. data/lib/makit/humanize.rb +218 -218
  87. data/lib/makit/indexer.rb +47 -47
  88. data/lib/makit/io/filesystem.rb +111 -111
  89. data/lib/makit/io/filesystem_service_impl.rb +337 -337
  90. data/lib/makit/lint.rb +212 -212
  91. data/lib/makit/logging/configuration.rb +309 -309
  92. data/lib/makit/logging/format_registry.rb +84 -84
  93. data/lib/makit/logging/formatters/base.rb +39 -39
  94. data/lib/makit/logging/formatters/console_formatter.rb +140 -140
  95. data/lib/makit/logging/formatters/json_formatter.rb +65 -65
  96. data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
  97. data/lib/makit/logging/formatters/text_formatter.rb +64 -64
  98. data/lib/makit/logging/log_request.rb +119 -119
  99. data/lib/makit/logging/logger.rb +199 -199
  100. data/lib/makit/logging/sinks/base.rb +91 -91
  101. data/lib/makit/logging/sinks/console.rb +72 -72
  102. data/lib/makit/logging/sinks/file_sink.rb +92 -92
  103. data/lib/makit/logging/sinks/structured.rb +123 -123
  104. data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
  105. data/lib/makit/logging.rb +578 -578
  106. data/lib/makit/markdown.rb +75 -75
  107. data/lib/makit/mp/basic_object_mp.rb +17 -17
  108. data/lib/makit/mp/command_mp.rb +13 -13
  109. data/lib/makit/mp/command_request.mp.rb +17 -17
  110. data/lib/makit/mp/project_mp.rb +199 -199
  111. data/lib/makit/mp/string_mp.rb +205 -205
  112. data/lib/makit/nuget.rb +454 -454
  113. data/lib/makit/podman/podman.rb +458 -458
  114. data/lib/makit/podman/podman_service_impl.rb +1081 -1081
  115. data/lib/makit/port.rb +32 -32
  116. data/lib/makit/process.rb +377 -377
  117. data/lib/makit/protoc.rb +112 -112
  118. data/lib/makit/rake/cli.rb +196 -196
  119. data/lib/makit/rake/trace_controller.rb +174 -174
  120. data/lib/makit/rake.rb +81 -81
  121. data/lib/makit/ruby/cli.rb +185 -185
  122. data/lib/makit/ruby.rb +25 -25
  123. data/lib/makit/rubygems.rb +137 -137
  124. data/lib/makit/secrets/azure_key_vault.rb +322 -322
  125. data/lib/makit/secrets/azure_secrets.rb +221 -183
  126. data/lib/makit/secrets/local_secrets.rb +72 -72
  127. data/lib/makit/secrets/secrets_manager.rb +105 -105
  128. data/lib/makit/secrets.rb +96 -16
  129. data/lib/makit/serializer.rb +130 -130
  130. data/lib/makit/services/builder.rb +186 -186
  131. data/lib/makit/services/error_handler.rb +226 -226
  132. data/lib/makit/services/repository_manager.rb +367 -367
  133. data/lib/makit/services/validator.rb +112 -112
  134. data/lib/makit/setup/classlib.rb +101 -101
  135. data/lib/makit/setup/gem.rb +268 -268
  136. data/lib/makit/setup/pages.rb +11 -11
  137. data/lib/makit/setup/razorclasslib.rb +101 -101
  138. data/lib/makit/setup/runner.rb +54 -54
  139. data/lib/makit/setup.rb +5 -5
  140. data/lib/makit/show.rb +110 -110
  141. data/lib/makit/storage.rb +126 -126
  142. data/lib/makit/symbols.rb +175 -175
  143. data/lib/makit/task_info.rb +130 -130
  144. data/lib/makit/tasks/at_exit.rb +15 -15
  145. data/lib/makit/tasks/build.rb +22 -22
  146. data/lib/makit/tasks/bump.rb +7 -7
  147. data/lib/makit/tasks/clean.rb +13 -13
  148. data/lib/makit/tasks/configure.rb +10 -10
  149. data/lib/makit/tasks/format.rb +10 -10
  150. data/lib/makit/tasks/hook_manager.rb +443 -443
  151. data/lib/makit/tasks/info.rb +368 -368
  152. data/lib/makit/tasks/init.rb +49 -49
  153. data/lib/makit/tasks/integrate.rb +60 -60
  154. data/lib/makit/tasks/pull_incoming.rb +13 -13
  155. data/lib/makit/tasks/secrets.rb +7 -7
  156. data/lib/makit/tasks/setup.rb +16 -16
  157. data/lib/makit/tasks/sync.rb +14 -14
  158. data/lib/makit/tasks/tag.rb +27 -27
  159. data/lib/makit/tasks/task_monkey_patch.rb +81 -81
  160. data/lib/makit/tasks/test.rb +22 -22
  161. data/lib/makit/tasks/update.rb +21 -21
  162. data/lib/makit/tasks/version.rb +6 -6
  163. data/lib/makit/tasks.rb +24 -24
  164. data/lib/makit/test_cache.rb +239 -239
  165. data/lib/makit/tree.rb +37 -37
  166. data/lib/makit/v1/configuration/project_service_impl.rb +370 -370
  167. data/lib/makit/v1/git/git_repository_service_impl.rb +295 -295
  168. data/lib/makit/v1/makit.v1_pb.rb +35 -35
  169. data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
  170. data/lib/makit/v1/services/repository_manager_service_impl.rb +572 -572
  171. data/lib/makit/version.rb +661 -661
  172. data/lib/makit/version_util.rb +21 -21
  173. data/lib/makit/wix.rb +95 -95
  174. data/lib/makit/yaml.rb +29 -29
  175. data/lib/makit/zip.rb +17 -17
  176. data/lib/makit copy.rb +44 -44
  177. data/lib/makit.rb +120 -119
  178. metadata +3 -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