avm-tools 0.52.0 → 0.53.0
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/lib/avm/git/issue/complete/_commits.rb +1 -4
- data/lib/avm/git/issue/complete/_local_branch.rb +4 -7
- data/lib/avm/git/issue/complete/_push.rb +1 -1
- data/lib/avm/git/issue/complete/_working_tree.rb +1 -1
- data/lib/avm/git/subrepo_check.rb +39 -0
- data/lib/avm/git/subrepo_check/parent.rb +51 -0
- data/lib/avm/git/subrepo_check/remote.rb +89 -0
- data/lib/avm/git/subrepo_check/show_result.rb +33 -0
- data/lib/avm/git/subrepo_checks.rb +59 -0
- data/lib/avm/result.rb +13 -3
- data/lib/avm/tools/runner/git/subrepo.rb +22 -0
- data/lib/avm/tools/runner/git/subrepo/check.rb +47 -0
- data/lib/avm/tools/version.rb +1 -1
- data/lib/eac_launcher/git/base.rb +10 -26
- data/vendor/gems/eac_git/Gemfile +5 -0
- data/vendor/gems/eac_git/eac_git.gemspec +19 -0
- data/vendor/gems/eac_git/lib/eac_git.rb +7 -0
- data/vendor/gems/eac_git/lib/eac_git/executables.rb +24 -0
- data/vendor/gems/eac_git/lib/eac_git/local.rb +57 -0
- data/vendor/gems/eac_git/lib/eac_git/local/subrepo.rb +48 -0
- data/vendor/gems/eac_git/lib/eac_git/local/subrepo/config.rb +43 -0
- data/vendor/gems/eac_git/lib/eac_git/remote.rb +19 -0
- data/vendor/gems/eac_git/lib/eac_git/remote/ls_result.rb +20 -0
- data/vendor/gems/eac_git/lib/eac_git/version.rb +5 -0
- data/vendor/gems/eac_git/spec/rubocop_spec.rb +7 -0
- data/vendor/gems/eac_git/spec/spec_helper.rb +100 -0
- metadata +35 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f84588df0d4cd0ec0d2140c037681209a2d20ad2631dced23607886bef8d18f5
|
4
|
+
data.tar.gz: 9f2fbd2b970e79076c229d536e5b764d096688b51ef9d4d22646ad7a1b33ff6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3bfad35dd4309a96a5a8f61b97cb1ba84203fd3ae20aac14394d6366269af231f8a50cafe8b9d9bb38c10fddd28dace0309738ef14d59ef64c2381faa166b5ff
|
7
|
+
data.tar.gz: 2eebd6a5654e278c8131630f500568ae6d4cf5f92f9eae4108b9ea497b3c229c539acc6f6c1dc6904109bcd2bdf4505f86682e0af3098503649bb7c6be8c13aa
|
@@ -19,13 +19,13 @@ module Avm
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def branch_name_result
|
22
|
-
::Avm::Result.success_or_error(
|
22
|
+
::Avm::Result.success_or_error(issue_id.present?, branch_name)
|
23
23
|
end
|
24
24
|
|
25
25
|
def branch_hash_result
|
26
26
|
::Avm::Result.success_or_error(
|
27
|
-
branch_hash
|
28
|
-
branch_hash
|
27
|
+
branch_hash.present?,
|
28
|
+
branch_hash
|
29
29
|
)
|
30
30
|
end
|
31
31
|
|
@@ -33,10 +33,7 @@ module Avm
|
|
33
33
|
return ::Avm::Result.neutral('No branch hash') unless branch_hash
|
34
34
|
|
35
35
|
r = follow_master?
|
36
|
-
::Avm::Result.success_or_error(
|
37
|
-
r ? 'yes' : 'no',
|
38
|
-
r
|
39
|
-
)
|
36
|
+
::Avm::Result.success_or_error(r, 'yes', 'no')
|
40
37
|
end
|
41
38
|
|
42
39
|
def follow_master?
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_launcher/git/base'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module Avm
|
7
|
+
module Git
|
8
|
+
class SubrepoCheck
|
9
|
+
require_sub __FILE__, include_modules: true
|
10
|
+
enable_console_speaker
|
11
|
+
enable_simple_cache
|
12
|
+
|
13
|
+
BLANK_TEXT = 'BLANK'
|
14
|
+
|
15
|
+
common_constructor :subrepo, :options
|
16
|
+
|
17
|
+
def blank_text
|
18
|
+
BLANK_TEXT
|
19
|
+
end
|
20
|
+
|
21
|
+
def check_remote?
|
22
|
+
options.fetch(:check_remote) ? true : false
|
23
|
+
end
|
24
|
+
|
25
|
+
def fix_parent?
|
26
|
+
options.fetch(:fix_parent) ? true : false
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def result_uncached
|
32
|
+
return ::Avm::Result.error('Parent failed') if parent_result.error?
|
33
|
+
return ::Avm::Result.error('Remote failed') if remote_result.error?
|
34
|
+
|
35
|
+
::Avm::Result.success('Parent and remote ok')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/result'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module Avm
|
7
|
+
module Git
|
8
|
+
class SubrepoCheck
|
9
|
+
module Parent
|
10
|
+
def fix_parent
|
11
|
+
return if parent_result.success?
|
12
|
+
|
13
|
+
info(' Fixing...')
|
14
|
+
self.parent_hash = expected_parent_hash
|
15
|
+
info_banner
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def expected_parent_hash_uncached
|
21
|
+
subrepo.local.rev_parse("#{last_file_change_rev}^")
|
22
|
+
end
|
23
|
+
|
24
|
+
def last_file_change_rev
|
25
|
+
subrepo.local.command('log', '-n', '1', '--pretty=format:%H', '--',
|
26
|
+
subrepo.config_relative_path.to_path).execute!.strip
|
27
|
+
end
|
28
|
+
|
29
|
+
def parent_hash
|
30
|
+
subrepo.parent_commit_id
|
31
|
+
end
|
32
|
+
|
33
|
+
def parent_hash=(new_hash)
|
34
|
+
subrepo.config.parent_commit_id = new_hash
|
35
|
+
subrepo.write_config
|
36
|
+
end
|
37
|
+
|
38
|
+
def parent_hash_ok?
|
39
|
+
return false if expected_parent_hash.blank? || parent_hash.blank?
|
40
|
+
|
41
|
+
expected_parent_hash == parent_hash
|
42
|
+
end
|
43
|
+
|
44
|
+
def parent_result_uncached
|
45
|
+
::Avm::Result.success_or_error(parent_hash_ok?,
|
46
|
+
parent_hash.presence || blank_text)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/result'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module Avm
|
7
|
+
module Git
|
8
|
+
class SubrepoCheck
|
9
|
+
module Remote
|
10
|
+
private
|
11
|
+
|
12
|
+
def fetch_uncached
|
13
|
+
subrepo.command('clean').execute!
|
14
|
+
subrepo.command('fetch').execute!
|
15
|
+
end
|
16
|
+
|
17
|
+
def check_remote_disabled?
|
18
|
+
!check_remote?
|
19
|
+
end
|
20
|
+
|
21
|
+
def check_remote_disabled_result
|
22
|
+
::Avm::Result.neutral('Check remote disabled')
|
23
|
+
end
|
24
|
+
|
25
|
+
def local_descend_remote?
|
26
|
+
local_id.present? && remote_id.present? && subrepo.local.descendant?(local_id, remote_id)
|
27
|
+
end
|
28
|
+
|
29
|
+
def local_descend_remote_result
|
30
|
+
::Avm::Result.pending(remote_result_value)
|
31
|
+
end
|
32
|
+
|
33
|
+
def local_id_uncached
|
34
|
+
fetch
|
35
|
+
subrepo.command('branch', '--force').execute!
|
36
|
+
subrepo.local.rev_parse("subrepo/#{subrepo.subpath}")
|
37
|
+
end
|
38
|
+
|
39
|
+
def remote_descend_local?
|
40
|
+
local_id.present? && remote_id.present? && subrepo.local.descendant?(remote_id, local_id)
|
41
|
+
end
|
42
|
+
|
43
|
+
def remote_descend_local_result
|
44
|
+
::Avm::Result.outdated(remote_result_value)
|
45
|
+
end
|
46
|
+
|
47
|
+
def remote_branches
|
48
|
+
['', 'refs/heads/', 'refs/tags/'].map { |prefix| "#{prefix}#{subrepo.remote_branch}" }
|
49
|
+
end
|
50
|
+
|
51
|
+
def remote_id_uncached
|
52
|
+
ls_result = subrepo.remote.ls
|
53
|
+
remote_branches.each do |b|
|
54
|
+
return ls_result[b] if ls_result[b].present?
|
55
|
+
end
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def remote_result_uncached
|
60
|
+
%w[check_remote_disabled same_ids local_descend_remote remote_descend_local]
|
61
|
+
.each do |condition|
|
62
|
+
return send("#{condition}_result") if send("#{condition}?")
|
63
|
+
end
|
64
|
+
|
65
|
+
::Avm::Result.error(remote_result_value)
|
66
|
+
end
|
67
|
+
|
68
|
+
def remote_result_value
|
69
|
+
local_s = local_id.presence || blank_text
|
70
|
+
remote_s = remote_id.presence || blank_text
|
71
|
+
|
72
|
+
if local_s == remote_s
|
73
|
+
"[L/R=#{local_s}]"
|
74
|
+
else
|
75
|
+
"[L=#{local_s}, R=#{remote_s}]"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def same_ids?
|
80
|
+
local_id.present? && remote_id.present? && local_id == remote_id
|
81
|
+
end
|
82
|
+
|
83
|
+
def same_ids_result
|
84
|
+
::Avm::Result.success(remote_result_value)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_launcher/git/base'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module Avm
|
7
|
+
module Git
|
8
|
+
class SubrepoCheck
|
9
|
+
module ShowResult
|
10
|
+
def show_result
|
11
|
+
out(subrepo.subpath.to_path.cyan)
|
12
|
+
out_attr('parent', parent_result.label)
|
13
|
+
run_fix_parent
|
14
|
+
out_attr('remote', remote_result.label)
|
15
|
+
out("\n")
|
16
|
+
end
|
17
|
+
|
18
|
+
def run_fix_parent
|
19
|
+
return unless fix_parent?
|
20
|
+
return unless parent_result.error?
|
21
|
+
|
22
|
+
out('|Fixing...'.white)
|
23
|
+
self.parent_hash = expected_parent_hash
|
24
|
+
out_attr('new parent', parent_result.label)
|
25
|
+
end
|
26
|
+
|
27
|
+
def out_attr(key, value)
|
28
|
+
out('|' + "#{key}=".white + value)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_launcher/git/base'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module Avm
|
7
|
+
module Git
|
8
|
+
class SubrepoChecks
|
9
|
+
enable_console_speaker
|
10
|
+
enable_simple_cache
|
11
|
+
attr_accessor :check_remote, :fix_parent
|
12
|
+
common_constructor :repository
|
13
|
+
|
14
|
+
def add_all_subrepos
|
15
|
+
add_subrepos(
|
16
|
+
*repository.command('subrepo', '-q', 'status').execute!.split("\n").map(&:strip)
|
17
|
+
.select(&:present?)
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_subrepos(*subpath_list)
|
22
|
+
subpath_list.each do |subpath|
|
23
|
+
subpaths.add(subpath)
|
24
|
+
end
|
25
|
+
reset_cache
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def check_options
|
30
|
+
{ fix_parent: fix_parent, check_remote: check_remote }
|
31
|
+
end
|
32
|
+
|
33
|
+
def show_result
|
34
|
+
checks.each(&:show_result)
|
35
|
+
infov 'Result', result.label
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def checks_uncached
|
41
|
+
subpaths.map do |subpath|
|
42
|
+
::Avm::Git::SubrepoCheck.new(repository.subrepo(subpath), check_options)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def result_uncached
|
47
|
+
error_count = checks.count { |check| check.result.error? }
|
48
|
+
::Avm::Result.success_or_error(
|
49
|
+
error_count.zero?,
|
50
|
+
"#{error_count} of #{checks.count} subrepos failed"
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
def subpaths
|
55
|
+
@subpaths ||= ::Set.new
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/avm/result.rb
CHANGED
@@ -2,12 +2,13 @@
|
|
2
2
|
|
3
3
|
require 'colorized_string'
|
4
4
|
require 'eac_ruby_utils/listable'
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
5
6
|
|
6
7
|
module Avm
|
7
8
|
class Result < ::SimpleDelegator
|
8
9
|
include ::EacRubyUtils::Listable
|
9
10
|
|
10
|
-
lists.add_string :type, :success, :error, :neutral
|
11
|
+
lists.add_string :type, :success, :error, :neutral, :pending, :outdated
|
11
12
|
|
12
13
|
lists.type.values.each do |type| # rubocop:disable Style/HashEachMethods
|
13
14
|
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
|
@@ -20,10 +21,19 @@ module Avm
|
|
20
21
|
TYPE_SUCCESS_COLOR = 'green'
|
21
22
|
TYPE_ERROR_COLOR = 'red'
|
22
23
|
TYPE_NEUTRAL_COLOR = 'light_black'
|
24
|
+
TYPE_PENDING_COLOR = 'yellow'
|
25
|
+
TYPE_OUTDATED_COLOR = 'blue'
|
23
26
|
|
24
27
|
class << self
|
25
|
-
|
26
|
-
|
28
|
+
# Return Avm::Result.success(success_value) if +success+ is truthy.
|
29
|
+
# Return Avm::Result.error(error_value || success_value) if +success+ is falsely.
|
30
|
+
# @return [Avm::Result]
|
31
|
+
def success_or_error(success, success_value, error_value = nil)
|
32
|
+
if success
|
33
|
+
self.success(success_value)
|
34
|
+
else
|
35
|
+
error(error_value.presence || success_value)
|
36
|
+
end
|
27
37
|
end
|
28
38
|
end
|
29
39
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_cli/default_runner'
|
4
|
+
require 'eac_ruby_utils/console/docopt_runner'
|
5
|
+
|
6
|
+
module Avm
|
7
|
+
module Tools
|
8
|
+
class Runner < ::EacRubyUtils::Console::DocoptRunner
|
9
|
+
class Git < ::EacRubyUtils::Console::DocoptRunner
|
10
|
+
class Subrepo < ::EacRubyUtils::Console::DocoptRunner
|
11
|
+
require_sub __FILE__
|
12
|
+
include ::EacCli::DefaultRunner
|
13
|
+
|
14
|
+
runner_definition do
|
15
|
+
desc 'Git-subrepo (https://github.com/ingydotnet/git-subrepo) utilities.'
|
16
|
+
subcommands
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_cli/default_runner'
|
4
|
+
require 'eac_git/local'
|
5
|
+
require 'eac_ruby_utils/console/docopt_runner'
|
6
|
+
|
7
|
+
module Avm
|
8
|
+
module Tools
|
9
|
+
class Runner < ::EacRubyUtils::Console::DocoptRunner
|
10
|
+
class Git < ::EacRubyUtils::Console::DocoptRunner
|
11
|
+
class Subrepo < ::EacRubyUtils::Console::DocoptRunner
|
12
|
+
class Check < ::EacRubyUtils::Console::DocoptRunner
|
13
|
+
include ::EacCli::DefaultRunner
|
14
|
+
|
15
|
+
runner_definition do
|
16
|
+
desc 'Check status of subrepos.'
|
17
|
+
bool_opt '-a', '--all', 'Select all subrepos.'
|
18
|
+
bool_opt '-f', '--fix-parent', 'Fix parent SHA1.'
|
19
|
+
bool_opt '-r', '--remote', 'Check subrepos remote.'
|
20
|
+
pos_arg :subrepos, repeat: true, optional: true
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
subrepo_checks.show_result
|
25
|
+
fatal_error 'Failed' if subrepo_checks.result.error?
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def subrepo_checks_uncached
|
31
|
+
r = ::Avm::Git::SubrepoChecks.new(local_repos)
|
32
|
+
r.check_remote = options.fetch('--remote')
|
33
|
+
r.fix_parent = options.fetch('--fix-parent')
|
34
|
+
r.add_all_subrepos if options.fetch('--all')
|
35
|
+
r.add_subrepos(*options.fetch('<subrepos>'))
|
36
|
+
r
|
37
|
+
end
|
38
|
+
|
39
|
+
def local_repos_uncached
|
40
|
+
::EacGit::Local.new(context(:git))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/avm/tools/version.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'eac_git/local'
|
3
4
|
require 'eac_ruby_utils/core_ext'
|
4
5
|
require 'eac_ruby_utils/envs'
|
5
6
|
require 'eac_launcher/paths/real'
|
@@ -16,21 +17,21 @@ module EacLauncher
|
|
16
17
|
include ::EacLauncher::Git::Base::Subrepo
|
17
18
|
include ::EacLauncher::Git::Base::Underlying
|
18
19
|
|
20
|
+
attr_reader :eac_git
|
21
|
+
delegate :descendant?, :merge_base, :rev_parse, to: :eac_git
|
22
|
+
|
23
|
+
def initialize(path)
|
24
|
+
super(path)
|
25
|
+
|
26
|
+
@eac_git = ::EacGit::Local.new(path)
|
27
|
+
end
|
28
|
+
|
19
29
|
def init_bare
|
20
30
|
FileUtils.mkdir_p(self)
|
21
31
|
::EacRubyUtils::Envs.local.command('git', 'init', '--bare', self).execute! unless
|
22
32
|
File.exist?(subpath('.git'))
|
23
33
|
end
|
24
34
|
|
25
|
-
def rev_parse(ref, required = false)
|
26
|
-
r = execute!('rev-parse', ref, exit_outputs: { 128 => nil, 32_768 => nil })
|
27
|
-
r.strip! if r.is_a?(String)
|
28
|
-
return r if r.present?
|
29
|
-
return nil unless required
|
30
|
-
|
31
|
-
raise "Reference \"#{ref}\" not found"
|
32
|
-
end
|
33
|
-
|
34
35
|
# @return [Pathname]
|
35
36
|
def root_path
|
36
37
|
@root_path ||= self.class.find_root(to_s)
|
@@ -44,17 +45,6 @@ module EacLauncher
|
|
44
45
|
base == revparse
|
45
46
|
end
|
46
47
|
|
47
|
-
def merge_base(*commits)
|
48
|
-
refs = commits.dup
|
49
|
-
while refs.count > 1
|
50
|
-
refs[1] = merge_base_pair(refs[0], refs[1])
|
51
|
-
return nil if refs[1].blank?
|
52
|
-
|
53
|
-
refs.shift
|
54
|
-
end
|
55
|
-
refs.first
|
56
|
-
end
|
57
|
-
|
58
48
|
def subtree_split(prefix)
|
59
49
|
execute!('subtree', '-q', 'split', '-P', prefix).strip
|
60
50
|
end
|
@@ -89,12 +79,6 @@ module EacLauncher
|
|
89
79
|
def raise(message)
|
90
80
|
::Kernel.raise EacLauncher::Git::Error.new(self, message)
|
91
81
|
end
|
92
|
-
|
93
|
-
private
|
94
|
-
|
95
|
-
def merge_base_pair(commit1, commit2)
|
96
|
-
execute!('merge-base', commit1, commit2, exit_outputs: { 256 => '' }).strip
|
97
|
-
end
|
98
82
|
end
|
99
83
|
end
|
100
84
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
4
|
+
|
5
|
+
require 'eac_git/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = 'eac_git'
|
9
|
+
s.version = EacGit::VERSION
|
10
|
+
s.authors = ['Put here the authors']
|
11
|
+
s.summary = 'Put here de description.'
|
12
|
+
|
13
|
+
s.files = Dir['{lib}/**/*']
|
14
|
+
|
15
|
+
s.add_dependency 'eac_ruby_utils', '~> 0.37'
|
16
|
+
s.add_dependency 'parseconfig', '~> 1.0', '>= 1.0.8'
|
17
|
+
|
18
|
+
s.add_development_dependency 'eac_ruby_gem_support', '~> 0.1', '>= 0.1.2'
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/envs'
|
4
|
+
require 'eac_ruby_utils/simple_cache'
|
5
|
+
|
6
|
+
module EacGit
|
7
|
+
module Executables
|
8
|
+
class << self
|
9
|
+
include ::EacRubyUtils::SimpleCache
|
10
|
+
|
11
|
+
def env
|
12
|
+
::EacRubyUtils::Envs.local
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
%w[git].each do |program|
|
18
|
+
define_method(program.underscore + '_uncached') do
|
19
|
+
env.executable(program, '--version')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_git/executables'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module EacGit
|
7
|
+
# A Git repository in local filesystem.
|
8
|
+
class Local
|
9
|
+
require_sub __FILE__
|
10
|
+
|
11
|
+
common_constructor :root_path do
|
12
|
+
self.root_path = root_path.to_pathname
|
13
|
+
end
|
14
|
+
|
15
|
+
def descendant?(descendant, ancestor)
|
16
|
+
base = merge_base(descendant, ancestor)
|
17
|
+
return false if base.blank?
|
18
|
+
|
19
|
+
revparse = command('rev-parse', '--verify', ancestor).execute!.strip
|
20
|
+
base == revparse
|
21
|
+
end
|
22
|
+
|
23
|
+
def merge_base(*commits)
|
24
|
+
refs = commits.dup
|
25
|
+
while refs.count > 1
|
26
|
+
refs[1] = merge_base_pair(refs[0], refs[1])
|
27
|
+
return nil if refs[1].blank?
|
28
|
+
|
29
|
+
refs.shift
|
30
|
+
end
|
31
|
+
refs.first
|
32
|
+
end
|
33
|
+
|
34
|
+
def command(*args)
|
35
|
+
::EacGit::Executables.git.command('-C', root_path.to_path, *args)
|
36
|
+
end
|
37
|
+
|
38
|
+
def rev_parse(ref, required = false)
|
39
|
+
r = command('rev-parse', ref).execute!(exit_outputs: { 128 => nil, 32_768 => nil })
|
40
|
+
r.strip! if r.is_a?(String)
|
41
|
+
return r if r.present?
|
42
|
+
return nil unless required
|
43
|
+
|
44
|
+
raise "Reference \"#{ref}\" not found"
|
45
|
+
end
|
46
|
+
|
47
|
+
def subrepo(subpath)
|
48
|
+
::EacGit::Local::Subrepo.new(self, subpath)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def merge_base_pair(commit1, commit2)
|
54
|
+
command('merge-base', commit1, commit2).execute!(exit_outputs: { 256 => nil }).strip
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_git/remote'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module EacGit
|
7
|
+
class Local
|
8
|
+
# A git-subrepo (https://github.com/ingydotnet/git-subrepo) in a [EacGit::Local].
|
9
|
+
class Subrepo
|
10
|
+
require_sub __FILE__
|
11
|
+
enable_simple_cache
|
12
|
+
|
13
|
+
common_constructor :local, :subpath do
|
14
|
+
self.subpath = subpath.to_pathname
|
15
|
+
raise "Config file \"#{config_absolute_path}\" not found" unless config_absolute_path.file?
|
16
|
+
end
|
17
|
+
|
18
|
+
def command(subrepo_subcommand, *subrepo_subcommand_args)
|
19
|
+
local.command('subrepo', subrepo_subcommand, subpath.to_path,
|
20
|
+
*subrepo_subcommand_args)
|
21
|
+
end
|
22
|
+
|
23
|
+
delegate(*::EacGit::Local::Subrepo::Config::MAPPING.keys, to: :config)
|
24
|
+
|
25
|
+
def write_config
|
26
|
+
config_absolute_path.write(config.to_content)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def config_uncached
|
32
|
+
::EacGit::Local::Subrepo::Config.from_file(config_absolute_path)
|
33
|
+
end
|
34
|
+
|
35
|
+
def config_absolute_path_uncached
|
36
|
+
config_relative_path.expand_path(local.root_path)
|
37
|
+
end
|
38
|
+
|
39
|
+
def config_relative_path_uncached
|
40
|
+
subpath.join('.gitrepo')
|
41
|
+
end
|
42
|
+
|
43
|
+
def remote_uncached
|
44
|
+
::EacGit::Remote.new(remote_uri)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'parseconfig'
|
5
|
+
|
6
|
+
module EacGit
|
7
|
+
class Local
|
8
|
+
class Subrepo
|
9
|
+
class Config
|
10
|
+
MAPPING = {
|
11
|
+
command_version: :cmdver, commit_id: :commit, join_method: :method,
|
12
|
+
parent_commit_id: :parent, remote_branch: :branch, remote_uri: :remote
|
13
|
+
}.freeze
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def from_file(file_path)
|
17
|
+
new(
|
18
|
+
::ParseConfig.new(file_path.to_pathname)['subrepo']
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
common_constructor :values do
|
24
|
+
self.values = values.with_indifferent_access
|
25
|
+
end
|
26
|
+
|
27
|
+
MAPPING.each do |method_name, _config_key|
|
28
|
+
define_method(method_name) do
|
29
|
+
values[MAPPING.fetch(method_name)]
|
30
|
+
end
|
31
|
+
|
32
|
+
define_method("#{method_name}=") do |value|
|
33
|
+
values[MAPPING.fetch(method_name)] = value
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_content
|
38
|
+
"[subrepo]\n" + MAPPING.map { |k, v| " #{v} = #{send(k)}\n" }.join
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_git/executables'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module EacGit
|
7
|
+
# A Git remote repository referenced by URI.
|
8
|
+
class Remote
|
9
|
+
require_sub __FILE__
|
10
|
+
|
11
|
+
common_constructor :uri
|
12
|
+
|
13
|
+
def ls
|
14
|
+
::EacGit::Remote::LsResult.by_ls_remote_command_output(
|
15
|
+
::EacGit::Executables.git.command('ls-remote', uri).execute!
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module EacGit
|
6
|
+
class Remote
|
7
|
+
class LsResult
|
8
|
+
class << self
|
9
|
+
def by_ls_remote_command_output(output)
|
10
|
+
new(
|
11
|
+
output.each_line.map { |line| line.strip.split(/\s+/) }.map { |x| [x[1], x[0]] }.to_h
|
12
|
+
)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
common_constructor :hashes
|
17
|
+
delegate :fetch, :'[]', :count, :any?, :empty?, to: :hashes
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
4
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
5
|
+
# The generated `.rspec` file contains `--require spec_helper` which will cause
|
6
|
+
# this file to always be loaded, without a need to explicitly require it in any
|
7
|
+
# files.
|
8
|
+
#
|
9
|
+
# Given that it is always loaded, you are encouraged to keep this file as
|
10
|
+
# light-weight as possible. Requiring heavyweight dependencies from this file
|
11
|
+
# will add to the boot time of your test suite on EVERY test run, even for an
|
12
|
+
# individual file that may not need all of that loaded. Instead, consider making
|
13
|
+
# a separate helper file that requires the additional dependencies and performs
|
14
|
+
# the additional setup, and require it from the spec files that actually need
|
15
|
+
# it.
|
16
|
+
#
|
17
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
18
|
+
RSpec.configure do |config|
|
19
|
+
# rspec-expectations config goes here. You can use an alternate
|
20
|
+
# assertion/expectation library such as wrong or the stdlib/minitest
|
21
|
+
# assertions if you prefer.
|
22
|
+
config.expect_with :rspec do |expectations|
|
23
|
+
# This option will default to `true` in RSpec 4. It makes the `description`
|
24
|
+
# and `failure_message` of custom matchers include text for helper methods
|
25
|
+
# defined using `chain`, e.g.:
|
26
|
+
# be_bigger_than(2).and_smaller_than(4).description
|
27
|
+
# # => "be bigger than 2 and smaller than 4"
|
28
|
+
# ...rather than:
|
29
|
+
# # => "be bigger than 2"
|
30
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
31
|
+
end
|
32
|
+
|
33
|
+
# rspec-mocks config goes here. You can use an alternate test double
|
34
|
+
# library (such as bogus or mocha) by changing the `mock_with` option here.
|
35
|
+
config.mock_with :rspec do |mocks|
|
36
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
37
|
+
# a real object. This is generally recommended, and will default to
|
38
|
+
# `true` in RSpec 4.
|
39
|
+
mocks.verify_partial_doubles = true
|
40
|
+
end
|
41
|
+
|
42
|
+
# This option will default to `:apply_to_host_groups` in RSpec 4 (and will
|
43
|
+
# have no way to turn it off -- the option exists only for backwards
|
44
|
+
# compatibility in RSpec 3). It causes shared context metadata to be
|
45
|
+
# inherited by the metadata hash of host groups and examples, rather than
|
46
|
+
# triggering implicit auto-inclusion in groups with matching metadata.
|
47
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
48
|
+
|
49
|
+
# The settings below are suggested to provide a good initial experience
|
50
|
+
# with RSpec, but feel free to customize to your heart's content.
|
51
|
+
# # This allows you to limit a spec run to individual examples or groups
|
52
|
+
# # you care about by tagging them with `:focus` metadata. When nothing
|
53
|
+
# # is tagged with `:focus`, all examples get run. RSpec also provides
|
54
|
+
# # aliases for `it`, `describe`, and `context` that include `:focus`
|
55
|
+
# # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
|
56
|
+
# config.filter_run_when_matching :focus
|
57
|
+
#
|
58
|
+
# # Allows RSpec to persist some state between runs in order to support
|
59
|
+
# # the `--only-failures` and `--next-failure` CLI options. We recommend
|
60
|
+
# # you configure your source control system to ignore this file.
|
61
|
+
# config.example_status_persistence_file_path = "spec/examples.txt"
|
62
|
+
#
|
63
|
+
# # Limits the available syntax to the non-monkey patched syntax that is
|
64
|
+
# # recommended. For more details, see:
|
65
|
+
# # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
|
66
|
+
# # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
|
67
|
+
# # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
|
68
|
+
# config.disable_monkey_patching!
|
69
|
+
#
|
70
|
+
# # This setting enables warnings. It's recommended, but in some cases may
|
71
|
+
# # be too noisy due to issues in dependencies.
|
72
|
+
# config.warnings = true
|
73
|
+
#
|
74
|
+
# # Many RSpec users commonly either run the entire suite or an individual
|
75
|
+
# # file, and it's useful to allow more verbose output when running an
|
76
|
+
# # individual spec file.
|
77
|
+
# if config.files_to_run.one?
|
78
|
+
# # Use the documentation formatter for detailed output,
|
79
|
+
# # unless a formatter has already been configured
|
80
|
+
# # (e.g. via a command-line flag).
|
81
|
+
# config.default_formatter = "doc"
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# # Print the 10 slowest examples and example groups at the
|
85
|
+
# # end of the spec run, to help surface which specs are running
|
86
|
+
# # particularly slow.
|
87
|
+
# config.profile_examples = 10
|
88
|
+
#
|
89
|
+
# # Run specs in random order to surface order dependencies. If you find an
|
90
|
+
# # order dependency and want to debug it, you can fix the order by providing
|
91
|
+
# # the seed, which is printed after each run.
|
92
|
+
# # --seed 1234
|
93
|
+
# config.order = :random
|
94
|
+
#
|
95
|
+
# # Seed global randomization in this process using the `--seed` CLI option.
|
96
|
+
# # Setting this allows you to use `--seed` to deterministically reproduce
|
97
|
+
# # test failures related to randomization by passing the same `--seed` value
|
98
|
+
# # as the one that triggered the failure.
|
99
|
+
# Kernel.srand config.seed
|
100
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: avm-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.53.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Esquilo Azul Company
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aranha-parsers
|
@@ -106,6 +106,20 @@ dependencies:
|
|
106
106
|
- - "~>"
|
107
107
|
- !ruby/object:Gem::Version
|
108
108
|
version: '0.3'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: eac_git
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0.1'
|
116
|
+
type: :runtime
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - "~>"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0.1'
|
109
123
|
- !ruby/object:Gem::Dependency
|
110
124
|
name: eac_ruby_gems_utils
|
111
125
|
requirement: !ruby/object:Gem::Requirement
|
@@ -278,6 +292,11 @@ files:
|
|
278
292
|
- lib/avm/git/issue/complete/validation.rb
|
279
293
|
- lib/avm/git/revision_test.rb
|
280
294
|
- lib/avm/git/spec_helper.rb
|
295
|
+
- lib/avm/git/subrepo_check.rb
|
296
|
+
- lib/avm/git/subrepo_check/parent.rb
|
297
|
+
- lib/avm/git/subrepo_check/remote.rb
|
298
|
+
- lib/avm/git/subrepo_check/show_result.rb
|
299
|
+
- lib/avm/git/subrepo_checks.rb
|
281
300
|
- lib/avm/instances.rb
|
282
301
|
- lib/avm/instances/application.rb
|
283
302
|
- lib/avm/instances/base.rb
|
@@ -379,6 +398,8 @@ files:
|
|
379
398
|
- lib/avm/tools/runner/git/dirty_files.rb
|
380
399
|
- lib/avm/tools/runner/git/issue.rb
|
381
400
|
- lib/avm/tools/runner/git/revisions_test.rb
|
401
|
+
- lib/avm/tools/runner/git/subrepo.rb
|
402
|
+
- lib/avm/tools/runner/git/subrepo/check.rb
|
382
403
|
- lib/avm/tools/runner/launcher.rb
|
383
404
|
- lib/avm/tools/runner/ruby.rb
|
384
405
|
- lib/avm/tools/runner/ruby/gems.rb
|
@@ -458,6 +479,18 @@ files:
|
|
458
479
|
- template/avm/stereotypes/eac_ubuntu_base0/docker_image/Dockerfile
|
459
480
|
- template/avm/stereotypes/eac_webapp_base0/apache_host/no_ssl.conf
|
460
481
|
- template/avm/stereotypes/eac_wordpress_base0/deploy/wp-config.php.template
|
482
|
+
- vendor/gems/eac_git/Gemfile
|
483
|
+
- vendor/gems/eac_git/eac_git.gemspec
|
484
|
+
- vendor/gems/eac_git/lib/eac_git.rb
|
485
|
+
- vendor/gems/eac_git/lib/eac_git/executables.rb
|
486
|
+
- vendor/gems/eac_git/lib/eac_git/local.rb
|
487
|
+
- vendor/gems/eac_git/lib/eac_git/local/subrepo.rb
|
488
|
+
- vendor/gems/eac_git/lib/eac_git/local/subrepo/config.rb
|
489
|
+
- vendor/gems/eac_git/lib/eac_git/remote.rb
|
490
|
+
- vendor/gems/eac_git/lib/eac_git/remote/ls_result.rb
|
491
|
+
- vendor/gems/eac_git/lib/eac_git/version.rb
|
492
|
+
- vendor/gems/eac_git/spec/rubocop_spec.rb
|
493
|
+
- vendor/gems/eac_git/spec/spec_helper.rb
|
461
494
|
- vendor/gems/eac_ruby_utils/Gemfile
|
462
495
|
- vendor/gems/eac_ruby_utils/MIT-LICENCE
|
463
496
|
- vendor/gems/eac_ruby_utils/README.rdoc
|