thegarage-gitx 1.1.0 → 1.2.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8f44b6f1f0c0229d1b8f76ea3e80eda7917d765c
4
- data.tar.gz: 02a85083e7efcc95bb7fab522943e02c946f1a40
3
+ metadata.gz: 3f48eab04a8576c7f4757294009f53818b01f3cc
4
+ data.tar.gz: ac2707ffbe75737ebb5fcfa8908008468803f31c
5
5
  SHA512:
6
- metadata.gz: af4fe8c1a93b78ae7fd33c6ea90d78bd9e127feeec361184b47d1399dae05e3ea18033ccc45450b2377ccd7bf5a0e1ea65794f9d753a86ee1c5677e711aa4c6e
7
- data.tar.gz: 704e75ec3c06cce54d8bc5c68f38f72f73bce82983ee60b2ac3b57dd2bb2dc6c8a82c6299d0174742b37f6b05df0e2107830ad03b63d4820e69d14240d8eb547
6
+ metadata.gz: 43d0831356ca1cafa085e85705568d2409c8ca62aa325a4bfbb63b45113c75c75333ce59bfb91d3dfd0278d90466334a45ee66d3b411f1c19d13dd890a91338f
7
+ data.tar.gz: e44c8876673101a8da4c5c830929ca1a58b4384bbfd53ba60392260df7330eae914312668b156182b4edf77231d2f7fcdac2a5e659b3bcfacfd3c791301d713f
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - '2.0.0'
4
+
5
+ after_success:
6
+ - git config --global user.email "builds@travis-ci.com"
7
+ - git config --global user.name "Travis CI"
8
+ - git buildtag
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # thegarage-gitx
2
2
 
3
+ [![Build Status](https://travis-ci.org/thegarage/thegarage-gitx.png?branch=fix-rspec-mocks)](https://travis-ci.org/thegarage/thegarage-gitx)
4
+
3
5
  Useful Git eXtensions for Development workflow at The Garage.
4
6
 
5
7
  Inspired by the [socialcast-git-extensions gem](https://github.com/socialcast/socialcast-git-extensions)
@@ -28,6 +30,7 @@ create a pull request on github for peer review of the current branch.
28
30
  ## git release
29
31
 
30
32
  release the current feature branch to master. This operation will perform the following:
33
+
31
34
  * pull in latest code from remote branch
32
35
  * merge in latest code from master branch
33
36
  * prompt user to confirm they actually want to perform the release
@@ -44,6 +47,10 @@ delete released branches after they have been merged into master.
44
47
 
45
48
  reset an aggregate branch (ex: prototype, staging) back to a known good state.
46
49
 
50
+ ## git buildtag
51
+
52
+ create a build tag for the current Travis-CI build and push it back to origin
53
+
47
54
 
48
55
  ## Note on Patches/Pull Requests
49
56
 
data/bin/git-buildtag ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'thegarage/gitx', 'cli.rb')
4
+ Thegarage::Gitx::CLI.start (['buildtag'] + ARGV)
@@ -5,6 +5,9 @@ require 'thegarage/gitx'
5
5
  module Thegarage
6
6
  module Gitx
7
7
  class CLI < Thor
8
+ include Thor::Actions
9
+ add_runtime_options!
10
+
8
11
  include Thegarage::Gitx
9
12
  include Thegarage::Gitx::Git
10
13
  include Thegarage::Gitx::Github
@@ -15,6 +18,7 @@ module Thegarage
15
18
  # Link to ticket describing feature/bug (plantain, JIRA, bugzilla). Format is [title](url).
16
19
  # Brief description of the change, and how it accomplishes the task they set out to do.
17
20
  EOS
21
+ TAGGABLE_BRANCHES = %w(master staging)
18
22
 
19
23
  method_option :trace, :type => :boolean, :aliases => '-v'
20
24
  def initialize(*args)
@@ -136,6 +140,41 @@ module Thegarage
136
140
  integrate_branch('master', 'staging')
137
141
  cleanup
138
142
  end
143
+
144
+ desc 'buildtag', 'create a tag for the current Travis-CI build and push it back to origin'
145
+ def buildtag
146
+ travis_branch = ENV['TRAVIS_BRANCH']
147
+ pull_request = ENV['TRAVIS_PULL_REQUEST']
148
+
149
+ raise "Unknown branch. ENV['TRAVIS_BRANCH'] is required." unless travis_branch
150
+
151
+ if pull_request != 'false'
152
+ say "Skipping creation of tag for pull request: #{pull_request}"
153
+ elsif !TAGGABLE_BRANCHES.include?(travis_branch)
154
+ say "Cannot create build tag for branch: #{travis_branch}. Only #{TAGGABLE_BRANCHES} are supported."
155
+ else
156
+ timestamp = Time.now.utc.strftime '%Y-%m-%d-%H-%M-%S'
157
+ git_tag = "build-#{travis_branch}-#{timestamp}"
158
+ run_cmd "git tag #{git_tag} -a -m 'Generated tag from TravisCI build #{ENV['TRAVIS_BUILD_NUMBER']}'"
159
+ run_cmd "git push origin #{git_tag}"
160
+ end
161
+ end
162
+
163
+ private
164
+
165
+ # execute a shell command and raise an error if non-zero exit code is returned
166
+ # return the string output from the command
167
+ def run_cmd(cmd, options = {})
168
+ output = run(cmd, capture: true)
169
+ success = $CHILD_STATUS.to_i == 0
170
+ fail "#{cmd} failed" unless success || options[:allow_failure]
171
+ output
172
+ end
173
+
174
+ # check if --pretend or -p flag passed to CLI
175
+ def pretend?
176
+ options[:pretend]
177
+ end
139
178
  end
140
179
  end
141
180
  end
@@ -1,5 +1,5 @@
1
1
  module Thegarage
2
2
  module Gitx
3
- VERSION = '1.1.0'
3
+ VERSION = '1.2.0.beta1'
4
4
  end
5
5
  end
@@ -8,18 +8,5 @@ require 'English'
8
8
  module Thegarage
9
9
  module Gitx
10
10
  BASE_BRANCH = 'master'
11
-
12
- private
13
-
14
- # execute a shell command and raise an error if non-zero exit code is returned
15
- # return the string output from the command
16
- def run_cmd(cmd, options = {})
17
- say "\n$ "
18
- say cmd.gsub("'", ''), :red
19
- output = `#{cmd}`
20
- success = $CHILD_STATUS.to_i == 0
21
- raise "#{cmd} failed" unless success || options[:allow_failure]
22
- output
23
- end
24
11
  end
25
12
  end
data/spec/spec_helper.rb CHANGED
@@ -1,36 +1,21 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
- require 'rspec/mocks'
4
- require 'webmock/rspec'
5
3
  require 'pry'
6
- RSpec::Mocks::setup(Object.new)
7
-
4
+ require 'webmock/rspec'
8
5
  require 'thegarage/gitx/cli'
9
6
 
10
- RSpec.configure do |config|
11
- config.mock_with :rspec
7
+ # Requires supporting ruby files with custom matchers and macros, etc,
8
+ # in spec/support/ and its subdirectories.
9
+ Dir[File.join(__dir__, "support/**/*.rb")].each { |f| require f }
12
10
 
13
- def capture_with_status(stream)
14
- exit_status = 0
15
- begin
16
- stream = stream.to_s
17
- eval "$#{stream} = StringIO.new"
18
- begin
19
- yield
20
- rescue SystemExit => system_exit # catch any exit calls
21
- exit_status = system_exit.status
22
- end
23
- result = eval("$#{stream}").string
24
- ensure
25
- eval("$#{stream} = #{stream.upcase}")
26
- end
27
- return result, exit_status
28
- end
11
+ RSpec.configure do |config|
12
+ config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ config.run_all_when_everything_filtered = true
14
+ config.filter_run :focus
29
15
 
30
- def remove_directories(*names)
31
- project_dir = Pathname.new(Dir.pwd)
32
- names.each do |name|
33
- FileUtils.rm_rf(project_dir.join(name)) if FileTest.exists?(project_dir.join(name))
34
- end
35
- end
16
+ # Run specs in random order to surface order dependencies. If you find an
17
+ # order dependency and want to debug it, you can fix the order by providing
18
+ # the seed, which is printed after each run.
19
+ # --seed 1234
20
+ config.order = 'random'
36
21
  end
@@ -0,0 +1,7 @@
1
+ # empty matcher to allow for mock expectations to fire
2
+ RSpec::Matchers.define :meet_expectations do |expected|
3
+ match do |actual|
4
+ # do nothing
5
+ expect(true).to be_true
6
+ end
7
+ end
@@ -1,87 +1,82 @@
1
1
  require 'spec_helper'
2
+ require 'timecop'
2
3
 
3
4
  describe Thegarage::Gitx::CLI do
4
- # stub methods on cli
5
- class Thegarage::Gitx::CLI
6
- class << self
7
- attr_accessor :stubbed_executed_commands
8
- end
9
- private
10
- # stub out command execution and record commands for test inspection
11
- def run_cmd(cmd, options={})
12
- self.class.stubbed_executed_commands << cmd
13
- ''
14
- end
15
- # stub branch to always be a known branch
16
- def current_branch
17
- 'FOO'
18
- end
19
- # stub current user to always be known
20
- def current_user
21
- 'wireframe'
22
- end
5
+ let(:args) { [] }
6
+ let(:options) { {} }
7
+ let(:config) do
8
+ {
9
+ pretend: true
10
+ }
23
11
  end
12
+ let(:cli) { Thegarage::Gitx::CLI.new(args, options, config) }
24
13
 
25
14
  before do
26
- Thegarage::Gitx::CLI.stubbed_executed_commands = []
15
+ # default current branch to: feature-branch
16
+ allow(cli).to receive(:current_branch).and_return('feature-branch')
27
17
  end
28
18
 
19
+
29
20
  describe '#update' do
30
21
  before do
31
- Thegarage::Gitx::CLI.start ['update']
22
+ expect(cli).to receive(:run).with('git pull origin feature-branch', capture: true).ordered
23
+ expect(cli).to receive(:run).with('git pull origin master', capture: true).ordered
24
+ expect(cli).to receive(:run).with('git push origin HEAD', capture: true).ordered
25
+
26
+ cli.update
32
27
  end
33
28
  it 'should run expected commands' do
34
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
35
- 'git pull origin FOO',
36
- 'git pull origin master',
37
- 'git push origin HEAD'
38
- ]
29
+ should meet_expectations
39
30
  end
40
31
  end
41
32
 
42
33
  describe '#integrate' do
43
34
  context 'when target branch is ommitted' do
44
35
  before do
45
- Thegarage::Gitx::CLI.start ['integrate']
36
+ expect(cli).to receive(:run).with("git pull origin feature-branch", capture: true).ordered
37
+ expect(cli).to receive(:run).with("git pull origin master", capture: true).ordered
38
+ expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
39
+ expect(cli).to receive(:run).with("git branch -D staging", capture: true).ordered
40
+ expect(cli).to receive(:run).with("git fetch origin", capture: true).ordered
41
+ expect(cli).to receive(:run).with("git checkout staging", capture: true).ordered
42
+ expect(cli).to receive(:run).with("git pull . feature-branch", capture: true).ordered
43
+ expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
44
+ expect(cli).to receive(:run).with("git checkout feature-branch", capture: true).ordered
45
+ expect(cli).to receive(:run).with("git checkout feature-branch", capture: true).ordered
46
+
47
+ cli.integrate
46
48
  end
47
49
  it 'should default to staging' do
48
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
49
- "git pull origin FOO",
50
- "git pull origin master",
51
- "git push origin HEAD",
52
- "git branch -D staging",
53
- "git fetch origin",
54
- "git checkout staging",
55
- "git pull . FOO",
56
- "git push origin HEAD",
57
- "git checkout FOO",
58
- "git checkout FOO"
59
- ]
50
+ should meet_expectations
60
51
  end
61
52
  end
62
53
  context 'when target branch == prototype' do
63
54
  before do
64
- Thegarage::Gitx::CLI.start ['integrate', 'prototype']
55
+ expect(cli).to receive(:run).with("git pull origin feature-branch", capture: true).ordered
56
+ expect(cli).to receive(:run).with("git pull origin master", capture: true).ordered
57
+ expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
58
+ expect(cli).to receive(:run).with("git branch -D prototype", capture: true).ordered
59
+ expect(cli).to receive(:run).with("git fetch origin", capture: true).ordered
60
+ expect(cli).to receive(:run).with("git checkout prototype", capture: true).ordered
61
+ expect(cli).to receive(:run).with("git pull . feature-branch", capture: true).ordered
62
+ expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
63
+ expect(cli).to receive(:run).with("git checkout feature-branch", capture: true).ordered
64
+ expect(cli).to receive(:run).with("git checkout feature-branch", capture: true).ordered
65
+
66
+ cli.integrate 'prototype'
65
67
  end
66
68
  it 'should run expected commands' do
67
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
68
- "git pull origin FOO",
69
- "git pull origin master",
70
- "git push origin HEAD",
71
- "git branch -D prototype",
72
- "git fetch origin",
73
- "git checkout prototype",
74
- "git pull . FOO",
75
- "git push origin HEAD",
76
- "git checkout FOO",
77
- "git checkout FOO"
78
- ]
69
+ should meet_expectations
79
70
  end
80
71
  end
81
72
  context 'when target branch != staging || prototype' do
82
73
  it 'should raise an error' do
74
+ expect(cli).to receive(:run).with("git pull origin feature-branch", capture: true).ordered
75
+ expect(cli).to receive(:run).with("git pull origin master", capture: true).ordered
76
+ expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
77
+
83
78
  lambda {
84
- Thegarage::Gitx::CLI.start ['integrate', 'asdfasdfasdf']
79
+ cli.integrate 'some-other-branch'
85
80
  }.should raise_error(/Only aggregate branches are allowed for integration/)
86
81
  end
87
82
  end
@@ -90,157 +85,270 @@ describe Thegarage::Gitx::CLI do
90
85
  describe '#release' do
91
86
  context 'when user rejects release' do
92
87
  before do
93
- Thegarage::Gitx::CLI.any_instance.should_receive(:yes?).and_return(false)
94
- Thegarage::Gitx::CLI.start ['release']
88
+ expect(cli).to receive(:yes?).and_return(false)
89
+
90
+ expect(cli).to receive(:run).with("git pull origin feature-branch", capture: true).ordered
91
+ expect(cli).to receive(:run).with("git pull origin master", capture: true).ordered
92
+ expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
93
+
94
+ cli.release
95
95
  end
96
96
  it 'should only run update commands' do
97
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
98
- "git pull origin FOO",
99
- "git pull origin master",
100
- "git push origin HEAD"
101
- ]
97
+ should meet_expectations
102
98
  end
103
99
  end
104
100
  context 'when user confirms release' do
105
101
  before do
106
- Thegarage::Gitx::CLI.any_instance.should_receive(:yes?).and_return(true)
107
- Thegarage::Gitx::CLI.start ['release']
102
+ expect(cli).to receive(:yes?).and_return(true)
103
+ expect(cli).to receive(:branches).and_return(%w( old-merged-feature )).twice
104
+
105
+ expect(cli).to receive(:run).with("git pull origin feature-branch", capture: true).ordered
106
+ expect(cli).to receive(:run).with("git pull origin master", capture: true).ordered
107
+ expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
108
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
109
+ expect(cli).to receive(:run).with("git pull origin master", capture: true).ordered
110
+ expect(cli).to receive(:run).with("git pull . feature-branch", capture: true).ordered
111
+ expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
112
+ expect(cli).to receive(:run).with("git branch -D staging", capture: true).ordered
113
+ expect(cli).to receive(:run).with("git fetch origin", capture: true).ordered
114
+ expect(cli).to receive(:run).with("git checkout staging", capture: true).ordered
115
+ expect(cli).to receive(:run).with("git pull . master", capture: true).ordered
116
+ expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
117
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
118
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
119
+ expect(cli).to receive(:run).with("git pull", capture: true).ordered
120
+ expect(cli).to receive(:run).with("git remote prune origin", capture: true).ordered
121
+ expect(cli).to receive(:run).with("git push origin --delete old-merged-feature", capture: true).ordered
122
+ expect(cli).to receive(:run).with("git branch -d old-merged-feature", capture: true).ordered
123
+
124
+ cli.release
108
125
  end
109
126
  it 'should run expected commands' do
110
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
111
- "git pull origin FOO",
112
- "git pull origin master",
113
- "git push origin HEAD",
114
- "git checkout master",
115
- "git pull origin master",
116
- "git pull . FOO",
117
- "git push origin HEAD",
118
- "git branch -D staging",
119
- "git fetch origin",
120
- "git checkout staging",
121
- "git pull . master",
122
- "git push origin HEAD",
123
- "git checkout master",
124
- "git checkout master",
125
- "git pull",
126
- "git remote prune origin"
127
- ]
127
+ should meet_expectations
128
128
  end
129
129
  end
130
130
  end
131
131
 
132
132
  describe '#nuke' do
133
133
  context 'when target branch == prototype and --destination == master' do
134
+ let(:options) do
135
+ {
136
+ destination: 'master'
137
+ }
138
+ end
139
+ let(:buildtags) do
140
+ %w( build-master-2013-10-01-01 ).join("\n")
141
+ end
134
142
  before do
135
- prototype_branches = %w( dev-foo dev-bar )
136
- master_branches = %w( dev-foo )
137
- Thegarage::Gitx::CLI.any_instance.should_receive(:branches).and_return(prototype_branches, master_branches, prototype_branches, master_branches)
138
- Thegarage::Gitx::CLI.any_instance.should_receive(:yes?).and_return(false)
139
- Thegarage::Gitx::CLI.start ['nuke', 'prototype', '--destination', 'master']
143
+ expect(cli).to receive(:yes?).and_return(true)
144
+
145
+ expect(cli).to receive(:run).with("git fetch --tags", capture: true).ordered
146
+ expect(cli).to receive(:run).with("git tag -l 'build-master-*'", capture: true).and_return(buildtags).ordered
147
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
148
+ expect(cli).to receive(:run).with("git branch -D prototype", capture: true).ordered
149
+ expect(cli).to receive(:run).with("git push origin --delete prototype", capture: true).ordered
150
+ expect(cli).to receive(:run).with("git checkout -b prototype build-master-2013-10-01-01", capture: true).ordered
151
+ expect(cli).to receive(:run).with("git push origin prototype", capture: true).ordered
152
+ expect(cli).to receive(:run).with("git branch --set-upstream-to origin/prototype", capture: true).ordered
153
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
154
+
155
+ cli.nuke 'prototype'
140
156
  end
141
157
  it 'should run expected commands' do
142
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
143
- "git checkout master",
144
- "git branch -D prototype",
145
- "git push origin --delete prototype",
146
- "git checkout -b prototype build-master-2013-10-01-01",
147
- "git push origin prototype",
148
- "git branch --set-upstream prototype origin/prototype",
149
- "git checkout master"
150
- ]
158
+ should meet_expectations
151
159
  end
152
160
  end
153
161
  context 'when target branch == staging and --destination == staging' do
162
+ let(:options) do
163
+ {
164
+ destination: 'staging'
165
+ }
166
+ end
167
+ let(:buildtags) do
168
+ %w( build-staging-2013-10-02-02 ).join("\n")
169
+ end
154
170
  before do
155
- Thegarage::Gitx::CLI.any_instance.should_receive(:yes?).and_return(false)
156
- Thegarage::Gitx::CLI.start ['nuke', 'staging', '--destination', 'staging']
171
+ expect(cli).to receive(:yes?).and_return(true)
172
+
173
+ expect(cli).to receive(:run).with("git fetch --tags", capture: true).ordered
174
+ expect(cli).to receive(:run).with("git tag -l 'build-staging-*'", capture: true).and_return(buildtags).ordered
175
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
176
+ expect(cli).to receive(:run).with("git branch -D staging", capture: true).ordered
177
+ expect(cli).to receive(:run).with("git push origin --delete staging", capture: true).ordered
178
+ expect(cli).to receive(:run).with("git checkout -b staging build-staging-2013-10-02-02", capture: true).ordered
179
+ expect(cli).to receive(:run).with("git push origin staging", capture: true).ordered
180
+ expect(cli).to receive(:run).with("git branch --set-upstream-to origin/staging", capture: true).ordered
181
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
182
+
183
+ cli.nuke 'staging'
157
184
  end
158
185
  it 'should run expected commands' do
159
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
160
- "git checkout master",
161
- "git branch -D staging",
162
- "git push origin --delete staging",
163
- "git checkout -b staging build-staging-2013-10-02-02",
164
- "git push origin staging",
165
- "git branch --set-upstream staging origin/staging",
166
- "git checkout master"
167
- ]
186
+ should meet_expectations
168
187
  end
169
188
  end
170
189
  context 'when target branch == prototype and destination prompt == nil' do
190
+ let(:buildtags) do
191
+ %w( build-prototype-2013-10-03-03 ).join("\n")
192
+ end
171
193
  before do
172
- Thegarage::Gitx::CLI.any_instance.should_receive(:ask).and_return('')
173
- Thegarage::Gitx::CLI.any_instance.should_receive(:yes?).and_return(false)
174
- Thegarage::Gitx::CLI.start ['nuke', 'prototype']
194
+ expect(cli).to receive(:ask).and_return('')
195
+ expect(cli).to receive(:yes?).and_return(true)
196
+
197
+ expect(cli).to receive(:run).with("git fetch --tags", capture: true).ordered
198
+ expect(cli).to receive(:run).with("git tag -l 'build-prototype-*'", capture: true).and_return(buildtags).ordered
199
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
200
+ expect(cli).to receive(:run).with("git branch -D prototype", capture: true).ordered
201
+ expect(cli).to receive(:run).with("git push origin --delete prototype", capture: true).ordered
202
+ expect(cli).to receive(:run).with("git checkout -b prototype build-prototype-2013-10-03-03", capture: true).ordered
203
+ expect(cli).to receive(:run).with("git push origin prototype", capture: true).ordered
204
+ expect(cli).to receive(:run).with("git branch --set-upstream-to origin/prototype", capture: true).ordered
205
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
206
+
207
+ cli.nuke 'prototype'
175
208
  end
176
209
  it 'defaults to prototype and should run expected commands' do
177
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
178
- "git checkout master",
179
- "git branch -D prototype",
180
- "git push origin --delete prototype",
181
- "git checkout -b prototype build-prototype-2013-10-02-03",
182
- "git push origin prototype",
183
- "git branch --set-upstream prototype origin/prototype",
184
- "git checkout master"
185
- ]
210
+ should meet_expectations
186
211
  end
187
212
  end
188
213
  context 'when target branch == prototype and destination prompt = master' do
214
+ let(:buildtags) do
215
+ %w( build-master-2013-10-01-01 ).join("\n")
216
+ end
189
217
  before do
190
- Thegarage::Gitx::CLI.any_instance.should_receive(:ask).and_return('master')
191
- Thegarage::Gitx::CLI.any_instance.should_receive(:yes?).and_return(false)
192
- Thegarage::Gitx::CLI.start ['nuke', 'prototype']
218
+ expect(cli).to receive(:ask).and_return('master')
219
+ expect(cli).to receive(:yes?).and_return(true)
220
+
221
+ expect(cli).to receive(:run).with("git fetch --tags", capture: true).ordered
222
+ expect(cli).to receive(:run).with("git tag -l 'build-master-*'", capture: true).and_return(buildtags).ordered
223
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
224
+ expect(cli).to receive(:run).with("git branch -D prototype", capture: true).ordered
225
+ expect(cli).to receive(:run).with("git push origin --delete prototype", capture: true).ordered
226
+ expect(cli).to receive(:run).with("git checkout -b prototype build-master-2013-10-01-01", capture: true).ordered
227
+ expect(cli).to receive(:run).with("git push origin prototype", capture: true).ordered
228
+ expect(cli).to receive(:run).with("git branch --set-upstream-to origin/prototype", capture: true).ordered
229
+ expect(cli).to receive(:run).with("git checkout master", capture: true).ordered
230
+
231
+ cli.nuke 'prototype'
193
232
  end
194
233
  it 'should run expected commands' do
195
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
196
- "git checkout master",
197
- "git branch -D prototype",
198
- "git push origin --delete prototype",
199
- "git checkout -b prototype build-master-2013-10-01-01",
200
- "git push origin prototype",
201
- "git branch --set-upstream prototype origin/prototype",
202
- "git checkout master"
203
- ]
234
+ should meet_expectations
204
235
  end
205
236
  end
206
237
  context 'when target branch != staging || prototype' do
207
238
  it 'should raise error' do
208
239
  lambda {
209
- Thegarage::Gitx::CLI.any_instance.should_receive(:ask).and_return('master')
210
- Thegarage::Gitx::CLI.any_instance.should_receive(:yes?).and_return(false)
211
- Thegarage::Gitx::CLI.start ['nuke', 'asdfasdf']
240
+ expect(cli).to receive(:ask).and_return('master')
241
+ expect(cli).to receive(:yes?).and_return(true)
242
+ cli.nuke 'not-an-integration-branch'
212
243
  }.should raise_error /Only aggregate branches are allowed to be reset/
213
244
  end
214
245
  end
215
246
  context 'when user does not confirm nuking the target branch' do
247
+ let(:buildtags) do
248
+ %w( build-master-2013-10-01-01 ).join("\n")
249
+ end
216
250
  before do
217
- Thegarage::Gitx::CLI.any_instance.should_receive(:ask).and_return('master')
218
- Thegarage::Gitx::CLI.any_instance.should_receive(:yes?).and_return(false)
219
- Thegarage::Gitx::CLI.start ['nuke', 'prototype']
251
+ expect(cli).to receive(:ask).and_return('master')
252
+ expect(cli).to receive(:yes?).and_return(false)
253
+
254
+ expect(cli).to receive(:run).with("git fetch --tags", capture: true).ordered
255
+ expect(cli).to receive(:run).with("git tag -l 'build-master-*'", capture: true).and_return(buildtags).ordered
256
+
257
+ cli.nuke 'prototype'
220
258
  end
221
259
  it 'should run expected commands' do
222
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
223
- "git fetch --tags"
224
- ]
260
+ should meet_expectations
261
+ end
262
+ end
263
+ context 'when no known good build tag found' do
264
+ let(:buildtags) do
265
+ ''
266
+ end
267
+ it 'raises error' do
268
+ expect(cli).to receive(:ask).and_return('master')
269
+
270
+ expect(cli).to receive(:run).with("git fetch --tags", capture: true).ordered
271
+ expect(cli).to receive(:run).with("git tag -l 'build-master-*'", capture: true).and_return(buildtags).ordered
272
+
273
+ expect { cli.nuke('prototype') }.to raise_error /No known good tag found for branch/
225
274
  end
226
275
  end
227
276
  end
228
277
 
229
278
  describe '#reviewrequest' do
230
- context 'when description != null' do
279
+ context 'when description != null and there is an existing authorization_token' do
280
+ let(:options) { {description: 'testing'} }
281
+ let(:authorization_token) { '123981239123' }
231
282
  before do
232
283
  stub_request(:post, "https://api.github.com/repos/thegarage/thegarage-gitx/pulls").
233
284
  to_return(:status => 200, :body => %q({"html_url": "http://github.com/repo/project/pulls/1"}), :headers => {})
234
285
 
235
- Thegarage::Gitx::CLI.start ['reviewrequest', '--description', 'testing']
286
+ expect(cli).to receive(:authorization_token).and_return(authorization_token)
287
+
288
+ expect(cli).to receive(:run).with("git pull origin feature-branch", capture: true).ordered
289
+ expect(cli).to receive(:run).with("git pull origin master", capture: true).ordered
290
+ expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
291
+
292
+ cli.reviewrequest
293
+ end
294
+ it 'should create github pull request' do
295
+ should meet_expectations
236
296
  end
237
- it 'should create github pull request' do end # see expectations
238
297
  it 'should run expected commands' do
239
- Thegarage::Gitx::CLI.stubbed_executed_commands.should == [
240
- "git pull origin FOO",
241
- "git pull origin master",
242
- "git push origin HEAD"
243
- ]
298
+ should meet_expectations
299
+ end
300
+ end
301
+ end
302
+
303
+ describe '#buildtag' do
304
+ let(:env_travis_branch) { nil }
305
+ let(:env_travis_pull_request) { nil }
306
+ let(:env_travis_build_number) { nil }
307
+ before do
308
+ ENV['TRAVIS_BRANCH'] = env_travis_branch
309
+ ENV['TRAVIS_PULL_REQUEST'] = env_travis_pull_request
310
+ ENV['TRAVIS_BUILD_NUMBER'] = env_travis_build_number
311
+ end
312
+ context 'when ENV[\'TRAVIS_BRANCH\'] is nil' do
313
+ it 'should raise Unknown Branch error' do
314
+ expect { cli.buildtag }.to raise_error "Unknown branch. ENV['TRAVIS_BRANCH'] is required."
315
+ end
316
+ end
317
+ context 'when the travis branch is master and the travis pull request is not false' do
318
+ let(:env_travis_branch) { 'master' }
319
+ let(:env_travis_pull_request) { '45' }
320
+ before do
321
+ expect(cli).to receive(:say).with("Skipping creation of tag for pull request: #{ENV['TRAVIS_PULL_REQUEST']}")
322
+ cli.buildtag
323
+ end
324
+ it 'tells us that it is skipping the creation of the tag' do
325
+ should meet_expectations
326
+ end
327
+ end
328
+ context 'when the travis branch is NOT master and is not a pull request' do
329
+ let(:env_travis_branch) { 'random-branch' }
330
+ let(:env_travis_pull_request) { 'false' }
331
+ before do
332
+ expect(cli).to receive(:say).with(/Cannot create build tag for branch: #{ENV['TRAVIS_BRANCH']}/)
333
+ cli.buildtag
334
+ end
335
+ it 'tells us that the branch is not supported' do
336
+ should meet_expectations
337
+ end
338
+ end
339
+ context 'when the travis branch is master and not a pull request' do
340
+ let(:env_travis_branch) { 'master' }
341
+ let(:env_travis_pull_request) { 'false' }
342
+ let(:env_travis_build_number) { '24' }
343
+ before do
344
+ Timecop.freeze(Time.utc(2013, 10, 30, 10, 21, 28)) do
345
+ expect(cli).to receive(:run).with("git tag build-master-2013-10-30-10-21-28 -a -m 'Generated tag from TravisCI build 24'", capture: true).ordered
346
+ expect(cli).to receive(:run).with("git push origin build-master-2013-10-30-10-21-28", capture: true).ordered
347
+ cli.buildtag
348
+ end
349
+ end
350
+ it 'should create a tag for the branch and push it to github' do
351
+ should meet_expectations
244
352
  end
245
353
  end
246
354
  end
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "rspec", '>= 2.11.0'
28
28
  spec.add_development_dependency "pry", '>= 0'
29
29
  spec.add_development_dependency "webmock", '>= 0'
30
+ spec.add_development_dependency "timecop", "~> 0.6.3"
30
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thegarage-gitx
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Sonnek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-11 00:00:00.000000000 Z
11
+ date: 2013-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grit
@@ -122,10 +122,25 @@ dependencies:
122
122
  - - '>='
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: timecop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 0.6.3
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: 0.6.3
125
139
  description: Git eXtensions for common development workflow
126
140
  email:
127
141
  - ryan.sonnek@gmail.com
128
142
  executables:
143
+ - git-buildtag
129
144
  - git-cleanup
130
145
  - git-integrate
131
146
  - git-nuke
@@ -140,12 +155,15 @@ extensions: []
140
155
  extra_rdoc_files: []
141
156
  files:
142
157
  - .gitignore
158
+ - .rspec
143
159
  - .ruby-gemset
144
160
  - .ruby-version
161
+ - .travis.yml
145
162
  - Gemfile
146
163
  - LICENSE.txt
147
164
  - README.md
148
165
  - Rakefile
166
+ - bin/git-buildtag
149
167
  - bin/git-cleanup
150
168
  - bin/git-integrate
151
169
  - bin/git-nuke
@@ -163,6 +181,7 @@ files:
163
181
  - lib/thegarage/gitx/string_extensions.rb
164
182
  - lib/thegarage/gitx/version.rb
165
183
  - spec/spec_helper.rb
184
+ - spec/support/meet_expectations_matcher.rb
166
185
  - spec/thegarage/gitx/cli_spec.rb
167
186
  - thegarage-gitx.gemspec
168
187
  homepage: ''
@@ -180,15 +199,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
180
199
  version: '0'
181
200
  required_rubygems_version: !ruby/object:Gem::Requirement
182
201
  requirements:
183
- - - '>='
202
+ - - '>'
184
203
  - !ruby/object:Gem::Version
185
- version: '0'
204
+ version: 1.3.1
186
205
  requirements: []
187
206
  rubyforge_project:
188
- rubygems_version: 2.1.5
207
+ rubygems_version: 2.0.7
189
208
  signing_key:
190
209
  specification_version: 4
191
210
  summary: Utility scripts for Git to increase productivity for common operations
192
211
  test_files:
193
212
  - spec/spec_helper.rb
213
+ - spec/support/meet_expectations_matcher.rb
194
214
  - spec/thegarage/gitx/cli_spec.rb