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.
Files changed (46) hide show
  1. data/.gitignore +4 -1
  2. data/CHANGELOG +26 -2
  3. data/Gemfile +4 -4
  4. data/Gemfile.lock +60 -0
  5. data/README.md +90 -36
  6. data/Rakefile +1 -26
  7. data/VERSION +1 -1
  8. data/auto_tagger.gemspec +24 -14
  9. data/bin/autotag +14 -29
  10. data/features/autotag.feature +43 -2
  11. data/features/deployment.feature +4 -0
  12. data/features/step_definitions/autotag_steps.rb +27 -22
  13. data/features/step_definitions/deployment_steps.rb +41 -33
  14. data/features/support/env.rb +45 -2
  15. data/features/support/step_helpers.rb +36 -12
  16. data/features/templates/deploy.erb +1 -1
  17. data/lib/auto_tagger/base.rb +150 -19
  18. data/lib/auto_tagger/capistrano_helper.rb +38 -17
  19. data/lib/auto_tagger/command_line.rb +65 -0
  20. data/lib/auto_tagger/commander.rb +22 -11
  21. data/lib/auto_tagger/configuration.rb +88 -0
  22. data/lib/auto_tagger/deprecator.rb +11 -0
  23. data/lib/auto_tagger/git/ref.rb +34 -0
  24. data/lib/auto_tagger/git/ref_set.rb +35 -0
  25. data/lib/auto_tagger/git/repo.rb +76 -0
  26. data/lib/auto_tagger/options.rb +170 -0
  27. data/lib/auto_tagger/recipes.rb +67 -27
  28. data/lib/auto_tagger.rb +9 -4
  29. data/spec/auto_tagger/base_spec.rb +236 -52
  30. data/spec/auto_tagger/capistrano_helper_spec.rb +82 -112
  31. data/spec/auto_tagger/command_line_spec.rb +110 -0
  32. data/spec/auto_tagger/commander_spec.rb +33 -7
  33. data/spec/auto_tagger/configuration_spec.rb +275 -0
  34. data/spec/auto_tagger/git/ref_set_spec.rb +61 -0
  35. data/spec/auto_tagger/git/ref_spec.rb +46 -0
  36. data/spec/auto_tagger/git/repo_spec.rb +108 -0
  37. data/spec/auto_tagger/options_spec.rb +157 -0
  38. data/spec/spec_helper.rb +1 -6
  39. metadata +32 -15
  40. data/geminstaller.yml +0 -7
  41. data/lib/auto_tagger/repository.rb +0 -43
  42. data/lib/auto_tagger/stage_manager.rb +0 -23
  43. data/lib/auto_tagger/tag.rb +0 -43
  44. data/spec/auto_tagger/repository_spec.rb +0 -72
  45. data/spec/auto_tagger/stage_manager_spec.rb +0 -34
  46. data/spec/auto_tagger/tag_spec.rb +0 -66
data/.gitignore CHANGED
@@ -4,4 +4,7 @@ rdoc/*
4
4
  .DS_Store
5
5
  test_files/*
6
6
  .idea/*
7
- .bundle/*
7
+ .bundle/*
8
+ .rvmrc
9
+ junk.*
10
+ .auto_tagger
data/CHANGELOG CHANGED
@@ -1,3 +1,27 @@
1
+ 2010-08-10
2
+
3
+ - Added the following commands
4
+ - help
5
+ - version
6
+ - create STAGE
7
+ - list STAGE
8
+ - cleanup STAGE
9
+ - delete_locally STAGE
10
+ - delete_on_remote STAGE
11
+ - Added the following options to autotag
12
+ --date-separator - the character used to separate parts of the timestamp
13
+ --fetch-refs - whether to fetch refs before creating or listing them
14
+ --push-refs - whether to push refs after creating them
15
+ --remote - specify a custom remote (defaults to "origin")
16
+ --ref-path - use a different ref directory, other than "tags"
17
+ --stages - specify all of the stages
18
+ --offline - don't push or fetch refs (is ignored with delete_on_remote command)
19
+ --dry-run - don't execute anything, but print the commands
20
+ --verbose - prints all commands as they run
21
+ --refs-to-keep - when using any clean commans, specify how many refs to keep
22
+ --executable - specify the full path to the git executable
23
+ --opts-file - the location of an additional opts file
24
+
1
25
  2010-05-15
2
26
 
3
27
  - Fixed the exit status in autotag executable (thank you Sarah Mei)
@@ -19,7 +43,7 @@
19
43
 
20
44
  2009-04-20
21
45
 
22
- - `release_tagger:create_tag` creates a production tag if you don't set any stages
46
+ - `release_tagger:create_ref` creates a production tag if you don't set any stages
23
47
 
24
48
  2009-04-05
25
49
 
@@ -31,7 +55,7 @@
31
55
 
32
56
  - Capistrano bases new tags off of old tags from the previous environment when tagging if there is a tag from the previous environment
33
57
  - Added the following cap tasks:
34
- - print_latest_tags
58
+ - print_latest_refs
35
59
  - read_tag_from_shared
36
60
  - write_tag_to_shared
37
61
 
data/Gemfile CHANGED
@@ -1,8 +1,8 @@
1
1
  source :gemcutter
2
2
 
3
- gem "cucumber", "0.6.4"
3
+ gem "rake", "0.8.7"
4
+ gem "rspec", "2.0.0.beta.19"
5
+ gem "cucumber", "0.8.5"
4
6
  gem "capistrano", "2.5.18"
5
7
  gem "capistrano-ext", "1.2.1"
6
- gem "rspec", "1.3.0"
7
- gem "rr", "0.8.1"
8
- gem "activesupport", "2.3.5"
8
+ gem "jeweler", "1.4.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,60 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ builder (2.1.2)
5
+ capistrano (2.5.18)
6
+ highline
7
+ net-scp (>= 1.0.0)
8
+ net-sftp (>= 2.0.0)
9
+ net-ssh (>= 2.0.14)
10
+ net-ssh-gateway (>= 1.0.0)
11
+ capistrano-ext (1.2.1)
12
+ capistrano (>= 1.0.0)
13
+ cucumber (0.8.5)
14
+ builder (~> 2.1.2)
15
+ diff-lcs (~> 1.1.2)
16
+ gherkin (~> 2.1.4)
17
+ json_pure (~> 1.4.3)
18
+ term-ansicolor (~> 1.0.4)
19
+ diff-lcs (1.1.2)
20
+ gemcutter (0.6.1)
21
+ gherkin (2.1.5)
22
+ trollop (~> 1.16.2)
23
+ git (1.2.5)
24
+ highline (1.6.1)
25
+ jeweler (1.4.0)
26
+ gemcutter (>= 0.1.0)
27
+ git (>= 1.2.5)
28
+ rubyforge (>= 2.0.0)
29
+ json_pure (1.4.3)
30
+ net-scp (1.0.2)
31
+ net-ssh (>= 1.99.1)
32
+ net-sftp (2.0.4)
33
+ net-ssh (>= 2.0.9)
34
+ net-ssh (2.0.23)
35
+ net-ssh-gateway (1.0.1)
36
+ net-ssh (>= 1.99.1)
37
+ rake (0.8.7)
38
+ rspec (2.0.0.beta.19)
39
+ rspec-core (= 2.0.0.beta.19)
40
+ rspec-expectations (= 2.0.0.beta.19)
41
+ rspec-mocks (= 2.0.0.beta.19)
42
+ rspec-core (2.0.0.beta.19)
43
+ rspec-expectations (2.0.0.beta.19)
44
+ diff-lcs (>= 1.1.2)
45
+ rspec-mocks (2.0.0.beta.19)
46
+ rubyforge (2.0.4)
47
+ json_pure (>= 1.1.7)
48
+ term-ansicolor (1.0.5)
49
+ trollop (1.16.2)
50
+
51
+ PLATFORMS
52
+ ruby
53
+
54
+ DEPENDENCIES
55
+ capistrano (= 2.5.18)
56
+ capistrano-ext (= 1.2.1)
57
+ cucumber (= 0.8.5)
58
+ jeweler (= 1.4.0)
59
+ rake (= 0.8.7)
60
+ rspec (= 2.0.0.beta.19)
data/README.md CHANGED
@@ -24,31 +24,56 @@ You can use the `autotag` command to tag releases on your CI box, then use the c
24
24
 
25
25
  ## The autotag executable
26
26
 
27
- Installing the gem creates an executable file named autotag, which takes two arguments: the stage, and optionally the path to the git repo:
28
-
29
- $ autotag demo # => creates a tag like demo/200804041234 in the current directory
30
- $ autotag demo . # => same as above
31
- $ autotag demo /Users/me/foo # => cd's to /Users/me/foo before creating the tag
32
-
33
- Running autotag does the following:
34
-
35
- $ git fetch origin --tags
36
- $ git tag <stage>/<timestamp>
37
- $ git push origin --tags
27
+ Installing the gem creates an executable file named autotag, which takes the stage, optionally the path to the git repo, and options:
28
+
29
+ $ autotag create demo # => creates a tag like demo/200804041234 in the current directory
30
+ $ autotag create demo . # => same as above
31
+ $ autotag create demo /Users/me/foo # => cd's to /Users/me/foo before creating the tag
32
+
33
+ By default, running autotag does the following:
34
+
35
+ $ git fetch origin refs/tags/*:refs/tags/*
36
+ $ git update-ref refs/tags/demo/20100910051459 1242b283208d06661b2a916097c41c046510af68
37
+ $ git push origin refs/tags/*:refs/tags/*
38
+
39
+ The autotag executable has the following commands:
40
+
41
+ help
42
+ version
43
+ create STAGE
44
+ list STAGE
45
+ cleanup STAGE
46
+ delete_locally STAGE
47
+ delete_on_remote STAGE
48
+
49
+ The autotag executable accepts the following options:
50
+
51
+ --date-separator - the character used to separate parts of the timestamp
52
+ --fetch-refs - whether to fetch refs before creating or listing them
53
+ --push-refs - whether to push refs after creating them
54
+ --remote - specify a custom remote (defaults to "origin")
55
+ --ref-path - use a different ref directory, other than "tags"
56
+ --stages - specify all of the stages
57
+ --offline - don't push or fetch refs (is ignored with delete_on_remote command)
58
+ --dry-run - don't execute anything, but print the commands
59
+ --verbose - prints all commands as they run
60
+ --refs-to-keep - when using any clean commans, specify how many refs to keep
61
+ --executable - specify the full path to the git executable
62
+ --opts-file - the location of a custom options file
38
63
 
39
64
  ## Capistrano Integration
40
65
 
41
66
  AutoTagger comes with 2 capistrano tasks:
42
67
 
43
- * `release_tagger:set_branch` tries to set the branch to the last tag from the previous environment.
44
- * `release_tagger:create_tag` runs autotag for the current stage
68
+ * `auto_tagger:set_branch` tries to set the branch to the last tag from the previous environment.
69
+ * `auto_tagger:create_ref` runs autotag for the current stage
45
70
 
46
71
  Example `config/deploy.rb` file:
47
72
 
48
- require 'release_tagger'
73
+ require 'auto_tagger/recipes'
49
74
 
50
- # The :autotagger_stages variable is required
51
- set :autotagger_stages, [:ci, :staging, :production]
75
+ # The :auto_tagger_stages variable is required
76
+ set :auto_tagger_stages, [:ci, :staging, :production]
52
77
 
53
78
  # The :working_directory variable is optional, and defaults to Dir.pwd
54
79
  # :working_directory can be an absolute or relative path
@@ -56,32 +81,47 @@ Example `config/deploy.rb` file:
56
81
 
57
82
  task :production do
58
83
  # In each of your environments that need auto-branch setting, you need to set :stage
59
- set :stage, :production
84
+ set :auto_tagger_stage, :production
60
85
  end
61
86
 
62
87
  task :staging do
63
88
  # If you do not set stage, it will not auto-set your branch
64
- # set :stage, :staging
89
+ # set :auto_tagger_stage, :staging
65
90
  end
66
91
 
67
92
  # You need to add the before/ater callbacks yourself
68
- before "deploy:update_code", "release_tagger:set_branch"
69
- after "deploy", "release_tagger:create_tag"
70
- after "deploy", "release_tagger:write_tag_to_shared"
71
- after "deploy", "release_tagger:print_latest_tags"
93
+ before "deploy:update_code", "auto_tagger:set_branch"
94
+ after "deploy", "auto_tagger:create_ref"
95
+ after "deploy", "auto_tagger:write_tag_to_shared"
96
+ after "deploy", "auto_tagger:print_latest_refs"
72
97
 
73
- ### Cpistano-ext multistage support
98
+ ### Capistano-ext multistage support
74
99
 
75
100
  If you use capistano-ext multistage, you can use auto_tagger.
76
101
 
77
- set :autotagger_stages, [:ci, :staging, :production]
102
+ set :auto_tagger_stages, [:ci, :staging, :production]
78
103
  set :stages, [:staging, :production]
79
104
  set :default_stage, :staging
80
105
  require 'capistrano/ext/multistage'
81
106
 
82
- When you deploy, autotagger will auto-detect your current stage.
107
+ When you deploy, auto_tagger will auto-detect your current stage.
108
+
109
+ You can specify the following capistrano variables that correspond to the autotag options:
110
+
111
+ :auto_tagger_date_separator
112
+ :auto_tagger_push_refs
113
+ :auto_tagger_fetch_refs
114
+ :auto_tagger_remote
115
+ :auto_tagger_ref_path
116
+ :auto_tagger_offline
117
+ :auto_tagger_dry_run
118
+ :auto_tagger_verbose
119
+ :auto_tagger_refs_to_keep
120
+ :auto_tagger_executable
121
+ :auto_tagger_opts_file
122
+ :auto_tagger_working_directory
83
123
 
84
- ### release_tagger:set_branch
124
+ ### auto_tagger:set_branch
85
125
 
86
126
  This task sets the git branch to the latest tag from the previous stage. Assume you have the following tags in your git repository:
87
127
 
@@ -91,7 +131,7 @@ This task sets the git branch to the latest tag from the previous stage. Assume
91
131
 
92
132
  And the following stages in your capistrano file:
93
133
 
94
- set :autotagger_stages, [:ci, :staging, :production]
134
+ set :auto_tagger_stages, [:ci, :staging, :production]
95
135
 
96
136
  The deployments would look like this:
97
137
 
@@ -109,29 +149,29 @@ If you add `before "deploy:update_code", "release_tagger:set_branch"`, you can j
109
149
 
110
150
  and the branch will be set for you automatically.
111
151
 
112
- ### release_tagger:create_tag
152
+ ### release_tagger:create_ref
113
153
 
114
154
  This cap task creates a new tag, based on the latest tag from the previous environment.
115
155
 
116
156
  If there is no tag from the previous stage, it creates a new tag from the latest commit in your _working directory_.
117
157
 
118
- If you don't specify any `autotagger_stages`, autotagger will create a tag that starts with "production".
158
+ If you don't specify any `auto_tagger_stages`, auto_tagger will create a tag that starts with "production".
119
159
 
120
- ### release_tagger:print_latest_tags
160
+ ### release_tagger:print_latest_refs
121
161
 
122
162
  This task reads the git version from the text file in shared:
123
163
 
124
164
  cap staging release_tagger:read_tag_from_shared
125
165
 
126
- ### release_tagger:print_latest_tags
166
+ ### release_tagger:print_latest_refs
127
167
 
128
168
  This task takes the latest tag from each environment and prints it to the screen. You can add it to your deploy.rb like so:
129
169
 
130
- after "deploy", "release_tagger:print_latest_tags"
170
+ after "deploy", "release_tagger:print_latest_refs"
131
171
 
132
172
  Or call it directly, like:
133
173
 
134
- cap production release_tagger:print_latest_tags
174
+ cap production release_tagger:print_latest_refs
135
175
 
136
176
  This will produce output like:
137
177
 
@@ -140,6 +180,14 @@ This will produce output like:
140
180
  ** staging staging/20090331050908 8031807feb5f4f99dd83257cdc07081fa6080cba some commit message
141
181
  ** production production/20090331050917 8031807feb5f4f99dd83257cdc07081fa6080cba some commit message
142
182
 
183
+ ## Configuration
184
+
185
+ You can store options in an options file, which is .auto_tagger by default. You can set options in this file like so:
186
+
187
+ --date-separator=-
188
+ --ref-path=autotags
189
+ --refs-to-keep=5
190
+
143
191
  ## Running tests:
144
192
 
145
193
  You must be able to ssh into your box via localhost (remote login). To make this easier, add your own key to your own account:
@@ -152,13 +200,18 @@ To ensure that this has worked, try this:
152
200
 
153
201
  If it asks you for a password, you've done something wrong.
154
202
 
155
- To run the specs, execute:
203
+ To run the specs, first make sure you have the required gems:
204
+
205
+ gem install bundler
206
+ bundle install
207
+
208
+ Then execute:
156
209
 
157
- spec spec/
210
+ rspec spec
158
211
 
159
212
  To run the cucumber features, execute:
160
213
 
161
- cucumber features/
214
+ cucumber features
162
215
 
163
216
  ## Acknowledgments
164
217
 
@@ -169,6 +222,7 @@ Special thanks to:
169
222
  * Chad Wooley for his feature ideas
170
223
  * Tim Holahan for his QA
171
224
  * Pat Nakajima for making auto_tagger a better ruby citizen
225
+ * Josh Susser for recommending the date format changes
172
226
 
173
227
  ## Links
174
228
 
data/Rakefile CHANGED
@@ -13,34 +13,9 @@ begin
13
13
  gem.require_paths = ["lib"]
14
14
  gem.executables = ["autotag"]
15
15
  gem.default_executable = %q{autotag}
16
- gem.date = %q{2010-04-25}
16
+ gem.date = %q{2010-09-10}
17
17
  end
18
18
  Jeweler::GemcutterTasks.new
19
19
  rescue LoadError
20
20
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
21
21
  end
22
-
23
- require 'spec/rake/spectask'
24
- Spec::Rake::SpecTask.new(:spec) do |spec|
25
- spec.libs << 'lib' << 'spec'
26
- spec.spec_files = FileList['spec/**/*_spec.rb']
27
- end
28
-
29
- Spec::Rake::SpecTask.new(:rcov) do |spec|
30
- spec.libs << 'lib' << 'spec'
31
- spec.pattern = 'spec/**/*_spec.rb'
32
- spec.rcov = true
33
- end
34
-
35
-
36
- task :default => :spec
37
-
38
- require 'rake/rdoctask'
39
- Rake::RDocTask.new do |rdoc|
40
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
41
-
42
- rdoc.rdoc_dir = 'rdoc'
43
- rdoc.title = "the-perfect-gem #{version}"
44
- rdoc.rdoc_files.include('README*')
45
- rdoc.rdoc_files.include('lib/**/*.rb')
46
- end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.2.0
data/auto_tagger.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{auto_tagger}
8
- s.version = "0.1.5"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jeff Dean", "Brian Takita", "Mike Grafton", "Bruce Krysiak", "Pat Nakajima", "Jay Zeschin", "Mike Barinek", "Sarah Mei"]
12
- s.date = %q{2010-05-15}
12
+ s.date = %q{2010-09-10}
13
13
  s.default_executable = %q{autotag}
14
14
  s.email = %q{jeff@zilkey.com}
15
15
  s.executables = ["autotag"]
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
21
21
  ".gitignore",
22
22
  "CHANGELOG",
23
23
  "Gemfile",
24
+ "Gemfile.lock",
24
25
  "MIT-LICENSE",
25
26
  "README.md",
26
27
  "Rakefile",
@@ -36,35 +37,44 @@ Gem::Specification.new do |s|
36
37
  "features/templates/cap_ext_deploy.erb",
37
38
  "features/templates/deploy.erb",
38
39
  "features/templates/stage.erb",
39
- "geminstaller.yml",
40
40
  "lib/auto_tagger.rb",
41
41
  "lib/auto_tagger/base.rb",
42
42
  "lib/auto_tagger/capistrano_helper.rb",
43
+ "lib/auto_tagger/command_line.rb",
43
44
  "lib/auto_tagger/commander.rb",
45
+ "lib/auto_tagger/configuration.rb",
46
+ "lib/auto_tagger/deprecator.rb",
47
+ "lib/auto_tagger/git/ref.rb",
48
+ "lib/auto_tagger/git/ref_set.rb",
49
+ "lib/auto_tagger/git/repo.rb",
50
+ "lib/auto_tagger/options.rb",
44
51
  "lib/auto_tagger/recipes.rb",
45
- "lib/auto_tagger/repository.rb",
46
- "lib/auto_tagger/stage_manager.rb",
47
- "lib/auto_tagger/tag.rb",
48
52
  "spec/auto_tagger/base_spec.rb",
49
53
  "spec/auto_tagger/capistrano_helper_spec.rb",
54
+ "spec/auto_tagger/command_line_spec.rb",
50
55
  "spec/auto_tagger/commander_spec.rb",
51
- "spec/auto_tagger/repository_spec.rb",
52
- "spec/auto_tagger/stage_manager_spec.rb",
53
- "spec/auto_tagger/tag_spec.rb",
56
+ "spec/auto_tagger/configuration_spec.rb",
57
+ "spec/auto_tagger/git/ref_set_spec.rb",
58
+ "spec/auto_tagger/git/ref_spec.rb",
59
+ "spec/auto_tagger/git/repo_spec.rb",
60
+ "spec/auto_tagger/options_spec.rb",
54
61
  "spec/spec_helper.rb"
55
62
  ]
56
63
  s.homepage = %q{http://github.com/zilkey/auto_tagger}
57
64
  s.rdoc_options = ["--charset=UTF-8"]
58
65
  s.require_paths = ["lib"]
59
- s.rubygems_version = %q{1.3.6}
66
+ s.rubygems_version = %q{1.3.7}
60
67
  s.summary = %q{Helps you automatically create tags for each stage in a multi-stage deploment and deploy from the latest tag from the previous environment}
61
68
  s.test_files = [
62
69
  "spec/auto_tagger/base_spec.rb",
63
70
  "spec/auto_tagger/capistrano_helper_spec.rb",
71
+ "spec/auto_tagger/command_line_spec.rb",
64
72
  "spec/auto_tagger/commander_spec.rb",
65
- "spec/auto_tagger/repository_spec.rb",
66
- "spec/auto_tagger/stage_manager_spec.rb",
67
- "spec/auto_tagger/tag_spec.rb",
73
+ "spec/auto_tagger/configuration_spec.rb",
74
+ "spec/auto_tagger/git/ref_set_spec.rb",
75
+ "spec/auto_tagger/git/ref_spec.rb",
76
+ "spec/auto_tagger/git/repo_spec.rb",
77
+ "spec/auto_tagger/options_spec.rb",
68
78
  "spec/spec_helper.rb"
69
79
  ]
70
80
 
@@ -72,7 +82,7 @@ Gem::Specification.new do |s|
72
82
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
73
83
  s.specification_version = 3
74
84
 
75
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
85
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
76
86
  s.add_runtime_dependency(%q<capistrano>, [">= 2.5.3"])
77
87
  else
78
88
  s.add_dependency(%q<capistrano>, [">= 2.5.3"])
data/bin/autotag CHANGED
@@ -1,35 +1,20 @@
1
1
  #!/usr/bin/env ruby
2
2
  require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "auto_tagger"))
3
- require 'getoptlong'
4
3
 
5
- def usage
6
- puts
7
- puts "USAGE: #{File.basename($0)} <stage> [<repository>]"
8
- puts
9
- puts ' where: stage sets the tag prefix'
10
- puts ' repository sets the repository to act on - defualts to the current directory'
11
- puts
12
- puts ' examples: autotag'
13
- puts ' autotag .'
14
- puts ' autotag ../'
15
- puts ' autotag /data/myrepo'
16
- puts ' autotag demo'
17
- puts
18
- puts
19
- exit 0
20
- end
21
-
22
- if ARGV[0] && ["-h", "--help", "-?", "--?"].include?(ARGV[0])
23
- usage
24
- elsif ARGV[0]
25
- begin
26
- AutoTagger::Runner.new(ARGV[0], ARGV[1]).create_tag
27
- rescue Exception => e
28
- puts "Error occured: #{e}"
29
- exit 1
4
+ begin
5
+ success, message = AutoTagger::CommandLine.new(ARGV.dup).execute
6
+ if success
7
+ puts message
8
+ Kernel.exit 0
30
9
  else
31
- exit 0
10
+ puts "Error occured: #{message}"
11
+ Kernel.exit 1
32
12
  end
33
- else
34
- usage
13
+ rescue SystemExit => e
14
+ Kernel.exit(e.status)
15
+ rescue Exception => e
16
+ STDERR.puts("Error occured:")
17
+ STDERR.puts(" #{e.message} (#{e.class})")
18
+ STDERR.puts(e.backtrace.join("\n "))
19
+ Kernel.exit(1)
35
20
  end
@@ -9,7 +9,7 @@ Feature: Deployment
9
9
  And I should see "USAGE:"
10
10
  And no tags should be created
11
11
  And exit code should be 0
12
-
12
+
13
13
  Scenario: user runs autotag with "--help"
14
14
  Given a repo
15
15
  When I run autotag with "--help"
@@ -31,21 +31,62 @@ Feature: Deployment
31
31
  And no tags should be created
32
32
  And exit code should be 0
33
33
 
34
+ @deprecated
34
35
  Scenario: user runs autotag with "demo"
35
36
  Given a repo
36
37
  When I run autotag with "demo"
37
38
  Then a "demo" tag should be created
38
39
  And exit code should be 0
39
40
 
41
+ @deprecated
40
42
  Scenario: user runs autotag with "demo ."
41
43
  Given a repo
42
44
  When I run autotag with "demo"
43
45
  Then a "demo" tag should be created
44
46
  And exit code should be 0
45
47
 
48
+ @deprecated
46
49
  Scenario: autotag cannot successfully complete
47
50
  Given a repo
48
51
  When I run autotag with "demo /no/such/path"
49
52
  Then I should see "Error occured:"
50
53
  And exit code should be 1
51
- And no tags should be created
54
+ And no tags should be created
55
+
56
+ @deprecated
57
+ Scenario: path is incorrect
58
+ Given a repo
59
+ When I run autotag with "create demo /no/such/path"
60
+ Then I should see "Error occured:"
61
+ And exit code should be 1
62
+ And no tags should be created
63
+
64
+ @1.0.0
65
+ Scenario: user runs autotag with "help"
66
+ Given a repo
67
+ When I run autotag with "help"
68
+ And I should see "USAGE:"
69
+ And no tags should be created
70
+ And the exit code should be 0
71
+
72
+ @1.0.0
73
+ Scenario: user runs autotag with "version"
74
+ Given a repo
75
+ When I run autotag with "version"
76
+ And I should see "AutoTagger version"
77
+ And no tags should be created
78
+ And the exit code should be 0
79
+
80
+ @1.0.0
81
+ Scenario: user runs autotag with "create demo . --date-separator -"
82
+ Given a repo
83
+ When I run autotag with "create demo --date-separator -"
84
+ Then a hyphen-delimited "demo" tag should be created
85
+ And the exit code should be 0
86
+
87
+ @1.0.0
88
+ Scenario: user runs autotag with "cleanup" with no stage
89
+ Given a repo
90
+ When I run autotag with "cleanup"
91
+ Then I should see "Error occured: You must provide a stage"
92
+ And the exit code should be 1
@@ -3,18 +3,21 @@ Feature: Deployment
3
3
  As a ruby and git ninja
4
4
  I want cap to do all the work for me
5
5
 
6
+ @0.1.5
6
7
  Scenario: user deploys with single file deploy.rb with 3 stages
7
8
  Given a three-stage app using single deploy file
8
9
  And a ci tag
9
10
  When I deploy to staging
10
11
  Then a tag should be added to git
11
12
 
13
+ @0.1.5
12
14
  Scenario: user deploys with single file deploy.rb with no stages
13
15
  Given a one-stage app using single deploy file with the following environments:
14
16
  |production |
15
17
  When I deploy
16
18
  Then a "production" tag should be added to git
17
19
 
20
+ @0.1.5
18
21
  Scenario: user deploys with single file deploy.rb stages with dashes in the name
19
22
  Given a one-stage app using single deploy file with the following environments:
20
23
  |staging |
@@ -22,6 +25,7 @@ Feature: Deployment
22
25
  When I deploy to secret-production
23
26
  Then a "secret-production" tag should be added to git
24
27
 
28
+ @0.1.5
25
29
  Scenario: user deploys with cap-ext multistage
26
30
  Given a three-stage app using cap-multistage
27
31
  And a ci tag