makit 0.0.138 → 0.0.140

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 (151) 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 -67
  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 +51 -0
  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 +385 -385
  37. data/lib/makit/commands/strategies/base.rb +171 -171
  38. data/lib/makit/commands/strategies/child_process.rb +1 -1
  39. data/lib/makit/commands/strategies/synchronous.rb +139 -139
  40. data/lib/makit/commands.rb +50 -50
  41. data/lib/makit/configuration/dotnet_project.rb +12 -12
  42. data/lib/makit/configuration/gitlab_helper.rb +58 -58
  43. data/lib/makit/configuration/project.rb +168 -168
  44. data/lib/makit/configuration/rakefile_helper.rb +43 -43
  45. data/lib/makit/configuration/step.rb +34 -34
  46. data/lib/makit/configuration/timeout.rb +74 -0
  47. data/lib/makit/configuration.rb +15 -14
  48. data/lib/makit/content/default_gitignore.rb +7 -7
  49. data/lib/makit/content/default_gitignore.txt +225 -225
  50. data/lib/makit/content/default_rakefile.rb +13 -13
  51. data/lib/makit/content/gem_rakefile.rb +16 -16
  52. data/lib/makit/context.rb +1 -1
  53. data/lib/makit/data.rb +49 -49
  54. data/lib/makit/directories.rb +140 -140
  55. data/lib/makit/directory.rb +262 -262
  56. data/lib/makit/docs/files.rb +89 -89
  57. data/lib/makit/docs/rake.rb +102 -102
  58. data/lib/makit/dotnet/cli.rb +69 -69
  59. data/lib/makit/dotnet/project.rb +217 -217
  60. data/lib/makit/dotnet/solution.rb +38 -38
  61. data/lib/makit/dotnet/solution_classlib.rb +239 -239
  62. data/lib/makit/dotnet/solution_console.rb +264 -264
  63. data/lib/makit/dotnet/solution_maui.rb +354 -354
  64. data/lib/makit/dotnet/solution_wasm.rb +275 -275
  65. data/lib/makit/dotnet/solution_wpf.rb +304 -304
  66. data/lib/makit/dotnet.rb +102 -102
  67. data/lib/makit/email.rb +90 -90
  68. data/lib/makit/environment.rb +142 -142
  69. data/lib/makit/examples/runner.rb +370 -370
  70. data/lib/makit/exceptions.rb +45 -45
  71. data/lib/makit/fileinfo.rb +24 -24
  72. data/lib/makit/files.rb +43 -43
  73. data/lib/makit/gems.rb +40 -40
  74. data/lib/makit/git/cli.rb +54 -54
  75. data/lib/makit/git/repository.rb +90 -90
  76. data/lib/makit/git.rb +98 -98
  77. data/lib/makit/gitlab_runner.rb +59 -59
  78. data/lib/makit/humanize.rb +137 -137
  79. data/lib/makit/indexer.rb +47 -47
  80. data/lib/makit/logging/configuration.rb +308 -308
  81. data/lib/makit/logging/format_registry.rb +84 -84
  82. data/lib/makit/logging/formatters/base.rb +39 -39
  83. data/lib/makit/logging/formatters/console_formatter.rb +140 -140
  84. data/lib/makit/logging/formatters/json_formatter.rb +65 -65
  85. data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
  86. data/lib/makit/logging/formatters/text_formatter.rb +64 -64
  87. data/lib/makit/logging/log_request.rb +119 -119
  88. data/lib/makit/logging/logger.rb +199 -199
  89. data/lib/makit/logging/sinks/base.rb +91 -91
  90. data/lib/makit/logging/sinks/console.rb +72 -72
  91. data/lib/makit/logging/sinks/file_sink.rb +92 -92
  92. data/lib/makit/logging/sinks/structured.rb +123 -123
  93. data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
  94. data/lib/makit/logging.rb +565 -565
  95. data/lib/makit/markdown.rb +75 -75
  96. data/lib/makit/mp/basic_object_mp.rb +17 -17
  97. data/lib/makit/mp/command_mp.rb +13 -13
  98. data/lib/makit/mp/command_request.mp.rb +17 -17
  99. data/lib/makit/mp/project_mp.rb +199 -199
  100. data/lib/makit/mp/string_mp.rb +191 -191
  101. data/lib/makit/nuget.rb +74 -74
  102. data/lib/makit/port.rb +32 -32
  103. data/lib/makit/process.rb +163 -163
  104. data/lib/makit/protoc.rb +107 -107
  105. data/lib/makit/rake/cli.rb +196 -196
  106. data/lib/makit/rake.rb +80 -80
  107. data/lib/makit/ruby/cli.rb +185 -185
  108. data/lib/makit/ruby.rb +25 -25
  109. data/lib/makit/secrets.rb +51 -51
  110. data/lib/makit/serializer.rb +130 -130
  111. data/lib/makit/services/builder.rb +186 -186
  112. data/lib/makit/services/error_handler.rb +226 -226
  113. data/lib/makit/services/repository_manager.rb +231 -231
  114. data/lib/makit/services/validator.rb +112 -112
  115. data/lib/makit/setup/classlib.rb +101 -101
  116. data/lib/makit/setup/gem.rb +268 -268
  117. data/lib/makit/setup/razorclasslib.rb +101 -101
  118. data/lib/makit/setup/runner.rb +54 -54
  119. data/lib/makit/setup.rb +5 -5
  120. data/lib/makit/show.rb +110 -110
  121. data/lib/makit/storage.rb +126 -126
  122. data/lib/makit/symbols.rb +170 -170
  123. data/lib/makit/task_info.rb +130 -130
  124. data/lib/makit/tasks/at_exit.rb +15 -15
  125. data/lib/makit/tasks/build.rb +22 -22
  126. data/lib/makit/tasks/clean.rb +13 -13
  127. data/lib/makit/tasks/configure.rb +10 -10
  128. data/lib/makit/tasks/format.rb +10 -10
  129. data/lib/makit/tasks/hook_manager.rb +443 -443
  130. data/lib/makit/tasks/init.rb +49 -49
  131. data/lib/makit/tasks/integrate.rb +29 -29
  132. data/lib/makit/tasks/pull_incoming.rb +13 -13
  133. data/lib/makit/tasks/setup.rb +13 -13
  134. data/lib/makit/tasks/sync.rb +17 -17
  135. data/lib/makit/tasks/tag.rb +16 -16
  136. data/lib/makit/tasks/task_monkey_patch.rb +81 -81
  137. data/lib/makit/tasks/test.rb +22 -22
  138. data/lib/makit/tasks/update.rb +18 -18
  139. data/lib/makit/tasks.rb +20 -20
  140. data/lib/makit/test_cache.rb +239 -239
  141. data/lib/makit/tree.rb +37 -37
  142. data/lib/makit/v1/makit.v1_pb.rb +35 -35
  143. data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
  144. data/lib/makit/version.rb +99 -99
  145. data/lib/makit/version_util.rb +21 -21
  146. data/lib/makit/wix.rb +95 -95
  147. data/lib/makit/yaml.rb +29 -29
  148. data/lib/makit/zip.rb +17 -17
  149. data/lib/makit copy.rb +44 -44
  150. data/lib/makit.rb +42 -42
  151. metadata +3 -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