thegarage-gitx 2.4.1 → 2.4.2
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 +4 -4
- data/lib/thegarage/gitx.rb +2 -2
- data/lib/thegarage/gitx/cli/integrate_command.rb +15 -6
- data/lib/thegarage/gitx/cli/start_command.rb +1 -1
- data/lib/thegarage/gitx/{string_extensions.rb → extensions/string.rb} +0 -0
- data/lib/thegarage/gitx/{thor_extensions.rb → extensions/thor.rb} +0 -0
- data/lib/thegarage/gitx/version.rb +1 -1
- data/spec/spec_helper.rb +4 -1
- data/spec/thegarage/gitx/cli/integrate_command_spec.rb +35 -9
- data/spec/thegarage/gitx/cli/nuke_command_spec.rb +60 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d9b47697535d0f7b3870b35f25567e35dc9d5482
|
4
|
+
data.tar.gz: d9a3e772a5e8a83d62d70e5ca4903d86bc94a096
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a6337e2103ad9072deb477849f675038b0b4e38bb0b79b9ac4eb5078f0b7b4d033eba9a73359d0860af65dcbb9ec4c81da7a3cdbbef893071bcc20a9db6530f
|
7
|
+
data.tar.gz: 39a72589d0870324530b0a7179c9740aa2f73eb825c046b18c71ed26de0e5486c176f37c5f07842a9d7ba1af74ef60d92ad39de5a6ac478c1baef76b1f3c3add
|
data/lib/thegarage/gitx.rb
CHANGED
@@ -10,7 +10,7 @@ module Thegarage
|
|
10
10
|
desc 'integrate', 'integrate the current branch into one of the aggregate development branches (default = staging)'
|
11
11
|
def integrate(target_branch = 'staging')
|
12
12
|
branch = current_branch.name
|
13
|
-
|
13
|
+
assert_aggregate_branch!(target_branch)
|
14
14
|
|
15
15
|
UpdateCommand.new.update
|
16
16
|
|
@@ -19,7 +19,8 @@ module Thegarage
|
|
19
19
|
say "into "
|
20
20
|
say target_branch, :green
|
21
21
|
|
22
|
-
|
22
|
+
create_remote_branch(target_branch) unless remote_branch_exists?(target_branch)
|
23
|
+
refresh_branch_from_remote(target_branch)
|
23
24
|
run_cmd "git merge #{branch}"
|
24
25
|
run_cmd "git push origin HEAD"
|
25
26
|
checkout_branch branch
|
@@ -27,17 +28,25 @@ module Thegarage
|
|
27
28
|
|
28
29
|
private
|
29
30
|
|
30
|
-
def
|
31
|
-
|
32
|
-
raise "Only aggregate branches are allowed for integration: #{AGGREGATE_BRANCHES}" unless aggregate_branch?(target_branch) || target_branch == Thegarage::Gitx::BASE_BRANCH
|
31
|
+
def assert_aggregate_branch!(target_branch)
|
32
|
+
fail "Invalid aggregate branch: #{target_branch} must be one of supported aggregate branches #{AGGREGATE_BRANCHES}" unless aggregate_branch?(target_branch)
|
33
33
|
end
|
34
34
|
|
35
35
|
# nuke local branch and pull fresh version from remote repo
|
36
36
|
def refresh_branch_from_remote(target_branch)
|
37
|
-
run_cmd "git branch -D #{target_branch}", :allow_failure => true
|
38
37
|
run_cmd "git fetch origin"
|
38
|
+
run_cmd "git branch -D #{target_branch}", :allow_failure => true
|
39
39
|
checkout_branch target_branch
|
40
40
|
end
|
41
|
+
|
42
|
+
def remote_branch_exists?(target_branch)
|
43
|
+
repo.branches.each_name(:remote).include?("origin/#{target_branch}")
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_remote_branch(target_branch)
|
47
|
+
repo.create_branch(target_branch, Thegarage::Gitx::BASE_BRANCH)
|
48
|
+
run_cmd "git push origin #{target_branch}:#{target_branch}"
|
49
|
+
end
|
41
50
|
end
|
42
51
|
end
|
43
52
|
end
|
File without changes
|
File without changes
|
data/spec/spec_helper.rb
CHANGED
@@ -10,10 +10,13 @@ describe Thegarage::Gitx::Cli::IntegrateCommand do
|
|
10
10
|
}
|
11
11
|
end
|
12
12
|
let(:cli) { Thegarage::Gitx::Cli::IntegrateCommand.new(args, options, config) }
|
13
|
-
let(:
|
13
|
+
let(:current_branch) { double('fake branch', name: 'feature-branch', head?: true) }
|
14
|
+
let(:repo) { cli.send(:repo) }
|
15
|
+
let(:remote_branch_names) { [] }
|
14
16
|
|
15
17
|
before do
|
16
|
-
allow(cli).to receive(:current_branch).and_return(
|
18
|
+
allow(cli).to receive(:current_branch).and_return(current_branch)
|
19
|
+
allow(repo).to receive(:branches).and_return(double(each_name: remote_branch_names))
|
17
20
|
end
|
18
21
|
|
19
22
|
describe '#integrate' do
|
@@ -21,12 +24,13 @@ describe Thegarage::Gitx::Cli::IntegrateCommand do
|
|
21
24
|
before do
|
22
25
|
allow(Thegarage::Gitx::Cli::UpdateCommand).to receive(:new).and_return(fake_update_command)
|
23
26
|
end
|
24
|
-
context 'when target branch is ommitted' do
|
27
|
+
context 'when target branch is ommitted and remote branch exists' do
|
28
|
+
let(:remote_branch_names) { ['origin/staging'] }
|
25
29
|
before do
|
26
30
|
expect(fake_update_command).to receive(:update)
|
27
31
|
|
28
|
-
expect(cli).to receive(:run_cmd).with("git branch -D staging", allow_failure: true).ordered
|
29
32
|
expect(cli).to receive(:run_cmd).with("git fetch origin").ordered
|
33
|
+
expect(cli).to receive(:run_cmd).with("git branch -D staging", allow_failure: true).ordered
|
30
34
|
expect(cli).to receive(:run_cmd).with("git checkout staging").ordered
|
31
35
|
expect(cli).to receive(:run_cmd).with("git merge feature-branch").ordered
|
32
36
|
expect(cli).to receive(:run_cmd).with("git push origin HEAD").ordered
|
@@ -38,12 +42,35 @@ describe Thegarage::Gitx::Cli::IntegrateCommand do
|
|
38
42
|
should meet_expectations
|
39
43
|
end
|
40
44
|
end
|
41
|
-
context 'when
|
45
|
+
context 'when staging branch does not exist remotely' do
|
46
|
+
let(:remote_branch_names) { [] }
|
47
|
+
before do
|
48
|
+
expect(fake_update_command).to receive(:update)
|
49
|
+
|
50
|
+
expect(repo).to receive(:create_branch).with('staging', 'master')
|
51
|
+
|
52
|
+
expect(cli).to receive(:run_cmd).with('git push origin staging:staging').ordered
|
53
|
+
|
54
|
+
expect(cli).to receive(:run_cmd).with("git fetch origin").ordered
|
55
|
+
expect(cli).to receive(:run_cmd).with("git branch -D staging", allow_failure: true).ordered
|
56
|
+
expect(cli).to receive(:run_cmd).with("git checkout staging").ordered
|
57
|
+
expect(cli).to receive(:run_cmd).with("git merge feature-branch").ordered
|
58
|
+
expect(cli).to receive(:run_cmd).with("git push origin HEAD").ordered
|
59
|
+
expect(cli).to receive(:run_cmd).with("git checkout feature-branch").ordered
|
60
|
+
|
61
|
+
cli.integrate
|
62
|
+
end
|
63
|
+
it 'creates remote aggregate branch' do
|
64
|
+
should meet_expectations
|
65
|
+
end
|
66
|
+
end
|
67
|
+
context 'when target branch == prototype and remote branch exists' do
|
68
|
+
let(:remote_branch_names) { ['origin/prototype'] }
|
42
69
|
before do
|
43
70
|
expect(fake_update_command).to receive(:update)
|
44
71
|
|
45
|
-
expect(cli).to receive(:run_cmd).with("git branch -D prototype", allow_failure: true).ordered
|
46
72
|
expect(cli).to receive(:run_cmd).with("git fetch origin").ordered
|
73
|
+
expect(cli).to receive(:run_cmd).with("git branch -D prototype", allow_failure: true).ordered
|
47
74
|
expect(cli).to receive(:run_cmd).with("git checkout prototype").ordered
|
48
75
|
expect(cli).to receive(:run_cmd).with("git merge feature-branch").ordered
|
49
76
|
expect(cli).to receive(:run_cmd).with("git push origin HEAD").ordered
|
@@ -55,10 +82,9 @@ describe Thegarage::Gitx::Cli::IntegrateCommand do
|
|
55
82
|
should meet_expectations
|
56
83
|
end
|
57
84
|
end
|
58
|
-
context 'when target branch
|
85
|
+
context 'when target branch is not an aggregate branch' do
|
59
86
|
it 'raises an error' do
|
60
|
-
|
61
|
-
expect { cli.integrate('some-other-branch') }.to raise_error(/Only aggregate branches are allowed for integration/)
|
87
|
+
expect { cli.integrate('some-other-branch') }.to raise_error(/Invalid aggregate branch: some-other-branch must be one of supported aggregate branches/)
|
62
88
|
end
|
63
89
|
end
|
64
90
|
end
|
@@ -101,5 +101,65 @@ describe Thegarage::Gitx::Cli::NukeCommand do
|
|
101
101
|
expect { cli.nuke('prototype') }.to raise_error(/No known good tag found for branch/)
|
102
102
|
end
|
103
103
|
end
|
104
|
+
context 'when database migrations exist and user cancels operation' do
|
105
|
+
let(:buildtag) { 'build-master-2013-10-01-01' }
|
106
|
+
let(:good_branch) { 'master' }
|
107
|
+
let(:bad_branch) { 'prototype' }
|
108
|
+
let(:migrations) do
|
109
|
+
%w( db/migrate/20140715194946_create_users.rb db/migrate/20140730063034_update_user_account.rb ).join("\n")
|
110
|
+
end
|
111
|
+
before do
|
112
|
+
FileUtils.mkdir_p('db/migrate')
|
113
|
+
|
114
|
+
expect(cli).to receive(:current_build_tag).with(good_branch).and_return(buildtag)
|
115
|
+
|
116
|
+
expect(cli).to receive(:ask).and_return(good_branch)
|
117
|
+
expect(cli).to receive(:yes?).with('Reset prototype to build-master-2013-10-01-01? (y/n)', :green).and_return(true)
|
118
|
+
expect(cli).to receive(:run_cmd).with("git diff build-master-2013-10-01-01...prototype --name-only db/migrate").and_return(migrations)
|
119
|
+
expect(cli).to receive(:yes?).with('Are you sure you want to nuke prototype? (y/n) ', :green).and_return(false)
|
120
|
+
|
121
|
+
cli.nuke 'prototype'
|
122
|
+
end
|
123
|
+
after do
|
124
|
+
FileUtils.rm_rf('db/migrate')
|
125
|
+
end
|
126
|
+
it 'prompts for nuke confirmation' do
|
127
|
+
should meet_expectations
|
128
|
+
end
|
129
|
+
end
|
130
|
+
context 'when database migrations exist and user approves operation' do
|
131
|
+
let(:buildtag) { 'build-master-2013-10-01-01' }
|
132
|
+
let(:good_branch) { 'master' }
|
133
|
+
let(:bad_branch) { 'prototype' }
|
134
|
+
let(:migrations) do
|
135
|
+
%w( db/migrate/20140715194946_create_users.rb db/migrate/20140730063034_update_user_account.rb ).join("\n")
|
136
|
+
end
|
137
|
+
before do
|
138
|
+
FileUtils.mkdir_p('db/migrate')
|
139
|
+
|
140
|
+
expect(cli).to receive(:current_build_tag).with(good_branch).and_return(buildtag)
|
141
|
+
|
142
|
+
expect(cli).to receive(:ask).and_return(good_branch)
|
143
|
+
expect(cli).to receive(:yes?).with('Reset prototype to build-master-2013-10-01-01? (y/n)', :green).and_return(true)
|
144
|
+
expect(cli).to receive(:run_cmd).with("git diff build-master-2013-10-01-01...prototype --name-only db/migrate").and_return(migrations)
|
145
|
+
expect(cli).to receive(:yes?).with('Are you sure you want to nuke prototype? (y/n) ', :green).and_return(true)
|
146
|
+
|
147
|
+
expect(cli).to receive(:run_cmd).with("git checkout master").ordered
|
148
|
+
expect(cli).to receive(:run_cmd).with("git branch -D prototype", allow_failure: true).ordered
|
149
|
+
expect(cli).to receive(:run_cmd).with("git push origin --delete prototype", allow_failure: true).ordered
|
150
|
+
expect(cli).to receive(:run_cmd).with("git checkout -b prototype build-master-2013-10-01-01").ordered
|
151
|
+
expect(cli).to receive(:run_cmd).with("git push origin prototype").ordered
|
152
|
+
expect(cli).to receive(:run_cmd).with("git branch --set-upstream-to origin/prototype").ordered
|
153
|
+
expect(cli).to receive(:run_cmd).with("git checkout master").ordered
|
154
|
+
|
155
|
+
cli.nuke 'prototype'
|
156
|
+
end
|
157
|
+
after do
|
158
|
+
FileUtils.rm_rf('db/migrate')
|
159
|
+
end
|
160
|
+
it 'prompts for nuke confirmation' do
|
161
|
+
should meet_expectations
|
162
|
+
end
|
163
|
+
end
|
104
164
|
end
|
105
165
|
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: 2.4.
|
4
|
+
version: 2.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Sonnek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rugged
|
@@ -271,8 +271,8 @@ files:
|
|
271
271
|
- lib/thegarage/gitx/cli/start_command.rb
|
272
272
|
- lib/thegarage/gitx/cli/track_command.rb
|
273
273
|
- lib/thegarage/gitx/cli/update_command.rb
|
274
|
-
- lib/thegarage/gitx/
|
275
|
-
- lib/thegarage/gitx/
|
274
|
+
- lib/thegarage/gitx/extensions/string.rb
|
275
|
+
- lib/thegarage/gitx/extensions/thor.rb
|
276
276
|
- lib/thegarage/gitx/version.rb
|
277
277
|
- spec/fixtures/vcr_cassettes/pull_request_does_exist.yml
|
278
278
|
- spec/fixtures/vcr_cassettes/pull_request_does_not_exist.yml
|