avm 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/lib/avm/registry/base.rb +65 -0
  3. data/lib/avm/registry.rb +29 -0
  4. data/lib/avm/rspec/setup.rb +22 -0
  5. data/lib/avm/rspec/shared_examples/in_avm_registry.rb +11 -0
  6. data/lib/avm/rspec/shared_examples/not_in_avm_registry.rb +14 -0
  7. data/lib/avm/{git/organize.rb → rspec.rb} +2 -4
  8. data/lib/avm/scms/base.rb +28 -0
  9. data/lib/avm/scms/commit.rb +43 -0
  10. data/lib/avm/source_stereotypes/base.rb +21 -0
  11. data/lib/avm/sources/base.rb +22 -0
  12. data/lib/avm/version.rb +1 -1
  13. metadata +13 -67
  14. data/lib/avm/files/appendable/file_content.rb +0 -24
  15. data/lib/avm/files/appendable/plain_directory.rb +0 -25
  16. data/lib/avm/files/appendable/resource_base.rb +0 -13
  17. data/lib/avm/files/appendable/tar_output_command.rb +0 -26
  18. data/lib/avm/files/appendable/templatized_directory.rb +0 -29
  19. data/lib/avm/files/appendable.rb +0 -55
  20. data/lib/avm/files/appender.rb +0 -11
  21. data/lib/avm/files/deploy.rb +0 -71
  22. data/lib/avm/files/formatter/formats/base.rb +0 -62
  23. data/lib/avm/files/formatter/formats/generic_plain.rb +0 -34
  24. data/lib/avm/files/formatter/formats/html.rb +0 -45
  25. data/lib/avm/files/formatter/formats/javascript.rb +0 -24
  26. data/lib/avm/files/formatter/formats/json.rb +0 -27
  27. data/lib/avm/files/formatter/formats/php.rb +0 -22
  28. data/lib/avm/files/formatter/formats/python.rb +0 -22
  29. data/lib/avm/files/formatter/formats/ruby.rb +0 -22
  30. data/lib/avm/files/formatter/formats/xml.rb +0 -28
  31. data/lib/avm/files/formatter/formats.rb +0 -13
  32. data/lib/avm/files/formatter/utf8_assert.rb +0 -74
  33. data/lib/avm/files/formatter.rb +0 -90
  34. data/lib/avm/files/rotate.rb +0 -107
  35. data/lib/avm/files.rb +0 -9
  36. data/lib/avm/git/auto_commit/commit_info.rb +0 -23
  37. data/lib/avm/git/auto_commit/rules/base.rb +0 -39
  38. data/lib/avm/git/auto_commit/rules/last.rb +0 -19
  39. data/lib/avm/git/auto_commit/rules/manual.rb +0 -45
  40. data/lib/avm/git/auto_commit/rules/new.rb +0 -24
  41. data/lib/avm/git/auto_commit/rules/nth.rb +0 -31
  42. data/lib/avm/git/auto_commit/rules/unique.rb +0 -21
  43. data/lib/avm/git/auto_commit/rules.rb +0 -31
  44. data/lib/avm/git/auto_commit_path/ruby.rb +0 -20
  45. data/lib/avm/git/auto_commit_path.rb +0 -28
  46. data/lib/avm/git/commit/class_methods.rb +0 -31
  47. data/lib/avm/git/commit/deploy.rb +0 -38
  48. data/lib/avm/git/commit/deploy_methods.rb +0 -19
  49. data/lib/avm/git/commit/diff_tree_line.rb +0 -32
  50. data/lib/avm/git/commit/file.rb +0 -46
  51. data/lib/avm/git/commit.rb +0 -59
  52. data/lib/avm/git/file_auto_fixup.rb +0 -83
  53. data/lib/avm/git/issue/complete/commits.rb +0 -42
  54. data/lib/avm/git/issue/complete/git_subrepos.rb +0 -23
  55. data/lib/avm/git/issue/complete/local_branch.rb +0 -54
  56. data/lib/avm/git/issue/complete/local_tag.rb +0 -39
  57. data/lib/avm/git/issue/complete/push.rb +0 -54
  58. data/lib/avm/git/issue/complete/remote.rb +0 -33
  59. data/lib/avm/git/issue/complete/test.rb +0 -45
  60. data/lib/avm/git/issue/complete/tracker.rb +0 -28
  61. data/lib/avm/git/issue/complete/validation.rb +0 -31
  62. data/lib/avm/git/issue/complete/validations.rb +0 -53
  63. data/lib/avm/git/issue/complete/working_tree.rb +0 -19
  64. data/lib/avm/git/issue/complete.rb +0 -51
  65. data/lib/avm/git/issue/deliver.rb +0 -56
  66. data/lib/avm/git/issue.rb +0 -11
  67. data/lib/avm/git/organize/reference_update.rb +0 -34
  68. data/lib/avm/git/organize/repository.rb +0 -76
  69. data/lib/avm/git/revision_test.rb +0 -105
  70. data/lib/avm/git/subrepo_check/parent.rb +0 -51
  71. data/lib/avm/git/subrepo_check/remote.rb +0 -89
  72. data/lib/avm/git/subrepo_check/show_result.rb +0 -32
  73. data/lib/avm/git/subrepo_check.rb +0 -38
  74. data/lib/avm/git/subrepo_checks.rb +0 -59
  75. data/lib/avm/git.rb +0 -10
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/core_ext'
4
-
5
- module Avm
6
- module Git
7
- module AutoCommit
8
- module Rules
9
- class Base
10
- class << self
11
- def keys
12
- [long_key, short_key]
13
- end
14
-
15
- def long_key
16
- name.demodulize.variableize
17
- end
18
-
19
- def short_key
20
- long_key[0, 1]
21
- end
22
- end
23
-
24
- def with_file(file)
25
- self.class.const_get('WithFile').new(self, file)
26
- end
27
-
28
- class WithFile
29
- common_constructor :rule, :file
30
-
31
- def new_commit_info
32
- ::Avm::Git::AutoCommit::CommitInfo.new
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'avm/git/auto_commit/rules/base'
4
-
5
- module Avm
6
- module Git
7
- module AutoCommit
8
- module Rules
9
- class Last < ::Avm::Git::AutoCommit::Rules::Base
10
- class WithFile < ::Avm::Git::AutoCommit::Rules::Base::WithFile
11
- def commit_info
12
- file.commits.last.if_present { |v| new_commit_info.fixup(v) }
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'avm/git/auto_commit/rules/base'
4
-
5
- module Avm
6
- module Git
7
- module AutoCommit
8
- module Rules
9
- class Manual < ::Avm::Git::AutoCommit::Rules::Base
10
- class WithFile < ::Avm::Git::AutoCommit::Rules::Base::WithFile
11
- enable_speaker
12
-
13
- COMMIT_FORMAT = '%h - %s (%cr)'
14
- SKIP_OPTION = 's'
15
-
16
- def commit_info
17
- return nil unless file.commits.any?
18
-
19
- commits_banner
20
- input('Which commit?', list: commits_by_position).if_present do |v|
21
- new_commit_info.fixup(v)
22
- end
23
- end
24
-
25
- def commits_banner
26
- file.commits.each_with_index do |commit, _index|
27
- infov " #{commit.position}", format_commit(commit)
28
- end
29
- infov " #{SKIP_OPTION}", 'skip'
30
- end
31
-
32
- def commits_by_position
33
- (file.commits.map { |commit| [commit.position.to_s, commit] } + [[SKIP_OPTION, nil]])
34
- .to_h
35
- end
36
-
37
- def format_commit(commit)
38
- commit.format(COMMIT_FORMAT)
39
- end
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'avm/git/auto_commit/rules/base'
4
- require 'avm/git/auto_commit_path'
5
-
6
- module Avm
7
- module Git
8
- module AutoCommit
9
- module Rules
10
- class New < ::Avm::Git::AutoCommit::Rules::Base
11
- class WithFile < ::Avm::Git::AutoCommit::Rules::Base::WithFile
12
- def auto_commit_path
13
- ::Avm::Git::AutoCommitPath.new(file.git, file.path)
14
- end
15
-
16
- def commit_info
17
- new_commit_info.message(auto_commit_path.commit_message)
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'avm/git/auto_commit/rules/base'
4
-
5
- module Avm
6
- module Git
7
- module AutoCommit
8
- module Rules
9
- class Nth < ::Avm::Git::AutoCommit::Rules::Base
10
- SHORT_KEY = 't'
11
-
12
- class << self
13
- def short_key
14
- SHORT_KEY
15
- end
16
- end
17
-
18
- common_constructor :number do
19
- self.number = number.to_i
20
- end
21
-
22
- class WithFile < ::Avm::Git::AutoCommit::Rules::Base::WithFile
23
- def commit_info
24
- file.commits(number - 1).if_present { |v| new_commit_info.fixup(v) }
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'avm/git/auto_commit/rules/base'
4
-
5
- module Avm
6
- module Git
7
- module AutoCommit
8
- module Rules
9
- class Unique < ::Avm::Git::AutoCommit::Rules::Base
10
- class WithFile < ::Avm::Git::AutoCommit::Rules::Base::WithFile
11
- def commit_info
12
- return nil unless file.commits.count == 1
13
-
14
- new_commit_info.fixup(file.commits.first)
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/core_ext'
4
-
5
- ::EacRubyUtils.require_sub __FILE__
6
-
7
- module Avm
8
- module Git
9
- module AutoCommit
10
- module Rules
11
- RULES_CLASSES = %w[last manual new nth unique]
12
- .map { |key| ::Avm::Git::AutoCommit::Rules.const_get(key.camelcase) }
13
-
14
- class << self
15
- def parse(string)
16
- parts = string.split(':')
17
-
18
- klass = rule_class_by_key(parts.shift)
19
- klass.new(*parts)
20
- end
21
-
22
- def rule_class_by_key(key)
23
- RULES_CLASSES.find { |klass| klass.keys.include?(key) } ||
24
- raise("Rule not find with key \"#{key}\" (Available: " +
25
- RULES_CLASSES.flat_map(&:keys).join(', ') + ')')
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/core_ext'
4
-
5
- module Avm
6
- module Git
7
- class AutoCommitPath
8
- module Ruby
9
- RUBY_CLASS_NAME_PATTERNS = [%r{lib/((?!.*/lib/).+)\.rb\z}, %r{app/[^/]+/(.+)\.rb\z}].freeze
10
-
11
- def ruby_class_name
12
- RUBY_CLASS_NAME_PATTERNS.each do |pattern|
13
- pattern.if_match(relative_path.to_path, false) { |m| return m[1].camelize }
14
- end
15
- nil
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/core_ext'
4
-
5
- module Avm
6
- module Git
7
- class AutoCommitPath
8
- require_sub __FILE__, include_modules: true
9
- common_constructor :git, :path do
10
- self.path = path.to_pathname
11
- end
12
-
13
- def class_name
14
- ruby_class_name || relative_path.to_path
15
- end
16
-
17
- def commit_message
18
- r = class_name
19
- r += ': remove' unless path.file?
20
- r + '.'
21
- end
22
-
23
- def relative_path
24
- path.expand_path.relative_path_from(git.root_path.expand_path)
25
- end
26
- end
27
- end
28
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/core_ext'
4
-
5
- module Avm
6
- module Git
7
- class Commit
8
- module ClassMethods
9
- common_concern
10
-
11
- module ClassMethods
12
- def target_url_to_env_path(target_url)
13
- uri = ::Addressable::URI.parse(target_url)
14
- uri.scheme = 'file' if uri.scheme.blank?
15
- [uri_to_env(uri), uri.path]
16
- end
17
-
18
- private
19
-
20
- def uri_to_env(uri)
21
- case uri.scheme
22
- when 'file' then ::EacRubyUtils::Envs.local
23
- when 'ssh' then ::EacRubyUtils::Envs.ssh(uri)
24
- else "Invalid schema \"#{uri.schema}\" (URI: #{uri})"
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'addressable'
4
- require 'eac_ruby_utils/core_ext'
5
- require 'avm/files/appendable'
6
- require 'avm/files/deploy'
7
-
8
- module Avm
9
- module Git
10
- class Commit
11
- class Deploy
12
- include ::Avm::Files::Appendable
13
- enable_simple_cache
14
-
15
- attr_reader :build_dir, :commit, :target_env, :target_path
16
-
17
- def initialize(commit, target_env, target_path)
18
- @commit = commit
19
- @target_env = target_env
20
- @target_path = target_path
21
- end
22
-
23
- def run
24
- fd = ::Avm::Files::Deploy.new(target_env, target_path)
25
- fd.append_tar_output_command(git_archive_command)
26
- fd.appended.push(*appended)
27
- fd.run
28
- end
29
-
30
- private
31
-
32
- def git_archive_command
33
- commit.git.command('archive', '--format=tar', commit.sha1)
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/core_ext'
4
-
5
- module Avm
6
- module Git
7
- class Commit
8
- module DeployMethods
9
- def deploy_to_env_path(target_env, target_path)
10
- Deploy.new(self, target_env, target_path)
11
- end
12
-
13
- def deploy_to_url(target_url)
14
- Deploy.new(self, *self.class.target_url_to_env_path(target_url))
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Avm
4
- module Git
5
- class Commit
6
- class DiffTreeLine
7
- DIFF_TREE_PATTERN = /\A:(\d{6}) (\d{6}) (\S+) (\S+) (\S+)\t(\S.*)\z/.freeze
8
- FIELDS = %w[src_mode dst_mode src_sha1 dst_sha1 status path].freeze
9
- GIT_COMMAND_ARGS = %w[-c core.quotepath=off diff-tree --no-commit-id -r --full-index].freeze
10
-
11
- attr_reader(*FIELDS)
12
-
13
- # line: a line of command "git [GIT_COMMAND_ARGS]"'s output.
14
- # Reference: https://git-scm.com/docs/git-diff-tree
15
- def initialize(line)
16
- m = DIFF_TREE_PATTERN.match(line.strip)
17
- raise "\"#{line}\" did not match pattern" unless m
18
-
19
- FIELDS.count.times { |i| send("#{FIELDS[i]}=", m[i + 1]) }
20
- end
21
-
22
- def fields
23
- FIELDS.map { |field| [field, send(field)] }.to_h
24
- end
25
-
26
- private
27
-
28
- attr_writer(*FIELDS)
29
- end
30
- end
31
- end
32
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/core_ext/module/delegation'
4
- require 'eac_ruby_utils/simple_cache'
5
- require 'avm/git/commit/diff_tree_line'
6
-
7
- module Avm
8
- module Git
9
- class Commit
10
- class File
11
- include ::EacRubyUtils::SimpleCache
12
-
13
- attr_reader :git, :diff_tree
14
-
15
- # git: [EacGit::Local]
16
- # diff_tree_tree: a line of command "git diff-tree --no-commit-id -r --full-index"'s output
17
- def initialize(git, diff_tree_line)
18
- @git = git
19
- @diff_tree = ::Avm::Git::Commit::DiffTreeLine.new(diff_tree_line)
20
- end
21
-
22
- delegate(*::Avm::Git::Commit::DiffTreeLine::FIELDS, to: :diff_tree)
23
-
24
- def to_s
25
- "#{path}|#{status}"
26
- end
27
-
28
- def src_size_uncached
29
- size(src_sha1)
30
- end
31
-
32
- def dst_size_uncached
33
- size(dst_sha1)
34
- end
35
-
36
- private
37
-
38
- def size(sha1)
39
- return 0 if /\A0+\z/.match(sha1)
40
-
41
- git.command('cat-file', '-s', sha1).execute!.strip.to_i
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/core_ext'
4
-
5
- module Avm
6
- module Git
7
- class Commit
8
- require_sub __FILE__, include_modules: true
9
- enable_simple_cache
10
-
11
- FIELDS = {
12
- author_name: '%an', author_email: '%ae', author_date: '%ai',
13
- subject: '%s',
14
- author_all: '%an <%ae>, %ai',
15
- commiter_name: '%cn', commiter_email: '%ce', commiter_date: '%ci',
16
- commiter_all: '%cn <%ce>, %ci'
17
- }.freeze
18
-
19
- attr_reader :git, :sha1
20
-
21
- # @param git [EacGit::Local]
22
- def initialize(git, sha1)
23
- @git = git
24
- @sha1 = sha1
25
- end
26
-
27
- def format(format)
28
- git.command('--no-pager', 'log', '-1', "--pretty=format:#{format}", sha1).execute!.strip
29
- end
30
-
31
- FIELDS.each do |field, format|
32
- define_method field do
33
- format(format)
34
- end
35
- end
36
-
37
- def files_uncached
38
- diff_tree_execute.each_line.map { |line| ::Avm::Git::Commit::File.new(git, line) }
39
- end
40
-
41
- def files_size_uncached
42
- files.inject(0) { |a, e| a + e.dst_size }
43
- end
44
-
45
- def root_child?
46
- format('%P').blank?
47
- end
48
-
49
- private
50
-
51
- def diff_tree_execute
52
- args = []
53
- args << '--root' if root_child?
54
- args << sha1
55
- git.command(*::Avm::Git::Commit::DiffTreeLine::GIT_COMMAND_ARGS, *args).execute!
56
- end
57
- end
58
- end
59
- end
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'avm/git/auto_commit/commit_info'
4
- require 'eac_ruby_utils/core_ext'
5
-
6
- module Avm
7
- module Git
8
- class FileAutoFixup
9
- enable_speaker
10
- enable_simple_cache
11
- enable_listable
12
-
13
- common_constructor :git, :path, :rules do
14
- self.path = path.to_pathname.expand_path(git.root_path)
15
- end
16
-
17
- COMMITS_SEARCH_INTERVAL = 'origin/master..HEAD'
18
-
19
- def git_relative_path
20
- path.to_pathname.relative_path_from(git.root_path)
21
- end
22
-
23
- def run
24
- start_banner
25
- run_commit || warn("No rule returned commit information for \"#{path}\"")
26
- end
27
-
28
- private
29
-
30
- def commit_args
31
- commit_info.if_present([], &:git_commit_args) + ['--', git_relative_path]
32
- end
33
-
34
- def commit_info_uncached
35
- rules.lazy.map { |rule| rule.with_file(self).commit_info }.find(&:present?)
36
- end
37
-
38
- def start_banner
39
- infov 'Path', path
40
- infov ' Commits found', commits.count
41
- end
42
-
43
- def run_commit
44
- return false if commit_info.blank?
45
-
46
- infov ' Commit arguments', ::Shellwords.join(commit_args)
47
- run_git_add_and_commit
48
- success ' Commited'
49
- true
50
- end
51
-
52
- def run_git_add_and_commit
53
- git.execute!('reset', '--soft', 'HEAD')
54
- if path.exist?
55
- git.execute!('add', git_relative_path)
56
- else
57
- git.execute!('rm', '-f', git_relative_path)
58
- end
59
- git.execute!('commit', *commit_args)
60
- end
61
-
62
- def commits_uncached
63
- git.execute!('log', '--pretty=format:%H', COMMITS_SEARCH_INTERVAL, '--', path)
64
- .each_line.map { |sha1| ::Avm::Git::Commit.new(git, sha1.strip) }
65
- .reject { |commit| commit.subject.start_with?('fixup!') }
66
- .each_with_index.map { |commit, index| CommitDelegator.new(commit, index) }
67
- end
68
-
69
- class CommitDelegator < ::SimpleDelegator
70
- attr_reader :index
71
-
72
- def initialize(commit, index)
73
- super(commit)
74
- @index = index
75
- end
76
-
77
- def position
78
- index + 1
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,42 +0,0 @@
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 Commits
10
- def commits_result
11
- ::Avm::Result.success_or_error(commits.any?, 'yes', 'none')
12
- end
13
-
14
- def commits_uncached
15
- return [] unless branch_hash && follow_master?
16
-
17
- interval = remote_master_hash ? "#{remote_master_hash}..#{branch_hash}" : branch_hash
18
- @git.execute!('rev-list', interval).each_line.map(&:strip)
19
- end
20
-
21
- def bifurcations_result
22
- commits.each do |commit|
23
- if multiple_parents?(commit)
24
- return ::Avm::Result.error("#{commit} has multiple parents")
25
- end
26
- end
27
- ::Avm::Result.success('no')
28
- end
29
-
30
- def multiple_parents?(commit)
31
- commit_parents(commit).count > 1
32
- end
33
-
34
- def commit_parents(commit)
35
- @git.execute!('log', '--pretty=%P', '-n', '1', commit).split(' ').map(&:strip)
36
- .select(&:present?)
37
- end
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,23 +0,0 @@
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