auto_tagger 0.1.5 → 0.2.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.
- data/.gitignore +4 -1
- data/CHANGELOG +26 -2
- data/Gemfile +4 -4
- data/Gemfile.lock +60 -0
- data/README.md +90 -36
- data/Rakefile +1 -26
- data/VERSION +1 -1
- data/auto_tagger.gemspec +24 -14
- data/bin/autotag +14 -29
- data/features/autotag.feature +43 -2
- data/features/deployment.feature +4 -0
- data/features/step_definitions/autotag_steps.rb +27 -22
- data/features/step_definitions/deployment_steps.rb +41 -33
- data/features/support/env.rb +45 -2
- data/features/support/step_helpers.rb +36 -12
- data/features/templates/deploy.erb +1 -1
- data/lib/auto_tagger/base.rb +150 -19
- data/lib/auto_tagger/capistrano_helper.rb +38 -17
- data/lib/auto_tagger/command_line.rb +65 -0
- data/lib/auto_tagger/commander.rb +22 -11
- data/lib/auto_tagger/configuration.rb +88 -0
- data/lib/auto_tagger/deprecator.rb +11 -0
- data/lib/auto_tagger/git/ref.rb +34 -0
- data/lib/auto_tagger/git/ref_set.rb +35 -0
- data/lib/auto_tagger/git/repo.rb +76 -0
- data/lib/auto_tagger/options.rb +170 -0
- data/lib/auto_tagger/recipes.rb +67 -27
- data/lib/auto_tagger.rb +9 -4
- data/spec/auto_tagger/base_spec.rb +236 -52
- data/spec/auto_tagger/capistrano_helper_spec.rb +82 -112
- data/spec/auto_tagger/command_line_spec.rb +110 -0
- data/spec/auto_tagger/commander_spec.rb +33 -7
- data/spec/auto_tagger/configuration_spec.rb +275 -0
- data/spec/auto_tagger/git/ref_set_spec.rb +61 -0
- data/spec/auto_tagger/git/ref_spec.rb +46 -0
- data/spec/auto_tagger/git/repo_spec.rb +108 -0
- data/spec/auto_tagger/options_spec.rb +157 -0
- data/spec/spec_helper.rb +1 -6
- metadata +32 -15
- data/geminstaller.yml +0 -7
- data/lib/auto_tagger/repository.rb +0 -43
- data/lib/auto_tagger/stage_manager.rb +0 -23
- data/lib/auto_tagger/tag.rb +0 -43
- data/spec/auto_tagger/repository_spec.rb +0 -72
- data/spec/auto_tagger/stage_manager_spec.rb +0 -34
- data/spec/auto_tagger/tag_spec.rb +0 -66
@@ -1,28 +1,28 @@
|
|
1
1
|
Given /^a repo$/ do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
with_or_without_debugging do
|
3
|
+
helpers = StepHelpers.new
|
4
|
+
helpers.create_git_repo
|
5
|
+
helpers.create_app
|
6
|
+
@refs = helpers.refs
|
7
|
+
end
|
8
8
|
end
|
9
9
|
|
10
10
|
When /^I run autotag with no arguments$/ do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
with_or_without_debugging do
|
12
|
+
helpers = StepHelpers.new
|
13
|
+
@output, @exit_code = helpers.run_autotag
|
14
|
+
@refs = helpers.refs
|
15
|
+
@exit_code = helpers.exit_code
|
16
|
+
end
|
17
17
|
end
|
18
18
|
|
19
19
|
When /^I run autotag with "([^\"]*)"$/ do |args|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
with_or_without_debugging do
|
21
|
+
helpers = StepHelpers.new
|
22
|
+
@output = helpers.run_autotag(args)
|
23
|
+
@refs = helpers.refs
|
24
|
+
@exit_code = helpers.exit_code
|
25
|
+
end
|
26
26
|
end
|
27
27
|
|
28
28
|
Then /^I should see "([^\"]*)"$/ do |text|
|
@@ -34,18 +34,23 @@ Then /^the exit code should be "(\d+)"$/ do |code|
|
|
34
34
|
end
|
35
35
|
|
36
36
|
Then /^no tags should be created$/ do
|
37
|
-
@
|
37
|
+
@refs.strip.should == ""
|
38
38
|
end
|
39
39
|
|
40
40
|
Then /^a "([^\"]*)" tag should be added to git$/ do |stage|
|
41
41
|
helpers = StepHelpers.new
|
42
|
-
helpers.
|
42
|
+
helpers.refs.split("\n").last.should match(/\/#{stage}\//)
|
43
43
|
end
|
44
44
|
|
45
45
|
Then /^a "([^\"]*)" tag should be created$/ do |prefix|
|
46
|
-
@
|
46
|
+
@refs.strip.split("\n").any? { |ref| ref =~ /\/demo\// }.should be_true
|
47
|
+
end
|
48
|
+
|
49
|
+
Then /^a hyphen-delimited "([^\"]*)" tag should be created$/ do |prefix|
|
50
|
+
tag = @refs.strip.split("\n").detect { |ref| ref =~ /\/demo\// }
|
51
|
+
tag.split(" ").last.split("/").last.split("-").first.should == Date.today.year.to_s
|
47
52
|
end
|
48
53
|
|
49
|
-
Then /^exit code should be (\d*)$/ do |exit_code|
|
54
|
+
Then /^(?:the )?exit code should be (\d*)$/ do |exit_code|
|
50
55
|
@exit_code.should == exit_code.to_i
|
51
56
|
end
|
@@ -1,53 +1,61 @@
|
|
1
1
|
Given /^a three-stage app using single deploy file$/ do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
with_or_without_debugging do
|
3
|
+
helpers = StepHelpers.new
|
4
|
+
helpers.create_app_with_single_deploy_file([:ci, :staging, :production])
|
5
|
+
@refs = helpers.refs
|
6
|
+
end
|
7
7
|
end
|
8
8
|
|
9
9
|
Given /^a one\-stage app using single deploy file with the following environments:$/ do |table|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
with_or_without_debugging do
|
11
|
+
helpers = StepHelpers.new
|
12
|
+
helpers.create_app_with_single_deploy_file table.raw.map(&:first)
|
13
|
+
@refs = helpers.refs
|
14
|
+
end
|
15
15
|
end
|
16
16
|
|
17
17
|
Given /^a three-stage app using cap-multistage$/ do
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
with_or_without_debugging do
|
19
|
+
helpers = StepHelpers.new
|
20
|
+
helpers.create_app_with_cap_ext_multistage
|
21
|
+
@refs = helpers.refs
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Given /^an app with deploy file that uses the dsl$/ do
|
26
|
+
with_or_without_debugging do
|
27
|
+
helpers = StepHelpers.new
|
28
|
+
helpers.create_app_with_dsl
|
29
|
+
@refs = helpers.refs
|
30
|
+
end
|
23
31
|
end
|
24
32
|
|
25
33
|
Given /^a ci tag$/ do
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
34
|
+
with_or_without_debugging do
|
35
|
+
helpers = StepHelpers.new
|
36
|
+
helpers.autotag("ci")
|
37
|
+
@refs = helpers.refs
|
38
|
+
end
|
31
39
|
end
|
32
40
|
|
33
41
|
When /^I deploy to (.*)$/ do |environment|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
42
|
+
with_or_without_debugging do
|
43
|
+
helpers = StepHelpers.new
|
44
|
+
helpers.deploy(environment)
|
45
|
+
end
|
38
46
|
end
|
39
47
|
|
40
48
|
When /^I deploy$/ do
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
49
|
+
with_or_without_debugging do
|
50
|
+
helpers = StepHelpers.new
|
51
|
+
helpers.deploy
|
52
|
+
end
|
45
53
|
end
|
46
54
|
|
47
55
|
Then /^a tag should be added to git$/ do
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
56
|
+
with_or_without_debugging do
|
57
|
+
helpers = StepHelpers.new
|
58
|
+
new_tags = helpers.refs
|
59
|
+
@refs.length.should < new_tags.length
|
60
|
+
end
|
53
61
|
end
|
data/features/support/env.rb
CHANGED
@@ -1,7 +1,50 @@
|
|
1
|
-
require '
|
1
|
+
require 'rspec'
|
2
2
|
require 'erb'
|
3
3
|
require 'etc'
|
4
|
-
|
4
|
+
|
5
|
+
class String
|
6
|
+
def starts_with?(prefix)
|
7
|
+
self[0, prefix.length] == prefix
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Silencers
|
12
|
+
|
13
|
+
def with_or_without_debugging
|
14
|
+
if ENV['AUTO_TAGGER_DEBUG'] == "true"
|
15
|
+
puts
|
16
|
+
yield
|
17
|
+
puts
|
18
|
+
else
|
19
|
+
silence_stream(STDOUT) do
|
20
|
+
silence_stream(STDERR) do
|
21
|
+
silence_warnings do
|
22
|
+
yield
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def silence_stream(stream)
|
30
|
+
old_stream = stream.dup
|
31
|
+
stream.reopen(RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'NUL:' : '/dev/null')
|
32
|
+
stream.sync = true
|
33
|
+
yield
|
34
|
+
ensure
|
35
|
+
stream.reopen(old_stream)
|
36
|
+
end
|
37
|
+
|
38
|
+
def silence_warnings
|
39
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
40
|
+
yield
|
41
|
+
ensure
|
42
|
+
$VERBOSE = old_verbose
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
World(Silencers)
|
5
48
|
|
6
49
|
Before do
|
7
50
|
StepHelpers.new.reset
|
@@ -24,10 +24,19 @@ class StepHelpers
|
|
24
24
|
create_single_deploy_file(environments)
|
25
25
|
end
|
26
26
|
|
27
|
+
def create_app_with_dsl
|
28
|
+
create_git_repo
|
29
|
+
create_app
|
30
|
+
capify_app
|
31
|
+
create_dsl_deploy_file
|
32
|
+
end
|
33
|
+
|
27
34
|
def run_autotag(args = nil)
|
28
35
|
cmd = "cd #{app_dir} && ../../bin/autotag"
|
29
36
|
cmd += " #{args}" if args
|
37
|
+
cmd += " 2>&1"
|
30
38
|
output = `#{cmd}`
|
39
|
+
puts output
|
31
40
|
@exit_code = $?.exitstatus
|
32
41
|
return output
|
33
42
|
end
|
@@ -55,11 +64,11 @@ class StepHelpers
|
|
55
64
|
system "cd #{app_dir} && git tag #{stage}/#{Time.now.utc.strftime('%Y%m%d%H%M%S')} && git push origin --tags"
|
56
65
|
end
|
57
66
|
|
58
|
-
def tags
|
59
|
-
system "cd #{app_dir} && git fetch origin
|
60
|
-
|
61
|
-
puts
|
62
|
-
|
67
|
+
def refs(namespace = "tags")
|
68
|
+
system "cd #{app_dir} && git fetch origin refs/#{namespace}/*:refs/#{namespace}/*"
|
69
|
+
refs = `cd #{app_dir} && git show-ref | grep #{namespace}`
|
70
|
+
puts refs
|
71
|
+
refs
|
63
72
|
end
|
64
73
|
|
65
74
|
def create_app
|
@@ -86,22 +95,41 @@ class StepHelpers
|
|
86
95
|
end
|
87
96
|
|
88
97
|
def create_single_deploy_file(environments)
|
98
|
+
|
99
|
+
# ERB variables
|
89
100
|
repository = repo_dir
|
90
101
|
deploy_to = File.join(test_files_dir, "deployed")
|
91
102
|
git_location = `which git`.strip
|
92
103
|
user = Etc.getlogin
|
93
104
|
|
94
105
|
path = File.expand_path(File.join(__FILE__, "..", "..", "templates", "deploy.erb"))
|
95
|
-
|
96
|
-
|
97
|
-
|
106
|
+
template = ERB.new File.read(path)
|
107
|
+
output = template.result(binding)
|
108
|
+
File.open(File.join(app_dir, "config", "deploy.rb"), 'w') {|f| f.write(output) }
|
109
|
+
end
|
110
|
+
|
111
|
+
def create_dsl_deploy_file
|
98
112
|
|
113
|
+
# ERB variables
|
114
|
+
repository = repo_dir
|
115
|
+
deploy_to = File.join(test_files_dir, "deployed")
|
116
|
+
git_location = `which git`.strip
|
117
|
+
user = Etc.getlogin
|
118
|
+
environments = ["ci", "staging"]
|
119
|
+
|
120
|
+
path = File.expand_path(File.join(__FILE__, "..", "..", "templates", "deploy_dsl.erb"))
|
99
121
|
template = ERB.new File.read(path)
|
100
122
|
output = template.result(binding)
|
123
|
+
|
124
|
+
puts "#{__FILE__}:#{__LINE__}"
|
125
|
+
p output
|
126
|
+
|
101
127
|
File.open(File.join(app_dir, "config", "deploy.rb"), 'w') {|f| f.write(output) }
|
102
128
|
end
|
103
129
|
|
104
130
|
def create_cap_ext_multistage_deploy_files
|
131
|
+
|
132
|
+
# ERB variables
|
105
133
|
repository = repo_dir
|
106
134
|
deploy_to = File.join(test_files_dir, "deployed")
|
107
135
|
git_location = `which git`.strip
|
@@ -109,11 +137,9 @@ class StepHelpers
|
|
109
137
|
environments = [:ci, :staging, :production]
|
110
138
|
|
111
139
|
path = File.expand_path(File.join(__FILE__, "..", "..", "templates", "cap_ext_deploy.erb"))
|
112
|
-
|
113
140
|
template = ERB.new File.read(path)
|
114
141
|
output = template.result(binding)
|
115
142
|
File.open(File.join(app_dir, "config", "deploy.rb"), 'w') {|f| f.write(output) }
|
116
|
-
|
117
143
|
%w(staging production).each do |stage|
|
118
144
|
create_cap_ext_multistage_deploy_stage_file(stage)
|
119
145
|
end
|
@@ -122,11 +148,9 @@ class StepHelpers
|
|
122
148
|
def create_cap_ext_multistage_deploy_stage_file(stage)
|
123
149
|
deploy_subdir = File.join(app_dir, "config", "deploy")
|
124
150
|
FileUtils.mkdir_p deploy_subdir
|
125
|
-
|
126
151
|
template_path = File.expand_path(File.join(__FILE__, "..", "..", "templates", "stage.erb"))
|
127
152
|
template = ERB.new File.read(template_path)
|
128
153
|
output = template.result(binding)
|
129
|
-
|
130
154
|
File.open(File.join(deploy_subdir, "#{stage}.rb"), 'w') {|f| f.write(output) }
|
131
155
|
end
|
132
156
|
|
@@ -31,4 +31,4 @@ end
|
|
31
31
|
before "deploy:update_code", "release_tagger:set_branch"
|
32
32
|
after "deploy", "release_tagger:create_tag"
|
33
33
|
after "deploy", "release_tagger:write_tag_to_shared"
|
34
|
-
after "deploy", "release_tagger:
|
34
|
+
after "deploy", "release_tagger:print_latest_tag"
|
data/lib/auto_tagger/base.rb
CHANGED
@@ -1,26 +1,157 @@
|
|
1
1
|
module AutoTagger
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
2
|
+
|
3
|
+
def self.version
|
4
|
+
File.read(File.expand_path(File.join(__FILE__, "/../../../VERSION")))
|
5
|
+
end
|
6
|
+
|
7
|
+
class Base
|
8
|
+
class StageCannotBeBlankError < StandardError;
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.items_to_remove(array, keep)
|
12
|
+
max = array.length - keep
|
13
|
+
max = 0 if max <= 0
|
14
|
+
array[0...max]
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :options
|
18
|
+
|
19
|
+
def initialize(options)
|
20
|
+
@options = options
|
21
|
+
end
|
22
|
+
|
23
|
+
def repo
|
24
|
+
@repo ||= AutoTagger::Git::Repo.new configuration.working_directory,
|
25
|
+
:execute_commands => !configuration.dry_run?,
|
26
|
+
:verbose => configuration.verbose?,
|
27
|
+
:executable => configuration.executable
|
28
|
+
end
|
29
|
+
|
30
|
+
def last_ref_from_previous_stage
|
31
|
+
return unless previous_stage
|
32
|
+
refs_for_stage(previous_stage).last
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_ref(commit = nil)
|
36
|
+
ensure_stage
|
37
|
+
fetch
|
38
|
+
new_tag = repo.refs.create(commit || repo.latest_commit_sha, ref_name)
|
39
|
+
push
|
18
40
|
new_tag
|
19
41
|
end
|
20
42
|
|
21
|
-
def
|
22
|
-
|
23
|
-
|
43
|
+
def pattern
|
44
|
+
"refs/#{configuration.ref_path}/*"
|
45
|
+
end
|
46
|
+
|
47
|
+
private :pattern
|
48
|
+
|
49
|
+
def fetch
|
50
|
+
repo.refs.fetch(pattern, configuration.remote) if configuration.fetch_refs?
|
51
|
+
end
|
52
|
+
|
53
|
+
private :fetch
|
54
|
+
|
55
|
+
def push
|
56
|
+
repo.refs.push(pattern, configuration.remote) if configuration.push_refs?
|
57
|
+
end
|
58
|
+
|
59
|
+
private :push
|
60
|
+
|
61
|
+
def cleanup
|
62
|
+
refs = refs_to_remove
|
63
|
+
delete_local_refs(refs)
|
64
|
+
delete_remote_refs(refs) if configuration.push_refs?
|
65
|
+
refs.length
|
66
|
+
end
|
67
|
+
|
68
|
+
def delete_locally
|
69
|
+
refs = refs_to_remove
|
70
|
+
refs.each { |ref| ref.delete_locally }
|
71
|
+
refs.length
|
72
|
+
end
|
73
|
+
|
74
|
+
def delete_local_refs(refs)
|
75
|
+
refs.each { |ref| ref.delete_locally }
|
76
|
+
end
|
77
|
+
|
78
|
+
private :delete_local_refs
|
79
|
+
|
80
|
+
def delete_on_remote
|
81
|
+
refs = refs_to_remove
|
82
|
+
delete_remote_refs(refs)
|
83
|
+
refs.length
|
84
|
+
end
|
85
|
+
|
86
|
+
def delete_remote_refs(refs)
|
87
|
+
if refs.any?
|
88
|
+
cmd = ["push #{configuration.remote}"]
|
89
|
+
cmd += refs.map { |ref| ":#{ref.name}" }
|
90
|
+
repo.exec cmd.join(" ")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
private :delete_remote_refs
|
95
|
+
|
96
|
+
def list
|
97
|
+
ensure_stage
|
98
|
+
fetch
|
99
|
+
refs_for_stage(configuration.stage)
|
100
|
+
end
|
101
|
+
|
102
|
+
def release_tag_entries
|
103
|
+
configuration.stages.map do |stage|
|
104
|
+
refs_for_stage(stage).last
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def refs_for_stage(stage)
|
109
|
+
raise StageCannotBeBlankError if stage.to_s.strip == ""
|
110
|
+
ref_path = Regexp.escape(configuration.ref_path)
|
111
|
+
matcher = /refs\/#{ref_path}\/#{Regexp.escape(stage)}\/.*/
|
112
|
+
repo.refs.all.select do |ref|
|
113
|
+
(ref.name =~ matcher) ? ref : nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def refs_to_remove
|
120
|
+
self.class.items_to_remove(refs_for_stage(configuration.stage), configuration.refs_to_keep)
|
121
|
+
end
|
122
|
+
|
123
|
+
def previous_stage
|
124
|
+
return unless configuration.stage
|
125
|
+
index = configuration.stages.index(configuration.stage).to_i - 1
|
126
|
+
configuration.stages[index] if index > -1
|
127
|
+
end
|
128
|
+
|
129
|
+
def configuration
|
130
|
+
@configuration ||= begin
|
131
|
+
config = AutoTagger::Configuration.new(@options)
|
132
|
+
# raise "Stage must be included in stages" unless config.stages.include?(config.stage)
|
133
|
+
config
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def ref_name
|
138
|
+
"refs/#{configuration.ref_path}/#{configuration.stage}/#{timestamp}"
|
139
|
+
end
|
140
|
+
|
141
|
+
def timestamp
|
142
|
+
time = Time.now.utc
|
143
|
+
[
|
144
|
+
time.strftime("%Y"),
|
145
|
+
time.strftime("%m"),
|
146
|
+
time.strftime("%d"),
|
147
|
+
time.strftime("%H"),
|
148
|
+
time.strftime("%M"),
|
149
|
+
time.strftime("%S")
|
150
|
+
].join(configuration.date_separator)
|
151
|
+
end
|
152
|
+
|
153
|
+
def ensure_stage
|
154
|
+
raise StageCannotBeBlankError if configuration.stage.to_s.strip == ""
|
24
155
|
end
|
25
156
|
end
|
26
157
|
end
|
@@ -1,40 +1,61 @@
|
|
1
1
|
module AutoTagger
|
2
2
|
class CapistranoHelper
|
3
3
|
|
4
|
-
attr_reader :variables
|
4
|
+
attr_reader :variables
|
5
|
+
private :variables
|
5
6
|
|
6
7
|
def initialize(variables)
|
7
|
-
@stage_manager = StageManager.new(variables[:autotagger_stages])
|
8
8
|
@variables = variables
|
9
|
-
@stage = variables[:stage]
|
10
|
-
@working_directory = variables[:working_directory] || Dir.pwd
|
11
9
|
end
|
12
10
|
|
13
|
-
def
|
14
|
-
@
|
11
|
+
def auto_tagger
|
12
|
+
@auto_tagger ||= AutoTagger::Base.new(auto_tagger_options)
|
15
13
|
end
|
16
14
|
|
17
|
-
def
|
15
|
+
def ref
|
18
16
|
if variables.has_key?(:head)
|
19
17
|
variables[:branch]
|
20
18
|
elsif variables.has_key?(:tag)
|
21
19
|
variables[:tag]
|
22
|
-
elsif
|
23
|
-
|
20
|
+
elsif variables.has_key?(:ref)
|
21
|
+
variables[:ref]
|
22
|
+
elsif auto_tagger.last_ref_from_previous_stage
|
23
|
+
auto_tagger.last_ref_from_previous_stage.sha
|
24
24
|
else
|
25
25
|
variables[:branch]
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
def auto_tagger_options
|
30
|
+
options = {}
|
31
|
+
options[:stage] = variables[:auto_tagger_stage] || variables[:stage]
|
32
|
+
options[:stages] = stages
|
33
|
+
|
34
|
+
if variables[:working_directory]
|
35
|
+
AutoTagger::Deprecator.warn(":working_directory is deprecated. Please use :auto_tagger_working_directory.")
|
36
|
+
options[:path] = variables[:working_directory]
|
37
|
+
else
|
38
|
+
options[:path] = variables[:auto_tagger_working_directory]
|
39
|
+
end
|
40
|
+
|
41
|
+
[
|
42
|
+
:date_separator, :push_refs, :fetch_refs, :remote, :ref_path, :offline,
|
43
|
+
:dry_run, :verbose, :refs_to_keep, :executable, :opts_file
|
44
|
+
].each do |key|
|
45
|
+
options[key] = variables[:"auto_tagger_#{key}"]
|
46
|
+
end
|
47
|
+
|
48
|
+
options
|
49
|
+
end
|
50
|
+
|
51
|
+
def stages
|
52
|
+
if variables[:autotagger_stages]
|
53
|
+
AutoTagger::Deprecator.warn(":autotagger_stages is deprecated. Please use :auto_tagger_stages.")
|
54
|
+
stages = variables[:autotagger_stages]
|
55
|
+
else
|
56
|
+
stages = variables[:auto_tagger_stages] || variables[:stages] || []
|
36
57
|
end
|
37
|
-
|
58
|
+
stages.map { |stage| stage.to_s }
|
38
59
|
end
|
39
60
|
|
40
61
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module AutoTagger
|
2
|
+
class CommandLine
|
3
|
+
|
4
|
+
def initialize(args)
|
5
|
+
@args = args
|
6
|
+
end
|
7
|
+
|
8
|
+
def execute
|
9
|
+
case options[:command]
|
10
|
+
when :version
|
11
|
+
[true, "AutoTagger version #{AutoTagger.version}"]
|
12
|
+
when :help
|
13
|
+
[true, options[:help_text]]
|
14
|
+
when :cleanup
|
15
|
+
begin
|
16
|
+
purged = AutoTagger::Base.new(options).cleanup
|
17
|
+
[true, "Deleted: #{purged}"]
|
18
|
+
rescue AutoTagger::Base::StageCannotBeBlankError
|
19
|
+
[false, "You must provide a stage"]
|
20
|
+
end
|
21
|
+
when :delete_locally
|
22
|
+
begin
|
23
|
+
purged = AutoTagger::Base.new(options).delete_locally
|
24
|
+
[true, "Deleted: #{purged}"]
|
25
|
+
rescue AutoTagger::Base::StageCannotBeBlankError
|
26
|
+
[false, "You must provide a stage"]
|
27
|
+
end
|
28
|
+
when :delete_on_remote
|
29
|
+
begin
|
30
|
+
purged = AutoTagger::Base.new(options).delete_on_remote
|
31
|
+
[true, "Deleted: #{purged}"]
|
32
|
+
rescue AutoTagger::Base::StageCannotBeBlankError
|
33
|
+
[false, "You must provide a stage"]
|
34
|
+
end
|
35
|
+
when :list
|
36
|
+
begin
|
37
|
+
[true, AutoTagger::Base.new(options).list.join("\n")]
|
38
|
+
rescue AutoTagger::Base::StageCannotBeBlankError
|
39
|
+
[false, "You must provide a stage"]
|
40
|
+
end
|
41
|
+
when :config
|
42
|
+
[true, AutoTagger::Configuration.new(options).settings.map { |key, value| "#{key} : #{value}" }.join("\n")]
|
43
|
+
else
|
44
|
+
begin
|
45
|
+
create_message = []
|
46
|
+
if options[:deprecated]
|
47
|
+
create_message << AutoTagger::Deprecator.string("Please use `autotag create #{options[:stage]}` instead")
|
48
|
+
end
|
49
|
+
ref = AutoTagger::Base.new(options).create_ref
|
50
|
+
create_message << "Created ref #{ref.name}"
|
51
|
+
[true, create_message.join("\n")]
|
52
|
+
rescue AutoTagger::Base::StageCannotBeBlankError
|
53
|
+
[false, "You must provide a stage"]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def options
|
61
|
+
@options ||= AutoTagger::Options.from_command_line(@args)
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|