avm-tools 0.45.0 → 0.46.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/lib/avm/stereotypes/eac_webapp_base0/instance.rb +3 -3
  3. data/lib/avm/tools/runner/launcher.rb +12 -0
  4. data/lib/avm/tools/version.rb +1 -1
  5. data/lib/eac_launcher.rb +17 -0
  6. data/lib/eac_launcher/context.rb +81 -0
  7. data/lib/eac_launcher/context/instance_discovery.rb +54 -0
  8. data/lib/eac_launcher/context/instance_manager.rb +94 -0
  9. data/lib/eac_launcher/context/settings.rb +51 -0
  10. data/lib/eac_launcher/git.rb +7 -0
  11. data/lib/eac_launcher/git/base.rb +94 -0
  12. data/lib/eac_launcher/git/base/_remotes.rb +36 -0
  13. data/lib/eac_launcher/git/base/subrepo.rb +42 -0
  14. data/lib/eac_launcher/git/base/underlying.rb +49 -0
  15. data/lib/eac_launcher/git/error.rb +11 -0
  16. data/lib/eac_launcher/git/mirror_update.rb +36 -0
  17. data/lib/eac_launcher/git/publish_base.rb +118 -0
  18. data/lib/eac_launcher/git/remote.rb +53 -0
  19. data/lib/eac_launcher/git/sub_warp_base.rb +30 -0
  20. data/lib/eac_launcher/git/warp_base.rb +54 -0
  21. data/lib/eac_launcher/instances.rb +6 -0
  22. data/lib/eac_launcher/instances/base.rb +91 -0
  23. data/lib/eac_launcher/instances/base/cache.rb +41 -0
  24. data/lib/eac_launcher/instances/error.rb +8 -0
  25. data/lib/eac_launcher/instances/runner_helper.rb +42 -0
  26. data/lib/eac_launcher/instances/settings.rb +23 -0
  27. data/lib/eac_launcher/paths.rb +4 -0
  28. data/lib/eac_launcher/paths/logical.rb +80 -0
  29. data/lib/eac_launcher/paths/real.rb +42 -0
  30. data/lib/eac_launcher/project.rb +16 -0
  31. data/lib/eac_launcher/publish.rb +4 -0
  32. data/lib/eac_launcher/publish/base.rb +45 -0
  33. data/lib/eac_launcher/publish/check_result.rb +65 -0
  34. data/lib/eac_launcher/ruby.rb +3 -0
  35. data/lib/eac_launcher/ruby/gem.rb +4 -0
  36. data/lib/eac_launcher/ruby/gem/build.rb +123 -0
  37. data/lib/eac_launcher/ruby/gem/specification.rb +61 -0
  38. data/lib/eac_launcher/runner.rb +21 -0
  39. data/lib/eac_launcher/runner/instances.rb +41 -0
  40. data/lib/eac_launcher/runner/projects.rb +46 -0
  41. data/lib/eac_launcher/runner/publish.rb +59 -0
  42. data/lib/eac_launcher/stereotype.rb +52 -0
  43. data/lib/eac_launcher/stereotypes.rb +14 -0
  44. data/lib/eac_launcher/stereotypes/git.rb +21 -0
  45. data/lib/eac_launcher/stereotypes/git/publish.rb +13 -0
  46. data/lib/eac_launcher/stereotypes/git/warp.rb +25 -0
  47. data/lib/eac_launcher/stereotypes/git_subrepo.rb +30 -0
  48. data/lib/eac_launcher/stereotypes/git_subrepo/publish.rb +12 -0
  49. data/lib/eac_launcher/stereotypes/git_subrepo/warp.rb +85 -0
  50. data/lib/eac_launcher/stereotypes/git_subtree.rb +47 -0
  51. data/lib/eac_launcher/stereotypes/git_subtree/publish.rb +10 -0
  52. data/lib/eac_launcher/stereotypes/git_subtree/warp.rb +27 -0
  53. data/lib/eac_launcher/stereotypes/rails.rb +21 -0
  54. data/lib/eac_launcher/stereotypes/redmine_plugin.rb +21 -0
  55. data/lib/eac_launcher/stereotypes/ruby_gem.rb +27 -0
  56. data/lib/eac_launcher/stereotypes/ruby_gem/publish.rb +127 -0
  57. data/lib/eac_launcher/vendor.rb +3 -0
  58. data/lib/eac_launcher/vendor/github.rb +18 -0
  59. data/lib/eac_launcher/version.rb +5 -0
  60. metadata +101 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e0e6277dfb4d7fb9d026f49aa93d0bc395c1c4b526911a5229f062e95a33a60
4
- data.tar.gz: 7c3628d294e04080fa3b9adef605bba3c4c75260bcaf398b1a46a8b1cca8a33d
3
+ metadata.gz: 22450837df14cf1ed2d98a21cb8721c9c755d573aa9ac12ca8128efd844eff34
4
+ data.tar.gz: a0d1f7803ffc840b0677efa4d306e12f3656cd1eb112bbbe5ea7d15a95ecfef2
5
5
  SHA512:
6
- metadata.gz: 690afb20bf63115d36da0090cb070ff112fd187ba6dc428cb25fd6d31b0ab9588f90abcf09faf43d1a33f1aacc0bb5fb549ef63ba14ab7a4f2ff31a6bb32cbff
7
- data.tar.gz: 28ae352ef538db3bb01a0dc8fbdc593ca61fd34ef24fdfe97e00db3ce3c27af6d953e3c9459fbb51b7dce2106c5d801b717c9d5e2adf0ee3a6ab4fb984a519e8
6
+ metadata.gz: a046970714aa1bfc759a83d7bc55bc86307d2b6c3ad206c5effe6bf1159930e336e5b70ce98789e5c1e65cf177b805bdd8ef0c1d49874411a81fd43f644f2287
7
+ data.tar.gz: 429de9bfecf5348c034542cb0f5b8555f3c757341da8b47ec6062883633c77b5c87b40f08f5df924419de940e39bd5acdb642b3798e204fe221b6a36821dd648
@@ -42,9 +42,9 @@ module Avm
42
42
  private
43
43
 
44
44
  def files_units
45
- self.class.const_get('FILES_UNITS').map do |data_key, fs_path_subpath|
46
- [data_key, ::Avm::Data::Instance::FilesUnit.new(self, fs_path_subpath)]
47
- end.to_h
45
+ self.class.const_get('FILES_UNITS').transform_values do |fs_path_subpath|
46
+ ::Avm::Data::Instance::FilesUnit.new(self, fs_path_subpath)
47
+ end
48
48
  end
49
49
  end
50
50
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_launcher/runner'
4
+
5
+ module Avm
6
+ module Tools
7
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
8
+ class Launcher < ::EacLauncher::Runner
9
+ end
10
+ end
11
+ end
12
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Avm
4
4
  module Tools
5
- VERSION = '0.45.0'
5
+ VERSION = '0.46.0'
6
6
  end
7
7
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ GIT_SUBREPO_LIB = ::File.join(::File.dirname(__dir__), 'vendor', 'git-subrepo', 'lib')
4
+ ENV['PATH'] = "#{GIT_SUBREPO_LIB}#{::File::PATH_SEPARATOR}#{ENV['PATH']}"
5
+
6
+ module EacLauncher
7
+ require 'eac_launcher/context'
8
+ require 'eac_launcher/paths'
9
+ require 'eac_launcher/project'
10
+ require 'eac_launcher/stereotype'
11
+ require 'eac_launcher/git'
12
+ require 'eac_launcher/instances'
13
+ require 'eac_launcher/publish'
14
+ require 'eac_launcher/ruby'
15
+ require 'eac_launcher/stereotypes'
16
+ require 'eac_launcher/vendor'
17
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/hash/indifferent_access'
4
+ require 'eac_ruby_utils/simple_cache'
5
+ require 'eac_ruby_utils/console/speaker'
6
+ require 'eac_launcher/context/instance_discovery'
7
+ require 'eac_launcher/context/instance_manager'
8
+ require 'eac_launcher/context/settings'
9
+ require 'eac_launcher/paths/logical'
10
+ require 'eac_launcher/project'
11
+
12
+ module EacLauncher
13
+ class Context
14
+ include ::EacRubyUtils::SimpleCache
15
+ include ::EacRubyUtils::Console::Speaker
16
+
17
+ DEFAULT_PROJECTS_ROOT = '.'
18
+ DEFAULT_SETTINGS_FILE = ::File.join(ENV['HOME'], '.config', 'eac_launcher', 'settings.yml')
19
+ DEFAULT_CACHE_ROOT = ::File.join(ENV['HOME'], '.cache', 'eac_launcher')
20
+
21
+ class << self
22
+ attr_writer :current
23
+
24
+ def current
25
+ @current ||= default
26
+ end
27
+
28
+ def default
29
+ @default ||= Context.new
30
+ end
31
+ end
32
+
33
+ attr_reader :root, :settings, :cache_root
34
+ attr_accessor :publish_options, :recache, :instance_manager
35
+
36
+ def initialize(options = {})
37
+ @options = options.with_indifferent_access
38
+ @root = ::EacLauncher::Paths::Logical.new(self, nil, build_option(:projects_root), '/')
39
+ @settings = ::EacLauncher::Context::Settings.new(build_option(:settings_file))
40
+ @cache_root = build_option(:cache_root)
41
+ @publish_options = { new: false, confirm: false, stereotype: nil }
42
+ @instance_manager = ::EacLauncher::Context::InstanceManager.new(self)
43
+ @recache = false
44
+ end
45
+
46
+ def instance(name)
47
+ instances.find { |i| i.name == name }
48
+ end
49
+
50
+ def instances
51
+ @instance_manager.instances
52
+ end
53
+
54
+ def pending_instances
55
+ @instance_manager.pending_instances
56
+ end
57
+
58
+ private
59
+
60
+ def build_option(key)
61
+ @options[key] || env_option(key) || default_option(key)
62
+ end
63
+
64
+ def env_option(key)
65
+ ENV["EAC_LAUNCHER_#{key}".underscore.upcase]
66
+ end
67
+
68
+ def default_option(key)
69
+ self.class.const_get("DEFAULT_#{key}".underscore.upcase)
70
+ end
71
+
72
+ def projects_uncached
73
+ r = {}
74
+ instances.each do |i|
75
+ r[i.project_name] ||= []
76
+ r[i.project_name] << i
77
+ end
78
+ r.map { |name, instances| ::EacLauncher::Project.new(name, instances) }
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ruby-progressbar'
4
+ require 'eac_launcher/instances/base'
5
+
6
+ module EacLauncher
7
+ class Context
8
+ class InstanceDiscovery
9
+ attr_reader :instances
10
+
11
+ def initialize(context)
12
+ @context = context
13
+ @progress = ::ProgressBar.create(title: 'Instance discovery', total: 1)
14
+ @instances = path_instances(@context.root, nil)
15
+ ensure
16
+ @progress&.finish
17
+ end
18
+
19
+ private
20
+
21
+ def path_instances(path, parent_instance)
22
+ update_progress_format(path)
23
+ on_rescued_path_instances(path) do |r|
24
+ if path.project?
25
+ parent_instance = ::EacLauncher::Instances::Base.instanciate(path, parent_instance)
26
+ r << path
27
+ end
28
+ children = path.children
29
+ update_progress_count(children)
30
+ r.concat(children.flat_map { |c| path_instances(c, parent_instance) })
31
+ end
32
+ end
33
+
34
+ def on_rescued_path_instances(path)
35
+ r = []
36
+ begin
37
+ yield(r) if path.included?
38
+ rescue StandardError => e
39
+ warn("#{path}: #{e}")
40
+ end
41
+ r
42
+ end
43
+
44
+ def update_progress_format(path)
45
+ @progress.format = "%t (Paths: %c/%C, Current: #{path.logical}) |%B| %a"
46
+ end
47
+
48
+ def update_progress_count(children)
49
+ @progress.total += children.count
50
+ @progress.increment
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require('yaml')
4
+
5
+ module EacLauncher
6
+ class Context
7
+ class InstanceManager
8
+ include ::EacRubyUtils::SimpleCache
9
+
10
+ def initialize(context)
11
+ @context = context
12
+ end
13
+
14
+ def publish_state_set(instance, stereotype_name, check_status)
15
+ data = cached_instances_file_content_uncached
16
+ data[instance.logical] ||= {}
17
+ data[instance.logical][:publish_state] ||= {}
18
+ data[instance.logical][:publish_state][stereotype_name] = check_status
19
+ write_cache_file(data)
20
+ end
21
+
22
+ def pending_instances
23
+ instances.select { |instance| pending_instance?(instance) }
24
+ end
25
+
26
+ private
27
+
28
+ def instances_uncached
29
+ (cached_instances || search_instances).select(&:included?)
30
+ end
31
+
32
+ def search_instances
33
+ cache_instances(::EacLauncher::Context::InstanceDiscovery.new(@context).instances)
34
+ end
35
+
36
+ def cached_instances
37
+ return nil if @context.recache
38
+ return nil unless cached_instances_file_content
39
+
40
+ CachedInstances.new(cached_instances_file_content).instances
41
+ end
42
+
43
+ def cached_instances_file_content_uncached
44
+ r = YAML.load_file(cache_file_path)
45
+ r.is_a?(::Hash) ? r : nil
46
+ rescue Errno::ENOENT
47
+ nil
48
+ end
49
+
50
+ def cache_instances(instances)
51
+ write_cache_file(Hash[instances.map { |i| [i.logical, i.to_h] }])
52
+ instances
53
+ end
54
+
55
+ def write_cache_file(data)
56
+ ::File.write(cache_file_path, data.to_yaml)
57
+ end
58
+
59
+ def cache_file_path
60
+ ::File.join(@context.cache_root, 'instances.yml')
61
+ end
62
+
63
+ def pending_instance?(instance)
64
+ data = cached_instances_file_content
65
+ return false unless data[instance.logical]
66
+ return false unless data[instance.logical][:publish_state].is_a?(Hash)
67
+
68
+ data[instance.logical][:publish_state].any? do |_k, v|
69
+ ::EacLauncher::Publish::CheckResult.pending_status?(v)
70
+ end
71
+ end
72
+
73
+ class CachedInstances
74
+ def initialize(content)
75
+ @content = content
76
+ @instances = {}
77
+ end
78
+
79
+ def instances
80
+ @content.keys.map { |k| by_logical_path(k) }
81
+ end
82
+
83
+ def by_logical_path(key)
84
+ return @instances[key] if @instances.key?(key)
85
+
86
+ h = @content[key]
87
+ parent_instance = h[:parent] ? by_logical_path(h[:parent]) : nil
88
+ path = ::EacLauncher::Paths::Logical.from_h(@context, h)
89
+ @instances[key] = ::EacLauncher::Instances::Base.instanciate(path, parent_instance)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/simple_cache'
4
+ require 'yaml'
5
+ require 'eac_launcher/instances/settings'
6
+
7
+ module EacLauncher
8
+ class Context
9
+ class Settings
10
+ include ::EacRubyUtils::SimpleCache
11
+
12
+ def initialize(file)
13
+ unless ::File.exist?(file)
14
+ ::FileUtils.mkdir_p(::File.dirname(file))
15
+ ::File.write(file, {}.to_yaml)
16
+ end
17
+ @data = YAML.load_file(file)
18
+ end
19
+
20
+ def instance_settings(instance)
21
+ ::EacLauncher::Instances::Settings.new(value(['Instances', instance.name]))
22
+ end
23
+
24
+ private
25
+
26
+ def excluded_projects_uncached
27
+ enum_value(%w[Projects Exclude])
28
+ end
29
+
30
+ def excluded_paths_uncached
31
+ enum_value(%w[Paths Exclude])
32
+ end
33
+
34
+ def enum_value(path)
35
+ r = value(path)
36
+ r.is_a?(Enumerable) ? r : []
37
+ end
38
+
39
+ def value(path)
40
+ node_value(@data, path)
41
+ end
42
+
43
+ def node_value(data, path)
44
+ return data if path.empty?
45
+ return nil unless data.is_a?(Hash)
46
+
47
+ node_value(data[path.first], path.drop(1))
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_launcher/git/base'
4
+ require 'eac_launcher/git/error'
5
+ require 'eac_launcher/git/mirror_update'
6
+ require 'eac_launcher/git/publish_base'
7
+ require 'eac_launcher/git/warp_base'
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/simple_cache'
4
+ require 'eac_ruby_utils/envs'
5
+ require 'eac_launcher/paths/real'
6
+ require 'eac_launcher/git/base/underlying'
7
+ require 'eac_launcher/git/base/subrepo'
8
+ require 'eac_launcher/git/error'
9
+
10
+ module EacLauncher
11
+ module Git
12
+ class Base < ::EacLauncher::Paths::Real
13
+ include ::EacRubyUtils::SimpleCache
14
+ include ::EacLauncher::Git::Base::Subrepo
15
+ include ::EacLauncher::Git::Base::Underlying
16
+ require_relative ::File.join(__dir__, 'base', '_remotes')
17
+
18
+ def init_bare
19
+ FileUtils.mkdir_p(self)
20
+ ::EacRubyUtils::Envs.local.command('git', 'init', '--bare', self).execute! unless
21
+ File.exist?(subpath('.git'))
22
+ end
23
+
24
+ def rev_parse(ref, required = false)
25
+ r = execute!('rev-parse', ref, exit_outputs: { 128 => nil, 32_768 => nil })
26
+ r.strip! if r.is_a?(String)
27
+ return r if r.present?
28
+ return nil unless required
29
+
30
+ raise "Reference \"#{ref}\" not found"
31
+ end
32
+
33
+ def descendant?(descendant, ancestor)
34
+ base = merge_base(descendant, ancestor)
35
+ return false if base.blank?
36
+
37
+ revparse = execute!('rev-parse', '--verify', ancestor).strip
38
+ base == revparse
39
+ end
40
+
41
+ def merge_base(*commits)
42
+ refs = commits.dup
43
+ while refs.count > 1
44
+ refs[1] = merge_base_pair(refs[0], refs[1])
45
+ return nil if refs[1].blank?
46
+
47
+ refs.shift
48
+ end
49
+ refs.first
50
+ end
51
+
52
+ def subtree_split(prefix)
53
+ execute!('subtree', '-q', 'split', '-P', prefix).strip
54
+ end
55
+
56
+ def push(remote_name, refspecs, options = {})
57
+ refspecs = [refspecs] unless refspecs.is_a?(Array)
58
+ args = ['push']
59
+ args << '--dry-run' if options[:dryrun]
60
+ args << '--force' if options[:force]
61
+ system!(args + [remote_name] + refspecs)
62
+ end
63
+
64
+ def push_all(remote_name)
65
+ system!('push', '--all', remote_name)
66
+ system!('push', '--tags', remote_name)
67
+ end
68
+
69
+ def fetch(remote_name, options = {})
70
+ args = ['fetch', '-p', remote_name]
71
+ args += %w[--tags --prune-tags --force] if options[:tags]
72
+ execute!(*args)
73
+ end
74
+
75
+ def current_branch
76
+ execute!(%w[symbolic-ref -q HEAD]).gsub(%r{\Arefs/heads/}, '').strip
77
+ end
78
+
79
+ def reset_hard(ref)
80
+ execute!('reset', '--hard', ref)
81
+ end
82
+
83
+ def raise(message)
84
+ ::Kernel.raise EacLauncher::Git::Error.new(self, message)
85
+ end
86
+
87
+ private
88
+
89
+ def merge_base_pair(commit1, commit2)
90
+ execute!('merge-base', commit1, commit2, exit_outputs: { 256 => '' }).strip
91
+ end
92
+ end
93
+ end
94
+ end