makit 0.0.98 → 0.0.111
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 -0
- data/exe/makit +5 -0
- data/lib/makit/apache.rb +7 -11
- data/lib/makit/cli/build_commands.rb +500 -0
- data/lib/makit/cli/generators/base_generator.rb +74 -0
- data/lib/makit/cli/generators/dotnet_generator.rb +50 -0
- data/lib/makit/cli/generators/generator_factory.rb +49 -0
- data/lib/makit/cli/generators/node_generator.rb +50 -0
- data/lib/makit/cli/generators/ruby_generator.rb +77 -0
- data/lib/makit/cli/generators/rust_generator.rb +50 -0
- data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -0
- data/lib/makit/cli/generators/templates/node_templates.rb +161 -0
- data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -0
- data/lib/makit/cli/generators/templates/ruby/gemspec.rb +40 -0
- data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -0
- data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -0
- data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -0
- data/lib/makit/cli/generators/templates/ruby/test.rb +39 -0
- data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -0
- data/lib/makit/cli/generators/templates/ruby/version.rb +29 -0
- data/lib/makit/cli/generators/templates/rust_templates.rb +128 -0
- data/lib/makit/cli/main.rb +48 -19
- data/lib/makit/cli/project_commands.rb +868 -0
- data/lib/makit/cli/repository_commands.rb +661 -0
- data/lib/makit/cli/utility_commands.rb +521 -0
- data/lib/makit/command_runner.rb +187 -128
- data/lib/makit/commands/compatibility.rb +365 -0
- data/lib/makit/commands/factory.rb +359 -0
- data/lib/makit/commands/middleware/base.rb +73 -0
- data/lib/makit/commands/middleware/cache.rb +248 -0
- data/lib/makit/commands/middleware/command_logger.rb +323 -0
- data/lib/makit/commands/middleware/unified_logger.rb +243 -0
- data/lib/makit/commands/middleware/validator.rb +269 -0
- data/lib/makit/commands/request.rb +254 -0
- data/lib/makit/commands/result.rb +323 -0
- data/lib/makit/commands/runner.rb +317 -0
- data/lib/makit/commands/strategies/base.rb +160 -0
- data/lib/makit/commands/strategies/synchronous.rb +134 -0
- data/lib/makit/commands.rb +24 -3
- data/lib/makit/configuration/gitlab_helper.rb +60 -0
- data/lib/makit/configuration/project.rb +127 -0
- data/lib/makit/configuration/rakefile_helper.rb +43 -0
- data/lib/makit/configuration/step.rb +34 -0
- data/lib/makit/configuration.rb +14 -0
- data/lib/makit/content/default_gitignore.rb +4 -2
- data/lib/makit/content/default_rakefile.rb +4 -2
- data/lib/makit/content/gem_rakefile.rb +4 -2
- data/lib/makit/context.rb +1 -0
- data/lib/makit/data.rb +9 -10
- data/lib/makit/directories.rb +48 -52
- data/lib/makit/directory.rb +38 -52
- data/lib/makit/docs/files.rb +5 -10
- data/lib/makit/docs/rake.rb +16 -20
- data/lib/makit/dotnet/cli.rb +65 -0
- data/lib/makit/dotnet/project.rb +153 -0
- data/lib/makit/dotnet/solution.rb +38 -0
- data/lib/makit/dotnet/solution_classlib.rb +239 -0
- data/lib/makit/dotnet/solution_console.rb +264 -0
- data/lib/makit/dotnet/solution_maui.rb +354 -0
- data/lib/makit/dotnet/solution_wasm.rb +275 -0
- data/lib/makit/dotnet/solution_wpf.rb +304 -0
- data/lib/makit/dotnet.rb +54 -171
- data/lib/makit/email.rb +46 -17
- data/lib/makit/environment.rb +22 -19
- data/lib/makit/examples/runner.rb +370 -0
- data/lib/makit/exceptions.rb +45 -0
- data/lib/makit/fileinfo.rb +3 -5
- data/lib/makit/files.rb +12 -16
- data/lib/makit/gems.rb +40 -39
- data/lib/makit/git/cli.rb +54 -0
- data/lib/makit/git/repository.rb +90 -0
- data/lib/makit/git.rb +44 -91
- data/lib/makit/gitlab_runner.rb +0 -1
- data/lib/makit/humanize.rb +31 -23
- data/lib/makit/indexer.rb +15 -24
- data/lib/makit/logging/configuration.rb +305 -0
- data/lib/makit/logging/format_registry.rb +84 -0
- data/lib/makit/logging/formatters/base.rb +39 -0
- data/lib/makit/logging/formatters/console_formatter.rb +127 -0
- data/lib/makit/logging/formatters/json_formatter.rb +65 -0
- data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -0
- data/lib/makit/logging/formatters/text_formatter.rb +64 -0
- data/lib/makit/logging/log_request.rb +115 -0
- data/lib/makit/logging/logger.rb +159 -0
- data/lib/makit/logging/sinks/base.rb +91 -0
- data/lib/makit/logging/sinks/console.rb +72 -0
- data/lib/makit/logging/sinks/file_sink.rb +92 -0
- data/lib/makit/logging/sinks/structured.rb +129 -0
- data/lib/makit/logging/sinks/unified_file_sink.rb +303 -0
- data/lib/makit/logging.rb +452 -37
- data/lib/makit/markdown.rb +18 -18
- data/lib/makit/mp/basic_object_mp.rb +5 -4
- data/lib/makit/mp/command_mp.rb +5 -5
- data/lib/makit/mp/command_request.mp.rb +3 -2
- data/lib/makit/mp/project_mp.rb +85 -96
- data/lib/makit/mp/string_mp.rb +245 -73
- data/lib/makit/nuget.rb +27 -25
- data/lib/makit/port.rb +25 -27
- data/lib/makit/process.rb +127 -29
- data/lib/makit/protoc.rb +27 -24
- data/lib/makit/rake/cli.rb +196 -0
- data/lib/makit/rake.rb +6 -6
- data/lib/makit/ruby/cli.rb +185 -0
- data/lib/makit/ruby.rb +25 -0
- data/lib/makit/secrets.rb +18 -18
- data/lib/makit/serializer.rb +29 -27
- data/lib/makit/services/builder.rb +186 -0
- data/lib/makit/services/error_handler.rb +226 -0
- data/lib/makit/services/repository_manager.rb +229 -0
- data/lib/makit/services/validator.rb +112 -0
- data/lib/makit/setup/classlib.rb +53 -0
- data/lib/makit/setup/gem.rb +250 -0
- data/lib/makit/setup/runner.rb +40 -0
- data/lib/makit/show.rb +16 -16
- data/lib/makit/storage.rb +32 -37
- data/lib/makit/symbols.rb +12 -0
- data/lib/makit/task_hooks.rb +125 -0
- data/lib/makit/task_info.rb +63 -21
- data/lib/makit/tasks/at_exit.rb +13 -0
- data/lib/makit/tasks/build.rb +18 -0
- data/lib/makit/tasks/clean.rb +11 -0
- data/lib/makit/tasks/hook_manager.rb +239 -0
- data/lib/makit/tasks/init.rb +47 -0
- data/lib/makit/tasks/integrate.rb +15 -0
- data/lib/makit/tasks/pull_incoming.rb +12 -0
- data/lib/makit/tasks/setup.rb +6 -0
- data/lib/makit/tasks/sync.rb +11 -0
- data/lib/makit/tasks/task_monkey_patch.rb +79 -0
- data/lib/makit/tasks.rb +5 -150
- data/lib/makit/test_cache.rb +239 -0
- data/lib/makit/v1/makit.v1_pb.rb +34 -35
- data/lib/makit/v1/makit.v1_services_pb.rb +2 -0
- data/lib/makit/version.rb +1 -60
- data/lib/makit/wix.rb +23 -23
- data/lib/makit/yaml.rb +18 -6
- data/lib/makit.rb +2 -261
- metadata +109 -145
- data/lib/makit/cli/clean.rb +0 -14
- data/lib/makit/cli/clone.rb +0 -59
- data/lib/makit/cli/init.rb +0 -38
- data/lib/makit/cli/make.rb +0 -54
- data/lib/makit/cli/new.rb +0 -37
- data/lib/makit/cli/nuget_cache.rb +0 -38
- data/lib/makit/cli/pull.rb +0 -31
- data/lib/makit/cli/setup.rb +0 -71
- data/lib/makit/cli/work.rb +0 -21
- data/lib/makit/content/default_gitignore.txt +0 -222
data/lib/makit/nuget.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "tmpdir"
|
2
4
|
# This module provides classes for the Makit gem.
|
3
5
|
module Makit
|
@@ -17,56 +19,56 @@ module Makit
|
|
17
19
|
|
18
20
|
def self.cache(package, version)
|
19
21
|
# if the package is already cached, there is nothing to do
|
20
|
-
if
|
21
|
-
Dir.mktmpdir do |dir|
|
22
|
-
# Use the temp directory here
|
23
|
-
Dir.chdir(dir) do
|
24
|
-
system("dotnet new classlib -n ClassLib")
|
25
|
-
Dir.chdir("ClassLib") do
|
22
|
+
return if Dir.exist?(get_cache_dir(package, version))
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
24
|
+
Dir.mktmpdir do |dir|
|
25
|
+
# Use the temp directory here
|
26
|
+
Dir.chdir(dir) do
|
27
|
+
system("dotnet new classlib -n ClassLib")
|
28
|
+
Dir.chdir("ClassLib") do
|
29
|
+
# display a list of directories in the current directory
|
30
|
+
puts Dir.entries(Dir.pwd)
|
31
|
+
# display a list of files in the current directory
|
32
|
+
puts Dir.entries(Dir.pwd)
|
33
|
+
puts "dotnet add ClassLib.csproj package #{package} --version #{version}"
|
34
|
+
system("dotnet add ClassLib.csproj package #{package} --version #{version}")
|
34
35
|
end
|
35
|
-
# The directory and its contents will be removed automatically after the block
|
36
36
|
end
|
37
|
+
# The directory and its contents will be removed automatically after the block
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
40
41
|
def self.clear_cache(package, version)
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
return unless Dir.exist?(get_cache_dir(package, version))
|
43
|
+
|
44
|
+
FileUtils.rm_rf(get_cache_dir(package, version))
|
44
45
|
end
|
45
46
|
|
46
47
|
# get the latest version of the package
|
47
48
|
def self.get_latest_version(package)
|
48
49
|
dir = File.join(Makit::Directories::NUGET_PACKAGE_CACHE, package)
|
49
|
-
if
|
50
|
-
versions = Dir.entries(dir).select
|
51
|
-
|
50
|
+
if Dir.exist?(dir)
|
51
|
+
versions = Dir.entries(dir).select do |entry|
|
52
|
+
File.directory?(File.join(dir, entry)) && ![".", ".."].include?(entry)
|
53
|
+
end
|
54
|
+
highest_version = Makit::Version.get_highest_version(versions)
|
52
55
|
return highest_version
|
53
56
|
end
|
54
57
|
nil
|
55
58
|
end
|
56
59
|
|
57
60
|
# publish a package to a nuget directory feed
|
58
|
-
def self.add_package(
|
61
|
+
def self.add_package(_package, path)
|
59
62
|
system("dotnet nuget push #{path} --source #{path}")
|
60
63
|
end
|
61
64
|
|
62
|
-
def self.publish_to_directory(nuget_package_path,directory,package_name,version)
|
65
|
+
def self.publish_to_directory(nuget_package_path, directory, package_name, version)
|
63
66
|
target_package_path = "#{directory}/#{package_name}/#{version}/#{package_name}.#{version}.nupkg".downcase
|
64
|
-
if
|
67
|
+
if File.exist?(target_package_path)
|
65
68
|
puts " #{target_package_path} already exists".colorize(:grey)
|
66
|
-
else
|
69
|
+
else
|
67
70
|
"dotnet nuget push #{nuget_package_path} --source #{directory}".run
|
68
71
|
end
|
69
72
|
end
|
70
|
-
|
71
73
|
end
|
72
74
|
end
|
data/lib/makit/port.rb
CHANGED
@@ -2,33 +2,31 @@
|
|
2
2
|
|
3
3
|
# This module provides classes for the Makit gem.
|
4
4
|
module Makit
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
5
|
+
# This class provide methods for working with ports
|
6
|
+
#
|
7
|
+
class Port
|
8
|
+
def self.is_port_available?(port)
|
9
|
+
socket = Socket.new(:INET, :STREAM)
|
10
|
+
socket.bind(Socket.sockaddr_in(port, ""))
|
11
|
+
socket.close
|
12
|
+
true # Port is available for use
|
13
|
+
rescue Errno::EADDRINUSE, Errno::EACCES
|
14
|
+
false # Port is not available for use
|
15
|
+
end
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
17
|
+
def self.get_available_port(start_port = 1024, end_port = 65_535)
|
18
|
+
(start_port..end_port).each do |port|
|
19
|
+
return port if is_port_available?(port)
|
20
|
+
end
|
21
|
+
nil # No available port found in the range
|
22
|
+
end
|
25
23
|
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
def self.get_random_port
|
25
|
+
rand(1024..65_535)
|
26
|
+
end
|
29
27
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
28
|
+
def self.get_random_available_port
|
29
|
+
get_available_port(get_random_port)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/makit/process.rb
CHANGED
@@ -1,64 +1,162 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This module provides classes for the Makit gem.
|
2
4
|
module Makit
|
5
|
+
# Cross-platform process management utilities
|
6
|
+
#
|
7
|
+
# This class provides methods for checking, listing, and terminating processes
|
8
|
+
# across different operating systems (Windows, Linux, macOS). It abstracts
|
9
|
+
# platform-specific commands into a unified interface.
|
3
10
|
class Process
|
11
|
+
# Check if a process with the given name is currently running
|
12
|
+
#
|
13
|
+
# Uses platform-specific commands:
|
14
|
+
# - Windows: tasklist command
|
15
|
+
# - Unix: ps command with grep filtering
|
16
|
+
#
|
17
|
+
# @param name [String] Name of the process to check (without .exe extension)
|
18
|
+
# @return [Boolean] True if the process is running, false otherwise
|
4
19
|
def self.is_running?(name)
|
20
|
+
return false if name.nil? || name.strip.empty?
|
21
|
+
|
5
22
|
# provide a cross-platform way to check if a process is running
|
6
|
-
if Makit::Environment.is_windows?
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
23
|
+
results = if Makit::Environment.is_windows?
|
24
|
+
# on windows, use the tasklist command
|
25
|
+
`tasklist /FI "imagename eq #{name}.exe" 2>nul`
|
26
|
+
else
|
27
|
+
# on linux/mac, use the ps command
|
28
|
+
`ps aux | grep "#{name}" | grep -v grep 2>/dev/null`
|
29
|
+
end
|
30
|
+
results.include?(name)
|
15
31
|
end
|
16
32
|
|
17
|
-
#
|
33
|
+
# Terminate all processes that match a given name
|
34
|
+
#
|
35
|
+
# Uses platform-specific termination commands:
|
36
|
+
# - Windows: taskkill command
|
37
|
+
# - Unix: kill command with SIGKILL (-9)
|
18
38
|
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
# an error 'kill: illegal process id: dotnet' is reported
|
39
|
+
# @param name [String] Name of the process(es) to terminate
|
40
|
+
# @return [Array<String>] Array of killed process IDs (empty if none found/killed)
|
22
41
|
def self.kill(name)
|
23
|
-
|
42
|
+
return [] if name.nil? || name.strip.empty?
|
43
|
+
|
44
|
+
killed_pids = []
|
45
|
+
|
24
46
|
if Makit::Environment.is_windows?
|
25
|
-
|
47
|
+
# Windows: Use tasklist to find PIDs first, then kill them
|
48
|
+
begin
|
49
|
+
# Find processes by name
|
50
|
+
tasklist_output = `tasklist /FI "imagename eq #{name}.exe" /FO CSV 2>nul`
|
51
|
+
|
52
|
+
# Parse CSV output to extract PIDs
|
53
|
+
lines = tasklist_output.split("\n")
|
54
|
+
if lines.length > 1 # Skip header line
|
55
|
+
lines[1..].each do |line|
|
56
|
+
parts = line.split(",")
|
57
|
+
next unless parts.length >= 2
|
58
|
+
|
59
|
+
pid = parts[1]&.gsub('"', "")&.strip
|
60
|
+
next unless pid && !pid.empty? && pid.match?(/^\d+$/)
|
61
|
+
|
62
|
+
begin
|
63
|
+
`taskkill /PID #{pid} /F 2>nul`
|
64
|
+
killed_pids << pid
|
65
|
+
rescue StandardError => e
|
66
|
+
# Log error but continue with other processes
|
67
|
+
puts "Failed to kill process #{pid}: #{e.message}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
rescue StandardError => e
|
72
|
+
# If tasklist fails, try direct taskkill by name
|
73
|
+
begin
|
74
|
+
`taskkill /IM "#{name}.exe" /F 2>nul`
|
75
|
+
# Since we can't get PIDs from direct kill, return empty array
|
76
|
+
# but don't raise error
|
77
|
+
rescue StandardError => e2
|
78
|
+
# Both methods failed, return empty array
|
79
|
+
puts "Failed to kill processes by name #{name}: #{e2.message}"
|
80
|
+
end
|
81
|
+
end
|
26
82
|
else
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
83
|
+
# Unix (Linux/Mac): Use pgrep to find PIDs, then kill them
|
84
|
+
begin
|
85
|
+
# Use pgrep to find PIDs, handle both Linux and Mac
|
86
|
+
pids = if Makit::Environment.is_mac?
|
87
|
+
# Mac: pgrep -f might not work the same way
|
88
|
+
`pgrep -x "#{name}" 2>/dev/null`.split("\n").reject(&:empty?)
|
89
|
+
else
|
90
|
+
# Linux: pgrep -f works well
|
91
|
+
`pgrep -f "#{name}" 2>/dev/null`.split("\n").reject(&:empty?)
|
92
|
+
end
|
93
|
+
|
94
|
+
pids.each do |pid|
|
95
|
+
next unless pid.match?(/^\d+$/)
|
96
|
+
|
97
|
+
begin
|
98
|
+
`kill -9 #{pid} 2>/dev/null`
|
99
|
+
killed_pids << pid
|
100
|
+
rescue StandardError => e
|
101
|
+
puts "Failed to kill process #{pid}: #{e.message}"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
rescue StandardError => e
|
105
|
+
# If pgrep fails, return empty array but don't raise error
|
106
|
+
puts "Failed to find processes by name #{name}: #{e.message}"
|
32
107
|
end
|
33
108
|
end
|
109
|
+
|
110
|
+
killed_pids
|
34
111
|
end
|
35
112
|
|
113
|
+
# List all running processes on the system
|
114
|
+
#
|
115
|
+
# Uses platform-specific commands to get a complete process listing:
|
116
|
+
# - Windows: tasklist command
|
117
|
+
# - Unix: ps aux command
|
118
|
+
#
|
119
|
+
# @return [String] Raw output from the system process listing command
|
36
120
|
def self.list
|
37
121
|
if Makit::Environment.is_windows?
|
38
|
-
`tasklist`
|
122
|
+
`tasklist 2>nul`
|
39
123
|
else
|
40
|
-
`ps aux`
|
124
|
+
`ps aux 2>/dev/null`
|
41
125
|
end
|
42
126
|
end
|
43
127
|
|
128
|
+
# List all running processes for the current user
|
129
|
+
#
|
130
|
+
# Filters the process list to show only processes owned by the current user.
|
131
|
+
# Uses platform-specific filtering:
|
132
|
+
# - Windows: tasklist with USERNAME filter
|
133
|
+
# - Unix: ps aux with grep filtering
|
134
|
+
#
|
135
|
+
# @return [String] Raw output from the filtered process listing command
|
44
136
|
def self.list_current_user
|
45
137
|
if Makit::Environment.is_windows?
|
46
|
-
`tasklist /FI "STATUS eq running and USERNAME eq #{Makit::Environment.current_user}"`
|
138
|
+
`tasklist /FI "STATUS eq running and USERNAME eq #{Makit::Environment.current_user}" 2>nul`
|
47
139
|
else
|
48
|
-
`ps aux | grep #{Makit::Environment.current_user} | grep -v grep`
|
140
|
+
`ps aux | grep "#{Makit::Environment.current_user}" | grep -v grep 2>/dev/null`
|
49
141
|
end
|
50
142
|
end
|
51
143
|
|
52
|
-
#
|
53
|
-
#
|
144
|
+
# List processes for the current user filtered by name
|
145
|
+
#
|
146
|
+
# Returns an array of process lines for consistency across platforms.
|
147
|
+
# Filters by both current user and process name.
|
148
|
+
#
|
149
|
+
# @param name [String] Process name to filter by
|
150
|
+
# @return [Array<String>] Array of process lines matching the criteria
|
54
151
|
def self.list_current_user_processes(name)
|
55
152
|
if Makit::Environment.is_windows?
|
56
|
-
`tasklist /FI "STATUS eq running and USERNAME eq #{Makit::Environment.current_user}"`
|
57
153
|
# filter the results to only include the current user
|
58
|
-
results = `tasklist /FI "STATUS eq running and USERNAME eq #{Makit::Environment.current_user}"`
|
154
|
+
results = `tasklist /FI "STATUS eq running and USERNAME eq #{Makit::Environment.current_user}" 2>nul`
|
59
155
|
results.split("\n").select { |line| line.include?(Makit::Environment.current_user) }
|
60
156
|
else
|
61
|
-
|
157
|
+
# Unix (Linux/Mac): return as array for consistency
|
158
|
+
results = `ps aux | grep "#{name}" | grep -v grep 2>/dev/null`
|
159
|
+
results.split("\n").reject(&:empty?)
|
62
160
|
end
|
63
161
|
end
|
64
162
|
end
|
data/lib/makit/protoc.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "pathname"
|
3
4
|
|
4
5
|
# This module provides classes for the Makit gem.
|
@@ -7,23 +8,23 @@ module Makit
|
|
7
8
|
#
|
8
9
|
class Protoc
|
9
10
|
def self.grpc_tools_path
|
10
|
-
File.join(Makit::Directories::NUGET_PACKAGE_CACHE, "grpc.tools", Makit::Protoc
|
11
|
+
File.join(Makit::Directories::NUGET_PACKAGE_CACHE, "grpc.tools", Makit::Protoc.get_latest_grpc_tools_version)
|
11
12
|
end
|
12
13
|
|
13
14
|
def self.grpc_csharp_plugin_path
|
14
|
-
Makit::Protoc
|
15
|
+
Makit::Protoc.find_plugin_path("grpc_csharp_plugin")
|
15
16
|
end
|
17
|
+
|
16
18
|
def self.setup
|
17
|
-
if
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
raise "Nuget package path #{Makit::Directories::NUGET_PACKAGE_CACHE} not found" if !Dir.exist?(Makit::Directories::NUGET_PACKAGE_CACHE)
|
19
|
+
if Dir.exist?(Makit::Directories::NUGET_PACKAGE_CACHE)
|
20
|
+
Makit::NuGet.cache("Grpc.Tools", "2.66.0")
|
21
|
+
unless Dir.exist?(Makit::Directories::NUGET_PACKAGE_CACHE)
|
22
|
+
raise "Nuget package path #{Makit::Directories::NUGET_PACKAGE_CACHE} not found"
|
23
|
+
end
|
23
24
|
|
24
25
|
# test if protoc is installed by running >protoc --version
|
25
26
|
which_protoc = Makit::Environment.which("protoc")
|
26
|
-
if
|
27
|
+
if Makit::Environment.which("protoc").nil?
|
27
28
|
puts " protoc not found, installing...".colorize(:red)
|
28
29
|
"go version".run
|
29
30
|
"go install google.golang.org/protobuf/cmd/protoc-gen-go@latest".run
|
@@ -32,35 +33,37 @@ module Makit
|
|
32
33
|
else
|
33
34
|
puts " protoc found at #{which_protoc}".colorize(:green)
|
34
35
|
end
|
35
|
-
raise "protoc not found"
|
36
|
+
raise "protoc not found" unless Makit::Environment.which("protoc")
|
36
37
|
|
37
|
-
#"git clone https://github.com/googleapis/googleapis.git third_party".run unless File.directory?("third_party/google")
|
38
|
-
puts " grpc_tools_path
|
39
|
-
puts " grpc_csharp_plugin_path
|
38
|
+
# "git clone https://github.com/googleapis/googleapis.git third_party".run unless File.directory?("third_party/google")
|
39
|
+
puts " grpc_tools_path #{Makit::Protoc.grpc_tools_path.to_s.colorize(:green)}"
|
40
|
+
puts " grpc_csharp_plugin_path #{Makit::Protoc.grpc_csharp_plugin_path.to_s.colorize(:green)}"
|
41
|
+
else
|
42
|
+
puts " warning: Nuget package cache directory #{Makit::Directories::NUGET_PACKAGE_CACHE} not found".colorize(:red)
|
43
|
+
puts " warning: Unable to proceed with protoc setup".colorize(:red)
|
40
44
|
end
|
41
45
|
end
|
42
46
|
|
43
47
|
# get the latest version of the grpc.tools package
|
44
48
|
def self.get_latest_grpc_tools_version
|
45
|
-
Makit::NuGet
|
49
|
+
Makit::NuGet.get_latest_version("Grpc.Tools")
|
46
50
|
end
|
47
51
|
|
48
|
-
#GRPC_CSHARP_PLUGIN_PATH = Makit::Protoc::find_plugin_path("grpc_csharp_plugin")
|
52
|
+
# GRPC_CSHARP_PLUGIN_PATH = Makit::Protoc::find_plugin_path("grpc_csharp_plugin")
|
49
53
|
def self.find_plugin_path(plugin_name)
|
50
54
|
# search for a file matching the pattern *grpc_csharp_plugin* in the grpc.tools directory
|
51
55
|
# should match on Windows and Linux
|
52
|
-
if
|
53
|
-
plugin_name = plugin_name + ".exe"
|
54
|
-
end
|
56
|
+
plugin_name += ".exe" if Makit::Environment.is_windows?
|
55
57
|
|
56
58
|
plugin_path = Dir.glob("#{Makit::Directories::GRPC_TOOLS_PATH}/**/#{plugin_name}").first
|
57
59
|
|
58
|
-
raise "Plugin path #{plugin_path} not found"
|
60
|
+
raise "Plugin path #{plugin_path} not found" unless File.exist?(plugin_path)
|
61
|
+
|
59
62
|
plugin_path
|
60
63
|
end
|
61
64
|
|
62
65
|
def self.get_proto_files_from_path(proto_source_dir)
|
63
|
-
proto_files =
|
66
|
+
proto_files = []
|
64
67
|
Dir.chdir(proto_source_dir) do
|
65
68
|
Dir.glob("**/*.proto").each do |proto|
|
66
69
|
proto_files << proto
|
@@ -70,7 +73,7 @@ module Makit
|
|
70
73
|
end
|
71
74
|
|
72
75
|
def self.generate_source_file(proto_filename, language, csharp_output_dir)
|
73
|
-
FileUtils.mkdir_p(csharp_output_dir)
|
76
|
+
FileUtils.mkdir_p(csharp_output_dir)
|
74
77
|
"protoc --#{language}_out=#{csharp_output_dir} #{proto_filename}".run
|
75
78
|
end
|
76
79
|
|
@@ -78,7 +81,7 @@ module Makit
|
|
78
81
|
def self.generate_source_files(proto_source_dir, language, output_dir)
|
79
82
|
debug = false
|
80
83
|
puts "Generating source files for #{language} in #{proto_source_dir} to #{output_dir}" if debug
|
81
|
-
FileUtils.mkdir_p(output_dir)
|
84
|
+
FileUtils.mkdir_p(output_dir)
|
82
85
|
|
83
86
|
path_a = Pathname.new(proto_source_dir)
|
84
87
|
path_b = Pathname.new(output_dir)
|
@@ -88,11 +91,11 @@ module Makit
|
|
88
91
|
Dir.chdir(proto_source_dir) do
|
89
92
|
Dir.glob("**/*.proto").each do |proto|
|
90
93
|
puts "Generating #{proto}" if debug
|
91
|
-
if
|
94
|
+
if language == "csharp"
|
92
95
|
namespace_dir = File.dirname(proto)
|
93
96
|
output_dir = "#{output_relative_path}/#{namespace_dir}"
|
94
97
|
puts "Generating #{proto} in #{output_dir}" if debug
|
95
|
-
FileUtils.mkdir_p(
|
98
|
+
FileUtils.mkdir_p(output_dir.to_s)
|
96
99
|
"protoc --csharp_out=#{output_dir} #{proto}".run
|
97
100
|
else
|
98
101
|
"protoc --#{language}_out=#{output_relative_path} #{proto}".run
|
@@ -0,0 +1,196 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "clamp"
|
4
|
+
|
5
|
+
module Makit
|
6
|
+
module Rake
|
7
|
+
# CLI command for managing rake-related functionality
|
8
|
+
# Command to run rake tasks
|
9
|
+
class RunCommand < Clamp::Command
|
10
|
+
self.description = "Run a rake task in a directory or repository"
|
11
|
+
|
12
|
+
parameter "TARGET", "Directory path or repository URL"
|
13
|
+
parameter "TASK", "Rake task to run"
|
14
|
+
option ["-v", "--verbose"], :flag, "Verbose output"
|
15
|
+
option ["-f", "--fail-fast"], :flag, "Stop on first failure"
|
16
|
+
option ["-j", "--jobs"], "JOBS", "Number of parallel jobs", default: "1"
|
17
|
+
option ["-t", "--trace"], :flag, "Show full backtrace on errors"
|
18
|
+
|
19
|
+
def execute
|
20
|
+
target_path = resolve_target(target)
|
21
|
+
|
22
|
+
signal_usage_error "Target directory does not exist: #{target_path}" unless Dir.exist?(target_path)
|
23
|
+
|
24
|
+
Dir.chdir(target_path) do
|
25
|
+
puts "Running rake task '#{task}' in #{target_path}".colorize(:blue)
|
26
|
+
|
27
|
+
# Build rake command with options
|
28
|
+
rake_cmd = build_rake_command
|
29
|
+
|
30
|
+
# Execute the command
|
31
|
+
result = system(rake_cmd)
|
32
|
+
|
33
|
+
if result
|
34
|
+
puts "Rake task '#{task}' completed successfully".colorize(:green)
|
35
|
+
else
|
36
|
+
puts "Rake task '#{task}' failed".colorize(:red)
|
37
|
+
exit(1)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def resolve_target(target)
|
45
|
+
return handle_repository_target(target) if target.start_with?("http")
|
46
|
+
|
47
|
+
# It's a repository URL, clone or update it
|
48
|
+
|
49
|
+
# It's a local path
|
50
|
+
File.expand_path(target)
|
51
|
+
end
|
52
|
+
|
53
|
+
def handle_repository_target(url)
|
54
|
+
local_path = File.join(
|
55
|
+
Makit::Directories::HOME,
|
56
|
+
"code",
|
57
|
+
"work",
|
58
|
+
Makit::Directories.get_relative_directory(url)
|
59
|
+
)
|
60
|
+
|
61
|
+
if Dir.exist?(local_path)
|
62
|
+
puts "Updating existing repository: #{url}".colorize(:yellow)
|
63
|
+
Dir.chdir(local_path) do
|
64
|
+
"git pull".run
|
65
|
+
end
|
66
|
+
else
|
67
|
+
puts "Cloning repository: #{url}".colorize(:green)
|
68
|
+
`git clone #{url} #{local_path}`
|
69
|
+
end
|
70
|
+
|
71
|
+
local_path
|
72
|
+
end
|
73
|
+
|
74
|
+
def build_rake_command
|
75
|
+
cmd_parts = ["rake", task]
|
76
|
+
|
77
|
+
cmd_parts << "--verbose" if verbose?
|
78
|
+
cmd_parts << "--fail-fast" if fail_fast?
|
79
|
+
cmd_parts << "--jobs" << jobs if jobs != "1"
|
80
|
+
cmd_parts << "--trace" if trace?
|
81
|
+
|
82
|
+
cmd_parts.join(" ")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Command to list available rake tasks
|
87
|
+
class ListCommand < Clamp::Command
|
88
|
+
self.description = "List available rake tasks in a directory or repository"
|
89
|
+
|
90
|
+
parameter "TARGET", "Directory path or repository URL"
|
91
|
+
option ["-a", "--all"], :flag, "Show all tasks including private ones"
|
92
|
+
option ["-p", "--pattern"], "PATTERN", "Filter tasks by pattern"
|
93
|
+
|
94
|
+
def execute
|
95
|
+
target_path = resolve_target(target)
|
96
|
+
|
97
|
+
signal_usage_error "Target directory does not exist: #{target_path}" unless Dir.exist?(target_path)
|
98
|
+
|
99
|
+
Dir.chdir(target_path) do
|
100
|
+
puts "Available rake tasks in #{target_path}:".colorize(:blue)
|
101
|
+
|
102
|
+
# Build rake command to list tasks
|
103
|
+
rake_cmd = "rake --tasks"
|
104
|
+
rake_cmd += " --all" if all?
|
105
|
+
|
106
|
+
# Execute and capture output
|
107
|
+
output = `#{rake_cmd} 2>/dev/null`
|
108
|
+
|
109
|
+
if output.empty?
|
110
|
+
puts "No rake tasks found or Rakefile not present".colorize(:yellow)
|
111
|
+
return
|
112
|
+
end
|
113
|
+
|
114
|
+
# Filter by pattern if specified
|
115
|
+
output = output.lines.select { |line| line.include?(pattern) }.join if pattern
|
116
|
+
|
117
|
+
puts output
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
|
123
|
+
def resolve_target(target)
|
124
|
+
return handle_repository_target(target) if target.start_with?("http")
|
125
|
+
|
126
|
+
# It's a repository URL, clone or update it
|
127
|
+
|
128
|
+
# It's a local path
|
129
|
+
File.expand_path(target)
|
130
|
+
end
|
131
|
+
|
132
|
+
def handle_repository_target(url)
|
133
|
+
local_path = File.join(
|
134
|
+
Makit::Directories::HOME,
|
135
|
+
"code",
|
136
|
+
"work",
|
137
|
+
Makit::Directories.get_relative_directory(url)
|
138
|
+
)
|
139
|
+
|
140
|
+
if Dir.exist?(local_path)
|
141
|
+
puts "Updating existing repository: #{url}".colorize(:yellow)
|
142
|
+
Dir.chdir(local_path) do
|
143
|
+
"git pull".run
|
144
|
+
end
|
145
|
+
else
|
146
|
+
puts "Cloning repository: #{url}".colorize(:green)
|
147
|
+
`git clone #{url} #{local_path}`
|
148
|
+
end
|
149
|
+
|
150
|
+
local_path
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# Command to run rake tasks in repositories (legacy compatibility)
|
155
|
+
class RepositoryCommand < Clamp::Command
|
156
|
+
self.description = "Run a rake task in a repository (legacy command)"
|
157
|
+
|
158
|
+
parameter "URL", "Repository URL"
|
159
|
+
parameter "TASK", "Rake task to run"
|
160
|
+
|
161
|
+
def execute
|
162
|
+
puts "Running rake task '#{task}' in repository: #{url}".colorize(:blue)
|
163
|
+
Makit::Rake.rake_repository(url, task)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
# CLI command for managing rake-related functionality
|
168
|
+
class CliCommand < Clamp::Command
|
169
|
+
self.description = <<~DESC
|
170
|
+
Rake management commands for Makit.
|
171
|
+
|
172
|
+
This command provides utilities for working with Rake tasks, including:
|
173
|
+
- Running rake tasks in repositories
|
174
|
+
- Managing rake task execution
|
175
|
+
- Repository-based rake operations
|
176
|
+
|
177
|
+
Common usage examples:
|
178
|
+
# Run a rake task in a repository
|
179
|
+
makit rake run https://github.com/user/repo test
|
180
|
+
#{" "}
|
181
|
+
# Run a rake task in a local directory
|
182
|
+
makit rake run ./my-project build
|
183
|
+
#{" "}
|
184
|
+
# List available rake tasks in a repository
|
185
|
+
makit rake list https://github.com/user/repo
|
186
|
+
#{" "}
|
187
|
+
# Run rake task with specific options
|
188
|
+
makit rake run ./my-project test --verbose
|
189
|
+
DESC
|
190
|
+
|
191
|
+
subcommand "run", "Run a rake task in a repository or directory", RunCommand
|
192
|
+
subcommand "list", "List available rake tasks", ListCommand
|
193
|
+
subcommand "repository", "Run rake task in a repository", RepositoryCommand
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|