avm 0.2.0 → 0.4.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/app_src/base.rb +45 -0
- data/lib/avm/app_src/configuration/_locale.rb +16 -0
- data/lib/avm/app_src/configuration/_rubocop.rb +24 -0
- data/lib/avm/app_src/configuration/_tests.rb +27 -0
- data/lib/avm/app_src/configuration.rb +55 -0
- data/lib/avm/app_src.rb +9 -0
- data/lib/avm/executables.rb +24 -0
- data/lib/avm/files/appendable/file_content.rb +24 -0
- data/lib/avm/files/appendable/plain_directory.rb +25 -0
- data/lib/avm/files/appendable/resource_base.rb +13 -0
- data/lib/avm/files/appendable/tar_output_command.rb +26 -0
- data/lib/avm/files/appendable/templatized_directory.rb +29 -0
- data/lib/avm/files/appendable.rb +55 -0
- data/lib/avm/files/appender.rb +11 -0
- data/lib/avm/files/deploy.rb +71 -0
- data/lib/avm/files/formatter/formats/base.rb +62 -0
- data/lib/avm/files/formatter/formats/generic_plain.rb +34 -0
- data/lib/avm/files/formatter/formats/html.rb +45 -0
- data/lib/avm/files/formatter/formats/javascript.rb +24 -0
- data/lib/avm/files/formatter/formats/json.rb +27 -0
- data/lib/avm/files/formatter/formats/php.rb +22 -0
- data/lib/avm/files/formatter/formats/python.rb +22 -0
- data/lib/avm/files/formatter/formats/ruby.rb +22 -0
- data/lib/avm/files/formatter/formats/xml.rb +28 -0
- data/lib/avm/files/formatter/formats.rb +13 -0
- data/lib/avm/files/formatter/utf8_assert.rb +74 -0
- data/lib/avm/files/formatter.rb +90 -0
- data/lib/avm/files/rotate.rb +107 -0
- data/lib/avm/files.rb +9 -0
- data/lib/avm/git/auto_commit/commit_info.rb +23 -0
- data/lib/avm/git/auto_commit/rules/base.rb +39 -0
- data/lib/avm/git/auto_commit/rules/last.rb +19 -0
- data/lib/avm/git/auto_commit/rules/manual.rb +45 -0
- data/lib/avm/git/auto_commit/rules/new.rb +24 -0
- data/lib/avm/git/auto_commit/rules/nth.rb +31 -0
- data/lib/avm/git/auto_commit/rules/unique.rb +21 -0
- data/lib/avm/git/auto_commit/rules.rb +31 -0
- data/lib/avm/git/auto_commit_path/ruby.rb +20 -0
- data/lib/avm/git/auto_commit_path.rb +28 -0
- data/lib/avm/git/commit/class_methods.rb +31 -0
- data/lib/avm/git/commit/deploy.rb +38 -0
- data/lib/avm/git/commit/deploy_methods.rb +19 -0
- data/lib/avm/git/commit/diff_tree_line.rb +32 -0
- data/lib/avm/git/commit/file.rb +46 -0
- data/lib/avm/git/commit.rb +59 -0
- data/lib/avm/git/file_auto_fixup.rb +83 -0
- data/lib/avm/git/issue/complete/commits.rb +42 -0
- data/lib/avm/git/issue/complete/git_subrepos.rb +23 -0
- data/lib/avm/git/issue/complete/local_branch.rb +54 -0
- data/lib/avm/git/issue/complete/local_tag.rb +39 -0
- data/lib/avm/git/issue/complete/push.rb +54 -0
- data/lib/avm/git/issue/complete/remote.rb +33 -0
- data/lib/avm/git/issue/complete/test.rb +45 -0
- data/lib/avm/git/issue/complete/tracker.rb +28 -0
- data/lib/avm/git/issue/complete/validation.rb +31 -0
- data/lib/avm/git/issue/complete/validations.rb +53 -0
- data/lib/avm/git/issue/complete/working_tree.rb +19 -0
- data/lib/avm/git/issue/complete.rb +51 -0
- data/lib/avm/git/issue/deliver.rb +56 -0
- data/lib/avm/git/issue.rb +11 -0
- data/lib/avm/git/organize/reference_update.rb +34 -0
- data/lib/avm/git/organize/repository.rb +76 -0
- data/lib/avm/git/organize.rb +11 -0
- data/lib/avm/git/revision_test.rb +105 -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 +32 -0
- data/lib/avm/git/subrepo_check.rb +38 -0
- data/lib/avm/git/subrepo_checks.rb +59 -0
- data/lib/avm/git.rb +10 -0
- data/lib/avm/jobs/base.rb +62 -0
- data/lib/avm/jobs/variables_source.rb +22 -0
- data/lib/avm/jobs.rb +9 -0
- data/lib/avm/result.rb +86 -0
- data/lib/avm/version.rb +1 -1
- metadata +179 -3
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/git/issue/complete/validation'
|
4
|
+
require 'avm/result'
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
module Avm
|
8
|
+
module Git
|
9
|
+
module Issue
|
10
|
+
class Complete
|
11
|
+
module Validations
|
12
|
+
VALIDATIONS = {
|
13
|
+
clean_workspace: 'Clean workspace?',
|
14
|
+
branch_name: 'Branch name',
|
15
|
+
branch_hash: 'Branch hash',
|
16
|
+
follow_master: 'Follow master?',
|
17
|
+
commits: 'Commits?',
|
18
|
+
bifurcations: 'Bifurcations?',
|
19
|
+
dry_push: 'Dry push?',
|
20
|
+
git_subrepos: 'Git subrepos ok?',
|
21
|
+
test: 'Test ok?'
|
22
|
+
}.with_indifferent_access.freeze
|
23
|
+
|
24
|
+
def valid?
|
25
|
+
validations.map(&:result).none?(&:error?)
|
26
|
+
end
|
27
|
+
|
28
|
+
def validations_banner
|
29
|
+
validations.each do |v|
|
30
|
+
infov "[#{v.key}] #{v.label}", v.result.label
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def validate_skip_validations
|
35
|
+
skip_validations.each do |validation|
|
36
|
+
next if VALIDATIONS.keys.include?(validation)
|
37
|
+
|
38
|
+
raise "\"#{validation}\" is not a registered validation"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def validations_uncached
|
45
|
+
VALIDATIONS.map do |key, label|
|
46
|
+
::Avm::Git::Issue::Complete::Validation.new(self, key, label)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avm
|
4
|
+
module Git
|
5
|
+
module Issue
|
6
|
+
class Complete
|
7
|
+
module WorkingTree
|
8
|
+
def clean_workspace_result
|
9
|
+
::Avm::Result.success_or_error(clean_workspace?, 'yes', 'no')
|
10
|
+
end
|
11
|
+
|
12
|
+
def clean_workspace?
|
13
|
+
@git.dirty_files.none?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/tools/core_ext'
|
4
|
+
|
5
|
+
module Avm
|
6
|
+
module Git
|
7
|
+
module Issue
|
8
|
+
class Complete
|
9
|
+
require_sub __FILE__, include_modules: true
|
10
|
+
enable_simple_cache
|
11
|
+
enable_speaker
|
12
|
+
|
13
|
+
attr_reader :skip_validations
|
14
|
+
|
15
|
+
def initialize(options)
|
16
|
+
consumer = ::EacRubyUtils::OptionsConsumer.new(options)
|
17
|
+
dir, @skip_validations = consumer.consume_all(:dir, :skip_validations)
|
18
|
+
validate_skip_validations
|
19
|
+
consumer.validate
|
20
|
+
@git = ::Avm::Launcher::Git::Base.new(dir)
|
21
|
+
end
|
22
|
+
|
23
|
+
def start_banner
|
24
|
+
validations_banner
|
25
|
+
end
|
26
|
+
|
27
|
+
def run
|
28
|
+
return false unless valid?
|
29
|
+
|
30
|
+
assert_tag
|
31
|
+
push
|
32
|
+
remove_local_branch
|
33
|
+
clipboard_copy_tracker_message
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
def issue_id
|
38
|
+
m = branch_name.match(/\A#{Regexp.quote('issue_')}(\d+)\z/)
|
39
|
+
m ? m[1].to_i : nil
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def git(args, exit_outputs = {})
|
45
|
+
r = @git.execute!(args, exit_outputs: exit_outputs)
|
46
|
+
r.is_a?(String) ? r.strip : r
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/tools/core_ext'
|
4
|
+
require 'clipboard'
|
5
|
+
|
6
|
+
module Avm
|
7
|
+
module Git
|
8
|
+
module Issue
|
9
|
+
class Deliver
|
10
|
+
enable_simple_cache
|
11
|
+
enable_speaker
|
12
|
+
|
13
|
+
common_constructor :git_repo
|
14
|
+
|
15
|
+
def run
|
16
|
+
push
|
17
|
+
clipboard_copy_tracker_message
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
def start_banner
|
22
|
+
infov 'Branch name', branch_name
|
23
|
+
infov 'Commit ID', branch_commit_id
|
24
|
+
infov 'Push arguments', ::Shellwords.join(push_args)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def branch_commit_id
|
30
|
+
git_repo.rev_parse(branch_name)
|
31
|
+
end
|
32
|
+
|
33
|
+
def branch_name_uncached
|
34
|
+
git_repo.command('rev-parse', '--abbrev-ref', 'HEAD').execute!.strip
|
35
|
+
end
|
36
|
+
|
37
|
+
def clipboard_copy_tracker_message
|
38
|
+
::Clipboard.copy(textile_tracker_message)
|
39
|
+
infov 'Copied to clipboard', textile_tracker_message
|
40
|
+
end
|
41
|
+
|
42
|
+
def push
|
43
|
+
git_repo.command(*push_args).system!
|
44
|
+
end
|
45
|
+
|
46
|
+
def push_args
|
47
|
+
%w[push origin --force] + ["#{branch_name}:refs/heads/#{branch_name}"]
|
48
|
+
end
|
49
|
+
|
50
|
+
def textile_tracker_message
|
51
|
+
"#{branch_name}: commit:#{branch_commit_id}."
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module Avm
|
6
|
+
module Git
|
7
|
+
module Organize
|
8
|
+
class ReferenceUpdate
|
9
|
+
enable_listable
|
10
|
+
lists.add_symbol :operation, :remove
|
11
|
+
|
12
|
+
common_constructor :repository, :reference, :operation
|
13
|
+
|
14
|
+
def run_operation
|
15
|
+
send("run_operation_#{operation}")
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
"#{reference} [#{operation}]"
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def reference_pathname
|
25
|
+
repository.refs_root.join(reference)
|
26
|
+
end
|
27
|
+
|
28
|
+
def run_operation_remove
|
29
|
+
reference_pathname.unlink
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module Avm
|
6
|
+
module Git
|
7
|
+
module Organize
|
8
|
+
class Repository
|
9
|
+
enable_simple_cache
|
10
|
+
common_constructor :eac_git_local
|
11
|
+
|
12
|
+
def collected_references
|
13
|
+
@collected_references || []
|
14
|
+
end
|
15
|
+
|
16
|
+
def collect_subrepos
|
17
|
+
collect_references_with_pattern(
|
18
|
+
%r{\Asubrepo/},
|
19
|
+
::Avm::Git::Organize::ReferenceUpdate::OPERATION_REMOVE
|
20
|
+
)
|
21
|
+
collect_references_with_pattern(
|
22
|
+
%r{\Aheads/subrepo/},
|
23
|
+
::Avm::Git::Organize::ReferenceUpdate::OPERATION_REMOVE
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def collect_originals
|
28
|
+
collect_references_with_pattern(
|
29
|
+
%r{\Aoriginal/},
|
30
|
+
::Avm::Git::Organize::ReferenceUpdate::OPERATION_REMOVE
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
def all_branches
|
35
|
+
eac_git_local.execute!
|
36
|
+
end
|
37
|
+
|
38
|
+
delegate :to_s, to: :eac_git_local
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def all_references
|
43
|
+
::Pathname.glob("#{refs_root}/**/*").select(&:file?)
|
44
|
+
.map { |p| p.relative_path_from(refs_root).to_path }
|
45
|
+
end
|
46
|
+
|
47
|
+
def reference_update_by_ref(reference)
|
48
|
+
collected_references.find { |ru| ru.reference == reference }
|
49
|
+
end
|
50
|
+
|
51
|
+
def collect_reference(reference, operation)
|
52
|
+
new_ru = ::Avm::Git::Organize::ReferenceUpdate.new(self, reference, operation)
|
53
|
+
reference_update_by_ref(new_ru.reference).if_present do |ru_found|
|
54
|
+
raise "Reference #{new_ru} already added (#{ru_found})"
|
55
|
+
end
|
56
|
+
@collected_references ||= []
|
57
|
+
@collected_references << new_ru
|
58
|
+
end
|
59
|
+
|
60
|
+
def collect_references_with_pattern(pattern, operation)
|
61
|
+
references_with_pattern(pattern).each do |reference|
|
62
|
+
collect_reference(reference, operation)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def references_with_pattern(pattern)
|
67
|
+
all_references.select { |reference| pattern.if_match(reference, false) }
|
68
|
+
end
|
69
|
+
|
70
|
+
def refs_root_uncached
|
71
|
+
eac_git_local.root_path / '.git' / 'refs'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'eac_ruby_utils/ruby'
|
5
|
+
|
6
|
+
module Avm
|
7
|
+
module Git
|
8
|
+
class RevisionTest
|
9
|
+
enable_simple_cache
|
10
|
+
enable_speaker
|
11
|
+
common_constructor :git, :sha1, :options
|
12
|
+
|
13
|
+
def banner
|
14
|
+
infov 'Revision to test', sha1
|
15
|
+
::EacRubyUtils::Speaker.context.on(::EacCli::Speaker.new(err_line_prefix: ' ')) do
|
16
|
+
revision_banner
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def successful_label
|
21
|
+
successful?.to_s.send((successful? ? :green : :red))
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
sha1
|
26
|
+
end
|
27
|
+
|
28
|
+
def successful?
|
29
|
+
successful
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def checkout_revision
|
35
|
+
infom 'Checking out revision...'
|
36
|
+
git.execute!('checkout', sha1)
|
37
|
+
end
|
38
|
+
|
39
|
+
def commit_uncached
|
40
|
+
::Avm::Git::Commit.new(git, sha1)
|
41
|
+
end
|
42
|
+
|
43
|
+
def git_absolute_path
|
44
|
+
::File.expand_path(git.to_s)
|
45
|
+
end
|
46
|
+
|
47
|
+
def revision_banner
|
48
|
+
infov '* Subject', commit.subject
|
49
|
+
infov '* Success?', successful_label
|
50
|
+
infov '* STDOUT', stdout_cache.content_path
|
51
|
+
infov '* STDERR', stderr_cache.content_path
|
52
|
+
end
|
53
|
+
|
54
|
+
def root_cache
|
55
|
+
fs_cache.child(git_absolute_path.parameterize, sha1,
|
56
|
+
options.fetch(:test_command).to_s.parameterize)
|
57
|
+
end
|
58
|
+
|
59
|
+
def run_test
|
60
|
+
infom "Running test command \"#{::Shellwords.join(test_command_args)}\"" \
|
61
|
+
" on \"#{git_absolute_path}\"..."
|
62
|
+
result = ::EacRubyUtils::Ruby.on_clean_environment { test_command.execute }
|
63
|
+
infom 'Test done'
|
64
|
+
write_result_cache(result)
|
65
|
+
end
|
66
|
+
|
67
|
+
def stdout_cache
|
68
|
+
root_cache.child('stdout')
|
69
|
+
end
|
70
|
+
|
71
|
+
def stderr_cache
|
72
|
+
root_cache.child('stderr')
|
73
|
+
end
|
74
|
+
|
75
|
+
def successful_cache
|
76
|
+
root_cache.child('successful')
|
77
|
+
end
|
78
|
+
|
79
|
+
def successful_uncached
|
80
|
+
if options.fetch(:no_cache) || !successful_cache.cached?
|
81
|
+
checkout_revision
|
82
|
+
run_test
|
83
|
+
end
|
84
|
+
successful_cache.read == 'true'
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_command
|
88
|
+
::EacRubyUtils::Envs.local.command(*test_command_args).chdir(git.to_s)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_command_args
|
92
|
+
r = ::Shellwords.split(options.fetch(:test_command).to_s)
|
93
|
+
return r if r.any?
|
94
|
+
|
95
|
+
raise 'No command found'
|
96
|
+
end
|
97
|
+
|
98
|
+
def write_result_cache(result)
|
99
|
+
stdout_cache.write(result[:stdout])
|
100
|
+
stderr_cache.write(result[:stderr])
|
101
|
+
successful_cache.write(result[:exit_code].zero? ? 'true' : 'false')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
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,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module Avm
|
6
|
+
module Git
|
7
|
+
class SubrepoCheck
|
8
|
+
module ShowResult
|
9
|
+
def show_result
|
10
|
+
out(subrepo.subpath.to_path.cyan)
|
11
|
+
out_attr('parent', parent_result.label)
|
12
|
+
run_fix_parent
|
13
|
+
out_attr('remote', remote_result.label)
|
14
|
+
out("\n")
|
15
|
+
end
|
16
|
+
|
17
|
+
def run_fix_parent
|
18
|
+
return unless fix_parent?
|
19
|
+
return unless parent_result.error?
|
20
|
+
|
21
|
+
out('|Fixing...'.white)
|
22
|
+
self.parent_hash = expected_parent_hash
|
23
|
+
out_attr('new parent', parent_result.label)
|
24
|
+
end
|
25
|
+
|
26
|
+
def out_attr(key, value)
|
27
|
+
out('|' + "#{key}=".white + value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module Avm
|
6
|
+
module Git
|
7
|
+
class SubrepoCheck
|
8
|
+
require_sub __FILE__, include_modules: true
|
9
|
+
enable_speaker
|
10
|
+
enable_simple_cache
|
11
|
+
|
12
|
+
BLANK_TEXT = 'BLANK'
|
13
|
+
|
14
|
+
common_constructor :subrepo, :options
|
15
|
+
|
16
|
+
def blank_text
|
17
|
+
BLANK_TEXT
|
18
|
+
end
|
19
|
+
|
20
|
+
def check_remote?
|
21
|
+
options.fetch(:check_remote) ? true : false
|
22
|
+
end
|
23
|
+
|
24
|
+
def fix_parent?
|
25
|
+
options.fetch(:fix_parent) ? true : false
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def result_uncached
|
31
|
+
return ::Avm::Result.error('Parent failed') if parent_result.error?
|
32
|
+
return ::Avm::Result.error('Remote failed') if remote_result.error?
|
33
|
+
|
34
|
+
::Avm::Result.success('Parent and remote ok')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/git/subrepo_check'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module Avm
|
7
|
+
module Git
|
8
|
+
class SubrepoChecks
|
9
|
+
enable_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
|