zilkey-auto_tagger 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 [Jeff Dean]
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # AutoTagger
2
+
3
+ AutoTagger allows you to create a date-stamped tag for each stage of your deployment, and deploy from the last tag from the previous environment.
4
+
5
+ Let's say you have the following workflow:
6
+
7
+ * Run all test on a Continuous Integration (CI) server
8
+ * Deploy to a staging server
9
+ * Deploy to a production server
10
+
11
+ You can use the `autotag` command to tag releases on your CI box, then use the capistrano tasks to auto-tag each release.
12
+
13
+ ## Capistrano Integration
14
+
15
+ Example deploy file:
16
+
17
+ require 'release_tagger'
18
+
19
+ # The :stages variable is required
20
+ set :stages, [:ci, :staging, :production]
21
+
22
+ # The :working_directory variable is optional, and defaults to Dir.pwd
23
+ # :working_directory can be an absolute or relative path
24
+ set :working_directory, "../../"
25
+
26
+ task :production do
27
+ # In each of your environments that need auto-branch setting, you need to set :current_stage
28
+ set :current_stage, :production
29
+ end
30
+
31
+ task :staging do
32
+ # If you do not set current_stage, it will not auto-set your branch
33
+ # set :current_stage, :staging
34
+ end
35
+
36
+ # You need to add the before/ater callbacks yourself
37
+ before "deploy:update_code", "release_tagger:set_branch"
38
+ after "deploy:update_code", "release_tagger:create_tag"
39
+
40
+ Assume you have the following tags in your git repository:
41
+
42
+ * ci/01
43
+ * staging/01
44
+ * production/01
45
+
46
+ The deployments would look like this:
47
+
48
+ cap staging deploy # => ci/01
49
+ cap production deploy # => staging/01
50
+
51
+ You can override with with the -Shead and -Stag options
52
+
53
+ cap staging deploy -Shead=true # => master
54
+ cap staging deploy -Stag=staging/01 # => staging/01
55
+
56
+ ## The autotag executable
57
+
58
+ autotag -h
59
+ autotag demo
60
+ autotag demo .
61
+ autotag demo /Users/me/foo
62
+
63
+ ## Known Issues
64
+
65
+ * DOES NOT work with capistrano ext multi-stage
66
+ * It will accept invalid tag names (if you specify a tag name with a space, it will blow up when you try to create the tag)
67
+
68
+ ## Things that might be useful
69
+
70
+ * Make it possible to define a different remote other than "origin"
71
+ * Make it possible to define a different default branch other than "master"
72
+ * Make it work with either cap-ext multistage or single-file deploy.rb files
73
+ * Make it possible to provide your own tag naming convention (like the PaperClip string interpolation), instead of relying on <prefix>/<timestamp>
74
+
75
+ ## Links
76
+
77
+ * http://codeintensity.blogspot.com/2008/06/changelogs-and-deployment-notification.html
78
+
79
+ Copyright (c) 2009 [Jeff Dean], released under the MIT license
@@ -0,0 +1,26 @@
1
+ class AutoTagger
2
+
3
+ class EnvironmentCannotBeBlankError < StandardError; end
4
+
5
+ attr_reader :stage, :repository, :working_directory
6
+
7
+ def initialize(stage, path = nil)
8
+ raise EnvironmentCannotBeBlankError if stage.to_s.strip == ""
9
+ @working_directory = File.expand_path(path ||= Dir.pwd)
10
+ @repository = Repository.new(@working_directory)
11
+ @stage = stage
12
+ end
13
+
14
+ def create_tag
15
+ repository.tags.fetch
16
+ new_tag = repository.tags.create(stage)
17
+ repository.tags.push
18
+ new_tag
19
+ end
20
+
21
+ def latest_tag
22
+ repository.tags.fetch
23
+ repository.tags.latest_from(stage)
24
+ end
25
+
26
+ end
@@ -0,0 +1,38 @@
1
+ class CapistranoHelper
2
+
3
+ class NoStagesSpecifiedError < StandardError
4
+ def message
5
+ "You must set the :stages variable to an array, like set :stages, [:ci, :demo]"
6
+ end
7
+ end
8
+
9
+ attr_reader :variables, :stages, :current_stage, :working_directory
10
+
11
+ def initialize(variables)
12
+ raise NoStagesSpecifiedError unless variables[:stages]
13
+ @variables = variables
14
+ @stages = variables[:stages]
15
+ @current_stage = variables[:current_stage]
16
+ @working_directory = variables[:working_directory] || Dir.pwd
17
+ end
18
+
19
+ def previous_stage
20
+ if current_stage
21
+ index = stages.index(current_stage) - 1
22
+ stages[index] if index > -1
23
+ end
24
+ end
25
+
26
+ def branch
27
+ if variables.has_key?(:head)
28
+ variables[:branch]
29
+ elsif variables.has_key?(:tag)
30
+ variables[:tag]
31
+ elsif previous_stage && (latest = AutoTagger.new(previous_stage, working_directory).latest_tag)
32
+ latest
33
+ else
34
+ variables[:branch]
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,16 @@
1
+ class Commander
2
+ class << self
3
+ def execute(path, cmd)
4
+ `#{command_in_context(path, cmd)}`
5
+ end
6
+
7
+ def execute!(path, cmd)
8
+ system command_in_context(path, cmd)
9
+ end
10
+
11
+ def command_in_context(path, cmd)
12
+ "cd #{path} && #{cmd}"
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,38 @@
1
+ class Repository
2
+
3
+ class NoPathProvidedError < StandardError; end
4
+ class NoSuchPathError < StandardError; end
5
+ class InvalidGitRepositoryError < StandardError; end
6
+ class GitCommandFailedError < StandardError; end
7
+
8
+ attr_reader :path
9
+
10
+ def initialize(path)
11
+ if path.to_s.strip == ""
12
+ raise NoPathProvidedError
13
+ elsif ! File.exists?(path)
14
+ raise NoSuchPathError
15
+ elsif ! File.exists?(File.join(path, ".git"))
16
+ raise InvalidGitRepositoryError
17
+ else
18
+ @path = path
19
+ end
20
+ end
21
+
22
+ def ==(other)
23
+ other.is_a?(Repository) && other.path == path
24
+ end
25
+
26
+ def tags
27
+ @tags ||= Tag.new(self)
28
+ end
29
+
30
+ def run(cmd)
31
+ Commander.execute(path, cmd)
32
+ end
33
+
34
+ def run!(cmd)
35
+ Commander.execute!(path, cmd) || raise(GitCommandFailedError)
36
+ end
37
+
38
+ end
@@ -0,0 +1,38 @@
1
+ class Tag
2
+
3
+ attr_reader :repository
4
+
5
+ def initialize(repository)
6
+ @repository = repository
7
+ end
8
+
9
+ def find_all
10
+ repository.run("git tag").split("\n")
11
+ end
12
+
13
+ def fetch
14
+ repository.run! "git fetch origin --tags"
15
+ end
16
+
17
+ def latest_from(stage)
18
+ find_all.select{|tag| tag =~ /^#{stage}/}.sort.last
19
+ end
20
+
21
+ def push
22
+ repository.run! "git push origin --tags"
23
+ end
24
+
25
+ def create(stage)
26
+ # git tag -a -m 'Successful continuous integration build on #{timestamp}' #{tag_name}"
27
+ tag_name = name_for(stage)
28
+ repository.run! "git tag #{tag_name}"
29
+ tag_name
30
+ end
31
+
32
+ private
33
+
34
+ def name_for(stage)
35
+ "%s/%s" % [stage, Time.now.utc.strftime('%Y%m%d%H%M%S')]
36
+ end
37
+
38
+ end
@@ -0,0 +1,9 @@
1
+ [
2
+ 'commander',
3
+ 'repository',
4
+ 'tag',
5
+ 'auto_tagger',
6
+ 'capistrano_helper'
7
+ ].each do |file|
8
+ require File.expand_path(File.join(File.dirname(__FILE__), "auto_tagger", file))
9
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "auto_tagger"))
2
+
3
+ Capistrano::Configuration.instance(:must_exist).load do
4
+ namespace :release_tagger do
5
+ desc %Q{
6
+ Sets the branch to the latest tag from the previous stage.
7
+ Use -Shead=true to set the branch to master, -Stag=<tag> to specify the tag explicitly.
8
+ }
9
+ task :set_branch do
10
+ branch_name = CapistranoHelper.new(variables).branch
11
+ set :branch, branch_name
12
+ logger.info "setting branch to #{branch_name.inspect}"
13
+ end
14
+
15
+ desc %Q{Creates a tag using the current_stage variable}
16
+ task :create_tag do
17
+ if variables[:current_stage]
18
+ tag_name = AutoTagger.new(variables[:current_stage], variables[:working_directory]).create_tag
19
+ logger.info "created and pushed tag #{tag_name}"
20
+ else
21
+ logger.info "AUTO TAGGER WARNING: skipping auto-creation of tag. Please specify :current_stage to enable auto-creation of tags (like set :current_stage, :ci)."
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,69 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe AutoTagger do
4
+
5
+ describe ".new" do
6
+ it "blows up if you don't pass an stage" do
7
+ proc do
8
+ AutoTagger.new(nil)
9
+ end.should raise_error(AutoTagger::EnvironmentCannotBeBlankError)
10
+ end
11
+
12
+ it "sets the stage when it's passed" do
13
+ AutoTagger.new("ci").stage.should == "ci"
14
+ end
15
+
16
+ it "sets the path to Dir.pwd when nil" do
17
+ mock(Dir).pwd { "/foo" }
18
+ mock(Repository).new("/foo")
19
+ AutoTagger.new("ci")
20
+ end
21
+
22
+ it "expands the path when the path is passed" do
23
+ mock(Repository).new(File.expand_path("."))
24
+ AutoTagger.new("ci", ".")
25
+ end
26
+
27
+ it "exposes the working directory" do
28
+ mock(Repository).new(File.expand_path("."))
29
+ AutoTagger.new("ci", ".").working_directory.should == File.expand_path(".")
30
+ end
31
+ end
32
+
33
+ describe "#create_tag" do
34
+ it "generates the correct commands" do
35
+ time = Time.local(2001,1,1)
36
+ mock(Time).now.once {time}
37
+ timestamp = time.utc.strftime('%Y%m%d%H%M%S')
38
+ mock(File).exists?(anything).twice { true }
39
+
40
+ mock(Commander).execute!("/foo", "git fetch origin --tags") {true}
41
+ mock(Commander).execute!("/foo", "git tag ci/#{timestamp}") {true}
42
+ mock(Commander).execute!("/foo", "git push origin --tags") {true}
43
+
44
+ AutoTagger.new("ci", "/foo").create_tag
45
+ end
46
+
47
+ it "returns the tag that was created" do
48
+ time = Time.local(2001,1,1)
49
+ mock(Time).now.once {time}
50
+ timestamp = time.utc.strftime('%Y%m%d%H%M%S')
51
+ mock(File).exists?(anything).twice { true }
52
+ mock(Commander).execute!(anything, anything).times(any_times) {true}
53
+
54
+ AutoTagger.new("ci", "/foo").create_tag.should == "ci/#{timestamp}"
55
+ end
56
+ end
57
+
58
+ describe "#latest_tag" do
59
+ it "generates the correct commands" do
60
+ mock(File).exists?(anything).twice { true }
61
+
62
+ mock(Commander).execute!("/foo", "git fetch origin --tags") {true}
63
+ mock(Commander).execute("/foo", "git tag") { "ci_01" }
64
+
65
+ AutoTagger.new("ci", "/foo").latest_tag
66
+ end
67
+ end
68
+
69
+ end
@@ -0,0 +1,130 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe CapistranoHelper do
4
+
5
+ describe ".new" do
6
+ it "blows up if there are no stages" do
7
+ proc do
8
+ CapistranoHelper.new({})
9
+ end.should raise_error(CapistranoHelper::NoStagesSpecifiedError)
10
+ end
11
+ end
12
+
13
+ describe "#variables" do
14
+ it "returns all variables" do
15
+ CapistranoHelper.new({:stages => [:bar]}).variables.should == {:stages => [:bar]}
16
+ end
17
+ end
18
+
19
+ describe "#stages" do
20
+ it "returns the hashes' stages value" do
21
+ CapistranoHelper.new({:stages => [:bar]}).stages.should == [:bar]
22
+ end
23
+ end
24
+
25
+ describe "#working_directory" do
26
+ it "returns the hashes' working directory value" do
27
+ CapistranoHelper.new({:stages => [:bar], :working_directory => "/foo"}).working_directory.should == "/foo"
28
+ end
29
+
30
+ it "defaults to Dir.pwd if it's not set, or it's nil" do
31
+ mock(Dir).pwd { "/bar" }
32
+ CapistranoHelper.new({:stages => [:bar]}).working_directory.should == "/bar"
33
+ end
34
+ end
35
+
36
+ describe "#current_stage" do
37
+ it "returns the hashes' current stage value" do
38
+ CapistranoHelper.new({:stages => [:bar], :current_stage => :bar}).current_stage.should == :bar
39
+ CapistranoHelper.new({:stages => [:bar]}).current_stage.should be_nil
40
+ end
41
+ end
42
+
43
+ describe "#previous_stage" do
44
+ it "returns the previous stage if there is more than one stage, and there is a current stage" do
45
+ CapistranoHelper.new({:stages => [:foo, :bar], :current_stage => :bar}).previous_stage.should == :foo
46
+ end
47
+
48
+ it "returns nil if there is no previous stage" do
49
+ CapistranoHelper.new({:stages => [:bar], :current_stage => :bar}).previous_stage.should be_nil
50
+ end
51
+
52
+ it "returns nil if there is no current stage" do
53
+ CapistranoHelper.new({:stages => [:bar]}).previous_stage.should be_nil
54
+ end
55
+ end
56
+
57
+ describe "#branch" do
58
+ describe "with :head and :branch specified" do
59
+ it "returns master" do
60
+ variables = {
61
+ :stages => [:bar],
62
+ :head => nil,
63
+ :branch => "foo"
64
+ }
65
+ CapistranoHelper.new(variables).branch.should == "foo"
66
+ end
67
+ end
68
+
69
+ describe "with :head specified, but no branch specified" do
70
+ it "returns master" do
71
+ variables = {
72
+ :stages => [:bar],
73
+ :head => nil
74
+ }
75
+ CapistranoHelper.new(variables).branch.should == nil
76
+ end
77
+ end
78
+
79
+ describe "with :branch specified" do
80
+ it "returns the value of branch" do
81
+ variables = {
82
+ :stages => [:bar],
83
+ :branch => "foo"
84
+ }
85
+ CapistranoHelper.new(variables).branch.should == "foo"
86
+ end
87
+ end
88
+
89
+ describe "with a previous stage with a tag" do
90
+ it "returns the latest tag for the previous stage" do
91
+ variables = {
92
+ :stages => [:foo, :bar],
93
+ :current_stage => :bar,
94
+ :branch => "master",
95
+ :working_directory => "/foo"
96
+ }
97
+ tagger = Object.new
98
+ mock(tagger).latest_tag { "foo_01" }
99
+ mock(AutoTagger).new(:foo, "/foo") { tagger }
100
+ CapistranoHelper.new(variables).branch.should == "foo_01"
101
+ end
102
+ end
103
+
104
+ describe "with no branch and a previous stage with no tag" do
105
+ it "returns nil" do
106
+ variables = {
107
+ :stages => [:foo, :bar],
108
+ :current_stage => :bar,
109
+ :working_directory => "/foo"
110
+ }
111
+ tagger = Object.new
112
+ mock(tagger).latest_tag { nil }
113
+ mock(AutoTagger).new(:foo, "/foo") { tagger }
114
+ CapistranoHelper.new(variables).branch.should == nil
115
+ end
116
+ end
117
+
118
+ describe "with no branch and previous stage" do
119
+ it "returns nil" do
120
+ variables = {
121
+ :stages => [:bar],
122
+ :current_stage => :bar
123
+ }
124
+ CapistranoHelper.new(variables).previous_stage.should be_nil
125
+ CapistranoHelper.new(variables).branch.should == nil
126
+ end
127
+ end
128
+ end
129
+
130
+ end
@@ -0,0 +1,17 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Commander do
4
+ describe ".execute" do
5
+ it "execute the command and returns the results" do
6
+ mock(Commander).`("cd /foo && ls") { "" } #`
7
+ Commander.execute("/foo", "ls")
8
+ end
9
+ end
10
+
11
+ describe "system" do
12
+ it "executes and doesn't return anything" do
13
+ mock(Commander).system("cd /foo && ls")
14
+ Commander.execute!("/foo", "ls")
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,72 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Repository do
4
+ describe ".new" do
5
+ it "sets the repo" do
6
+ mock(File).exists?(anything).twice { true }
7
+ repo = Repository.new("/foo")
8
+ repo.path.should == "/foo"
9
+ end
10
+
11
+ it "raises an error when the path is blank" do
12
+ proc do
13
+ Repository.new(" ")
14
+ end.should raise_error(Repository::NoPathProvidedError)
15
+ end
16
+
17
+ it "raises an error when the path is nil" do
18
+ proc do
19
+ Repository.new(nil)
20
+ end.should raise_error(Repository::NoPathProvidedError)
21
+ end
22
+
23
+ it "raises an error with a file that doesn't exist" do
24
+ mock(File).exists?("/foo") { false }
25
+ proc do
26
+ Repository.new("/foo")
27
+ end.should raise_error(Repository::NoSuchPathError)
28
+ end
29
+
30
+ it "raises an error with a non-git repository" do
31
+ mock(File).exists?("/foo") { true }
32
+ mock(File).exists?("/foo/.git") { false }
33
+ proc do
34
+ Repository.new("/foo")
35
+ end.should raise_error(Repository::InvalidGitRepositoryError)
36
+ end
37
+ end
38
+
39
+ describe "#==" do
40
+ it "compares paths" do
41
+ mock(File).exists?(anything).times(any_times) { true }
42
+ Repository.new("/foo").should_not == "/foo"
43
+ Repository.new("/foo").should_not == Repository.new("/bar")
44
+ Repository.new("/foo").should == Repository.new("/foo")
45
+ end
46
+ end
47
+
48
+ describe "#run" do
49
+ it "sends the correct command" do
50
+ mock(File).exists?(anything).twice { true }
51
+ mock(Commander).execute("/foo", "bar")
52
+ Repository.new("/foo").run("bar")
53
+ end
54
+ end
55
+
56
+ describe "run!" do
57
+ it "sends the correct command" do
58
+ mock(File).exists?(anything).twice { true }
59
+ mock(Commander).execute!("/foo", "bar") { true }
60
+ Repository.new("/foo").run!("bar")
61
+ end
62
+
63
+ it "raises an exception if it the command returns false" do
64
+ mock(File).exists?(anything).twice { true }
65
+ mock(Commander).execute!("/foo", "bar") { false }
66
+ proc do
67
+ Repository.new("/foo").run!("bar")
68
+ end.should raise_error(Repository::GitCommandFailedError)
69
+ end
70
+ end
71
+
72
+ end
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Tag do
4
+
5
+ before(:each) do
6
+ @repository = Object.new
7
+ end
8
+
9
+ describe ".new" do
10
+ it "sets the repository" do
11
+ Tag.new(@repository).repository.should == @repository
12
+ end
13
+ end
14
+
15
+ describe "#find_all" do
16
+ it "returns an array of tags" do
17
+ mock(@repository).run("git tag") { "ci_01\nci_02" }
18
+ Tag.new(@repository).find_all.should == ["ci_01", "ci_02"]
19
+ end
20
+
21
+ it "returns an empty array if there are none" do
22
+ mock(@repository).run("git tag") { "" }
23
+ Tag.new(@repository).find_all.should be_empty
24
+ end
25
+ end
26
+
27
+ describe "#latest_from" do
28
+ before do
29
+ @tag = Tag.new(@repository)
30
+ mock(@tag).find_all { ["ci/01", "ci/02"] }
31
+ end
32
+
33
+ it "returns the latest tag that starts with the specified stage" do
34
+ @tag.latest_from(:ci).should == "ci/02"
35
+ end
36
+
37
+ it "returns nil if none match" do
38
+ @tag.latest_from(:staging).should be_nil
39
+ end
40
+ end
41
+
42
+ describe "#fetch_tags" do
43
+ it "sends the correct command" do
44
+ mock(@repository).run!("git fetch origin --tags")
45
+ Tag.new(@repository).fetch
46
+ end
47
+ end
48
+
49
+ describe "#push" do
50
+ it "sends the correct command" do
51
+ mock(@repository).run!("git push origin --tags")
52
+ Tag.new(@repository).push
53
+ end
54
+ end
55
+
56
+ describe "#create" do
57
+ it "creates the right command and returns the name" do
58
+ time = Time.local(2001,1,1)
59
+ mock(Time).now.once {time}
60
+ tag_name = "ci/#{time.utc.strftime('%Y%m%d%H%M%S')}"
61
+ mock(@repository).run!("git tag #{tag_name}")
62
+ Tag.new(@repository).create("ci").should == tag_name
63
+ end
64
+ end
65
+
66
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec'
2
+ require 'rr'
3
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "auto_tagger"))
4
+
5
+ Spec::Runner.configure do |config|
6
+ config.mock_with :rr
7
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zilkey-auto_tagger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Dean
@@ -23,7 +23,7 @@ dependencies:
23
23
  version: 2.5.3
24
24
  version:
25
25
  description:
26
- email: jeff at zilkey dot com
26
+ email:
27
27
  executables:
28
28
  - autotag
29
29
  extensions: []
@@ -31,24 +31,24 @@ extensions: []
31
31
  extra_rdoc_files: []
32
32
 
33
33
  files:
34
- - ./lib/auto_tagger
35
- - ./lib/auto_tagger/auto_tagger.rb
36
- - ./lib/auto_tagger/capistrano_helper.rb
37
- - ./lib/auto_tagger/commander.rb
38
- - ./lib/auto_tagger/repository.rb
39
- - ./lib/auto_tagger/tag.rb
40
- - ./lib/auto_tagger.rb
41
- - ./recipes/release_tagger.rb
42
- - ./bin/autotag
43
- - ./spec/auto_tagger
44
- - ./spec/auto_tagger/auto_tagger_spec.rb
45
- - ./spec/auto_tagger/capistrano_helper_spec.rb
46
- - ./spec/auto_tagger/commander_spec.rb
47
- - ./spec/auto_tagger/repository_spec.rb
48
- - ./spec/auto_tagger/tag_spec.rb
49
- - ./spec/spec_helper.rb
50
- - ./MIT-LICENSE
51
- - ./README.md
34
+ - lib/auto_tagger
35
+ - lib/auto_tagger/auto_tagger.rb
36
+ - lib/auto_tagger/capistrano_helper.rb
37
+ - lib/auto_tagger/commander.rb
38
+ - lib/auto_tagger/repository.rb
39
+ - lib/auto_tagger/tag.rb
40
+ - lib/auto_tagger.rb
41
+ - recipes/release_tagger.rb
42
+ - bin/autotag
43
+ - spec/auto_tagger
44
+ - spec/auto_tagger/auto_tagger_spec.rb
45
+ - spec/auto_tagger/capistrano_helper_spec.rb
46
+ - spec/auto_tagger/commander_spec.rb
47
+ - spec/auto_tagger/repository_spec.rb
48
+ - spec/auto_tagger/tag_spec.rb
49
+ - spec/spec_helper.rb
50
+ - MIT-LICENSE
51
+ - README.md
52
52
  has_rdoc: false
53
53
  homepage: http://github.com/zilkey/git_tagger/tree/master
54
54
  post_install_message: