coaster 1.3.28 → 1.3.29

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69a9eb83228b624c93abb0c9a4388db9aefb093e6371c5894db112796be35216
4
- data.tar.gz: e120a8005d27155ad5db3c711085cf69dd946d6521c8e15311b182e0e51290f8
3
+ metadata.gz: cee8914e3be8e12b37a81c3217b8d9725737dd505908db7055727cd6d88ef7e8
4
+ data.tar.gz: 67c6aaec914f4a2ff93b932c575f86d77753b76032ea8e3f369e47500b1c9de1
5
5
  SHA512:
6
- metadata.gz: ac2f5e5d9e93408837d49926609d76b84eeed06f262404fd1c68aeb887782c2a44fd2e8f96374ce9db2b34bf8062640a645157f7d46b0e2bcaa9baaf31d5483f
7
- data.tar.gz: 5795ff40b61e4cba9405d76a8c20d2f7d743f933ec2d7bfaa683668ccfd80b556f4133b23e0039f40a38dabf9b35d19031cbc2456d9447594e42eb002d38563a
6
+ metadata.gz: 38d61efdc28e80bb944cc546da9c139a4aa454c65fe6c61166258e911135125d9c9c92ee6493c71f54cd9055e828590d07344deaa672b7d072054823d4232aa5
7
+ data.tar.gz: 2b2cf7c5738c15875820905b080e35c240b209b0e4a1cc4f454f2f69e46b1e088d55fd96afdb1583d642a1cb5e2ae6dea94cf6bcbc84f2c9a5e69f98cb7c8be2
@@ -0,0 +1,142 @@
1
+ module Coaster
2
+ module Git
3
+ class Repository
4
+ class << self
5
+ def option_parser(options)
6
+ opts = []
7
+
8
+ # multiple options can be passed by set
9
+ options.map do |k, v|
10
+ if v.is_a?(Set)
11
+ v.each {|set_v| opts << [k, set_v]}
12
+ else
13
+ opts << [k, v]
14
+ end
15
+ end
16
+
17
+ parsed = opts.map do |k, v|
18
+ v = case v
19
+ when Hash then v.map{|vk,vv| "#{vk}=#{vv}"}.join(',')
20
+ when Array then v.join(',')
21
+ else v
22
+ end
23
+ v = v.strip
24
+ if k.start_with?('--')
25
+ "#{k}#{v.length > 0 ? "=#{v}" : ''}" # ex, --config-env=<name>=<envvar>
26
+ else
27
+ "#{k} #{v.length > 0 ? "#{v}" : ''}" # ex, -c <name>=<value>
28
+ end
29
+ end
30
+
31
+ parsed.join(' ')
32
+ end
33
+
34
+ def run_cmd(path, command)
35
+ puts "Run command: #{command}"
36
+ stdout, stderr, status = Open3.capture3(command, chdir: path)
37
+ if status.success?
38
+ puts " ↳ success: #{stdout}"
39
+ stdout
40
+ else
41
+ raise "Error executing command: #{command}\n ↳ #{stderr}"
42
+ end
43
+ end
44
+
45
+ def create(path)
46
+ run_cmd(path.split('/')[0..-2].join('/'), "git init #{path}")
47
+ run_cmd(path, "git commit --allow-empty -m 'initial commit'")
48
+ new(path)
49
+ end
50
+ end
51
+
52
+ attr_reader :path
53
+
54
+ def initialize(path)
55
+ @path = path
56
+ @sha = current_sha
57
+ end
58
+
59
+ def run_cmd(command)
60
+ self.class.run_cmd(path, command)
61
+ end
62
+
63
+ def run_git_cmd(command, **options)
64
+ cmd = "git #{self.class.option_parser(options)} #{command}"
65
+ run_cmd(cmd)
66
+ end
67
+
68
+ def add!
69
+ run_git_cmd('add .')
70
+ end
71
+
72
+ def commit!(message)
73
+ run_git_cmd("commit -m \"#{message}\"")
74
+ end
75
+
76
+ def branch!(name)
77
+ run_git_cmd("branch #{name}")
78
+ end
79
+
80
+ def checkout!(name)
81
+ run_git_cmd("checkout #{name}")
82
+ end
83
+
84
+ def submodule_add!(path, url, git_options: {})
85
+ run_git_cmd("submodule add #{url} #{path}", **git_options)
86
+ end
87
+
88
+ def submodule_init!(path)
89
+ run_git_cmd("submodule init #{path}")
90
+ end
91
+
92
+ def submodule_update!(*paths, options: {})
93
+ run_git_cmd("submodule update #{self.class.option_parser(options)} #{paths.join(' ')}")
94
+ end
95
+
96
+ def current_sha
97
+ run_git_cmd('rev-parse HEAD').strip
98
+ end
99
+
100
+ def submodule_paths
101
+ @submodule_paths ||= run_git_cmd('submodule status --recursive').split("\n").map do |line|
102
+ line.split(' ')[1]
103
+ end
104
+ end
105
+
106
+ def submodules
107
+ @submodules ||= submodule_paths.map do |path|
108
+ [path, Git::Repository.new(File.join(@path, path))]
109
+ end.to_h
110
+ end
111
+
112
+ def merge(pointer)
113
+ pointers = pointers(pointer).join(',')
114
+ puts "#{path} merged deploy, #{pointers}"
115
+ run_git_cmd("merge #{pointer} --commit -m \"merged deploy, #{pointers}\"")
116
+ end
117
+
118
+ def submodule_sha(path, pointer: nil)
119
+ pointer ||= @sha
120
+ run_git_cmd("ls-tree #{pointer} #{path}").split(' ')[2]
121
+ end
122
+
123
+ def deep_merge(pointer)
124
+ submodules.values.each do |submodule|
125
+ sm_sha = submodule_sha(submodule.path, pointer: pointer)
126
+ submodule.merge(sm_sha)
127
+ end
128
+ merge(pointer)
129
+ end
130
+
131
+ def pointers(sha)
132
+ run_git_cmd("branch --contains #{sha}").split("\n").map do |br|
133
+ (br.start_with?('*') ? br[2..-1] : br).strip
134
+ end
135
+ end
136
+
137
+ def remove
138
+ self.class.run_cmd(path.split('/')[0..-2].join('/'), "rm -rf #{path}")
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,9 @@
1
+ require 'open3'
2
+
3
+ module Coaster
4
+ module Git
5
+
6
+ end
7
+ end
8
+
9
+ require 'coaster/git/repository'
@@ -1,3 +1,3 @@
1
1
  module Coaster
2
- VERSION = '1.3.28'
2
+ VERSION = '1.3.29'
3
3
  end
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 'translation missing: en.class.Coaster.NotTranslated.self', NotTranslated._translate
27
+ assert_equal 'Translation missing: en.class.Coaster.NotTranslated.self', NotTranslated._translate
28
28
  end
29
29
 
30
30
  def test_fallback
@@ -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 "translation missing: en.no.translation (Coaster::TestStandardError::UntitledError)", e.to_s
68
- assert_equal "translation missing: en.no.translation (Coaster::TestStandardError::UntitledError)", e.message
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 'translation missing: en.no.translation', e._translate
72
- assert_equal "translation missing: en.no.translation", e.user_message
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.28
4
+ version: 1.3.29
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-05-02 00:00:00.000000000 Z
11
+ date: 2023-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -197,6 +197,8 @@ files:
197
197
  - lib/coaster/core_ext/standard_error.rb
198
198
  - lib/coaster/core_ext/standard_error/raven.rb
199
199
  - lib/coaster/core_ext/standard_error/sentry.rb
200
+ - lib/coaster/git.rb
201
+ - lib/coaster/git/repository.rb
200
202
  - lib/coaster/rails_ext.rb
201
203
  - lib/coaster/rails_ext/backtrace_cleaner.rb
202
204
  - lib/coaster/safe_yaml_serializer.rb
@@ -207,6 +209,7 @@ files:
207
209
  - test/support/models.rb
208
210
  - test/support/schema.rb
209
211
  - test/test_backtrace.rb
212
+ - test/test_git.rb
210
213
  - test/test_helper.rb
211
214
  - test/test_month.rb
212
215
  - test/test_object_translation.rb
@@ -241,6 +244,7 @@ test_files:
241
244
  - test/support/models.rb
242
245
  - test/support/schema.rb
243
246
  - test/test_backtrace.rb
247
+ - test/test_git.rb
244
248
  - test/test_helper.rb
245
249
  - test/test_month.rb
246
250
  - test/test_object_translation.rb