avm 0.1.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/lib/avm/docker/runner.rb +4 -8
  3. data/lib/avm/executables.rb +24 -0
  4. data/lib/avm/files/appendable/file_content.rb +24 -0
  5. data/lib/avm/files/appendable/plain_directory.rb +25 -0
  6. data/lib/avm/files/appendable/resource_base.rb +13 -0
  7. data/lib/avm/files/appendable/tar_output_command.rb +26 -0
  8. data/lib/avm/files/appendable/templatized_directory.rb +29 -0
  9. data/lib/avm/files/appendable.rb +55 -0
  10. data/lib/avm/files/appender.rb +11 -0
  11. data/lib/avm/files/deploy.rb +71 -0
  12. data/lib/avm/files/formatter/formats/base.rb +62 -0
  13. data/lib/avm/files/formatter/formats/generic_plain.rb +34 -0
  14. data/lib/avm/files/formatter/formats/html.rb +45 -0
  15. data/lib/avm/files/formatter/formats/javascript.rb +23 -0
  16. data/lib/avm/files/formatter/formats/json.rb +27 -0
  17. data/lib/avm/files/formatter/formats/php.rb +21 -0
  18. data/lib/avm/files/formatter/formats/python.rb +21 -0
  19. data/lib/avm/files/formatter/formats/ruby.rb +22 -0
  20. data/lib/avm/files/formatter/formats/xml.rb +27 -0
  21. data/lib/avm/files/formatter/formats.rb +13 -0
  22. data/lib/avm/files/formatter/utf8_assert.rb +74 -0
  23. data/lib/avm/files/formatter.rb +90 -0
  24. data/lib/avm/files/info.rb +24 -0
  25. data/lib/avm/files/rotate.rb +107 -0
  26. data/lib/avm/files.rb +9 -0
  27. data/lib/avm/git/auto_commit/commit_info.rb +23 -0
  28. data/lib/avm/git/auto_commit/rules/base.rb +39 -0
  29. data/lib/avm/git/auto_commit/rules/last.rb +19 -0
  30. data/lib/avm/git/auto_commit/rules/manual.rb +45 -0
  31. data/lib/avm/git/auto_commit/rules/new.rb +24 -0
  32. data/lib/avm/git/auto_commit/rules/nth.rb +31 -0
  33. data/lib/avm/git/auto_commit/rules/unique.rb +21 -0
  34. data/lib/avm/git/auto_commit/rules.rb +31 -0
  35. data/lib/avm/git/auto_commit_path/ruby.rb +20 -0
  36. data/lib/avm/git/auto_commit_path.rb +28 -0
  37. data/lib/avm/git/commit/class_methods.rb +31 -0
  38. data/lib/avm/git/commit/deploy.rb +38 -0
  39. data/lib/avm/git/commit/deploy_methods.rb +19 -0
  40. data/lib/avm/git/commit/diff_tree_line.rb +32 -0
  41. data/lib/avm/git/commit/file.rb +46 -0
  42. data/lib/avm/git/commit.rb +59 -0
  43. data/lib/avm/git/file_auto_fixup.rb +83 -0
  44. data/lib/avm/git/issue/complete/commits.rb +42 -0
  45. data/lib/avm/git/issue/complete/git_subrepos.rb +23 -0
  46. data/lib/avm/git/issue/complete/local_branch.rb +54 -0
  47. data/lib/avm/git/issue/complete/local_tag.rb +39 -0
  48. data/lib/avm/git/issue/complete/push.rb +54 -0
  49. data/lib/avm/git/issue/complete/remote.rb +33 -0
  50. data/lib/avm/git/issue/complete/test.rb +45 -0
  51. data/lib/avm/git/issue/complete/tracker.rb +28 -0
  52. data/lib/avm/git/issue/complete/validation.rb +31 -0
  53. data/lib/avm/git/issue/complete/validations.rb +53 -0
  54. data/lib/avm/git/issue/complete/working_tree.rb +19 -0
  55. data/lib/avm/git/issue/complete.rb +51 -0
  56. data/lib/avm/git/issue/deliver.rb +56 -0
  57. data/lib/avm/git/issue.rb +11 -0
  58. data/lib/avm/git/organize/reference_update.rb +34 -0
  59. data/lib/avm/git/organize/repository.rb +76 -0
  60. data/lib/avm/git/organize.rb +11 -0
  61. data/lib/avm/git/revision_test.rb +106 -0
  62. data/lib/avm/git/subrepo_check/parent.rb +51 -0
  63. data/lib/avm/git/subrepo_check/remote.rb +89 -0
  64. data/lib/avm/git/subrepo_check/show_result.rb +32 -0
  65. data/lib/avm/git/subrepo_check.rb +38 -0
  66. data/lib/avm/git/subrepo_checks.rb +59 -0
  67. data/lib/avm/git.rb +10 -0
  68. data/lib/avm/instances/docker_image.rb +15 -0
  69. data/lib/avm/result.rb +86 -0
  70. data/lib/avm/version.rb +1 -1
  71. metadata +125 -10
@@ -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
@@ -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,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+ ::EacRubyUtils.require_sub(__FILE__)
5
+
6
+ module Avm
7
+ module Git
8
+ module Issue
9
+ end
10
+ end
11
+ 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,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module Git
7
+ module Organize
8
+ require_sub __FILE__
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/fs_cache'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'eac_ruby_utils/ruby'
6
+
7
+ module Avm
8
+ module Git
9
+ class RevisionTest
10
+ enable_simple_cache
11
+ enable_speaker
12
+ common_constructor :git, :sha1, :options
13
+
14
+ def banner
15
+ infov 'Revision to test', sha1
16
+ ::EacRubyUtils::Speaker.context.on(::EacCli::Speaker.new(err_line_prefix: ' ')) do
17
+ revision_banner
18
+ end
19
+ end
20
+
21
+ def successful_label
22
+ successful?.to_s.send((successful? ? :green : :red))
23
+ end
24
+
25
+ def to_s
26
+ sha1
27
+ end
28
+
29
+ def successful?
30
+ successful
31
+ end
32
+
33
+ private
34
+
35
+ def checkout_revision
36
+ infom 'Checking out revision...'
37
+ git.execute!('checkout', sha1)
38
+ end
39
+
40
+ def commit_uncached
41
+ ::Avm::Git::Commit.new(git, sha1)
42
+ end
43
+
44
+ def git_absolute_path
45
+ ::File.expand_path(git.to_s)
46
+ end
47
+
48
+ def revision_banner
49
+ infov '* Subject', commit.subject
50
+ infov '* Success?', successful_label
51
+ infov '* STDOUT', stdout_cache.content_path
52
+ infov '* STDERR', stderr_cache.content_path
53
+ end
54
+
55
+ def root_cache
56
+ ::Avm.fs_cache.child('git', 'revision_test', git_absolute_path.parameterize, sha1,
57
+ options.fetch(:test_command).to_s.parameterize)
58
+ end
59
+
60
+ def run_test
61
+ infom "Running test command \"#{::Shellwords.join(test_command_args)}\"" \
62
+ " on \"#{git_absolute_path}\"..."
63
+ result = ::EacRubyUtils::Ruby.on_clean_environment { test_command.execute }
64
+ infom 'Test done'
65
+ write_result_cache(result)
66
+ end
67
+
68
+ def stdout_cache
69
+ root_cache.child('stdout')
70
+ end
71
+
72
+ def stderr_cache
73
+ root_cache.child('stderr')
74
+ end
75
+
76
+ def successful_cache
77
+ root_cache.child('successful')
78
+ end
79
+
80
+ def successful_uncached
81
+ if options.fetch(:no_cache) || !successful_cache.cached?
82
+ checkout_revision
83
+ run_test
84
+ end
85
+ successful_cache.read == 'true'
86
+ end
87
+
88
+ def test_command
89
+ ::EacRubyUtils::Envs.local.command(*test_command_args).chdir(git.to_s)
90
+ end
91
+
92
+ def test_command_args
93
+ r = ::Shellwords.split(options.fetch(:test_command).to_s)
94
+ return r if r.any?
95
+
96
+ raise 'No command found'
97
+ end
98
+
99
+ def write_result_cache(result)
100
+ stdout_cache.write(result[:stdout])
101
+ stderr_cache.write(result[:stderr])
102
+ successful_cache.write(result[:exit_code].zero? ? 'true' : 'false')
103
+ end
104
+ end
105
+ end
106
+ end