avm-tools 0.62.1 → 0.64.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/avm/git/organize.rb +11 -0
  3. data/lib/avm/git/organize/reference_update.rb +34 -0
  4. data/lib/avm/git/organize/repository.rb +76 -0
  5. data/lib/avm/instances/configuration.rb +11 -3
  6. data/lib/avm/instances/configuration/_tests.rb +1 -1
  7. data/lib/avm/launcher/context/instance_manager.rb +76 -0
  8. data/lib/avm/launcher/context/instance_manager/cached_instance.rb +37 -0
  9. data/lib/avm/launcher/context/instance_manager/cached_instances.rb +35 -0
  10. data/lib/avm/launcher/errors/base.rb +10 -0
  11. data/lib/avm/launcher/errors/non_project.rb +15 -0
  12. data/lib/avm/launcher/instances/base.rb +95 -0
  13. data/lib/avm/launcher/instances/base/cache.rb +43 -0
  14. data/lib/avm/launcher/instances/settings.rb +51 -0
  15. data/lib/avm/patches/eac_ruby_gems_utils/gem.rb +29 -0
  16. data/lib/avm/projects/stereotypes/git_subrepo/warp.rb +5 -4
  17. data/lib/avm/projects/stereotypes/ruby_gem/local_project_mixin.rb +1 -1
  18. data/lib/avm/ruby/rubocop/_gemfile.rb +2 -2
  19. data/lib/avm/tools/runner/git/organize.rb +78 -0
  20. data/lib/avm/tools/version.rb +1 -1
  21. data/lib/eac_launcher/context.rb +2 -2
  22. data/lib/eac_launcher/context/instance_discovery.rb +2 -2
  23. data/lib/eac_launcher/context/settings.rb +2 -2
  24. data/lib/eac_launcher/git/base/dirty_files.rb +1 -1
  25. data/lib/eac_launcher/git/sub_warp_base.rb +3 -2
  26. data/lib/eac_launcher/instances.rb +2 -2
  27. data/lib/eac_launcher/instances/error.rb +7 -3
  28. data/lib/eac_launcher/paths/logical.rb +2 -2
  29. data/lib/eac_launcher/publish/base.rb +2 -2
  30. data/vendor/eac_git/lib/eac_git/local.rb +4 -0
  31. data/vendor/eac_git/lib/eac_git/version.rb +1 -1
  32. data/vendor/eac_ruby_gems_utils/lib/eac_ruby_gems_utils/gem.rb +1 -1
  33. data/vendor/eac_ruby_gems_utils/lib/eac_ruby_gems_utils/version.rb +1 -1
  34. metadata +15 -6
  35. data/lib/eac_launcher/context/instance_manager.rb +0 -95
  36. data/lib/eac_launcher/instances/base.rb +0 -91
  37. data/lib/eac_launcher/instances/base/cache.rb +0 -41
  38. data/lib/eac_launcher/instances/settings.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 447658cf671d6c1aac6466424cf7b18d4872629bdfb1bdf9c742cff32204b727
4
- data.tar.gz: f7bf0f7474bd5b90b726b5cc19802d4cdaef60ae8eaa06a138c3a4ecd542e483
3
+ metadata.gz: 1565797abcceccaa3a466abb16694b514ae9773b151142ad27628a0d344a6c2b
4
+ data.tar.gz: a2756806ed389c2d141a9d038cdb6a55aaa28c9747768cac97bb32ca27b49962
5
5
  SHA512:
6
- metadata.gz: a14e64ac9c8e6220ab30e4d24a86fee412dd7ba7b15d4825adfc3c064fe9b7ea1a0a96469e608ee85a5cc0041580f625bd1a367ba560db3a205428c28ae322eb
7
- data.tar.gz: 227b8a6efafda6f7660549498858a09cc1e4900cf154464ef77095c430e7f915f0604c0662faec8d5b4515043a02bc79e66237beeaea075ecf1128fb6a526368
6
+ metadata.gz: 5d895b6ceef334e3b439291f2c2eed9477cc738864fede0f4426d0f7040768febf4759b3cc2267fa0ee34eb18301e8c0066e29b5c1a02b952fcacd7f711c91bd
7
+ data.tar.gz: 812e64910a913c855562bcea3f61aabf441cfafbd7a0af8e356dc217f66451f12361d30507343dbab2b56898313d319880d51bf59893ca11cab6c1d29ed90682
@@ -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,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
@@ -17,15 +17,23 @@ module Avm
17
17
  internal_find_path(path.expand_path)
18
18
  end
19
19
 
20
- private
21
-
22
- def internal_find_path(absolute_pathname)
20
+ def find_in_path(path)
21
+ absolute_pathname = path.to_pathname.expand_path
23
22
  if absolute_pathname.directory?
24
23
  FILENAMES.each do |filename|
25
24
  file = absolute_pathname.join(filename)
26
25
  return new(file) if file.exist?
27
26
  end
28
27
  end
28
+ nil
29
+ end
30
+
31
+ private
32
+
33
+ def internal_find_path(absolute_pathname)
34
+ r = find_in_path(absolute_pathname)
35
+ return r if r.present?
36
+
29
37
  internal_find_path(absolute_pathname.dirname) unless absolute_pathname.root?
30
38
  end
31
39
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_gems_utils/gem'
3
+ require 'avm/patches/eac_ruby_gems_utils/gem'
4
4
 
5
5
  module Avm
6
6
  module Instances
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'eac_launcher/publish/check_result'
5
+ require('yaml')
6
+
7
+ module Avm
8
+ module Launcher
9
+ class Context
10
+ class InstanceManager
11
+ require_sub __FILE__
12
+ enable_simple_cache
13
+ common_constructor :context
14
+
15
+ def publish_state_set(instance, stereotype_name, check_status)
16
+ data = cached_instances_file_content_uncached
17
+ data[instance.logical] ||= {}
18
+ data[instance.logical][:publish_state] ||= {}
19
+ data[instance.logical][:publish_state][stereotype_name] = check_status
20
+ write_cache_file(data)
21
+ end
22
+
23
+ def pending_instances
24
+ instances.select { |instance| pending_instance?(instance) }
25
+ end
26
+
27
+ private
28
+
29
+ def instances_uncached
30
+ (cached_instances || search_instances).select(&:included?)
31
+ end
32
+
33
+ def search_instances
34
+ cache_instances(::EacLauncher::Context::InstanceDiscovery.new(context).instances)
35
+ end
36
+
37
+ def cached_instances
38
+ return nil if context.recache
39
+ return nil unless cached_instances_file_content
40
+
41
+ CachedInstances.new(self, cached_instances_file_content).instances
42
+ end
43
+
44
+ def cached_instances_file_content_uncached
45
+ r = YAML.load_file(cache_file_path)
46
+ r.is_a?(::Hash) ? r : nil
47
+ rescue Errno::ENOENT
48
+ nil
49
+ end
50
+
51
+ def cache_instances(instances)
52
+ write_cache_file(Hash[instances.map { |i| [i.logical, i.to_h] }])
53
+ instances
54
+ end
55
+
56
+ def write_cache_file(data)
57
+ ::File.write(cache_file_path, data.to_yaml)
58
+ end
59
+
60
+ def cache_file_path
61
+ ::File.join(context.cache_root, 'instances.yml')
62
+ end
63
+
64
+ def pending_instance?(instance)
65
+ data = cached_instances_file_content
66
+ return false unless data[instance.logical]
67
+ return false unless data[instance.logical][:publish_state].is_a?(Hash)
68
+
69
+ data[instance.logical][:publish_state].any? do |_k, v|
70
+ ::EacLauncher::Publish::CheckResult.pending_status?(v)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/launcher/instances/base'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Launcher
8
+ class Context
9
+ class InstanceManager
10
+ class CachedInstance
11
+ enable_console_speaker
12
+ enable_simple_cache
13
+ common_constructor :cached_instances, :data
14
+
15
+ private
16
+
17
+ def instance_uncached
18
+ ::Avm::Launcher::Instances::Base.instanciate(path, parent_instance)
19
+ rescue ::Avm::Launcher::Errors::NonProject
20
+ warn "Cached instance \"#{data[:logical]}\" not found"
21
+ nil
22
+ end
23
+
24
+ def parent_instance_uncached
25
+ data[:parent]
26
+ .if_present { |v| cached_instances.by_logical_path(v) }
27
+ .if_present(&:instance)
28
+ end
29
+
30
+ def path_uncached
31
+ ::EacLauncher::Paths::Logical.from_h(cached_instances.context, data)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/launcher/context/instance_manager/cached_instance'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Launcher
8
+ class Context
9
+ class InstanceManager
10
+ class CachedInstances
11
+ enable_simple_cache
12
+ common_constructor :context, :content
13
+
14
+ def instances
15
+ content.keys.map { |k| by_logical_path(k).instance }.reject(&:blank?)
16
+ end
17
+
18
+ def by_logical_path(key)
19
+ cached_instances[key].if_blank do
20
+ cached_instances[key] = ::Avm::Launcher::Context::InstanceManager::CachedInstance.new(
21
+ self, content.fetch(key)
22
+ )
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def cached_instances_uncached
29
+ {}
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module Launcher
5
+ module Errors
6
+ class Base < ::StandardError
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/launcher/errors/base'
4
+
5
+ module Avm
6
+ module Launcher
7
+ module Errors
8
+ class NonProject < ::Avm::Launcher::Errors::Base
9
+ def initialize(path)
10
+ super("#{path} is not a project")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base/cache'
4
+ require 'avm/launcher/errors/non_project'
5
+
6
+ module Avm
7
+ module Launcher
8
+ module Instances
9
+ module Base
10
+ class << self
11
+ def extend_object(object)
12
+ object.extend ::EacRubyUtils::SimpleCache
13
+ object.extend ::EacRubyUtils::Console::Speaker
14
+ object.extend ::Avm::Launcher::Instances::Base::Cache
15
+ super
16
+ end
17
+
18
+ def instanciate(path, parent)
19
+ unless path.is_a?(::Avm::Launcher::Instances::Base)
20
+ raise ::Avm::Launcher::Errors::NonProject, path unless path.project?
21
+
22
+ path.extend(::Avm::Launcher::Instances::Base)
23
+ path.parent = parent
24
+ end
25
+ path
26
+ end
27
+ end
28
+
29
+ attr_accessor :parent
30
+
31
+ def name
32
+ logical
33
+ end
34
+
35
+ def stereotype?(stereotype)
36
+ stereotypes.include?(stereotype)
37
+ end
38
+
39
+ def to_parent_path
40
+ return self unless @parent
41
+
42
+ logical.gsub(/\A#{Regexp.quote(@parent.logical)}/, '')
43
+ end
44
+
45
+ def project?
46
+ stereotypes.any?
47
+ end
48
+
49
+ def publish_run
50
+ stereotypes.each do |s|
51
+ next unless publish?(s)
52
+
53
+ infov(name, "publishing #{s.label}")
54
+ s.publish_class.new(self).run
55
+ end
56
+ end
57
+
58
+ def publish_check
59
+ stereotypes.each do |s|
60
+ next unless publish?(s)
61
+
62
+ puts "#{name.to_s.cyan}|#{s.label}|" \
63
+ "#{s.publish_class.new(self).check}"
64
+ end
65
+ end
66
+
67
+ def project_name
68
+ ::File.basename(logical)
69
+ end
70
+
71
+ def included?
72
+ !::EacLauncher::Context.current.settings.excluded_projects.include?(project_name)
73
+ end
74
+
75
+ def to_h
76
+ super.to_h.merge(parent: parent ? parent.logical : nil)
77
+ end
78
+
79
+ private
80
+
81
+ def publish?(stereotype)
82
+ return false unless stereotype.publish_class
83
+ return false unless options.stereotype_publishable?(stereotype)
84
+
85
+ filter = ::EacLauncher::Context.current.publish_options[:stereotype]
86
+ filter.blank? ? true : filter == stereotype.name.demodulize
87
+ end
88
+
89
+ def options_uncached
90
+ ::EacLauncher::Context.current.settings.instance_settings(self)
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module Launcher
5
+ module Instances
6
+ module Base
7
+ module Cache
8
+ def cache_path(subpath)
9
+ File.join(cache_root, subpath)
10
+ end
11
+
12
+ def cache_key(key, &block)
13
+ v = cache_key_get(key)
14
+ return v if v.present? || block.nil?
15
+
16
+ v = yield
17
+ cache_key_write(key, v)
18
+ v
19
+ end
20
+
21
+ private
22
+
23
+ def cache_key_get(key)
24
+ File.file?(cache_key_path(key)) ? File.read(cache_key_path(key)) : nil
25
+ end
26
+
27
+ def cache_key_write(key, value)
28
+ FileUtils.mkdir_p(File.dirname(cache_key_path(key)))
29
+ File.write(cache_key_path(key), value)
30
+ end
31
+
32
+ def cache_key_path(key)
33
+ File.join(cache_root, 'keys', key.parameterize)
34
+ end
35
+
36
+ def cache_root
37
+ File.join(::EacLauncher::Context.current.cache_root, name.parameterize)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module Launcher
7
+ module Instances
8
+ class Settings
9
+ DEFAULT_CURRENT_REVISION = 'origin/master'
10
+ DEFAULT_PUBLISH_REMOTE = 'publish'
11
+ PUBLISHABLE_KEY = :publishable
12
+
13
+ common_constructor :data do
14
+ self.data = (data.is_a?(Hash) ? data : {}).with_indifferent_access
15
+ end
16
+
17
+ def git_current_revision
18
+ data[__method__] || DEFAULT_CURRENT_REVISION
19
+ end
20
+
21
+ def git_publish_remote
22
+ data[__method__] || DEFAULT_PUBLISH_REMOTE
23
+ end
24
+
25
+ def publishable?
26
+ !!publishable_value
27
+ end
28
+
29
+ def stereotype_publishable?(stereotype)
30
+ return publishable? unless publishable_value.is_a?(::Hash)
31
+
32
+ parse_publishable_value(publishable_value[stereotype.stereotype_name], true)
33
+ end
34
+
35
+ private
36
+
37
+ def publishable_value
38
+ parse_publishable_value(data[PUBLISHABLE_KEY], false)
39
+ end
40
+
41
+ def parse_publishable_value(value, hash_to_true)
42
+ return value.with_indifferent_access if !hash_to_true && value.is_a?(::Hash)
43
+ return true if value.nil? || value == true
44
+ return false if value == false
45
+
46
+ !!value
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/instances/configuration'
4
+ require 'eac_ruby_gems_utils/gem'
5
+ require 'eac_ruby_utils/core_ext'
6
+
7
+ module Avm
8
+ module Patches
9
+ module EacRubyGemsUtils
10
+ module Gem
11
+ enable_simple_cache
12
+
13
+ private
14
+
15
+ def configuration_uncached
16
+ ::Avm::Instances::Configuration.find_in_path(root)
17
+ end
18
+
19
+ def gemfile_path_uncached
20
+ return super unless configuration.present? && configuration.rubocop_gemfile.present?
21
+
22
+ configuration.rubocop_gemfile
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ ::EacRubyGemsUtils::Gem.prepend(::Avm::Patches::EacRubyGemsUtils::Gem)
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'eac_ruby_utils/simple_cache'
4
4
  require 'eac_launcher/git/sub_warp_base'
5
- require 'eac_launcher/instances/error'
5
+ require 'avm/launcher/errors/base'
6
6
  require 'eac_launcher/paths/real'
7
7
  require 'eac_launcher/vendor/github'
8
8
 
@@ -32,8 +32,9 @@ module Avm
32
32
  return if parent_git_warped.rev_parse(subrepo_parent_hash) &&
33
33
  parent_git_warped.descendant?('HEAD', subrepo_parent_hash)
34
34
 
35
- raise EacLauncher::Instances::Error, "Subrepo parent hash \"#{subrepo_parent_hash}\""\
36
- " not found in \"#{parent_git_warped}\""
35
+ raise EacLauncher::Instances::Errors::Base,
36
+ "Subrepo parent hash \"#{subrepo_parent_hash}\"" \
37
+ " not found in \"#{parent_git_warped}\""
37
38
  end
38
39
 
39
40
  def subrepo_parent_hash
@@ -41,7 +42,7 @@ module Avm
41
42
  h = data['Pull Parent']
42
43
  return h if h.present?
43
44
 
44
- raise EacLauncher::Instances::Error, "Subrepo parent hash is blank: #{data}"
45
+ raise EacLauncher::Instances::Errors::Base, "Subrepo parent hash is blank: #{data}"
45
46
  end
46
47
 
47
48
  def init_aux
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_gems_utils/gem'
3
+ require 'avm/patches/eac_ruby_gems_utils/gem'
4
4
  require 'eac_ruby_utils/core_ext'
5
5
 
6
6
  module Avm
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_gems_utils/gem'
3
+ require 'avm/patches/eac_ruby_gems_utils/gem'
4
4
  require 'eac_ruby_utils/core_ext'
5
5
  require 'eac_ruby_utils/on_clean_ruby_environment'
6
6
 
@@ -14,7 +14,7 @@ module Avm
14
14
  end
15
15
 
16
16
  def rubocop_command_by_gemfile_path(path)
17
- ::EacRubyGemsUtils::Gem.new(path).bundle('exec', 'rubocop')
17
+ ::EacRubyGemsUtils::Gem.new(path).bundle('exec', 'rubocop').chdir_root
18
18
  end
19
19
 
20
20
  def rubocop_gemfile?
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/git/organize/repository'
4
+ require 'eac_cli/default_runner'
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 Organize < ::EacRubyUtils::Console::DocoptRunner
12
+ include ::EacCli::DefaultRunner
13
+
14
+ runner_definition do
15
+ desc 'Organize branches.'
16
+ bool_opt '-a', '--all', 'Run all organizations.'
17
+ bool_opt '-n', '--no', 'Do not run operations.'
18
+ bool_opt '-o', '--originals', 'Remove refs/original branches.'
19
+ bool_opt '-s', '--subrepos', 'Remove git-subrepo branches.'
20
+ bool_opt '-y', '--yes', 'Run operations without confirmation.'
21
+ end
22
+
23
+ def run
24
+ start_banner
25
+ collect_references
26
+ after_collect_banner
27
+ run_operations
28
+ end
29
+
30
+ private
31
+
32
+ def after_collect_banner
33
+ infov 'Collected references', repository.collected_references.count
34
+ repository.collected_references.each do |ru|
35
+ infov " * #{ru.reference}", ru.operation
36
+ end
37
+ end
38
+
39
+ def collect?(type)
40
+ options.fetch("--#{type}") || options.fetch('--all')
41
+ end
42
+
43
+ def collect_references
44
+ %w[subrepos originals].each do |type|
45
+ repository.send("collect_#{type}") if collect?(type)
46
+ end
47
+ end
48
+
49
+ def run_operations
50
+ return warn('No operations to run (Run with --help to see options)') if
51
+ repository.collected_references.empty?
52
+ return unless run_operations?
53
+
54
+ repository.collected_references.each do |ru|
55
+ info "Doing operation #{ru}..."
56
+ ru.run_operation
57
+ end
58
+ end
59
+
60
+ def run_operations?
61
+ return true if options.fetch('--yes')
62
+ return false if options.fetch('--no')
63
+
64
+ request_input('Confirm operations?', bool: true)
65
+ end
66
+
67
+ def repository_uncached
68
+ ::Avm::Git::Organize::Repository.new(context(:git).eac_git)
69
+ end
70
+
71
+ def start_banner
72
+ infov 'Repository', repository
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Avm
4
4
  module Tools
5
- VERSION = '0.62.1'
5
+ VERSION = '0.64.0'
6
6
  end
7
7
  end
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support/core_ext/hash/indifferent_access'
4
+ require 'avm/launcher/context/instance_manager'
4
5
  require 'eac_ruby_utils/simple_cache'
5
6
  require 'eac_ruby_utils/console/speaker'
6
7
  require 'eac_launcher/context/instance_discovery'
7
- require 'eac_launcher/context/instance_manager'
8
8
  require 'eac_launcher/context/settings'
9
9
  require 'eac_launcher/paths/logical'
10
10
  require 'eac_launcher/project'
@@ -39,7 +39,7 @@ module EacLauncher
39
39
  @settings = ::EacLauncher::Context::Settings.new(build_option(:settings_file))
40
40
  @cache_root = build_option(:cache_root)
41
41
  @publish_options = { new: false, confirm: false, stereotype: nil }
42
- @instance_manager = ::EacLauncher::Context::InstanceManager.new(self)
42
+ @instance_manager = ::Avm::Launcher::Context::InstanceManager.new(self)
43
43
  @recache = false
44
44
  end
45
45
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'ruby-progressbar'
4
- require 'eac_launcher/instances/base'
4
+ require 'avm/launcher/instances/base'
5
5
 
6
6
  module EacLauncher
7
7
  class Context
@@ -22,7 +22,7 @@ module EacLauncher
22
22
  update_progress_format(path)
23
23
  on_rescued_path_instances(path) do |r|
24
24
  if path.project?
25
- parent_instance = ::EacLauncher::Instances::Base.instanciate(path, parent_instance)
25
+ parent_instance = ::Avm::Launcher::Instances::Base.instanciate(path, parent_instance)
26
26
  r << path
27
27
  end
28
28
  children = path.children
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'avm/launcher/instances/settings'
3
4
  require 'eac_ruby_utils/simple_cache'
4
5
  require 'yaml'
5
- require 'eac_launcher/instances/settings'
6
6
 
7
7
  module EacLauncher
8
8
  class Context
@@ -18,7 +18,7 @@ module EacLauncher
18
18
  end
19
19
 
20
20
  def instance_settings(instance)
21
- ::EacLauncher::Instances::Settings.new(value(['Instances', instance.name]))
21
+ ::Avm::Launcher::Instances::Settings.new(value(['Instances', instance.name]))
22
22
  end
23
23
 
24
24
  private
@@ -6,7 +6,7 @@ module EacLauncher
6
6
  module Git
7
7
  class Base < ::EacLauncher::Paths::Real
8
8
  module DirtyFiles
9
- delegate :dirty, to: :eac_git
9
+ delegate :dirty?, to: :eac_git
10
10
 
11
11
  def dirty_files
12
12
  eac_git.dirty_files.map do |df|
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_launcher/instances/error'
3
+ require 'avm/projects/stereotype'
4
+ require 'avm/launcher/errors/base'
4
5
 
5
6
  module EacLauncher
6
7
  module Git
@@ -11,7 +12,7 @@ module EacLauncher
11
12
  r = find_parent_instance(instance.parent)
12
13
  return r if r
13
14
 
14
- ::EacLauncher::Instances::Error.new('Git parent not found')
15
+ ::EacLauncher::Instances::Errors::Base.new('Git parent not found')
15
16
  end
16
17
 
17
18
  def find_parent_instance(current)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_launcher/instances/base'
4
- require 'eac_launcher/instances/error'
3
+ require 'avm/launcher/errors/base'
4
+ require 'avm/launcher/instances/base'
5
5
  require 'eac_launcher/instances/runner_helper'
6
6
  require 'eac_launcher/instances/settings'
@@ -1,8 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module EacLauncher
4
- module Instances
5
- class Error < StandardError
3
+ module Avm
4
+ module Launcher
5
+ module Instances
6
+ module Errors
7
+ class Error < StandardError
8
+ end
9
+ end
6
10
  end
7
11
  end
8
12
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'avm/stereotypes'
3
+ require 'avm/projects/stereotypes'
4
4
  require 'eac_launcher/paths/real'
5
5
 
6
6
  module EacLauncher
@@ -68,7 +68,7 @@ module EacLauncher
68
68
  end
69
69
 
70
70
  def warped_uncached
71
- if is_a?(::EacLauncher::Instances::Base)
71
+ if is_a?(::Avm::Launcher::Instances::Base)
72
72
  stereotypes.each do |s|
73
73
  return s.warp_class.new(self) if s.warp_class
74
74
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_launcher/instances/error'
3
+ require 'avm/launcher/errors/base'
4
4
 
5
5
  module EacLauncher
6
6
  module Publish
@@ -35,7 +35,7 @@ module EacLauncher
35
35
 
36
36
  def check_with_rescue
37
37
  internal_check
38
- rescue ::EacLauncher::Instances::Error => e
38
+ rescue ::EacLauncher::Instances::Errors::Base => e
39
39
  ::EacLauncher::Publish::CheckResult.blocked("Error: #{e}")
40
40
  rescue ::EacLauncher::Git::Error => e
41
41
  ::EacLauncher::Publish::CheckResult.blocked("Git error: #{e}")
@@ -48,6 +48,10 @@ module EacGit
48
48
  ::EacGit::Local::Subrepo.new(self, subpath)
49
49
  end
50
50
 
51
+ def to_s
52
+ "#{self.class}[#{root_path}]"
53
+ end
54
+
51
55
  private
52
56
 
53
57
  def merge_base_pair(commit1, commit2)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacGit
4
- VERSION = '0.3.0'
4
+ VERSION = '0.3.1'
5
5
  end
@@ -64,7 +64,7 @@ module EacRubyGemsUtils
64
64
  end
65
65
 
66
66
  def gemfile_lock_path_uncached
67
- root.join('Gemfile.lock')
67
+ gemfile_path.basename_sub { |b| "#{b}.lock" }
68
68
  end
69
69
 
70
70
  def gemspec_path_uncached
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyGemsUtils
4
- VERSION = '0.6.1'
4
+ VERSION = '0.6.2'
5
5
  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.62.1
4
+ version: 0.64.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-08-02 00:00:00.000000000 Z
11
+ date: 2020-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha-parsers
@@ -336,6 +336,9 @@ files:
336
336
  - lib/avm/git/issue/complete/_validations.rb
337
337
  - lib/avm/git/issue/complete/_working_tree.rb
338
338
  - lib/avm/git/issue/complete/validation.rb
339
+ - lib/avm/git/organize.rb
340
+ - lib/avm/git/organize/reference_update.rb
341
+ - lib/avm/git/organize/repository.rb
339
342
  - lib/avm/git/revision_test.rb
340
343
  - lib/avm/git/spec_helper.rb
341
344
  - lib/avm/git/subrepo_check.rb
@@ -363,10 +366,19 @@ files:
363
366
  - lib/avm/instances/entries.rb
364
367
  - lib/avm/instances/entries/entry_reader.rb
365
368
  - lib/avm/instances/entry_keys.rb
369
+ - lib/avm/launcher/context/instance_manager.rb
370
+ - lib/avm/launcher/context/instance_manager/cached_instance.rb
371
+ - lib/avm/launcher/context/instance_manager/cached_instances.rb
372
+ - lib/avm/launcher/errors/base.rb
373
+ - lib/avm/launcher/errors/non_project.rb
374
+ - lib/avm/launcher/instances/base.rb
375
+ - lib/avm/launcher/instances/base/cache.rb
376
+ - lib/avm/launcher/instances/settings.rb
366
377
  - lib/avm/local_projects.rb
367
378
  - lib/avm/local_projects/instance.rb
368
379
  - lib/avm/local_projects/jobs/update.rb
369
380
  - lib/avm/patches.rb
381
+ - lib/avm/patches/eac_ruby_gems_utils/gem.rb
370
382
  - lib/avm/patches/object/template.rb
371
383
  - lib/avm/path_string.rb
372
384
  - lib/avm/projects.rb
@@ -467,6 +479,7 @@ files:
467
479
  - lib/avm/tools/runner/git/deploy.rb
468
480
  - lib/avm/tools/runner/git/dirty_files.rb
469
481
  - lib/avm/tools/runner/git/issue.rb
482
+ - lib/avm/tools/runner/git/organize.rb
470
483
  - lib/avm/tools/runner/git/revisions_test.rb
471
484
  - lib/avm/tools/runner/git/subrepo.rb
472
485
  - lib/avm/tools/runner/git/subrepo/check.rb
@@ -487,7 +500,6 @@ files:
487
500
  - lib/eac_launcher.rb
488
501
  - lib/eac_launcher/context.rb
489
502
  - lib/eac_launcher/context/instance_discovery.rb
490
- - lib/eac_launcher/context/instance_manager.rb
491
503
  - lib/eac_launcher/context/settings.rb
492
504
  - lib/eac_launcher/git.rb
493
505
  - lib/eac_launcher/git/base.rb
@@ -503,11 +515,8 @@ files:
503
515
  - lib/eac_launcher/git/sub_warp_base.rb
504
516
  - lib/eac_launcher/git/warp_base.rb
505
517
  - lib/eac_launcher/instances.rb
506
- - lib/eac_launcher/instances/base.rb
507
- - lib/eac_launcher/instances/base/cache.rb
508
518
  - lib/eac_launcher/instances/error.rb
509
519
  - lib/eac_launcher/instances/runner_helper.rb
510
- - lib/eac_launcher/instances/settings.rb
511
520
  - lib/eac_launcher/paths.rb
512
521
  - lib/eac_launcher/paths/logical.rb
513
522
  - lib/eac_launcher/paths/real.rb
@@ -1,95 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_launcher/publish/check_result'
4
- require('yaml')
5
-
6
- module EacLauncher
7
- class Context
8
- class InstanceManager
9
- include ::EacRubyUtils::SimpleCache
10
-
11
- def initialize(context)
12
- @context = context
13
- end
14
-
15
- def publish_state_set(instance, stereotype_name, check_status)
16
- data = cached_instances_file_content_uncached
17
- data[instance.logical] ||= {}
18
- data[instance.logical][:publish_state] ||= {}
19
- data[instance.logical][:publish_state][stereotype_name] = check_status
20
- write_cache_file(data)
21
- end
22
-
23
- def pending_instances
24
- instances.select { |instance| pending_instance?(instance) }
25
- end
26
-
27
- private
28
-
29
- def instances_uncached
30
- (cached_instances || search_instances).select(&:included?)
31
- end
32
-
33
- def search_instances
34
- cache_instances(::EacLauncher::Context::InstanceDiscovery.new(@context).instances)
35
- end
36
-
37
- def cached_instances
38
- return nil if @context.recache
39
- return nil unless cached_instances_file_content
40
-
41
- CachedInstances.new(cached_instances_file_content).instances
42
- end
43
-
44
- def cached_instances_file_content_uncached
45
- r = YAML.load_file(cache_file_path)
46
- r.is_a?(::Hash) ? r : nil
47
- rescue Errno::ENOENT
48
- nil
49
- end
50
-
51
- def cache_instances(instances)
52
- write_cache_file(Hash[instances.map { |i| [i.logical, i.to_h] }])
53
- instances
54
- end
55
-
56
- def write_cache_file(data)
57
- ::File.write(cache_file_path, data.to_yaml)
58
- end
59
-
60
- def cache_file_path
61
- ::File.join(@context.cache_root, 'instances.yml')
62
- end
63
-
64
- def pending_instance?(instance)
65
- data = cached_instances_file_content
66
- return false unless data[instance.logical]
67
- return false unless data[instance.logical][:publish_state].is_a?(Hash)
68
-
69
- data[instance.logical][:publish_state].any? do |_k, v|
70
- ::EacLauncher::Publish::CheckResult.pending_status?(v)
71
- end
72
- end
73
-
74
- class CachedInstances
75
- def initialize(content)
76
- @content = content
77
- @instances = {}
78
- end
79
-
80
- def instances
81
- @content.keys.map { |k| by_logical_path(k) }
82
- end
83
-
84
- def by_logical_path(key)
85
- return @instances[key] if @instances.key?(key)
86
-
87
- h = @content[key]
88
- parent_instance = h[:parent] ? by_logical_path(h[:parent]) : nil
89
- path = ::EacLauncher::Paths::Logical.from_h(@context, h)
90
- @instances[key] = ::EacLauncher::Instances::Base.instanciate(path, parent_instance)
91
- end
92
- end
93
- end
94
- end
95
- end
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base/cache'
4
-
5
- module EacLauncher
6
- module Instances
7
- module Base
8
- class << self
9
- def extend_object(object)
10
- object.extend ::EacRubyUtils::SimpleCache
11
- object.extend ::EacRubyUtils::Console::Speaker
12
- object.extend ::EacLauncher::Instances::Base::Cache
13
- super
14
- end
15
-
16
- def instanciate(path, parent)
17
- unless path.is_a?(::EacLauncher::Instances::Base)
18
- raise "#{path} is not a project" unless path.project?
19
-
20
- path.extend(::EacLauncher::Instances::Base)
21
- path.parent = parent
22
- end
23
- path
24
- end
25
- end
26
-
27
- attr_accessor :parent
28
-
29
- def name
30
- logical
31
- end
32
-
33
- def stereotype?(stereotype)
34
- stereotypes.include?(stereotype)
35
- end
36
-
37
- def to_parent_path
38
- return self unless @parent
39
-
40
- logical.gsub(/\A#{Regexp.quote(@parent.logical)}/, '')
41
- end
42
-
43
- def project?
44
- stereotypes.any?
45
- end
46
-
47
- def publish_run
48
- stereotypes.each do |s|
49
- next unless publish?(s)
50
-
51
- infov(name, "publishing #{s.label}")
52
- s.publish_class.new(self).run
53
- end
54
- end
55
-
56
- def publish_check
57
- stereotypes.each do |s|
58
- next unless publish?(s)
59
-
60
- puts "#{name.to_s.cyan}|#{s.label}|" \
61
- "#{s.publish_class.new(self).check}"
62
- end
63
- end
64
-
65
- def project_name
66
- ::File.basename(logical)
67
- end
68
-
69
- def included?
70
- !::EacLauncher::Context.current.settings.excluded_projects.include?(project_name)
71
- end
72
-
73
- def to_h
74
- super.to_h.merge(parent: parent ? parent.logical : nil)
75
- end
76
-
77
- private
78
-
79
- def publish?(stereotype)
80
- return false unless stereotype.publish_class
81
-
82
- filter = ::EacLauncher::Context.current.publish_options[:stereotype]
83
- filter.blank? ? true : filter == stereotype.name.demodulize
84
- end
85
-
86
- def options_uncached
87
- ::EacLauncher::Context.current.settings.instance_settings(self)
88
- end
89
- end
90
- end
91
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module EacLauncher
4
- module Instances
5
- module Base
6
- module Cache
7
- def cache_path(subpath)
8
- File.join(cache_root, subpath)
9
- end
10
-
11
- def cache_key(key, &block)
12
- v = cache_key_get(key)
13
- return v if v.present? || block.nil?
14
-
15
- v = yield
16
- cache_key_write(key, v)
17
- v
18
- end
19
-
20
- private
21
-
22
- def cache_key_get(key)
23
- File.file?(cache_key_path(key)) ? File.read(cache_key_path(key)) : nil
24
- end
25
-
26
- def cache_key_write(key, value)
27
- FileUtils.mkdir_p(File.dirname(cache_key_path(key)))
28
- File.write(cache_key_path(key), value)
29
- end
30
-
31
- def cache_key_path(key)
32
- File.join(cache_root, 'keys', key.parameterize)
33
- end
34
-
35
- def cache_root
36
- File.join(::EacLauncher::Context.current.cache_root, name.parameterize)
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module EacLauncher
4
- module Instances
5
- class Settings
6
- def initialize(data)
7
- @data = ActiveSupport::HashWithIndifferentAccess.new(data.is_a?(Hash) ? data : {})
8
- end
9
-
10
- def git_current_revision
11
- @data[__method__] || 'origin/master'
12
- end
13
-
14
- def git_publish_remote
15
- @data[__method__] || 'publish'
16
- end
17
-
18
- def publishable?
19
- @data.key?(:publishable) ? @data[:publishable] : true
20
- end
21
- end
22
- end
23
- end