avm 0.0.0 → 0.3.1
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/docker/container.rb +50 -0
- data/lib/avm/docker/image.rb +71 -0
- data/lib/avm/docker/runner.rb +117 -0
- data/lib/avm/docker.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 +23 -0
- data/lib/avm/files/formatter/formats/json.rb +27 -0
- data/lib/avm/files/formatter/formats/php.rb +21 -0
- data/lib/avm/files/formatter/formats/python.rb +21 -0
- data/lib/avm/files/formatter/formats/ruby.rb +22 -0
- data/lib/avm/files/formatter/formats/xml.rb +27 -0
- data/lib/avm/files/formatter/formats.rb +13 -0
- data/lib/avm/files/formatter/utf8_assert.rb +72 -0
- data/lib/avm/files/formatter.rb +90 -0
- data/lib/avm/files/info.rb +24 -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 +106 -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/instances/docker_image.rb +15 -0
- data/lib/avm/result.rb +86 -0
- data/lib/avm/version.rb +1 -1
- data/lib/avm/version_number.rb +45 -0
- metadata +143 -3
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/git/subrepo_checks'
|
4
|
+
require 'eac_git/local'
|
5
|
+
|
6
|
+
module Avm
|
7
|
+
module Git
|
8
|
+
module Issue
|
9
|
+
class Complete
|
10
|
+
module GitSubrepos
|
11
|
+
def git_subrepos_result
|
12
|
+
return ::Avm::Result.error('Unclean workspace') unless clean_workspace?
|
13
|
+
|
14
|
+
infom 'Checking Git subrepos...'
|
15
|
+
r = ::Avm::Git::SubrepoChecks.new(::EacGit::Local.new(@git)).add_all_subrepos
|
16
|
+
r.check_remote = true
|
17
|
+
r.result
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/result'
|
4
|
+
|
5
|
+
module Avm
|
6
|
+
module Git
|
7
|
+
module Issue
|
8
|
+
class Complete
|
9
|
+
module LocalBranch
|
10
|
+
def branch_uncached
|
11
|
+
@git.current_branch
|
12
|
+
end
|
13
|
+
|
14
|
+
def branch_hash_uncached
|
15
|
+
@git.rev_parse("refs/heads/#{branch}")
|
16
|
+
end
|
17
|
+
|
18
|
+
def branch_name
|
19
|
+
branch.split('/')[-1]
|
20
|
+
end
|
21
|
+
|
22
|
+
def branch_name_result
|
23
|
+
::Avm::Result.success_or_error(issue_id.present?, branch_name)
|
24
|
+
end
|
25
|
+
|
26
|
+
def branch_hash_result
|
27
|
+
::Avm::Result.success_or_error(
|
28
|
+
branch_hash.present?,
|
29
|
+
branch_hash
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def follow_master_result
|
34
|
+
return ::Avm::Result.neutral('No branch hash') unless branch_hash
|
35
|
+
|
36
|
+
r = follow_master?
|
37
|
+
::Avm::Result.success_or_error(r, 'yes', 'no')
|
38
|
+
end
|
39
|
+
|
40
|
+
def follow_master?
|
41
|
+
remote_master_hash ? @git.descendant?(branch_hash, remote_master_hash) : true
|
42
|
+
end
|
43
|
+
|
44
|
+
def remove_local_branch
|
45
|
+
info 'Removendo branch local...'
|
46
|
+
bn = branch_name
|
47
|
+
git(['checkout', branch_hash])
|
48
|
+
git(['branch', '-D', bn])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/result'
|
4
|
+
|
5
|
+
module Avm
|
6
|
+
module Git
|
7
|
+
module Issue
|
8
|
+
class Complete
|
9
|
+
module LocalTag
|
10
|
+
def assert_tag
|
11
|
+
if tag_hash
|
12
|
+
return if tag_hash == branch_hash
|
13
|
+
|
14
|
+
delete_tag
|
15
|
+
end
|
16
|
+
create_tag
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete_tag
|
20
|
+
info 'Removendo tag...'
|
21
|
+
git(['tag', '-d', branch_name])
|
22
|
+
end
|
23
|
+
|
24
|
+
def tag
|
25
|
+
"refs/tags/#{branch_name}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def tag_hash
|
29
|
+
@git.rev_parse(tag)
|
30
|
+
end
|
31
|
+
|
32
|
+
def create_tag
|
33
|
+
git(['tag', branch_name, branch_hash])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avm
|
4
|
+
module Git
|
5
|
+
module Issue
|
6
|
+
class Complete
|
7
|
+
module Push
|
8
|
+
def dry_push_args
|
9
|
+
%w[push --dry-run] + [remote_name] + pushs
|
10
|
+
end
|
11
|
+
|
12
|
+
def dry_push_result
|
13
|
+
return ::Avm::Result.error('Nothing to push') if pushs.empty?
|
14
|
+
|
15
|
+
r = @git.execute(dry_push_args)
|
16
|
+
message = if r.fetch(:exit_code).zero?
|
17
|
+
'ok'
|
18
|
+
else
|
19
|
+
r.fetch(:stderr) + "\n#{::Shellwords.join(dry_push_args)}"
|
20
|
+
end
|
21
|
+
::Avm::Result.success_or_error(r.fetch(:exit_code).zero?, message)
|
22
|
+
end
|
23
|
+
|
24
|
+
def push
|
25
|
+
if pushs.empty?
|
26
|
+
info 'PUSH: Nada a enviar'
|
27
|
+
else
|
28
|
+
info "PUSH: enviando \"#{pushs}\"..."
|
29
|
+
git(%w[push origin] + pushs)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def pushs_uncached
|
34
|
+
[master_push, remove_branch_push, tag_push].reject(&:nil?)
|
35
|
+
end
|
36
|
+
|
37
|
+
def master_push
|
38
|
+
remote_master_hash != branch_hash ? "#{branch_hash}:refs/heads/master" : nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def remove_branch_push
|
42
|
+
remote_branch_hash ? ":refs/heads/#{branch}" : nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def tag_push
|
46
|
+
return nil unless !remote_tag_hash || remote_tag_hash != branch_hash
|
47
|
+
|
48
|
+
"#{branch_hash}:#{tag}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avm
|
4
|
+
module Git
|
5
|
+
module Issue
|
6
|
+
class Complete
|
7
|
+
module Remote
|
8
|
+
def remote_master_hash
|
9
|
+
remote_hashs['refs/heads/master']
|
10
|
+
end
|
11
|
+
|
12
|
+
def remote_branch_hash
|
13
|
+
remote_hashs["refs/heads/#{branch}"]
|
14
|
+
end
|
15
|
+
|
16
|
+
def remote_tag_hash
|
17
|
+
remote_hashs[tag]
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def remote_name
|
23
|
+
'origin'
|
24
|
+
end
|
25
|
+
|
26
|
+
def remote_hashs_uncached
|
27
|
+
@git.remote_hashs(remote_name)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/apps/sources/configuration'
|
4
|
+
require 'avm/result'
|
5
|
+
require 'eac_ruby_utils/fs/temp'
|
6
|
+
|
7
|
+
module Avm
|
8
|
+
module Git
|
9
|
+
module Issue
|
10
|
+
class Complete
|
11
|
+
module Test
|
12
|
+
def test_result
|
13
|
+
test_command = configuration.if_present(&:any_test_command)
|
14
|
+
return ::Avm::Result.success('unconfigured') if test_command.blank?
|
15
|
+
|
16
|
+
infom "Running test command \"#{test_command}\"..."
|
17
|
+
result = test_command.execute
|
18
|
+
test_result_log(result)
|
19
|
+
if result.fetch(:exit_code).zero?
|
20
|
+
::Avm::Result.success('yes')
|
21
|
+
else
|
22
|
+
::Avm::Result.error('no')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def test_result_log(result)
|
29
|
+
stdout_file = ::EacRubyUtils::Fs::Temp.file
|
30
|
+
stderr_file = ::EacRubyUtils::Fs::Temp.file
|
31
|
+
stdout_file.write(result.fetch(:stdout))
|
32
|
+
stderr_file.write(result.fetch(:stderr))
|
33
|
+
infov ' * Exit code', result.fetch(:exit_code)
|
34
|
+
infov ' * STDOUT', stdout_file.to_path
|
35
|
+
infov ' * STDERR', stderr_file.to_path
|
36
|
+
end
|
37
|
+
|
38
|
+
def configuration_uncached
|
39
|
+
::Avm::Apps::Sources::Configuration.find_by_path(@git)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'clipboard'
|
4
|
+
|
5
|
+
module Avm
|
6
|
+
module Git
|
7
|
+
module Issue
|
8
|
+
class Complete
|
9
|
+
module Tracker
|
10
|
+
def clipboard_copy_tracker_message
|
11
|
+
::Clipboard.copy(textile_tracker_message)
|
12
|
+
infov 'Copied to clipboard', textile_tracker_message
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def textile_tracker_message_uncached
|
18
|
+
"Revisado para commit:#{branch_short_hash}, ok."
|
19
|
+
end
|
20
|
+
|
21
|
+
def branch_short_hash
|
22
|
+
git(['log', '--pretty=format:%h', '-1', '-q', branch_hash])
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,31 @@
|
|
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
|
+
module Issue
|
9
|
+
class Complete
|
10
|
+
class Validation
|
11
|
+
enable_simple_cache
|
12
|
+
common_constructor :parent, :key, :label
|
13
|
+
|
14
|
+
def skip?
|
15
|
+
parent.skip_validations.include?(key)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def result_uncached
|
21
|
+
if skip?
|
22
|
+
::Avm::Result.neutral('skipped')
|
23
|
+
else
|
24
|
+
parent.send("#{key}_result")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -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
|