auto_tagger 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,6 @@
1
+ README.md
2
+ CHANGELOG
3
+ MIT-LICENSE
4
+ bin/*
5
+ lib/**/*
6
+ recipes/**/*
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ 2010-04-25
2
+
3
+ - Fixed creating incorrect tags when deploying from a branch, tag, or from head (Brian Takita & Bruce Krysiak)
4
+ - Namespaced all classes under AutoTagger (Pat Nakajima)
5
+ - Renamed Commander.execute! to Commander.execute? (Pat Nakjima)
6
+
1
7
  2009-10-15
2
8
 
3
9
  - You can now define your stages as strings or symbols and auto-tagger will not fail (thanks to Chad Wooley for the bug report)
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # IMPORTANT NOTE
2
2
 
3
- This gem is still in it's infancy, and lots of things might change. Since this creates and pushes tags to your git repository, please use with caution.
3
+ This creates and pushes tags to your git repository, please use with caution.
4
4
 
5
5
  # AutoTagger
6
6
 
@@ -16,12 +16,10 @@ You can use the `autotag` command to tag releases on your CI box, then use the c
16
16
 
17
17
  ## Installation
18
18
 
19
- gem sources -a http://gems.github.com
20
- sudo gem install zilkey-auto_tagger
19
+ sudo gem install auto_tagger
21
20
 
22
21
  ## Contribute
23
22
 
24
- * [Tracker Project](http://www.pivotaltracker.com/projects/11988)
25
23
  * [GitHub Repository](http://github.com/zilkey/auto_tagger/tree/master)
26
24
 
27
25
  ## The autotag executable
@@ -164,12 +162,13 @@ To run the cucumber features, execute:
164
162
 
165
163
  ## Acknowledgments
166
164
 
167
- Special thanks to
165
+ Special thanks to:
168
166
 
169
167
  * Brian Takita for the original recipes
170
168
  * Mike Dalessio for his git fu
171
169
  * Chad Wooley for his feature ideas
172
170
  * Tim Holahan for his QA
171
+ * Pat Nakajima for making auto_tagger a better ruby citizen
173
172
 
174
173
  ## Links
175
174
 
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "auto_tagger"
8
+ gem.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}
9
+ gem.email = "jeff@zilkey.com"
10
+ gem.homepage = "http://github.com/zilkey/auto_tagger"
11
+ gem.authors = ["Jeff Dean", "Brian Takita", "Mike Grafton", "Bruce Krysiak", "Pat Nakajima", "Jay Zeschin", "Mike Barinek"]
12
+ gem.add_dependency('capistrano', [">= 2.5.3"])
13
+ gem.require_paths = ["lib"]
14
+ gem.executables = ["autotag"]
15
+ gem.default_executable = %q{autotag}
16
+ gem.date = %q{2010-04-25}
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
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.0
1
+ 0.1.2
data/auto_tagger.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # Generated by jeweler
2
- # DO NOT EDIT THIS FILE
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{auto_tagger}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Jeff Dean", "Brian Takita"]
12
- s.date = %q{2009-10-15}
11
+ s.authors = ["Jeff Dean", "Brian Takita", "Mike Grafton", "Bruce Krysiak", "Pat Nakajima", "Jay Zeschin", "Mike Barinek"]
12
+ s.date = %q{2010-04-25}
13
13
  s.default_executable = %q{autotag}
14
14
  s.email = %q{jeff@zilkey.com}
15
15
  s.executables = ["autotag"]
@@ -17,10 +17,12 @@ Gem::Specification.new do |s|
17
17
  "README.md"
18
18
  ]
19
19
  s.files = [
20
- ".gitignore",
20
+ ".document",
21
+ ".gitignore",
21
22
  "CHANGELOG",
22
23
  "MIT-LICENSE",
23
24
  "README.md",
25
+ "Rakefile",
24
26
  "VERSION",
25
27
  "auto_tagger.gemspec",
26
28
  "bin/autotag",
@@ -35,14 +37,14 @@ Gem::Specification.new do |s|
35
37
  "features/templates/stage.erb",
36
38
  "geminstaller.yml",
37
39
  "lib/auto_tagger.rb",
38
- "lib/auto_tagger/auto_tagger.rb",
40
+ "lib/auto_tagger/base.rb",
39
41
  "lib/auto_tagger/capistrano_helper.rb",
40
42
  "lib/auto_tagger/commander.rb",
43
+ "lib/auto_tagger/recipes.rb",
41
44
  "lib/auto_tagger/repository.rb",
42
45
  "lib/auto_tagger/stage_manager.rb",
43
46
  "lib/auto_tagger/tag.rb",
44
- "recipes/release_tagger.rb",
45
- "spec/auto_tagger/auto_tagger_spec.rb",
47
+ "spec/auto_tagger/base_spec.rb",
46
48
  "spec/auto_tagger/capistrano_helper_spec.rb",
47
49
  "spec/auto_tagger/commander_spec.rb",
48
50
  "spec/auto_tagger/repository_spec.rb",
@@ -52,11 +54,11 @@ Gem::Specification.new do |s|
52
54
  ]
53
55
  s.homepage = %q{http://github.com/zilkey/auto_tagger}
54
56
  s.rdoc_options = ["--charset=UTF-8"]
55
- s.require_paths = ["lib", "recipes"]
56
- s.rubygems_version = %q{1.3.5}
57
+ s.require_paths = ["lib"]
58
+ s.rubygems_version = %q{1.3.6}
57
59
  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}
58
60
  s.test_files = [
59
- "spec/auto_tagger/auto_tagger_spec.rb",
61
+ "spec/auto_tagger/base_spec.rb",
60
62
  "spec/auto_tagger/capistrano_helper_spec.rb",
61
63
  "spec/auto_tagger/commander_spec.rb",
62
64
  "spec/auto_tagger/repository_spec.rb",
@@ -78,3 +80,4 @@ Gem::Specification.new do |s|
78
80
  s.add_dependency(%q<capistrano>, [">= 2.5.3"])
79
81
  end
80
82
  end
83
+
data/bin/autotag CHANGED
@@ -2,10 +2,6 @@
2
2
  require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "auto_tagger"))
3
3
  require 'getoptlong'
4
4
 
5
- opts = GetoptLong.new(
6
- ['--help', '-h', '-?', GetoptLong::NO_ARGUMENT]
7
- )
8
-
9
5
  def usage
10
6
  puts
11
7
  puts "USAGE: #{File.basename($0)} <stage> [<repository>]"
@@ -23,16 +19,11 @@ def usage
23
19
  exit 0
24
20
  end
25
21
 
26
- opts.each do |opt, arg|
27
- case opt
28
- when "--help"
29
- usage
30
- end
31
- end
32
-
33
- if ARGV[0]
34
- AutoTagger.new(ARGV[0], ARGV[1]).create_tag
35
- exit 0
22
+ if ARGV[0] && ["-h", "--help", "-?", "--?"].include?(ARGV[0])
23
+ usage
24
+ elsif ARGV[0]
25
+ AutoTagger::Runner.new(ARGV[0], ARGV[1]).create_tag
26
+ exit 1
36
27
  else
37
28
  usage
38
29
  end
@@ -1,5 +1,4 @@
1
1
  class StepHelpers
2
-
3
2
  attr_reader :test_files_dir, :app_dir, :repo_dir
4
3
 
5
4
  def initialize
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "recipes", "release_tagger"))
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "lib", "auto_tagger", "recipes"))
2
2
 
3
3
  set :autotagger_stages, [:ci, :staging, :production]
4
4
  set :stages, [:staging, :production]
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "recipes", "release_tagger"))
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "lib", "auto_tagger", "recipes"))
2
2
 
3
3
  set :autotagger_stages, ["<%= environments.join('", "') %>"]
4
4
 
@@ -0,0 +1,26 @@
1
+ module AutoTagger
2
+ class EnvironmentCannotBeBlankError < StandardError; end
3
+
4
+ class Runner
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(commit = nil)
15
+ repository.tags.fetch
16
+ new_tag = repository.tags.create(stage, commit)
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
+ end
26
+ end
@@ -1,39 +1,41 @@
1
- class CapistranoHelper
1
+ module AutoTagger
2
+ class CapistranoHelper
2
3
 
3
- attr_reader :variables, :stage, :working_directory
4
+ attr_reader :variables, :stage, :working_directory
4
5
 
5
- def initialize(variables)
6
- @stage_manager = StageManager.new(variables[:autotagger_stages])
7
- @variables = variables
8
- @stage = variables[:stage]
9
- @working_directory = variables[:working_directory] || Dir.pwd
10
- end
6
+ def initialize(variables)
7
+ @stage_manager = StageManager.new(variables[:autotagger_stages])
8
+ @variables = variables
9
+ @stage = variables[:stage]
10
+ @working_directory = variables[:working_directory] || Dir.pwd
11
+ end
11
12
 
12
- def previous_stage
13
- @stage_manager.previous_stage(stage)
14
- end
13
+ def previous_stage
14
+ @stage_manager.previous_stage(stage)
15
+ end
15
16
 
16
- def branch
17
- if variables.has_key?(:head)
18
- variables[:branch]
19
- elsif variables.has_key?(:tag)
20
- variables[:tag]
21
- elsif previous_stage && (latest = AutoTagger.new(previous_stage, working_directory).latest_tag)
22
- latest
23
- else
24
- variables[:branch]
17
+ def branch
18
+ if variables.has_key?(:head)
19
+ variables[:branch]
20
+ elsif variables.has_key?(:tag)
21
+ variables[:tag]
22
+ elsif previous_stage && (latest = Runner.new(previous_stage, working_directory).latest_tag)
23
+ latest
24
+ else
25
+ variables[:branch]
26
+ end
25
27
  end
26
- end
27
28
 
28
- def release_tag_entries
29
- entries = []
30
- @stage_manager.stages.each do |stage|
31
- tagger = AutoTagger.new(stage, working_directory)
32
- tag = tagger.latest_tag
33
- commit = tagger.repository.commit_for(tag)
34
- entries << "#{stage.to_s.ljust(10, " ")} #{tag.to_s.ljust(30, " ")} #{commit.to_s}"
29
+ def release_tag_entries
30
+ entries = []
31
+ @stage_manager.stages.each do |stage|
32
+ tagger = Runner.new(stage, working_directory)
33
+ tag = tagger.latest_tag
34
+ commit = tagger.repository.commit_for(tag)
35
+ entries << "#{stage.to_s.ljust(10, " ")} #{tag.to_s.ljust(30, " ")} #{commit.to_s}"
36
+ end
37
+ entries
35
38
  end
36
- entries
37
- end
38
39
 
39
- end
40
+ end
41
+ end
@@ -1,15 +1,19 @@
1
- class Commander
2
- class << self
3
- def execute(path, cmd)
4
- `#{command_in_context(path, cmd)}`
5
- end
1
+ module AutoTagger
2
+ class Commander
3
+ class << self
4
+ def execute(path, cmd)
5
+ `#{command_in_context(path, cmd)}`
6
+ end
6
7
 
7
- def execute!(path, cmd)
8
- system command_in_context(path, cmd)
9
- end
8
+ def execute?(path, cmd)
9
+ system command_in_context(path, cmd)
10
+ end
11
+
12
+ private
10
13
 
11
- def command_in_context(path, cmd)
12
- "cd #{path} && #{cmd}"
14
+ def command_in_context(path, cmd)
15
+ "cd #{path} && #{cmd}"
16
+ end
13
17
  end
14
18
  end
15
19
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "auto_tagger"))
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "auto_tagger"))
2
2
 
3
3
  Capistrano::Configuration.instance(:must_exist).load do
4
4
  namespace :release_tagger do
@@ -7,7 +7,7 @@ Capistrano::Configuration.instance(:must_exist).load do
7
7
  Use -Shead=true to set the branch to master, -Stag=<tag> to specify the tag explicitly.
8
8
  }
9
9
  task :set_branch do
10
- if branch_name = CapistranoHelper.new(variables).branch
10
+ if branch_name = AutoTagger::CapistranoHelper.new(variables).branch
11
11
  set :branch, branch_name
12
12
  logger.info "setting branch to #{branch_name}"
13
13
  else
@@ -18,7 +18,7 @@ Capistrano::Configuration.instance(:must_exist).load do
18
18
  desc %Q{Prints the most current tags from all stages}
19
19
  task :print_latest_tags, :roles => :app do
20
20
  logger.info "AUTO TAGGER: release tag history is:"
21
- entries = CapistranoHelper.new(variables).release_tag_entries
21
+ entries = AutoTagger::CapistranoHelper.new(variables).release_tag_entries
22
22
  entries.each do |entry|
23
23
  logger.info entry
24
24
  end
@@ -43,10 +43,10 @@ Capistrano::Configuration.instance(:must_exist).load do
43
43
  desc %Q{Creates a tag using the stage variable}
44
44
  task :create_tag, :roles => :app do
45
45
  if variables[:stage]
46
- tag_name = AutoTagger.new(variables[:stage], variables[:working_directory]).create_tag(real_revision)
46
+ tag_name = AutoTagger::Runner.new(variables[:stage], variables[:working_directory]).create_tag(real_revision)
47
47
  logger.info "AUTO TAGGER created tag #{tag_name} from #{real_revision}"
48
48
  else
49
- tag_name = AutoTagger.new(:production, variables[:working_directory]).create_tag
49
+ tag_name = AutoTagger::Runner.new(:production, variables[:working_directory]).create_tag
50
50
  logger.info "AUTO TAGGER created tag #{tag_name}"
51
51
  end
52
52
  end
@@ -1,42 +1,43 @@
1
- class Repository
2
-
1
+ module AutoTagger
3
2
  class NoPathProvidedError < StandardError; end
4
3
  class NoSuchPathError < StandardError; end
5
4
  class InvalidGitRepositoryError < StandardError; end
6
5
  class GitCommandFailedError < StandardError; end
6
+
7
+ class Repository
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
7
21
 
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
22
+ def ==(other)
23
+ other.is_a?(Repository) && other.path == path
19
24
  end
20
- end
21
25
 
22
- def ==(other)
23
- other.is_a?(Repository) && other.path == path
24
- end
26
+ def tags
27
+ @tags ||= Tag.new(self)
28
+ end
25
29
 
26
- def tags
27
- @tags ||= Tag.new(self)
28
- end
30
+ def commit_for(tag)
31
+ Commander.execute(path, "git --no-pager log #{tag} --pretty=oneline -1")
32
+ end
29
33
 
30
- def commit_for(tag)
31
- Commander.execute(path, "git --no-pager log #{tag} --pretty=oneline -1")
32
- end
34
+ def run(cmd)
35
+ Commander.execute(path, cmd)
36
+ end
33
37
 
34
- def run(cmd)
35
- Commander.execute(path, cmd)
36
- end
38
+ def run!(cmd)
39
+ Commander.execute?(path, cmd) || raise(GitCommandFailedError)
40
+ end
37
41
 
38
- def run!(cmd)
39
- Commander.execute!(path, cmd) || raise(GitCommandFailedError)
40
42
  end
41
-
42
- end
43
+ end
@@ -1,23 +1,23 @@
1
- class StageManager
2
-
3
- class NoStagesSpecifiedError < StandardError
4
- def message
5
- "You must set the :stages variable to an array, like set :stages, [:ci, :demo]"
1
+ module AutoTagger
2
+ class StageManager
3
+ class NoStagesSpecifiedError < StandardError
4
+ def message
5
+ "You must set the :stages variable to an array, like set :stages, [:ci, :demo]"
6
+ end
6
7
  end
7
- end
8
8
 
9
- attr_reader :stages
9
+ attr_reader :stages
10
10
 
11
- def initialize(stages)
12
- raise NoStagesSpecifiedError unless stages && stages.is_a?(Array)
13
- @stages = stages.map{|stage| stage.to_s }
14
- end
11
+ def initialize(stages)
12
+ raise NoStagesSpecifiedError unless stages && stages.is_a?(Array)
13
+ @stages = stages.map{|stage| stage.to_s }
14
+ end
15
15
 
16
- def previous_stage(stage)
17
- if stage
18
- index = stages.index(stage.to_s) - 1
19
- stages[index] if index > -1
16
+ def previous_stage(stage)
17
+ if stage
18
+ index = stages.index(stage.to_s) - 1
19
+ stages[index] if index > -1
20
+ end
20
21
  end
21
22
  end
22
-
23
- end
23
+ end
@@ -1,41 +1,43 @@
1
1
  # git --no-pager log --pretty=oneline -1
2
2
  # git tag -a -m 'Successful continuous integration build on #{timestamp}' #{tag_name}"
3
- class Tag
3
+ module AutoTagger
4
+ class Tag
4
5
 
5
- attr_reader :repository
6
+ attr_reader :repository
6
7
 
7
- def initialize(repository)
8
- @repository = repository
9
- end
8
+ def initialize(repository)
9
+ @repository = repository
10
+ end
10
11
 
11
- def find_all
12
- repository.run("git tag").split("\n")
13
- end
12
+ def find_all
13
+ repository.run("git tag").split("\n")
14
+ end
14
15
 
15
- def fetch
16
- repository.run! "git fetch origin --tags"
17
- end
16
+ def fetch
17
+ repository.run! "git fetch origin --tags"
18
+ end
18
19
 
19
- def latest_from(stage)
20
- find_all.select{|tag| tag =~ /^#{stage}\//}.sort.last
21
- end
20
+ def latest_from(stage)
21
+ find_all.select{|tag| tag =~ /^#{stage}\//}.sort.last
22
+ end
22
23
 
23
- def push
24
- repository.run! "git push origin --tags"
25
- end
24
+ def push
25
+ repository.run! "git push origin --tags"
26
+ end
26
27
 
27
- def create(stage, commit = nil)
28
- tag_name = name_for(stage)
29
- cmd = "git tag #{tag_name}"
30
- cmd += " #{commit}" if commit
31
- repository.run! cmd
32
- tag_name
33
- end
28
+ def create(stage, commit = nil)
29
+ tag_name = name_for(stage)
30
+ cmd = "git tag #{tag_name}"
31
+ cmd += " #{commit}" if commit
32
+ repository.run! cmd
33
+ tag_name
34
+ end
34
35
 
35
- private
36
+ private
36
37
 
37
- def name_for(stage)
38
- "%s/%s" % [stage, Time.now.utc.strftime('%Y%m%d%H%M%S')]
39
- end
38
+ def name_for(stage)
39
+ "%s/%s" % [stage, Time.now.utc.strftime('%Y%m%d%H%M%S')]
40
+ end
40
41
 
41
- end
42
+ end
43
+ end
data/lib/auto_tagger.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  'commander',
3
3
  'repository',
4
4
  'tag',
5
- 'auto_tagger',
5
+ 'base',
6
6
  'stage_manager',
7
7
  'capistrano_helper'
8
8
  ].each do |file|
@@ -0,0 +1,85 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe AutoTagger::Runner do
4
+ before(:each) do
5
+ stub(Dir).pwd { File.join(File.dirname(__FILE__), '..', '..') }
6
+ end
7
+
8
+ describe ".new" do
9
+ it "blows up if you don't pass an stage" do
10
+ proc do
11
+ AutoTagger::Runner.new(nil)
12
+ end.should raise_error(AutoTagger::EnvironmentCannotBeBlankError)
13
+ end
14
+
15
+ it "sets the stage when it's passed" do
16
+ AutoTagger::Runner.new("ci").stage.should == "ci"
17
+ end
18
+
19
+ it "sets the path to Dir.pwd when nil" do
20
+ mock(Dir).pwd { "/foo" }
21
+ mock(AutoTagger::Repository).new("/foo")
22
+ AutoTagger::Runner.new("ci")
23
+ end
24
+
25
+ it "expands the path when the path is passed" do
26
+ mock(AutoTagger::Repository).new(File.expand_path("."))
27
+ AutoTagger::Runner.new("ci", ".")
28
+ end
29
+
30
+ it "exposes the working directory" do
31
+ mock(AutoTagger::Repository).new(File.expand_path("."))
32
+ AutoTagger::Runner.new("ci", ".").working_directory.should == File.expand_path(".")
33
+ end
34
+ end
35
+
36
+ describe "#create_tag" do
37
+ it "generates the correct commands" do
38
+ time = Time.local(2001,1,1)
39
+ mock(Time).now.once {time}
40
+ timestamp = time.utc.strftime('%Y%m%d%H%M%S')
41
+ mock(File).exists?(anything).twice { true }
42
+
43
+ mock(AutoTagger::Commander).execute?("/foo", "git fetch origin --tags") {true}
44
+ mock(AutoTagger::Commander).execute?("/foo", "git tag ci/#{timestamp}") {true}
45
+ mock(AutoTagger::Commander).execute?("/foo", "git push origin --tags") {true}
46
+
47
+ AutoTagger::Runner.new("ci", "/foo").create_tag
48
+ end
49
+
50
+ it "allows you to base it off an existing tag or commit" do
51
+ time = Time.local(2001,1,1)
52
+ mock(Time).now.once {time}
53
+ timestamp = time.utc.strftime('%Y%m%d%H%M%S')
54
+ mock(File).exists?(anything).twice { true }
55
+
56
+ mock(AutoTagger::Commander).execute?("/foo", "git fetch origin --tags") {true}
57
+ mock(AutoTagger::Commander).execute?("/foo", "git tag ci/#{timestamp} guid") {true}
58
+ mock(AutoTagger::Commander).execute?("/foo", "git push origin --tags") {true}
59
+
60
+ AutoTagger::Runner.new("ci", "/foo").create_tag("guid")
61
+ end
62
+
63
+ it "returns the tag that was created" do
64
+ time = Time.local(2001,1,1)
65
+ mock(Time).now.once {time}
66
+ timestamp = time.utc.strftime('%Y%m%d%H%M%S')
67
+ mock(File).exists?(anything).twice { true }
68
+ mock(AutoTagger::Commander).execute?(anything, anything).times(any_times) {true}
69
+
70
+ AutoTagger::Runner.new("ci", "/foo").create_tag.should == "ci/#{timestamp}"
71
+ end
72
+ end
73
+
74
+ describe "#latest_tag" do
75
+ it "generates the correct commands" do
76
+ mock(File).exists?(anything).twice { true }
77
+
78
+ mock(AutoTagger::Commander).execute?("/foo", "git fetch origin --tags") {true}
79
+ mock(AutoTagger::Commander).execute("/foo", "git tag") { "ci_01" }
80
+
81
+ AutoTagger::Runner.new("ci", "/foo").latest_tag
82
+ end
83
+ end
84
+
85
+ end
@@ -1,53 +1,53 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe CapistranoHelper do
3
+ describe AutoTagger::CapistranoHelper do
4
4
 
5
5
  describe ".new" do
6
6
  it "blows up if there are no stages" do
7
7
  proc do
8
- CapistranoHelper.new({})
9
- end.should raise_error(StageManager::NoStagesSpecifiedError)
8
+ AutoTagger::CapistranoHelper.new({})
9
+ end.should raise_error(AutoTagger::StageManager::NoStagesSpecifiedError)
10
10
  end
11
11
  end
12
12
 
13
13
  describe "#variables" do
14
14
  it "returns all variables" do
15
- CapistranoHelper.new({:autotagger_stages => [:bar]}).variables.should == {:autotagger_stages => [:bar]}
15
+ AutoTagger::CapistranoHelper.new({:autotagger_stages => [:bar]}).variables.should == {:autotagger_stages => [:bar]}
16
16
  end
17
17
  end
18
18
 
19
19
  describe "#working_directory" do
20
20
  it "returns the hashes' working directory value" do
21
- CapistranoHelper.new({:autotagger_stages => [:bar], :working_directory => "/foo"}).working_directory.should == "/foo"
21
+ AutoTagger::CapistranoHelper.new({:autotagger_stages => [:bar], :working_directory => "/foo"}).working_directory.should == "/foo"
22
22
  end
23
23
 
24
24
  it "defaults to Dir.pwd if it's not set, or it's nil" do
25
25
  mock(Dir).pwd { "/bar" }
26
- CapistranoHelper.new({:autotagger_stages => [:bar]}).working_directory.should == "/bar"
26
+ AutoTagger::CapistranoHelper.new({:autotagger_stages => [:bar]}).working_directory.should == "/bar"
27
27
  end
28
28
  end
29
29
 
30
30
  describe "#stage" do
31
31
  it "returns the hashes' current stage value" do
32
- CapistranoHelper.new({:autotagger_stages => [:bar], :stage => :bar}).stage.should == :bar
33
- CapistranoHelper.new({:autotagger_stages => [:bar]}).stage.should be_nil
32
+ AutoTagger::CapistranoHelper.new({:autotagger_stages => [:bar], :stage => :bar}).stage.should == :bar
33
+ AutoTagger::CapistranoHelper.new({:autotagger_stages => [:bar]}).stage.should be_nil
34
34
  end
35
35
  end
36
36
 
37
37
  describe "#release_tag_entries" do
38
38
  it "returns a column-justifed version of all the commits" do
39
- mock(Commander).execute("/foo", "git tag").times(any_times) { "ci/01\nstaging/01\nproduction/01" }
40
- mock(Commander).execute("/foo", "git --no-pager log ci/01 --pretty=oneline -1") { "guid1" }
41
- mock(Commander).execute("/foo", "git --no-pager log staging/01 --pretty=oneline -1") { "guid2" }
42
- mock(Commander).execute("/foo", "git --no-pager log production/01 --pretty=oneline -1") { "guid3" }
43
- mock(Commander).execute!("/foo", "git fetch origin --tags").times(any_times) { true }
39
+ mock(AutoTagger::Commander).execute("/foo", "git tag").times(any_times) { "ci/01\nstaging/01\nproduction/01" }
40
+ mock(AutoTagger::Commander).execute("/foo", "git --no-pager log ci/01 --pretty=oneline -1") { "guid1" }
41
+ mock(AutoTagger::Commander).execute("/foo", "git --no-pager log staging/01 --pretty=oneline -1") { "guid2" }
42
+ mock(AutoTagger::Commander).execute("/foo", "git --no-pager log production/01 --pretty=oneline -1") { "guid3" }
43
+ mock(AutoTagger::Commander).execute?("/foo", "git fetch origin --tags").times(any_times) { true }
44
44
  mock(File).exists?(anything).times(any_times) {true}
45
45
 
46
46
  variables = {
47
47
  :working_directory => "/foo",
48
48
  :autotagger_stages => [:ci, :staging, :production]
49
49
  }
50
- histories = CapistranoHelper.new(variables).release_tag_entries
50
+ histories = AutoTagger::CapistranoHelper.new(variables).release_tag_entries
51
51
  histories.length.should == 3
52
52
  histories[0].should include("ci/01", "guid1")
53
53
  histories[1].should include("staging/01", "guid2")
@@ -55,16 +55,16 @@ describe CapistranoHelper do
55
55
  end
56
56
 
57
57
  it "ignores tags delimited with '_'" do
58
- mock(Commander).execute("/foo", "git tag").times(any_times) { "ci/01\nci_02" }
59
- mock(Commander).execute("/foo", "git --no-pager log ci/01 --pretty=oneline -1") { "guid1" }
60
- mock(Commander).execute!("/foo", "git fetch origin --tags").times(any_times) { true }
58
+ mock(AutoTagger::Commander).execute("/foo", "git tag").times(any_times) { "ci/01\nci_02" }
59
+ mock(AutoTagger::Commander).execute("/foo", "git --no-pager log ci/01 --pretty=oneline -1") { "guid1" }
60
+ mock(AutoTagger::Commander).execute?("/foo", "git fetch origin --tags").times(any_times) { true }
61
61
  mock(File).exists?(anything).times(any_times) {true}
62
62
 
63
63
  variables = {
64
64
  :working_directory => "/foo",
65
65
  :autotagger_stages => [:ci]
66
66
  }
67
- histories = CapistranoHelper.new(variables).release_tag_entries
67
+ histories = AutoTagger::CapistranoHelper.new(variables).release_tag_entries
68
68
  histories.length.should == 1
69
69
  histories[0].should include("ci/01", "guid1")
70
70
  end
@@ -78,7 +78,7 @@ describe CapistranoHelper do
78
78
  :head => nil,
79
79
  :branch => "foo"
80
80
  }
81
- CapistranoHelper.new(variables).branch.should == "foo"
81
+ AutoTagger::CapistranoHelper.new(variables).branch.should == "foo"
82
82
  end
83
83
  end
84
84
 
@@ -88,7 +88,7 @@ describe CapistranoHelper do
88
88
  :autotagger_stages => [:bar],
89
89
  :head => nil
90
90
  }
91
- CapistranoHelper.new(variables).branch.should == nil
91
+ AutoTagger::CapistranoHelper.new(variables).branch.should == nil
92
92
  end
93
93
  end
94
94
 
@@ -98,7 +98,7 @@ describe CapistranoHelper do
98
98
  :autotagger_stages => [:bar],
99
99
  :branch => "foo"
100
100
  }
101
- CapistranoHelper.new(variables).branch.should == "foo"
101
+ AutoTagger::CapistranoHelper.new(variables).branch.should == "foo"
102
102
  end
103
103
  end
104
104
 
@@ -112,8 +112,8 @@ describe CapistranoHelper do
112
112
  }
113
113
  tagger = Object.new
114
114
  mock(tagger).latest_tag { "foo_01" }
115
- mock(AutoTagger).new("foo", "/foo") { tagger }
116
- CapistranoHelper.new(variables).branch.should == "foo_01"
115
+ mock(AutoTagger::Runner).new("foo", "/foo") { tagger }
116
+ AutoTagger::CapistranoHelper.new(variables).branch.should == "foo_01"
117
117
  end
118
118
  end
119
119
 
@@ -126,8 +126,8 @@ describe CapistranoHelper do
126
126
  }
127
127
  tagger = Object.new
128
128
  mock(tagger).latest_tag { nil }
129
- mock(AutoTagger).new("foo", "/foo") { tagger }
130
- CapistranoHelper.new(variables).branch.should == nil
129
+ mock(AutoTagger::Runner).new("foo", "/foo") { tagger }
130
+ AutoTagger::CapistranoHelper.new(variables).branch.should == nil
131
131
  end
132
132
  end
133
133
 
@@ -137,8 +137,8 @@ describe CapistranoHelper do
137
137
  :autotagger_stages => [:bar],
138
138
  :stage => :bar
139
139
  }
140
- CapistranoHelper.new(variables).previous_stage.should be_nil
141
- CapistranoHelper.new(variables).branch.should == nil
140
+ AutoTagger::CapistranoHelper.new(variables).previous_stage.should be_nil
141
+ AutoTagger::CapistranoHelper.new(variables).branch.should == nil
142
142
  end
143
143
  end
144
144
  end
@@ -1,17 +1,17 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe Commander do
3
+ describe AutoTagger::Commander do
4
4
  describe ".execute" do
5
5
  it "execute the command and returns the results" do
6
- mock(Commander).`("cd /foo && ls") { "" } #`
7
- Commander.execute("/foo", "ls")
6
+ mock(AutoTagger::Commander).`("cd /foo && ls") { "" } #`
7
+ AutoTagger::Commander.execute("/foo", "ls")
8
8
  end
9
9
  end
10
10
 
11
11
  describe "system" do
12
12
  it "executes and doesn't return anything" do
13
- mock(Commander).system("cd /foo && ls")
14
- Commander.execute!("/foo", "ls")
13
+ mock(AutoTagger::Commander).system("cd /foo && ls")
14
+ AutoTagger::Commander.execute?("/foo", "ls")
15
15
  end
16
16
  end
17
17
  end
@@ -1,71 +1,71 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe Repository do
3
+ describe AutoTagger::Repository do
4
4
  describe ".new" do
5
5
  it "sets the repo" do
6
6
  mock(File).exists?(anything).twice { true }
7
- repo = Repository.new("/foo")
7
+ repo = AutoTagger::Repository.new("/foo")
8
8
  repo.path.should == "/foo"
9
9
  end
10
10
 
11
11
  it "raises an error when the path is blank" do
12
12
  proc do
13
- Repository.new(" ")
14
- end.should raise_error(Repository::NoPathProvidedError)
13
+ AutoTagger::Repository.new(" ")
14
+ end.should raise_error(AutoTagger::NoPathProvidedError)
15
15
  end
16
16
 
17
17
  it "raises an error when the path is nil" do
18
18
  proc do
19
- Repository.new(nil)
20
- end.should raise_error(Repository::NoPathProvidedError)
19
+ AutoTagger::Repository.new(nil)
20
+ end.should raise_error(AutoTagger::NoPathProvidedError)
21
21
  end
22
22
 
23
23
  it "raises an error with a file that doesn't exist" do
24
24
  mock(File).exists?("/foo") { false }
25
25
  proc do
26
- Repository.new("/foo")
27
- end.should raise_error(Repository::NoSuchPathError)
26
+ AutoTagger::Repository.new("/foo")
27
+ end.should raise_error(AutoTagger::NoSuchPathError)
28
28
  end
29
29
 
30
30
  it "raises an error with a non-git repository" do
31
31
  mock(File).exists?("/foo") { true }
32
32
  mock(File).exists?("/foo/.git") { false }
33
33
  proc do
34
- Repository.new("/foo")
35
- end.should raise_error(Repository::InvalidGitRepositoryError)
34
+ AutoTagger::Repository.new("/foo")
35
+ end.should raise_error(AutoTagger::InvalidGitRepositoryError)
36
36
  end
37
37
  end
38
38
 
39
39
  describe "#==" do
40
40
  it "compares paths" do
41
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")
42
+ AutoTagger::Repository.new("/foo").should_not == "/foo"
43
+ AutoTagger::Repository.new("/foo").should_not == AutoTagger::Repository.new("/bar")
44
+ AutoTagger::Repository.new("/foo").should == AutoTagger::Repository.new("/foo")
45
45
  end
46
46
  end
47
47
 
48
48
  describe "#run" do
49
49
  it "sends the correct command" do
50
50
  mock(File).exists?(anything).twice { true }
51
- mock(Commander).execute("/foo", "bar")
52
- Repository.new("/foo").run("bar")
51
+ mock(AutoTagger::Commander).execute("/foo", "bar")
52
+ AutoTagger::Repository.new("/foo").run("bar")
53
53
  end
54
54
  end
55
55
 
56
56
  describe "run!" do
57
57
  it "sends the correct command" do
58
58
  mock(File).exists?(anything).twice { true }
59
- mock(Commander).execute!("/foo", "bar") { true }
60
- Repository.new("/foo").run!("bar")
59
+ mock(AutoTagger::Commander).execute?("/foo", "bar") { true }
60
+ AutoTagger::Repository.new("/foo").run!("bar")
61
61
  end
62
62
 
63
63
  it "raises an exception if it the command returns false" do
64
64
  mock(File).exists?(anything).twice { true }
65
- mock(Commander).execute!("/foo", "bar") { false }
65
+ mock(AutoTagger::Commander).execute?("/foo", "bar") { false }
66
66
  proc do
67
- Repository.new("/foo").run!("bar")
68
- end.should raise_error(Repository::GitCommandFailedError)
67
+ AutoTagger::Repository.new("/foo").run!("bar")
68
+ end.should raise_error(AutoTagger::GitCommandFailedError)
69
69
  end
70
70
  end
71
71
 
@@ -1,32 +1,32 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe StageManager do
3
+ describe AutoTagger::StageManager do
4
4
 
5
5
  describe ".new" do
6
6
  [nil, ""].each do |value|
7
7
  it "blows up if there are stages == #{value.inspect}" do
8
8
  proc do
9
- StageManager.new(value)
10
- end.should raise_error(StageManager::NoStagesSpecifiedError)
9
+ AutoTagger::StageManager.new(value)
10
+ end.should raise_error(AutoTagger::StageManager::NoStagesSpecifiedError)
11
11
  end
12
12
  end
13
13
  end
14
14
 
15
15
  describe "#previous_stage" do
16
16
  it "returns the previous stage as a string if there is more than one stage, and there is a current stage" do
17
- StageManager.new([:foo, :bar]).previous_stage(:bar).should == "foo"
17
+ AutoTagger::StageManager.new([:foo, :bar]).previous_stage(:bar).should == "foo"
18
18
  end
19
19
 
20
20
  it "returns nil if there is no previous stage" do
21
- StageManager.new([:bar]).previous_stage(:bar).should be_nil
21
+ AutoTagger::StageManager.new([:bar]).previous_stage(:bar).should be_nil
22
22
  end
23
23
 
24
24
  it "deals with mixed strings and symbols" do
25
- StageManager.new([:"foo-bar", "baz"]).previous_stage(:baz).should == "foo-bar"
25
+ AutoTagger::StageManager.new([:"foo-bar", "baz"]).previous_stage(:baz).should == "foo-bar"
26
26
  end
27
27
 
28
28
  it "returns nil if there is no current stage" do
29
- StageManager.new([:bar]).previous_stage(nil).should be_nil
29
+ AutoTagger::StageManager.new([:bar]).previous_stage(nil).should be_nil
30
30
  end
31
31
  end
32
32
 
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe Tag do
3
+ describe AutoTagger::Tag do
4
4
 
5
5
  before(:each) do
6
6
  @repository = Object.new
@@ -8,25 +8,25 @@ describe Tag do
8
8
 
9
9
  describe ".new" do
10
10
  it "sets the repository" do
11
- Tag.new(@repository).repository.should == @repository
11
+ AutoTagger::Tag.new(@repository).repository.should == @repository
12
12
  end
13
13
  end
14
14
 
15
15
  describe "#find_all" do
16
16
  it "returns an array of tags" do
17
17
  mock(@repository).run("git tag") { "ci_01\nci_02" }
18
- Tag.new(@repository).find_all.should == ["ci_01", "ci_02"]
18
+ AutoTagger::Tag.new(@repository).find_all.should == ["ci_01", "ci_02"]
19
19
  end
20
20
 
21
21
  it "returns an empty array if there are none" do
22
22
  mock(@repository).run("git tag") { "" }
23
- Tag.new(@repository).find_all.should be_empty
23
+ AutoTagger::Tag.new(@repository).find_all.should be_empty
24
24
  end
25
25
  end
26
26
 
27
27
  describe "#latest_from" do
28
28
  before do
29
- @tag = Tag.new(@repository)
29
+ @tag = AutoTagger::Tag.new(@repository)
30
30
  mock(@tag).find_all { ["ci/01", "ci/02"] }
31
31
  end
32
32
 
@@ -42,14 +42,14 @@ describe Tag do
42
42
  describe "#fetch_tags" do
43
43
  it "sends the correct command" do
44
44
  mock(@repository).run!("git fetch origin --tags")
45
- Tag.new(@repository).fetch
45
+ AutoTagger::Tag.new(@repository).fetch
46
46
  end
47
47
  end
48
48
 
49
49
  describe "#push" do
50
50
  it "sends the correct command" do
51
51
  mock(@repository).run!("git push origin --tags")
52
- Tag.new(@repository).push
52
+ AutoTagger::Tag.new(@repository).push
53
53
  end
54
54
  end
55
55
 
@@ -59,7 +59,7 @@ describe Tag do
59
59
  mock(Time).now.once {time}
60
60
  tag_name = "ci/#{time.utc.strftime('%Y%m%d%H%M%S')}"
61
61
  mock(@repository).run!("git tag #{tag_name}")
62
- Tag.new(@repository).create("ci").should == tag_name
62
+ AutoTagger::Tag.new(@repository).create("ci").should == tag_name
63
63
  end
64
64
  end
65
65
 
metadata CHANGED
@@ -1,28 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auto_tagger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 2
9
+ version: 0.1.2
5
10
  platform: ruby
6
11
  authors:
7
12
  - Jeff Dean
8
13
  - Brian Takita
14
+ - Mike Grafton
15
+ - Bruce Krysiak
16
+ - Pat Nakajima
17
+ - Jay Zeschin
18
+ - Mike Barinek
9
19
  autorequire:
10
20
  bindir: bin
11
21
  cert_chain: []
12
22
 
13
- date: 2009-10-15 00:00:00 -04:00
23
+ date: 2010-04-25 00:00:00 -04:00
14
24
  default_executable: autotag
15
25
  dependencies:
16
26
  - !ruby/object:Gem::Dependency
17
27
  name: capistrano
18
- type: :runtime
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
28
+ prerelease: false
29
+ requirement: &id001 !ruby/object:Gem::Requirement
21
30
  requirements:
22
31
  - - ">="
23
32
  - !ruby/object:Gem::Version
33
+ segments:
34
+ - 2
35
+ - 5
36
+ - 3
24
37
  version: 2.5.3
25
- version:
38
+ type: :runtime
39
+ version_requirements: *id001
26
40
  description:
27
41
  email: jeff@zilkey.com
28
42
  executables:
@@ -32,10 +46,12 @@ extensions: []
32
46
  extra_rdoc_files:
33
47
  - README.md
34
48
  files:
49
+ - .document
35
50
  - .gitignore
36
51
  - CHANGELOG
37
52
  - MIT-LICENSE
38
53
  - README.md
54
+ - Rakefile
39
55
  - VERSION
40
56
  - auto_tagger.gemspec
41
57
  - bin/autotag
@@ -50,14 +66,14 @@ files:
50
66
  - features/templates/stage.erb
51
67
  - geminstaller.yml
52
68
  - lib/auto_tagger.rb
53
- - lib/auto_tagger/auto_tagger.rb
69
+ - lib/auto_tagger/base.rb
54
70
  - lib/auto_tagger/capistrano_helper.rb
55
71
  - lib/auto_tagger/commander.rb
72
+ - lib/auto_tagger/recipes.rb
56
73
  - lib/auto_tagger/repository.rb
57
74
  - lib/auto_tagger/stage_manager.rb
58
75
  - lib/auto_tagger/tag.rb
59
- - recipes/release_tagger.rb
60
- - spec/auto_tagger/auto_tagger_spec.rb
76
+ - spec/auto_tagger/base_spec.rb
61
77
  - spec/auto_tagger/capistrano_helper_spec.rb
62
78
  - spec/auto_tagger/commander_spec.rb
63
79
  - spec/auto_tagger/repository_spec.rb
@@ -73,28 +89,29 @@ rdoc_options:
73
89
  - --charset=UTF-8
74
90
  require_paths:
75
91
  - lib
76
- - recipes
77
92
  required_ruby_version: !ruby/object:Gem::Requirement
78
93
  requirements:
79
94
  - - ">="
80
95
  - !ruby/object:Gem::Version
96
+ segments:
97
+ - 0
81
98
  version: "0"
82
- version:
83
99
  required_rubygems_version: !ruby/object:Gem::Requirement
84
100
  requirements:
85
101
  - - ">="
86
102
  - !ruby/object:Gem::Version
103
+ segments:
104
+ - 0
87
105
  version: "0"
88
- version:
89
106
  requirements: []
90
107
 
91
108
  rubyforge_project:
92
- rubygems_version: 1.3.3
109
+ rubygems_version: 1.3.6
93
110
  signing_key:
94
111
  specification_version: 3
95
112
  summary: Helps you automatically create tags for each stage in a multi-stage deploment and deploy from the latest tag from the previous environment
96
113
  test_files:
97
- - spec/auto_tagger/auto_tagger_spec.rb
114
+ - spec/auto_tagger/base_spec.rb
98
115
  - spec/auto_tagger/capistrano_helper_spec.rb
99
116
  - spec/auto_tagger/commander_spec.rb
100
117
  - spec/auto_tagger/repository_spec.rb
@@ -1,26 +0,0 @@
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(commit = nil)
15
- repository.tags.fetch
16
- new_tag = repository.tags.create(stage, commit)
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
@@ -1,85 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- describe AutoTagger do
4
- before(:each) do
5
- stub(Dir).pwd { File.join(File.dirname(__FILE__), '..', '..') }
6
- end
7
-
8
- describe ".new" do
9
- it "blows up if you don't pass an stage" do
10
- proc do
11
- AutoTagger.new(nil)
12
- end.should raise_error(AutoTagger::EnvironmentCannotBeBlankError)
13
- end
14
-
15
- it "sets the stage when it's passed" do
16
- AutoTagger.new("ci").stage.should == "ci"
17
- end
18
-
19
- it "sets the path to Dir.pwd when nil" do
20
- mock(Dir).pwd { "/foo" }
21
- mock(Repository).new("/foo")
22
- AutoTagger.new("ci")
23
- end
24
-
25
- it "expands the path when the path is passed" do
26
- mock(Repository).new(File.expand_path("."))
27
- AutoTagger.new("ci", ".")
28
- end
29
-
30
- it "exposes the working directory" do
31
- mock(Repository).new(File.expand_path("."))
32
- AutoTagger.new("ci", ".").working_directory.should == File.expand_path(".")
33
- end
34
- end
35
-
36
- describe "#create_tag" do
37
- it "generates the correct commands" do
38
- time = Time.local(2001,1,1)
39
- mock(Time).now.once {time}
40
- timestamp = time.utc.strftime('%Y%m%d%H%M%S')
41
- mock(File).exists?(anything).twice { true }
42
-
43
- mock(Commander).execute!("/foo", "git fetch origin --tags") {true}
44
- mock(Commander).execute!("/foo", "git tag ci/#{timestamp}") {true}
45
- mock(Commander).execute!("/foo", "git push origin --tags") {true}
46
-
47
- AutoTagger.new("ci", "/foo").create_tag
48
- end
49
-
50
- it "allows you to base it off an existing tag or commit" do
51
- time = Time.local(2001,1,1)
52
- mock(Time).now.once {time}
53
- timestamp = time.utc.strftime('%Y%m%d%H%M%S')
54
- mock(File).exists?(anything).twice { true }
55
-
56
- mock(Commander).execute!("/foo", "git fetch origin --tags") {true}
57
- mock(Commander).execute!("/foo", "git tag ci/#{timestamp} guid") {true}
58
- mock(Commander).execute!("/foo", "git push origin --tags") {true}
59
-
60
- AutoTagger.new("ci", "/foo").create_tag("guid")
61
- end
62
-
63
- it "returns the tag that was created" do
64
- time = Time.local(2001,1,1)
65
- mock(Time).now.once {time}
66
- timestamp = time.utc.strftime('%Y%m%d%H%M%S')
67
- mock(File).exists?(anything).twice { true }
68
- mock(Commander).execute!(anything, anything).times(any_times) {true}
69
-
70
- AutoTagger.new("ci", "/foo").create_tag.should == "ci/#{timestamp}"
71
- end
72
- end
73
-
74
- describe "#latest_tag" do
75
- it "generates the correct commands" do
76
- mock(File).exists?(anything).twice { true }
77
-
78
- mock(Commander).execute!("/foo", "git fetch origin --tags") {true}
79
- mock(Commander).execute("/foo", "git tag") { "ci_01" }
80
-
81
- AutoTagger.new("ci", "/foo").latest_tag
82
- end
83
- end
84
-
85
- end