coaster 1.3.28 → 1.3.30
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/bin/coaster +13 -0
- data/lib/coaster/git/repository.rb +150 -0
- data/lib/coaster/git.rb +9 -0
- data/lib/coaster/version.rb +1 -1
- data/test/test_git.rb +56 -0
- data/test/test_object_translation.rb +1 -1
- data/test/test_standard_error.rb +4 -4
- metadata +12 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: aac619d5b87a41007fed3589618ba253e33307659e17aa689d06898e9a11042b
|
|
4
|
+
data.tar.gz: 362d24aedcb8cd9c462a50b059bb51ec7ba65dfee97d8a26dab85a3a2ab46035
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c19b75ef110edf238f8423add0213c37f3f88a9d3f3442a6fc9b368acfa48603d6c7beed391ac5802983b9e0d92e930d69014847dd6c8e7e082e73d34f9c73e2
|
|
7
|
+
data.tar.gz: 6a756b8db4c72bb2aa6b91a59fe94e98acc895c8263bf751a08661da0abf1d92bf1b68602ead812fcacfd751a13654c7672d681a6a360cb29d871de8ff22b43b
|
data/bin/coaster
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'coaster'
|
|
4
|
+
require 'coaster/git'
|
|
5
|
+
|
|
6
|
+
command = ARGV.shift
|
|
7
|
+
if command == 'git'
|
|
8
|
+
repo = Git::Repository.new(Dir.pwd)
|
|
9
|
+
subcommand = ARGV.shift
|
|
10
|
+
repo.send(subcommand, *ARGV)
|
|
11
|
+
else
|
|
12
|
+
puts "Unknown command: #{command}"
|
|
13
|
+
end
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
module Coaster
|
|
2
|
+
module Git
|
|
3
|
+
class Repository
|
|
4
|
+
class << self
|
|
5
|
+
def option_parser(options)
|
|
6
|
+
case options
|
|
7
|
+
when Hash then hash_option_parser(options)
|
|
8
|
+
when Array, Set then options.map{|o| option_parser(o)}.join(' ')
|
|
9
|
+
else options
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def hash_option_parser(options)
|
|
14
|
+
opts = []
|
|
15
|
+
|
|
16
|
+
# multiple options can be passed by set
|
|
17
|
+
options.map do |k, v|
|
|
18
|
+
if v.is_a?(Set)
|
|
19
|
+
v.each {|set_v| opts << [k, set_v]}
|
|
20
|
+
else
|
|
21
|
+
opts << [k, v]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
parsed = opts.map do |k, v|
|
|
26
|
+
v = case v
|
|
27
|
+
when Hash then v.map{|vk,vv| "#{vk}=#{vv}"}.join(',')
|
|
28
|
+
when Array then v.join(',')
|
|
29
|
+
else v || ''
|
|
30
|
+
end
|
|
31
|
+
v = v.strip
|
|
32
|
+
if k.start_with?('--')
|
|
33
|
+
"#{k}#{v.length > 0 ? "=#{v}" : ''}" # ex, --config-env=<name>=<envvar>
|
|
34
|
+
else
|
|
35
|
+
"#{k} #{v.length > 0 ? "#{v}" : ''}" # ex, -c <name>=<value>
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
parsed.join(' ')
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def run_cmd(path, command)
|
|
43
|
+
puts "Run command: #{command}"
|
|
44
|
+
stdout, stderr, status = Open3.capture3(command, chdir: path)
|
|
45
|
+
if status.success?
|
|
46
|
+
puts " ↳ success: #{stdout}"
|
|
47
|
+
stdout
|
|
48
|
+
else
|
|
49
|
+
raise "Error executing command: #{command}\n ↳ #{stderr}"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def create(path)
|
|
54
|
+
run_cmd(path.split('/')[0..-2].join('/'), "git init #{path}")
|
|
55
|
+
run_cmd(path, "git commit --allow-empty -m 'initial commit'")
|
|
56
|
+
new(path)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
attr_reader :path
|
|
61
|
+
|
|
62
|
+
def initialize(path)
|
|
63
|
+
@path = path
|
|
64
|
+
@sha = current_sha
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def run_cmd(command)
|
|
68
|
+
self.class.run_cmd(path, command)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def run_git_cmd(command, *options)
|
|
72
|
+
cmd = "git #{self.class.option_parser(options)} #{command}"
|
|
73
|
+
run_cmd(cmd)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def add!
|
|
77
|
+
run_git_cmd('add .')
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def commit!(message)
|
|
81
|
+
run_git_cmd("commit -m \"#{message}\"")
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def branch!(name)
|
|
85
|
+
run_git_cmd("branch #{name}")
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def checkout!(name)
|
|
89
|
+
run_git_cmd("checkout #{name}")
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def submodule_add!(path, url, git_options: {})
|
|
93
|
+
run_git_cmd("submodule add #{url} #{path}", **git_options)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def submodule_init!(path)
|
|
97
|
+
run_git_cmd("submodule init #{path}")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def submodule_update!(*paths, options: {})
|
|
101
|
+
run_git_cmd("submodule update #{self.class.option_parser(options)} #{paths.join(' ')}")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def current_sha
|
|
105
|
+
run_git_cmd('rev-parse HEAD').strip
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def submodule_paths
|
|
109
|
+
@submodule_paths ||= run_git_cmd('submodule status --recursive').split("\n").map do |line|
|
|
110
|
+
line.split(' ')[1]
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def submodules
|
|
115
|
+
@submodules ||= submodule_paths.map do |path|
|
|
116
|
+
[path, Git::Repository.new(File.join(@path, path))]
|
|
117
|
+
end.to_h
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def merge(pointer)
|
|
121
|
+
pointers = pointers(pointer).join(',')
|
|
122
|
+
puts "#{path} merged deploy, #{pointers}"
|
|
123
|
+
run_git_cmd("merge #{pointer} --commit -m \"merged deploy, #{pointers}\"")
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def submodule_sha(path, pointer: nil)
|
|
127
|
+
pointer ||= @sha
|
|
128
|
+
run_git_cmd("ls-tree #{pointer} #{path}").split(' ')[2]
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def deep_merge(pointer)
|
|
132
|
+
submodules.values.each do |submodule|
|
|
133
|
+
sm_sha = submodule_sha(submodule.path, pointer: pointer)
|
|
134
|
+
submodule.merge(sm_sha)
|
|
135
|
+
end
|
|
136
|
+
merge(pointer)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def pointers(sha)
|
|
140
|
+
run_git_cmd("branch --contains #{sha}").split("\n").map do |br|
|
|
141
|
+
(br.start_with?('*') ? br[2..-1] : br).strip
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def remove
|
|
146
|
+
self.class.run_cmd(path.split('/')[0..-2].join('/'), "rm -rf #{path}")
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
data/lib/coaster/git.rb
ADDED
data/lib/coaster/version.rb
CHANGED
data/test/test_git.rb
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'minitest/autorun'
|
|
3
|
+
require 'coaster/git'
|
|
4
|
+
|
|
5
|
+
module Coaster
|
|
6
|
+
class TestGit < Minitest::Test
|
|
7
|
+
def setup
|
|
8
|
+
super
|
|
9
|
+
@test_repo_root = File.expand_path('../../tmp/test_repo', __FILE__)
|
|
10
|
+
FileUtils.rm_rf(@test_repo_root)
|
|
11
|
+
FileUtils.mkdir_p(@test_repo_root)
|
|
12
|
+
@beta = Git::Repository.create(File.join(@test_repo_root, 'beta'))
|
|
13
|
+
@beta.run_cmd('echo "hello beta" > README.md')
|
|
14
|
+
@beta.run_git_cmd('add .')
|
|
15
|
+
@beta.run_git_cmd('commit -m "hello"')
|
|
16
|
+
@beta.branch!('beta_feature')
|
|
17
|
+
@beta.checkout!('beta_feature')
|
|
18
|
+
@beta.run_cmd('echo "beta_feature" >> README.md')
|
|
19
|
+
@beta.run_git_cmd('add .')
|
|
20
|
+
@beta.run_git_cmd('commit -m "beta_feature"')
|
|
21
|
+
@beta.run_git_cmd('checkout main')
|
|
22
|
+
|
|
23
|
+
@alpha = Git::Repository.create(File.join(@test_repo_root, 'alpha'))
|
|
24
|
+
@alpha.submodule_add!('sb/beta', @beta.path, git_options: {'-c' => {'protocol.file.allow' => 'always'}})
|
|
25
|
+
@alpha.submodule_update!('sb/beta')
|
|
26
|
+
@alpha.run_cmd('echo "hello alpha" > README.md')
|
|
27
|
+
@alpha.run_git_cmd('add .')
|
|
28
|
+
@alpha.run_git_cmd('commit -m "hello"')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def teardown
|
|
32
|
+
FileUtils.rm_rf(@test_repo_root)
|
|
33
|
+
super
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_git_deep_merge
|
|
37
|
+
assert_equal "hello alpha\n", @alpha.run_cmd('cat README.md')
|
|
38
|
+
assert_equal "hello beta\n", @alpha.run_cmd('cat sb/beta/README.md')
|
|
39
|
+
|
|
40
|
+
@alpha.branch!('alpha_feature')
|
|
41
|
+
@alpha.checkout!('alpha_feature')
|
|
42
|
+
@alpha.run_cmd('echo "alpha_feature" >> README.md')
|
|
43
|
+
@alpha.submodules['sb/beta'].run_git_cmd('checkout beta_feature')
|
|
44
|
+
@alpha.run_git_cmd('add .')
|
|
45
|
+
@alpha.run_git_cmd('commit -m "alpha_feature"')
|
|
46
|
+
assert_equal "README.md\nsb/beta\n", @alpha.run_git_cmd('diff --name-only HEAD~1 HEAD')
|
|
47
|
+
|
|
48
|
+
@alpha.checkout!('main')
|
|
49
|
+
@alpha.submodule_update!
|
|
50
|
+
assert_equal "hello beta\n", @alpha.run_cmd('cat sb/beta/README.md')
|
|
51
|
+
@alpha.deep_merge('alpha_feature')
|
|
52
|
+
assert_equal "hello alpha\nalpha_feature\n", @alpha.run_cmd('cat README.md')
|
|
53
|
+
assert_equal "hello beta\nbeta_feature\n", @alpha.run_cmd('cat sb/beta/README.md')
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -24,7 +24,7 @@ module Coaster
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def test_translation_missing
|
|
27
|
-
assert_equal '
|
|
27
|
+
assert_equal 'Translation missing: en.class.Coaster.NotTranslated.self', NotTranslated._translate
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def test_fallback
|
data/test/test_standard_error.rb
CHANGED
|
@@ -64,12 +64,12 @@ module Coaster
|
|
|
64
64
|
assert_equal 'user message', e.user_message
|
|
65
65
|
assert_equal 'standard error title', e.title
|
|
66
66
|
e = UntitledError.new(tkey: 'no.translation')
|
|
67
|
-
assert_equal "
|
|
68
|
-
assert_equal "
|
|
67
|
+
assert_equal "Translation missing: en.no.translation (Coaster::TestStandardError::UntitledError)", e.to_s
|
|
68
|
+
assert_equal "Translation missing: en.no.translation (Coaster::TestStandardError::UntitledError)", e.message
|
|
69
69
|
assert_nil e.description
|
|
70
70
|
assert_nil e.desc
|
|
71
|
-
assert_equal '
|
|
72
|
-
assert_equal "
|
|
71
|
+
assert_equal 'Translation missing: en.no.translation', e._translate
|
|
72
|
+
assert_equal "Translation missing: en.no.translation", e.user_message
|
|
73
73
|
assert_equal 'standard error title', e.title
|
|
74
74
|
end
|
|
75
75
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: coaster
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.3.
|
|
4
|
+
version: 1.3.30
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- buzz jung
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-06-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: oj
|
|
@@ -180,13 +180,15 @@ dependencies:
|
|
|
180
180
|
version: '0'
|
|
181
181
|
description: Ruby Core Extensions
|
|
182
182
|
email: buzz@frograms.com
|
|
183
|
-
executables:
|
|
183
|
+
executables:
|
|
184
|
+
- coaster
|
|
184
185
|
extensions: []
|
|
185
186
|
extra_rdoc_files: []
|
|
186
187
|
files:
|
|
187
188
|
- LICENSE
|
|
188
189
|
- README.md
|
|
189
190
|
- Rakefile
|
|
191
|
+
- bin/coaster
|
|
190
192
|
- lib/coaster.rb
|
|
191
193
|
- lib/coaster/core_ext.rb
|
|
192
194
|
- lib/coaster/core_ext/array.rb
|
|
@@ -197,6 +199,8 @@ files:
|
|
|
197
199
|
- lib/coaster/core_ext/standard_error.rb
|
|
198
200
|
- lib/coaster/core_ext/standard_error/raven.rb
|
|
199
201
|
- lib/coaster/core_ext/standard_error/sentry.rb
|
|
202
|
+
- lib/coaster/git.rb
|
|
203
|
+
- lib/coaster/git/repository.rb
|
|
200
204
|
- lib/coaster/rails_ext.rb
|
|
201
205
|
- lib/coaster/rails_ext/backtrace_cleaner.rb
|
|
202
206
|
- lib/coaster/safe_yaml_serializer.rb
|
|
@@ -207,6 +211,7 @@ files:
|
|
|
207
211
|
- test/support/models.rb
|
|
208
212
|
- test/support/schema.rb
|
|
209
213
|
- test/test_backtrace.rb
|
|
214
|
+
- test/test_git.rb
|
|
210
215
|
- test/test_helper.rb
|
|
211
216
|
- test/test_month.rb
|
|
212
217
|
- test/test_object_translation.rb
|
|
@@ -216,7 +221,9 @@ files:
|
|
|
216
221
|
homepage: http://github.com/frograms/coaster
|
|
217
222
|
licenses:
|
|
218
223
|
- MIT
|
|
219
|
-
metadata:
|
|
224
|
+
metadata:
|
|
225
|
+
source_code_uri: https://github.com/frograms/coaster
|
|
226
|
+
bug_tracker_uri: https://github.com/frograms/coaster/issues
|
|
220
227
|
post_install_message:
|
|
221
228
|
rdoc_options: []
|
|
222
229
|
require_paths:
|
|
@@ -241,6 +248,7 @@ test_files:
|
|
|
241
248
|
- test/support/models.rb
|
|
242
249
|
- test/support/schema.rb
|
|
243
250
|
- test/test_backtrace.rb
|
|
251
|
+
- test/test_git.rb
|
|
244
252
|
- test/test_helper.rb
|
|
245
253
|
- test/test_month.rb
|
|
246
254
|
- test/test_object_translation.rb
|