eac_launcher 0.1.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 (40) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +14 -0
  3. data/README.rdoc +3 -0
  4. data/exe/eac_launcher_instance +33 -0
  5. data/exe/eac_launcher_projects +43 -0
  6. data/exe/eac_launcher_publish +49 -0
  7. data/lib/eac_launcher.rb +44 -0
  8. data/lib/eac_launcher/context.rb +63 -0
  9. data/lib/eac_launcher/context/settings.rb +36 -0
  10. data/lib/eac_launcher/git/base.rb +105 -0
  11. data/lib/eac_launcher/git/base/subrepo.rb +18 -0
  12. data/lib/eac_launcher/git/base/underlying.rb +38 -0
  13. data/lib/eac_launcher/git/mirror_update.rb +32 -0
  14. data/lib/eac_launcher/git/publish_base.rb +69 -0
  15. data/lib/eac_launcher/git/transpose_base.rb +48 -0
  16. data/lib/eac_launcher/instances/base.rb +110 -0
  17. data/lib/eac_launcher/instances/base/cache.rb +38 -0
  18. data/lib/eac_launcher/instances/runner_helper.rb +37 -0
  19. data/lib/eac_launcher/instances/settings.rb +17 -0
  20. data/lib/eac_launcher/path.rb +25 -0
  21. data/lib/eac_launcher/project.rb +14 -0
  22. data/lib/eac_launcher/publish/base.rb +12 -0
  23. data/lib/eac_launcher/publish/check_result.rb +42 -0
  24. data/lib/eac_launcher/stereotype.rb +44 -0
  25. data/lib/eac_launcher/stereotypes/git.rb +17 -0
  26. data/lib/eac_launcher/stereotypes/git/publish.rb +9 -0
  27. data/lib/eac_launcher/stereotypes/git/transpose.rb +21 -0
  28. data/lib/eac_launcher/stereotypes/git_subrepo.rb +25 -0
  29. data/lib/eac_launcher/stereotypes/git_subrepo/publish.rb +8 -0
  30. data/lib/eac_launcher/stereotypes/git_subrepo/transpose.rb +87 -0
  31. data/lib/eac_launcher/stereotypes/git_subtree.rb +31 -0
  32. data/lib/eac_launcher/stereotypes/git_subtree/publish.rb +8 -0
  33. data/lib/eac_launcher/stereotypes/git_subtree/transpose.rb +27 -0
  34. data/lib/eac_launcher/stereotypes/rails.rb +17 -0
  35. data/lib/eac_launcher/stereotypes/redmine_plugin.rb +17 -0
  36. data/lib/eac_launcher/stereotypes/ruby_gem.rb +21 -0
  37. data/lib/eac_launcher/stereotypes/ruby_gem/publish.rb +109 -0
  38. data/lib/eac_launcher/vendor/github.rb +13 -0
  39. data/lib/eac_launcher/version.rb +5 -0
  40. metadata +194 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ddd299ffda328fc28afcf975e6f4c5cf1044fc62
4
+ data.tar.gz: deb8b2a8a31144cfcc8a2c3603eac3b0f4fc7cc2
5
+ SHA512:
6
+ metadata.gz: 2365a2c18cc5d3d9b22748a32b41f65e76e85767848314f08bdea10f30d49f0c0e40c47caa49393d0f973360f2d7a5cc600b16dd944fecbee266d0dc3c16f7d2
7
+ data.tar.gz: 97e6e6f63eb094a7151f732aefb20cf35de0a92d1e23132b0308a52c230cbd09aa6d109107dfa56ad347e43cce896b1f73d0d0ff24c2fe2806986ceaffc5956a
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Declare your gem's dependencies in users_support.gemspec.
4
+ # Bundler will treat runtime dependencies like base dependencies, and
5
+ # development dependencies will be added by default to the :development group.
6
+ gemspec
7
+
8
+ # Declare any dependencies that are still in development here instead of in
9
+ # your gemspec. These might include edge Rails or gems from your path or
10
+ # Git. Remember to move these dependencies to your gemspec before releasing
11
+ # your gem to rubygems.org.
12
+
13
+ # To use a debugger
14
+ # gem 'byebug', group: [:development, :test]
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = E.A.C. Launcher
2
+
3
+ Utilities to deploy applications and libraries.
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'rubygems'
5
+ require 'bundler/setup'
6
+ require 'eac_launcher'
7
+
8
+ class Runner < ::EacLauncher::Instances::RunnerHelper
9
+ DOC = <<DOCOPT.freeze
10
+ Mostra informações sobre instâncias.
11
+
12
+ Usage:
13
+ __PROGRAM__ [options] [<instance_path>...]
14
+ __PROGRAM__ -h | --help
15
+
16
+ Options:
17
+ -h --help Show this screen.
18
+ --all Get all instances.
19
+
20
+ DOCOPT
21
+
22
+ private
23
+
24
+ def run
25
+ instances.each { |i| puts instance_label(i) }
26
+ end
27
+
28
+ def instance_path
29
+ options['<instance_path>']
30
+ end
31
+ end
32
+
33
+ Runner.new
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+ require 'eac_launcher'
6
+
7
+ class Runner < ::EacLauncher::Instances::RunnerHelper
8
+ DOC = <<DOCOPT.freeze
9
+ Listas os projetos disponíveis.
10
+
11
+ Usage:
12
+ __PROGRAM__
13
+ __PROGRAM__ -i | --instances
14
+ __PROGRAM__ -h | --help
15
+
16
+ Options:
17
+ -h --help Show this screen.
18
+ -i --instances Show instances.
19
+
20
+ DOCOPT
21
+
22
+ private
23
+
24
+ def run
25
+ ::EacLauncher::Context.current.projects.each do |p|
26
+ show_project(p)
27
+ end
28
+ end
29
+
30
+ def show_project(p)
31
+ puts project_label(p)
32
+ return unless options['--instances']
33
+ p.instances.each do |i|
34
+ puts " * #{instance_label(i)}"
35
+ end
36
+ end
37
+
38
+ def project_label(p)
39
+ p.to_s.cyan.to_s
40
+ end
41
+ end
42
+
43
+ Runner.new
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+ require 'eac_launcher'
6
+
7
+ class Runner < ::EacLauncher::Instances::RunnerHelper
8
+ DOC = <<DOCOPT.freeze
9
+ Publica projetos ou instâncias.
10
+
11
+ Usage:
12
+ __PROGRAM__ (check|dry-run|run) [options] [<instance_path>...]
13
+ __PROGRAM__ -h | --help
14
+
15
+ Options:
16
+ -h --help Show this screen.
17
+ --new Publish projects not published before.
18
+ -s --stereotype=<st> Publish only for stereotype <stereotype>.
19
+ --all Publish all instances.
20
+
21
+ DOCOPT
22
+
23
+ OPTIONS = {
24
+ new: '--new', confirm: 'run', stereotype: '--stereotype'
25
+ }.freeze
26
+
27
+ private
28
+
29
+ def run
30
+ build_publish_options
31
+ instances.each do |i|
32
+ i.send(instance_method)
33
+ end
34
+ end
35
+
36
+ def instance_method
37
+ options['run'] || options['dry-run'] ? 'publish_run' : 'publish_check'
38
+ end
39
+
40
+ def build_publish_options
41
+ ::EacLauncher::Context.current.publish_options = publish_options
42
+ end
43
+
44
+ def publish_options
45
+ Hash[OPTIONS.map { |k, v| [k, options[v]] }]
46
+ end
47
+ end
48
+
49
+ Runner.new
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require('active_support')
4
+ require('active_support/core_ext')
5
+ require('colorize')
6
+ require('curb')
7
+ require('eac/simple_cache')
8
+ require('eac_ruby_utils')
9
+ require('git')
10
+ require('json')
11
+ require('rubygems')
12
+ require('shellwords')
13
+ require('yaml')
14
+
15
+ module EacLauncher
16
+ require 'eac_launcher/context'
17
+ require 'eac_launcher/path'
18
+ require 'eac_launcher/project'
19
+ require 'eac_launcher/stereotype'
20
+ require 'eac_launcher/context/settings'
21
+ require 'eac_launcher/git/base'
22
+ require 'eac_launcher/git/mirror_update'
23
+ require 'eac_launcher/git/publish_base'
24
+ require 'eac_launcher/git/transpose_base'
25
+ require 'eac_launcher/instances/base'
26
+ require 'eac_launcher/instances/runner_helper'
27
+ require 'eac_launcher/instances/settings'
28
+ require 'eac_launcher/publish/base'
29
+ require 'eac_launcher/publish/check_result'
30
+ require 'eac_launcher/stereotypes/git'
31
+ require 'eac_launcher/stereotypes/git_subrepo'
32
+ require 'eac_launcher/stereotypes/git_subtree'
33
+ require 'eac_launcher/stereotypes/rails'
34
+ require 'eac_launcher/stereotypes/redmine_plugin'
35
+ require 'eac_launcher/stereotypes/ruby_gem'
36
+ require 'eac_launcher/stereotypes/git/publish'
37
+ require 'eac_launcher/stereotypes/git/transpose'
38
+ require 'eac_launcher/stereotypes/git_subrepo/publish'
39
+ require 'eac_launcher/stereotypes/git_subrepo/transpose'
40
+ require 'eac_launcher/stereotypes/git_subtree/publish'
41
+ require 'eac_launcher/stereotypes/git_subtree/transpose'
42
+ require 'eac_launcher/stereotypes/ruby_gem/publish'
43
+ require 'eac_launcher/vendor/github'
44
+ end
@@ -0,0 +1,63 @@
1
+ module EacLauncher
2
+ class Context
3
+ include ::Eac::SimpleCache
4
+
5
+ class << self
6
+ def current
7
+ default
8
+ end
9
+
10
+ def default
11
+ @default ||= Context.new(
12
+ ENV['EAC_LAUNCHER_PROJECTS_ROOT'] || '.',
13
+ ENV['EAC_LAUNCHER_SETTINGS_FILE'] ||
14
+ ::File.join(ENV['HOME'], '.config', 'eac_launcher', 'settings.yml')
15
+ )
16
+ end
17
+ end
18
+
19
+ attr_reader :root, :settings
20
+ attr_accessor :publish_options
21
+
22
+ def initialize(projects_root, settings_file)
23
+ @root = ::EacLauncher::Instances::Base.new(projects_root, nil)
24
+ @settings = ::EacLauncher::Context::Settings.new(settings_file)
25
+ @publish_options = { new: false, confirm: false, stereotype: nil }
26
+ end
27
+
28
+ def cache_root
29
+ File.join(ENV['HOME'], '.cache', 'cli-utils', 'dev')
30
+ end
31
+
32
+ private
33
+
34
+ def projects_uncached
35
+ r = {}
36
+ instances.each do |i|
37
+ r[i.basename] ||= []
38
+ r[i.basename] << i
39
+ end
40
+ r.map { |name, instances| ::EacLauncher::Project.new(name, instances) }
41
+ .select { |p| include_project?(p) }
42
+ end
43
+
44
+ def instances_uncached
45
+ instance_instances(root)
46
+ end
47
+
48
+ def instance_instances(i)
49
+ r = []
50
+ r << i if include_instance?(i)
51
+ r += i.children.flat_map { |c| instance_instances(c) }
52
+ r
53
+ end
54
+
55
+ def include_project?(p)
56
+ !@settings.excluded_projects.include?(p.name)
57
+ end
58
+
59
+ def include_instance?(i)
60
+ i.project? && !@settings.excluded_projects.include?(i.project_name)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,36 @@
1
+ module EacLauncher
2
+ class Context
3
+ class Settings
4
+ include ::Eac::SimpleCache
5
+
6
+ def initialize(file)
7
+ @data = YAML.load_file(file)
8
+ end
9
+
10
+ def instance_settings(instance)
11
+ ::EacLauncher::Instances::Settings.new(value(['Instances', instance.to_root_path]))
12
+ end
13
+
14
+ private
15
+
16
+ def excluded_projects_uncached
17
+ enum_value(%w[Projects Exclude])
18
+ end
19
+
20
+ def enum_value(path)
21
+ r = value(path)
22
+ r.is_a?(Enumerable) ? r : []
23
+ end
24
+
25
+ def value(path)
26
+ node_value(@data, path)
27
+ end
28
+
29
+ def node_value(data, path)
30
+ return data if path.empty?
31
+ return nil unless data.is_a?(Hash)
32
+ node_value(data[path.first], path.drop(1))
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,105 @@
1
+ require_relative 'base/underlying'
2
+ require_relative 'base/subrepo'
3
+
4
+ module EacLauncher
5
+ module Git
6
+ class Base < ::EacLauncher::Path
7
+ include ::Eac::SimpleCache
8
+ include ::EacLauncher::Git::Base::Subrepo
9
+ include ::EacLauncher::Git::Base::Underlying
10
+
11
+ def init_bare
12
+ FileUtils.mkdir_p(self)
13
+ ::EacRubyUtils::Envs.local.command('git', 'init', '--bare', self).execute! unless
14
+ File.exist?(subpath('.git'))
15
+ end
16
+
17
+ def rev_parse(ref)
18
+ r = execute!('rev-parse', ref, exit_outputs: { 128 => nil, 32_768 => nil })
19
+ r.strip! if r.is_a?(String)
20
+ r = nil if r == ''
21
+ r
22
+ end
23
+
24
+ def remote_hashs(remote_name)
25
+ r = {}
26
+ execute!(['ls-remote', remote_name]).each_line do |line|
27
+ x = line.strip.split(/\s+/)
28
+ r[x[1]] = x[0]
29
+ end
30
+ r
31
+ end
32
+
33
+ def remote_exist?(remote_name)
34
+ git.remote(remote_name).url.present?
35
+ end
36
+
37
+ def descendant?(descendant, ancestor)
38
+ base = merge_base(descendant, ancestor)
39
+ return false if base.blank?
40
+ revparse = execute!('rev-parse', '--verify', ancestor).strip
41
+ base == revparse
42
+ end
43
+
44
+ def merge_base(*commits)
45
+ refs = commits.dup
46
+ while refs.count > 1
47
+ refs[1] = merge_base_pair(refs[0], refs[1])
48
+ return nil if refs[1].blank?
49
+ refs.shift
50
+ end
51
+ refs.first
52
+ end
53
+
54
+ def subtree_split(prefix)
55
+ execute!('subtree', '-q', 'split', '-P', prefix).strip
56
+ end
57
+
58
+ def assert_remote_url(remote_name, url)
59
+ r = git.remote(remote_name)
60
+ if !r.url || r.url != url
61
+ r.remove if r.url
62
+ git.add_remote(remote_name, url)
63
+ end
64
+ r
65
+ end
66
+
67
+ def remote_branch_sha(remote_name, branch_name)
68
+ remote_hashs(remote_name)["refs/heads/#{branch_name}"]
69
+ end
70
+
71
+ def push(remote_name, refspecs, options = {})
72
+ refspecs = [refspecs] unless refspecs.is_a?(Array)
73
+ args = ['push']
74
+ args << '--dry-run' if options[:dryrun]
75
+ args << '--force' if options[:force]
76
+ system!(args + [remote_name] + refspecs)
77
+ end
78
+
79
+ def push_all(remote_name)
80
+ system!('push', '--all', remote_name)
81
+ system!('push', '--tags', remote_name)
82
+ end
83
+
84
+ def fetch(remote_name, options = {})
85
+ args = ['fetch', '-p', remote_name]
86
+ args << '--tags' if options[:tags]
87
+ execute!(*args)
88
+ end
89
+
90
+ def current_branch
91
+ execute!(%w[symbolic-ref -q HEAD]).gsub(%r{\Arefs/heads/}, '').strip
92
+ end
93
+
94
+ def reset_hard(ref)
95
+ execute!('reset', '--hard', ref)
96
+ end
97
+
98
+ private
99
+
100
+ def merge_base_pair(c1, c2)
101
+ execute!('merge-base', c1, c2, exit_outputs: { 256 => '' }).strip
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,18 @@
1
+ module EacLauncher
2
+ module Git
3
+ class Base < ::EacLauncher::Path
4
+ module Subrepo
5
+ def subrepo_status(subrepo_path)
6
+ s = execute!('subrepo', 'status', subrepo_path.gsub(%r{\A/}, ''))
7
+ r = {}.with_indifferent_access
8
+ s.each_line do |l|
9
+ m = /\A([^\:]+)\:(.*)\z/.match(l.strip)
10
+ next unless m && m[2].present?
11
+ r[m[1].strip] = m[2].strip
12
+ end
13
+ r
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,38 @@
1
+ module EacLauncher
2
+ module Git
3
+ class Base < ::EacLauncher::Path
4
+ module Underlying
5
+ def execute!(*args)
6
+ args, options = build_args(args)
7
+ ::EacRubyUtils::Envs.local.command(*args).execute!(options)
8
+ end
9
+
10
+ def system!(*args)
11
+ args, options = build_args(args)
12
+ ::EacRubyUtils::Envs.local.command(*args).system!(options)
13
+ end
14
+
15
+ private
16
+
17
+ def build_args(args)
18
+ options = {}
19
+ if args.last.is_a?(Hash)
20
+ options = args.last
21
+ args.pop
22
+ end
23
+ args = args.first if args.first.is_a?(Array)
24
+ [['git', '-C', self, '--no-pager'] + args, options]
25
+ end
26
+
27
+ def git_uncached
28
+ FileUtils.mkdir_p(self)
29
+ if File.exist?(subpath('.git'))
30
+ ::Git.open(self)
31
+ else
32
+ ::Git.init(self)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end