makit 0.0.140 → 0.0.141

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 (153) 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/cli/build_commands.rb +500 -500
  7. data/lib/makit/cli/generators/base_generator.rb +74 -74
  8. data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
  9. data/lib/makit/cli/generators/generator_factory.rb +49 -49
  10. data/lib/makit/cli/generators/node_generator.rb +50 -50
  11. data/lib/makit/cli/generators/ruby_generator.rb +77 -77
  12. data/lib/makit/cli/generators/rust_generator.rb +50 -50
  13. data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
  14. data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
  15. data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
  16. data/lib/makit/cli/generators/templates/ruby/gemspec.rb +40 -40
  17. data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
  18. data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
  19. data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
  20. data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
  21. data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
  22. data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
  23. data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
  24. data/lib/makit/cli/main.rb +69 -69
  25. data/lib/makit/cli/project_commands.rb +868 -868
  26. data/lib/makit/cli/repository_commands.rb +661 -661
  27. data/lib/makit/cli/strategy_commands.rb +203 -203
  28. data/lib/makit/cli/utility_commands.rb +521 -521
  29. data/lib/makit/commands/factory.rb +359 -359
  30. data/lib/makit/commands/middleware/base.rb +73 -73
  31. data/lib/makit/commands/middleware/cache.rb +248 -248
  32. data/lib/makit/commands/middleware/command_logger.rb +312 -312
  33. data/lib/makit/commands/middleware/validator.rb +269 -269
  34. data/lib/makit/commands/request.rb +316 -316
  35. data/lib/makit/commands/result.rb +323 -323
  36. data/lib/makit/commands/runner.rb +388 -385
  37. data/lib/makit/commands/strategies/base.rb +171 -171
  38. data/lib/makit/commands/strategies/child_process.rb +165 -165
  39. data/lib/makit/commands/strategies/factory.rb +136 -136
  40. data/lib/makit/commands/strategies/synchronous.rb +139 -139
  41. data/lib/makit/commands.rb +50 -50
  42. data/lib/makit/configuration/dotnet_project.rb +12 -12
  43. data/lib/makit/configuration/gitlab_helper.rb +58 -58
  44. data/lib/makit/configuration/project.rb +168 -168
  45. data/lib/makit/configuration/rakefile_helper.rb +43 -43
  46. data/lib/makit/configuration/step.rb +34 -34
  47. data/lib/makit/configuration/timeout.rb +74 -74
  48. data/lib/makit/configuration.rb +15 -15
  49. data/lib/makit/content/default_gitignore.rb +7 -7
  50. data/lib/makit/content/default_gitignore.txt +225 -225
  51. data/lib/makit/content/default_rakefile.rb +13 -13
  52. data/lib/makit/content/gem_rakefile.rb +16 -16
  53. data/lib/makit/context.rb +1 -1
  54. data/lib/makit/data.rb +49 -49
  55. data/lib/makit/directories.rb +140 -140
  56. data/lib/makit/directory.rb +262 -262
  57. data/lib/makit/docs/files.rb +89 -89
  58. data/lib/makit/docs/rake.rb +102 -102
  59. data/lib/makit/dotnet/cli.rb +69 -69
  60. data/lib/makit/dotnet/project.rb +217 -217
  61. data/lib/makit/dotnet/solution.rb +38 -38
  62. data/lib/makit/dotnet/solution_classlib.rb +239 -239
  63. data/lib/makit/dotnet/solution_console.rb +264 -264
  64. data/lib/makit/dotnet/solution_maui.rb +354 -354
  65. data/lib/makit/dotnet/solution_wasm.rb +275 -275
  66. data/lib/makit/dotnet/solution_wpf.rb +304 -304
  67. data/lib/makit/dotnet.rb +102 -102
  68. data/lib/makit/email.rb +90 -90
  69. data/lib/makit/environment.rb +142 -142
  70. data/lib/makit/examples/runner.rb +370 -370
  71. data/lib/makit/exceptions.rb +45 -45
  72. data/lib/makit/fileinfo.rb +24 -24
  73. data/lib/makit/files.rb +43 -43
  74. data/lib/makit/gems.rb +40 -40
  75. data/lib/makit/git/cli.rb +54 -54
  76. data/lib/makit/git/repository.rb +90 -90
  77. data/lib/makit/git.rb +98 -98
  78. data/lib/makit/gitlab_runner.rb +59 -59
  79. data/lib/makit/humanize.rb +137 -137
  80. data/lib/makit/indexer.rb +47 -47
  81. data/lib/makit/logging/configuration.rb +308 -308
  82. data/lib/makit/logging/format_registry.rb +84 -84
  83. data/lib/makit/logging/formatters/base.rb +39 -39
  84. data/lib/makit/logging/formatters/console_formatter.rb +140 -140
  85. data/lib/makit/logging/formatters/json_formatter.rb +65 -65
  86. data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
  87. data/lib/makit/logging/formatters/text_formatter.rb +64 -64
  88. data/lib/makit/logging/log_request.rb +119 -119
  89. data/lib/makit/logging/logger.rb +199 -199
  90. data/lib/makit/logging/sinks/base.rb +91 -91
  91. data/lib/makit/logging/sinks/console.rb +72 -72
  92. data/lib/makit/logging/sinks/file_sink.rb +92 -92
  93. data/lib/makit/logging/sinks/structured.rb +123 -123
  94. data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
  95. data/lib/makit/logging.rb +565 -565
  96. data/lib/makit/markdown.rb +75 -75
  97. data/lib/makit/mp/basic_object_mp.rb +17 -17
  98. data/lib/makit/mp/command_mp.rb +13 -13
  99. data/lib/makit/mp/command_request.mp.rb +17 -17
  100. data/lib/makit/mp/project_mp.rb +199 -199
  101. data/lib/makit/mp/string_mp.rb +199 -191
  102. data/lib/makit/nuget.rb +74 -74
  103. data/lib/makit/port.rb +32 -32
  104. data/lib/makit/process.rb +163 -163
  105. data/lib/makit/protoc.rb +107 -107
  106. data/lib/makit/rake/cli.rb +196 -196
  107. data/lib/makit/rake/trace_controller.rb +173 -173
  108. data/lib/makit/rake.rb +80 -80
  109. data/lib/makit/ruby/cli.rb +185 -185
  110. data/lib/makit/ruby.rb +25 -25
  111. data/lib/makit/secrets.rb +51 -51
  112. data/lib/makit/serializer.rb +130 -130
  113. data/lib/makit/services/builder.rb +186 -186
  114. data/lib/makit/services/error_handler.rb +226 -226
  115. data/lib/makit/services/repository_manager.rb +231 -231
  116. data/lib/makit/services/validator.rb +112 -112
  117. data/lib/makit/setup/classlib.rb +101 -101
  118. data/lib/makit/setup/gem.rb +268 -268
  119. data/lib/makit/setup/razorclasslib.rb +101 -101
  120. data/lib/makit/setup/runner.rb +54 -54
  121. data/lib/makit/setup.rb +5 -5
  122. data/lib/makit/show.rb +110 -110
  123. data/lib/makit/storage.rb +126 -126
  124. data/lib/makit/symbols.rb +170 -170
  125. data/lib/makit/task_info.rb +130 -130
  126. data/lib/makit/tasks/at_exit.rb +15 -15
  127. data/lib/makit/tasks/build.rb +22 -22
  128. data/lib/makit/tasks/clean.rb +13 -13
  129. data/lib/makit/tasks/configure.rb +10 -10
  130. data/lib/makit/tasks/format.rb +10 -10
  131. data/lib/makit/tasks/hook_manager.rb +443 -443
  132. data/lib/makit/tasks/init.rb +49 -49
  133. data/lib/makit/tasks/integrate.rb +29 -29
  134. data/lib/makit/tasks/pull_incoming.rb +13 -13
  135. data/lib/makit/tasks/setup.rb +13 -13
  136. data/lib/makit/tasks/sync.rb +17 -17
  137. data/lib/makit/tasks/tag.rb +16 -16
  138. data/lib/makit/tasks/task_monkey_patch.rb +81 -81
  139. data/lib/makit/tasks/test.rb +22 -22
  140. data/lib/makit/tasks/update.rb +18 -18
  141. data/lib/makit/tasks.rb +20 -20
  142. data/lib/makit/test_cache.rb +239 -239
  143. data/lib/makit/tree.rb +37 -37
  144. data/lib/makit/v1/makit.v1_pb.rb +35 -35
  145. data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
  146. data/lib/makit/version.rb +99 -99
  147. data/lib/makit/version_util.rb +21 -21
  148. data/lib/makit/wix.rb +95 -95
  149. data/lib/makit/yaml.rb +29 -29
  150. data/lib/makit/zip.rb +17 -17
  151. data/lib/makit copy.rb +44 -44
  152. data/lib/makit.rb +42 -42
  153. metadata +2 -2
@@ -1,231 +1,231 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "validator"
4
-
5
- module Makit
6
- module Services
7
- # Service class responsible for git repository management operations
8
- # Handles cloning, pulling, logging, and working directory setup
9
- class RepositoryManager
10
- class << self
11
- # Initialize a new git repository in the specified directory
12
- #
13
- # @param directory [String] the directory path to initialize
14
- # @return [Makit::V1::Command] the git init command result
15
- # @raise [Makit::DirectoryError] if the directory cannot be created
16
- # @raise [Makit::GitError] if git initialization fails
17
- def initialize_repository(directory)
18
- Validator.validate_directory_parameter(directory)
19
- FileUtils.mkdir_p(directory)
20
-
21
- raise Makit::DirectoryError, "directory does not exist: #{directory}" unless Dir.exist?(directory)
22
-
23
- Dir.chdir(directory) do
24
- File.write(".gitignore", Makit::Content::GITIGNORE) unless File.exist?(".gitignore")
25
- init_command = Makit::Commands::Runner.default.execute("git init")
26
-
27
- if init_command.exit_code != 0
28
- raise Makit::GitError, "failed to initialize local repository: #{directory}\\n#{Makit::Humanize.get_command_summary(init_command)}"
29
- end
30
-
31
- init_command
32
- end
33
- end
34
-
35
- # Clone a git repository to a local directory
36
- #
37
- # @param git_repository [String] the git repository URL
38
- # @return [Array<Makit::V1::Command>] array of command results
39
- def clone_repository(git_repository)
40
- Validator.validate_url_parameter(git_repository)
41
- commands = []
42
-
43
- clone_dir = Directories.get_clone_directory(git_repository)
44
- unless Dir.exist?(clone_dir)
45
- commands << Makit::Commands::Runner.default.execute("git clone #{git_repository} #{clone_dir}")
46
- end
47
-
48
- commands
49
- end
50
-
51
- # Pull the latest changes from the remote repository
52
- #
53
- # @param git_repository [String] the git repository URL
54
- # @return [Makit::V1::Command] the git pull command result
55
- def pull_repository(git_repository)
56
- Validator.validate_url_parameter(git_repository)
57
- clone_dir = Directories.get_clone_directory(git_repository)
58
-
59
- Validator.validate_directory_exists(clone_dir, "clone directory")
60
-
61
- Dir.chdir(clone_dir) do
62
- execute_git_pull(clone_dir)
63
- end
64
- end
65
-
66
- # Clone repository if it doesn't exist, otherwise pull latest changes
67
- #
68
- # @param git_repository [String] the git repository URL
69
- # @return [Array<Makit::V1::Command>] array of command results
70
- def clone_or_pull_repository(git_repository)
71
- commands = []
72
- clone_dir = Directories.get_clone_directory(git_repository)
73
-
74
- commands << if Dir.exist?(clone_dir)
75
- pull_repository(git_repository)
76
- else
77
- clone_repository(git_repository)
78
- end
79
- commands
80
- end
81
-
82
- # Get git log information for a repository
83
- #
84
- # @param git_repository [String] the git repository URL
85
- # @param limit [Integer] maximum number of commits to retrieve
86
- # @param skip [Integer] number of commits to skip
87
- # @return [Array<Makit::V1::GitLogEntry>] array of log entries
88
- def get_repository_log(git_repository, limit, skip)
89
- Validator.validate_url_parameter(git_repository)
90
- Validator.validate_pagination_parameters(limit, skip)
91
-
92
- clone_dir = Directories.get_clone_directory(git_repository)
93
- Validator.validate_directory_exists(clone_dir, "clone directory")
94
-
95
- Dir.chdir(clone_dir) do
96
- log_command = Makit::Commands::Runner.default.execute("git log -n #{limit} --skip #{skip} --date=iso")
97
- parse_git_log_output(log_command)
98
- end
99
- end
100
-
101
- # Set up a work directory for a repository
102
- #
103
- # @param repository [String] the git repository URL
104
- # @return [nil] always returns nil
105
- def setup_work_directory(repository)
106
- Validator.validate_url_parameter(repository)
107
- clone_or_pull_repository(repository)
108
- create_work_directory(repository)
109
- nil
110
- end
111
-
112
- # Get the latest commit hash from a repository
113
- #
114
- # @param clone_dir [String] the local clone directory
115
- # @param commands [Array] array to append command results to
116
- # @return [String] the latest commit hash
117
- def get_latest_commit(clone_dir, commands)
118
- Dir.chdir(clone_dir) do
119
- git_log = Makit::Commands::Runner.default.execute("git log -n 1 --date=iso")
120
- commands << git_log
121
-
122
- commit = git_log.output.match(/^commit ([0-9a-f]{#{Validator::COMMIT_HASH_LENGTH}})$/i)&.captures&.first
123
-
124
- if commit.nil? || commit.empty? || !commit.match?(/\\A[0-9a-f]{#{Validator::COMMIT_HASH_LENGTH}}\\z/i)
125
- raise Makit::InvalidCommitError, "invalid commit: #{commit}"
126
- end
127
-
128
- commit
129
- end
130
- end
131
-
132
- # Validate that a clone directory exists for the given repository
133
- #
134
- # @param url [String] the git repository URL
135
- # @return [String] the clone directory path
136
- def validate_clone_directory(url)
137
- clone_dir = Directories.get_clone_directory(url)
138
- Validator.validate_directory_exists(clone_dir, "clone directory")
139
- clone_dir
140
- end
141
-
142
- private
143
-
144
- # Execute git pull command with proper error handling
145
- def execute_git_pull(clone_dir)
146
- request = Makit::V1::CommandRequest.new(
147
- name: "git",
148
- arguments: ["pull"],
149
- directory: clone_dir,
150
- )
151
- pull_command = Makit::Commands::Runner.default.execute(request)
152
-
153
- raise Makit::PullError, Makit::Humanize.get_command_details(pull_command) if pull_command.exit_code != 0
154
-
155
- pull_command
156
- end
157
-
158
- # Create work directory for development
159
- def create_work_directory(repository)
160
- work_dir = Makit::Directories.get_work_directory(repository)
161
- clone_dir = Makit::Directories.get_clone_directory(repository)
162
-
163
- unless Dir.exist?(work_dir)
164
- FileUtils.mkdir_p(File.dirname(work_dir))
165
- Makit::Commands::Runner.default.execute("git clone #{clone_dir} #{work_dir}")
166
- end
167
-
168
- Dir.chdir(work_dir) do
169
- File.write(".gitignore", Makit::Content::GITIGNORE) unless File.exist?(".gitignore")
170
- end
171
- end
172
-
173
- # Parse git log output into structured log entries
174
- def parse_git_log_output(log_command)
175
- entries = []
176
- return entries if log_command.exit_code != 0
177
-
178
- lines = log_command.output.split("\\n")
179
- current_entry = nil
180
-
181
- lines.each do |line|
182
- current_entry = process_git_log_line(line, current_entry, entries)
183
- end
184
-
185
- entries
186
- end
187
-
188
- # Process a single line from git log output
189
- def process_git_log_line(line, current_entry, entries)
190
- case line
191
- when /^commit/
192
- create_new_log_entry(line, entries)
193
- when /^Author:/
194
- current_entry ? update_entry_author(line, current_entry) : current_entry
195
- when /^Date:/
196
- current_entry ? update_entry_date(line, current_entry) : current_entry
197
- when /^ /
198
- current_entry ? update_entry_message(line, current_entry) : current_entry
199
- else
200
- current_entry
201
- end
202
- end
203
-
204
- # Create new git log entry from commit line
205
- def create_new_log_entry(line, entries)
206
- current_entry = GitLogEntry.new(line.split[1])
207
- entries << current_entry
208
- current_entry
209
- end
210
-
211
- # Update log entry with author information
212
- def update_entry_author(line, current_entry)
213
- current_entry.author = line.split[1..].join(" ")
214
- current_entry
215
- end
216
-
217
- # Update log entry with date information
218
- def update_entry_date(line, current_entry)
219
- current_entry.date = line.split[1..].join(" ")
220
- current_entry
221
- end
222
-
223
- # Update log entry with commit message
224
- def update_entry_message(line, current_entry)
225
- current_entry.message += line[4..]
226
- current_entry
227
- end
228
- end
229
- end
230
- end
231
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "validator"
4
+
5
+ module Makit
6
+ module Services
7
+ # Service class responsible for git repository management operations
8
+ # Handles cloning, pulling, logging, and working directory setup
9
+ class RepositoryManager
10
+ class << self
11
+ # Initialize a new git repository in the specified directory
12
+ #
13
+ # @param directory [String] the directory path to initialize
14
+ # @return [Makit::V1::Command] the git init command result
15
+ # @raise [Makit::DirectoryError] if the directory cannot be created
16
+ # @raise [Makit::GitError] if git initialization fails
17
+ def initialize_repository(directory)
18
+ Validator.validate_directory_parameter(directory)
19
+ FileUtils.mkdir_p(directory)
20
+
21
+ raise Makit::DirectoryError, "directory does not exist: #{directory}" unless Dir.exist?(directory)
22
+
23
+ Dir.chdir(directory) do
24
+ File.write(".gitignore", Makit::Content::GITIGNORE) unless File.exist?(".gitignore")
25
+ init_command = Makit::Commands::Runner.default.execute("git init")
26
+
27
+ if init_command.exit_code != 0
28
+ raise Makit::GitError, "failed to initialize local repository: #{directory}\\n#{Makit::Humanize.get_command_summary(init_command)}"
29
+ end
30
+
31
+ init_command
32
+ end
33
+ end
34
+
35
+ # Clone a git repository to a local directory
36
+ #
37
+ # @param git_repository [String] the git repository URL
38
+ # @return [Array<Makit::V1::Command>] array of command results
39
+ def clone_repository(git_repository)
40
+ Validator.validate_url_parameter(git_repository)
41
+ commands = []
42
+
43
+ clone_dir = Directories.get_clone_directory(git_repository)
44
+ unless Dir.exist?(clone_dir)
45
+ commands << Makit::Commands::Runner.default.execute("git clone #{git_repository} #{clone_dir}")
46
+ end
47
+
48
+ commands
49
+ end
50
+
51
+ # Pull the latest changes from the remote repository
52
+ #
53
+ # @param git_repository [String] the git repository URL
54
+ # @return [Makit::V1::Command] the git pull command result
55
+ def pull_repository(git_repository)
56
+ Validator.validate_url_parameter(git_repository)
57
+ clone_dir = Directories.get_clone_directory(git_repository)
58
+
59
+ Validator.validate_directory_exists(clone_dir, "clone directory")
60
+
61
+ Dir.chdir(clone_dir) do
62
+ execute_git_pull(clone_dir)
63
+ end
64
+ end
65
+
66
+ # Clone repository if it doesn't exist, otherwise pull latest changes
67
+ #
68
+ # @param git_repository [String] the git repository URL
69
+ # @return [Array<Makit::V1::Command>] array of command results
70
+ def clone_or_pull_repository(git_repository)
71
+ commands = []
72
+ clone_dir = Directories.get_clone_directory(git_repository)
73
+
74
+ commands << if Dir.exist?(clone_dir)
75
+ pull_repository(git_repository)
76
+ else
77
+ clone_repository(git_repository)
78
+ end
79
+ commands
80
+ end
81
+
82
+ # Get git log information for a repository
83
+ #
84
+ # @param git_repository [String] the git repository URL
85
+ # @param limit [Integer] maximum number of commits to retrieve
86
+ # @param skip [Integer] number of commits to skip
87
+ # @return [Array<Makit::V1::GitLogEntry>] array of log entries
88
+ def get_repository_log(git_repository, limit, skip)
89
+ Validator.validate_url_parameter(git_repository)
90
+ Validator.validate_pagination_parameters(limit, skip)
91
+
92
+ clone_dir = Directories.get_clone_directory(git_repository)
93
+ Validator.validate_directory_exists(clone_dir, "clone directory")
94
+
95
+ Dir.chdir(clone_dir) do
96
+ log_command = Makit::Commands::Runner.default.execute("git log -n #{limit} --skip #{skip} --date=iso")
97
+ parse_git_log_output(log_command)
98
+ end
99
+ end
100
+
101
+ # Set up a work directory for a repository
102
+ #
103
+ # @param repository [String] the git repository URL
104
+ # @return [nil] always returns nil
105
+ def setup_work_directory(repository)
106
+ Validator.validate_url_parameter(repository)
107
+ clone_or_pull_repository(repository)
108
+ create_work_directory(repository)
109
+ nil
110
+ end
111
+
112
+ # Get the latest commit hash from a repository
113
+ #
114
+ # @param clone_dir [String] the local clone directory
115
+ # @param commands [Array] array to append command results to
116
+ # @return [String] the latest commit hash
117
+ def get_latest_commit(clone_dir, commands)
118
+ Dir.chdir(clone_dir) do
119
+ git_log = Makit::Commands::Runner.default.execute("git log -n 1 --date=iso")
120
+ commands << git_log
121
+
122
+ commit = git_log.output.match(/^commit ([0-9a-f]{#{Validator::COMMIT_HASH_LENGTH}})$/i)&.captures&.first
123
+
124
+ if commit.nil? || commit.empty? || !commit.match?(/\\A[0-9a-f]{#{Validator::COMMIT_HASH_LENGTH}}\\z/i)
125
+ raise Makit::InvalidCommitError, "invalid commit: #{commit}"
126
+ end
127
+
128
+ commit
129
+ end
130
+ end
131
+
132
+ # Validate that a clone directory exists for the given repository
133
+ #
134
+ # @param url [String] the git repository URL
135
+ # @return [String] the clone directory path
136
+ def validate_clone_directory(url)
137
+ clone_dir = Directories.get_clone_directory(url)
138
+ Validator.validate_directory_exists(clone_dir, "clone directory")
139
+ clone_dir
140
+ end
141
+
142
+ private
143
+
144
+ # Execute git pull command with proper error handling
145
+ def execute_git_pull(clone_dir)
146
+ request = Makit::V1::CommandRequest.new(
147
+ name: "git",
148
+ arguments: ["pull"],
149
+ directory: clone_dir,
150
+ )
151
+ pull_command = Makit::Commands::Runner.default.execute(request)
152
+
153
+ raise Makit::PullError, Makit::Humanize.get_command_details(pull_command) if pull_command.exit_code != 0
154
+
155
+ pull_command
156
+ end
157
+
158
+ # Create work directory for development
159
+ def create_work_directory(repository)
160
+ work_dir = Makit::Directories.get_work_directory(repository)
161
+ clone_dir = Makit::Directories.get_clone_directory(repository)
162
+
163
+ unless Dir.exist?(work_dir)
164
+ FileUtils.mkdir_p(File.dirname(work_dir))
165
+ Makit::Commands::Runner.default.execute("git clone #{clone_dir} #{work_dir}")
166
+ end
167
+
168
+ Dir.chdir(work_dir) do
169
+ File.write(".gitignore", Makit::Content::GITIGNORE) unless File.exist?(".gitignore")
170
+ end
171
+ end
172
+
173
+ # Parse git log output into structured log entries
174
+ def parse_git_log_output(log_command)
175
+ entries = []
176
+ return entries if log_command.exit_code != 0
177
+
178
+ lines = log_command.output.split("\\n")
179
+ current_entry = nil
180
+
181
+ lines.each do |line|
182
+ current_entry = process_git_log_line(line, current_entry, entries)
183
+ end
184
+
185
+ entries
186
+ end
187
+
188
+ # Process a single line from git log output
189
+ def process_git_log_line(line, current_entry, entries)
190
+ case line
191
+ when /^commit/
192
+ create_new_log_entry(line, entries)
193
+ when /^Author:/
194
+ current_entry ? update_entry_author(line, current_entry) : current_entry
195
+ when /^Date:/
196
+ current_entry ? update_entry_date(line, current_entry) : current_entry
197
+ when /^ /
198
+ current_entry ? update_entry_message(line, current_entry) : current_entry
199
+ else
200
+ current_entry
201
+ end
202
+ end
203
+
204
+ # Create new git log entry from commit line
205
+ def create_new_log_entry(line, entries)
206
+ current_entry = GitLogEntry.new(line.split[1])
207
+ entries << current_entry
208
+ current_entry
209
+ end
210
+
211
+ # Update log entry with author information
212
+ def update_entry_author(line, current_entry)
213
+ current_entry.author = line.split[1..].join(" ")
214
+ current_entry
215
+ end
216
+
217
+ # Update log entry with date information
218
+ def update_entry_date(line, current_entry)
219
+ current_entry.date = line.split[1..].join(" ")
220
+ current_entry
221
+ end
222
+
223
+ # Update log entry with commit message
224
+ def update_entry_message(line, current_entry)
225
+ current_entry.message += line[4..]
226
+ current_entry
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end