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.
- checksums.yaml +4 -4
- data/README.md +41 -41
- data/exe/makit +5 -5
- data/lib/makit/apache.rb +28 -28
- data/lib/makit/auto.rb +48 -48
- data/lib/makit/cli/build_commands.rb +500 -500
- data/lib/makit/cli/generators/base_generator.rb +74 -74
- data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
- data/lib/makit/cli/generators/generator_factory.rb +49 -49
- data/lib/makit/cli/generators/node_generator.rb +50 -50
- data/lib/makit/cli/generators/ruby_generator.rb +77 -77
- data/lib/makit/cli/generators/rust_generator.rb +50 -50
- data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
- data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
- data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
- data/lib/makit/cli/generators/templates/ruby/gemspec.rb +40 -40
- data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
- data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
- data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
- data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
- data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
- data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
- data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
- data/lib/makit/cli/main.rb +69 -67
- data/lib/makit/cli/project_commands.rb +868 -868
- data/lib/makit/cli/repository_commands.rb +661 -661
- data/lib/makit/cli/strategy_commands.rb +51 -0
- data/lib/makit/cli/utility_commands.rb +521 -521
- data/lib/makit/commands/factory.rb +359 -359
- data/lib/makit/commands/middleware/base.rb +73 -73
- data/lib/makit/commands/middleware/cache.rb +248 -248
- data/lib/makit/commands/middleware/command_logger.rb +312 -312
- data/lib/makit/commands/middleware/validator.rb +269 -269
- data/lib/makit/commands/request.rb +316 -316
- data/lib/makit/commands/result.rb +323 -323
- data/lib/makit/commands/runner.rb +385 -385
- data/lib/makit/commands/strategies/base.rb +171 -171
- data/lib/makit/commands/strategies/child_process.rb +1 -1
- data/lib/makit/commands/strategies/synchronous.rb +139 -139
- data/lib/makit/commands.rb +50 -50
- data/lib/makit/configuration/dotnet_project.rb +12 -12
- data/lib/makit/configuration/gitlab_helper.rb +58 -58
- data/lib/makit/configuration/project.rb +168 -168
- data/lib/makit/configuration/rakefile_helper.rb +43 -43
- data/lib/makit/configuration/step.rb +34 -34
- data/lib/makit/configuration/timeout.rb +74 -0
- data/lib/makit/configuration.rb +15 -14
- data/lib/makit/content/default_gitignore.rb +7 -7
- data/lib/makit/content/default_gitignore.txt +225 -225
- data/lib/makit/content/default_rakefile.rb +13 -13
- data/lib/makit/content/gem_rakefile.rb +16 -16
- data/lib/makit/context.rb +1 -1
- data/lib/makit/data.rb +49 -49
- data/lib/makit/directories.rb +140 -140
- data/lib/makit/directory.rb +262 -262
- data/lib/makit/docs/files.rb +89 -89
- data/lib/makit/docs/rake.rb +102 -102
- data/lib/makit/dotnet/cli.rb +69 -69
- data/lib/makit/dotnet/project.rb +217 -217
- data/lib/makit/dotnet/solution.rb +38 -38
- data/lib/makit/dotnet/solution_classlib.rb +239 -239
- data/lib/makit/dotnet/solution_console.rb +264 -264
- data/lib/makit/dotnet/solution_maui.rb +354 -354
- data/lib/makit/dotnet/solution_wasm.rb +275 -275
- data/lib/makit/dotnet/solution_wpf.rb +304 -304
- data/lib/makit/dotnet.rb +102 -102
- data/lib/makit/email.rb +90 -90
- data/lib/makit/environment.rb +142 -142
- data/lib/makit/examples/runner.rb +370 -370
- data/lib/makit/exceptions.rb +45 -45
- data/lib/makit/fileinfo.rb +24 -24
- data/lib/makit/files.rb +43 -43
- data/lib/makit/gems.rb +40 -40
- data/lib/makit/git/cli.rb +54 -54
- data/lib/makit/git/repository.rb +90 -90
- data/lib/makit/git.rb +98 -98
- data/lib/makit/gitlab_runner.rb +59 -59
- data/lib/makit/humanize.rb +137 -137
- data/lib/makit/indexer.rb +47 -47
- data/lib/makit/logging/configuration.rb +308 -308
- data/lib/makit/logging/format_registry.rb +84 -84
- data/lib/makit/logging/formatters/base.rb +39 -39
- data/lib/makit/logging/formatters/console_formatter.rb +140 -140
- data/lib/makit/logging/formatters/json_formatter.rb +65 -65
- data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
- data/lib/makit/logging/formatters/text_formatter.rb +64 -64
- data/lib/makit/logging/log_request.rb +119 -119
- data/lib/makit/logging/logger.rb +199 -199
- data/lib/makit/logging/sinks/base.rb +91 -91
- data/lib/makit/logging/sinks/console.rb +72 -72
- data/lib/makit/logging/sinks/file_sink.rb +92 -92
- data/lib/makit/logging/sinks/structured.rb +123 -123
- data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
- data/lib/makit/logging.rb +565 -565
- data/lib/makit/markdown.rb +75 -75
- data/lib/makit/mp/basic_object_mp.rb +17 -17
- data/lib/makit/mp/command_mp.rb +13 -13
- data/lib/makit/mp/command_request.mp.rb +17 -17
- data/lib/makit/mp/project_mp.rb +199 -199
- data/lib/makit/mp/string_mp.rb +191 -191
- data/lib/makit/nuget.rb +74 -74
- data/lib/makit/port.rb +32 -32
- data/lib/makit/process.rb +163 -163
- data/lib/makit/protoc.rb +107 -107
- data/lib/makit/rake/cli.rb +196 -196
- data/lib/makit/rake.rb +80 -80
- data/lib/makit/ruby/cli.rb +185 -185
- data/lib/makit/ruby.rb +25 -25
- data/lib/makit/secrets.rb +51 -51
- data/lib/makit/serializer.rb +130 -130
- data/lib/makit/services/builder.rb +186 -186
- data/lib/makit/services/error_handler.rb +226 -226
- data/lib/makit/services/repository_manager.rb +231 -231
- data/lib/makit/services/validator.rb +112 -112
- data/lib/makit/setup/classlib.rb +101 -101
- data/lib/makit/setup/gem.rb +268 -268
- data/lib/makit/setup/razorclasslib.rb +101 -101
- data/lib/makit/setup/runner.rb +54 -54
- data/lib/makit/setup.rb +5 -5
- data/lib/makit/show.rb +110 -110
- data/lib/makit/storage.rb +126 -126
- data/lib/makit/symbols.rb +170 -170
- data/lib/makit/task_info.rb +130 -130
- data/lib/makit/tasks/at_exit.rb +15 -15
- data/lib/makit/tasks/build.rb +22 -22
- data/lib/makit/tasks/clean.rb +13 -13
- data/lib/makit/tasks/configure.rb +10 -10
- data/lib/makit/tasks/format.rb +10 -10
- data/lib/makit/tasks/hook_manager.rb +443 -443
- data/lib/makit/tasks/init.rb +49 -49
- data/lib/makit/tasks/integrate.rb +29 -29
- data/lib/makit/tasks/pull_incoming.rb +13 -13
- data/lib/makit/tasks/setup.rb +13 -13
- data/lib/makit/tasks/sync.rb +17 -17
- data/lib/makit/tasks/tag.rb +16 -16
- data/lib/makit/tasks/task_monkey_patch.rb +81 -81
- data/lib/makit/tasks/test.rb +22 -22
- data/lib/makit/tasks/update.rb +18 -18
- data/lib/makit/tasks.rb +20 -20
- data/lib/makit/test_cache.rb +239 -239
- data/lib/makit/tree.rb +37 -37
- data/lib/makit/v1/makit.v1_pb.rb +35 -35
- data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
- data/lib/makit/version.rb +99 -99
- data/lib/makit/version_util.rb +21 -21
- data/lib/makit/wix.rb +95 -95
- data/lib/makit/yaml.rb +29 -29
- data/lib/makit/zip.rb +17 -17
- data/lib/makit copy.rb +44 -44
- data/lib/makit.rb +42 -42
- 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
|