avm-tools 0.52.0 → 0.53.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|