auto_tagger 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|