makit 0.0.112 → 0.0.128

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