git_reflow 0.8.10 → 0.9.4
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/.github/workflows/multi-ruby-tests.yml +33 -0
- data/.rubocop.yml +2 -0
- data/.ruby-version +1 -1
- data/Appraisals +1 -6
- data/CHANGELOG.md +466 -348
- data/Gemfile.lock +100 -70
- data/LICENSE +20 -20
- data/README.md +36 -12
- data/Rakefile +15 -8
- data/Workflow +3 -0
- data/bin/console +7 -7
- data/bin/setup +6 -6
- data/exe/git-reflow +14 -30
- data/git_reflow.gemspec +25 -24
- data/lib/git_reflow.rb +3 -14
- data/lib/git_reflow/config.rb +52 -17
- data/lib/git_reflow/git_helpers.rb +69 -22
- data/lib/git_reflow/git_server/base.rb +68 -68
- data/lib/git_reflow/git_server/git_hub.rb +53 -40
- data/lib/git_reflow/git_server/git_hub/pull_request.rb +25 -17
- data/lib/git_reflow/git_server/pull_request.rb +19 -3
- data/lib/git_reflow/merge_error.rb +9 -9
- data/lib/git_reflow/rspec.rb +1 -0
- data/lib/git_reflow/rspec/command_line_helpers.rb +23 -6
- data/lib/git_reflow/rspec/stub_helpers.rb +13 -13
- data/lib/git_reflow/rspec/workflow_helpers.rb +18 -0
- data/lib/git_reflow/sandbox.rb +16 -6
- data/lib/git_reflow/version.rb +1 -1
- data/lib/git_reflow/workflow.rb +305 -10
- data/lib/git_reflow/workflows/FlatMergeWorkflow +38 -0
- data/lib/git_reflow/workflows/core.rb +208 -79
- data/spec/fixtures/authentication_failure.json +3 -0
- data/spec/fixtures/awesome_workflow.rb +2 -6
- data/spec/fixtures/git/git_config +7 -7
- data/spec/fixtures/issues/comment.json.erb +27 -27
- data/spec/fixtures/issues/comments.json +29 -29
- data/spec/fixtures/issues/comments.json.erb +15 -15
- data/spec/fixtures/pull_requests/comment.json.erb +45 -45
- data/spec/fixtures/pull_requests/comments.json +47 -47
- data/spec/fixtures/pull_requests/comments.json.erb +15 -15
- data/spec/fixtures/pull_requests/commits.json +29 -29
- data/spec/fixtures/pull_requests/external_pull_request.json +145 -145
- data/spec/fixtures/pull_requests/pull_request.json +142 -142
- data/spec/fixtures/pull_requests/pull_request.json.erb +142 -142
- data/spec/fixtures/pull_requests/pull_request_branch_nonexistent_error.json +32 -0
- data/spec/fixtures/pull_requests/pull_request_exists_error.json +32 -32
- data/spec/fixtures/pull_requests/pull_requests.json +136 -136
- data/spec/fixtures/repositories/commit.json +53 -53
- data/spec/fixtures/repositories/commit.json.erb +53 -53
- data/spec/fixtures/repositories/commits.json.erb +13 -13
- data/spec/fixtures/repositories/statuses.json +31 -31
- data/spec/fixtures/users/user.json +32 -0
- data/spec/lib/git_reflow/git_helpers_spec.rb +115 -12
- data/spec/lib/git_reflow/git_server/git_hub/pull_request_spec.rb +6 -6
- data/spec/lib/git_reflow/git_server/git_hub_spec.rb +77 -3
- data/spec/lib/git_reflow/git_server/pull_request_spec.rb +41 -7
- data/spec/lib/git_reflow/workflow_spec.rb +259 -14
- data/spec/lib/git_reflow/workflows/core_spec.rb +224 -65
- data/spec/lib/git_reflow/workflows/flat_merge_spec.rb +17 -6
- data/spec/lib/git_reflow_spec.rb +2 -25
- data/spec/spec_helper.rb +3 -0
- data/spec/support/github_helpers.rb +1 -1
- data/spec/support/mock_pull_request.rb +17 -17
- data/spec/support/web_mocks.rb +39 -39
- metadata +52 -53
- data/circle.yml +0 -26
- data/lib/git_reflow/commands/deliver.rb +0 -10
- data/lib/git_reflow/commands/refresh.rb +0 -20
- data/lib/git_reflow/commands/review.rb +0 -13
- data/lib/git_reflow/commands/setup.rb +0 -11
- data/lib/git_reflow/commands/stage.rb +0 -9
- data/lib/git_reflow/commands/start.rb +0 -18
- data/lib/git_reflow/commands/status.rb +0 -7
- data/lib/git_reflow/workflows/flat_merge.rb +0 -10
- data/spec/fixtures/workflow_with_super.rb +0 -8
@@ -5,14 +5,51 @@ describe GitReflow::Workflows::Core do
|
|
5
5
|
let(:existing_pull_requests) { Fixture.new('pull_requests/pull_requests.json').to_json_hashie }
|
6
6
|
let(:existing_gh_pull_request) { GitReflow::GitServer::GitHub::PullRequest.new existing_pull_requests.first }
|
7
7
|
let(:pull_request_message_file) { "#{GitReflow.git_root_dir}/.git/GIT_REFLOW_PR_MSG" }
|
8
|
+
let(:workflow) { described_class }
|
8
9
|
|
9
10
|
before do
|
10
|
-
allow(
|
11
|
+
allow(workflow).to receive(:current_branch).and_return(feature_branch)
|
11
12
|
allow_any_instance_of(HighLine).to receive(:choose)
|
12
13
|
end
|
13
14
|
|
15
|
+
describe ".load_workflow(workflow_path)" do
|
16
|
+
let(:workflow_path) { "/tmp/Workflow" }
|
17
|
+
subject { GitReflow::Workflows::Core.load_workflow(workflow_path) }
|
18
|
+
|
19
|
+
before { allow(GitReflow::Workflows::Core).to receive(:load_workflow).and_call_original }
|
20
|
+
|
21
|
+
it "returns `nil` if the workflow path doesn't exist" do
|
22
|
+
allow(File).to receive(:exists?).and_return(false)
|
23
|
+
expect(subject).to be_nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it "evaluates the workflow file in the context of the class" do
|
27
|
+
workflow_content = "# testing"
|
28
|
+
allow(File).to receive(:exists?).with("#{GitReflow.git_root_dir}/Workflow").and_return(false)
|
29
|
+
allow(File).to receive(:exists?).with(workflow_path).and_return(true)
|
30
|
+
expect(File).to receive(:read).with(workflow_path).and_return(workflow_content)
|
31
|
+
expect(GitReflow::Workflows::Core).to receive(:load_raw_workflow).with(workflow_content)
|
32
|
+
subject
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe ".load_raw_workflow(workflow_string)" do
|
37
|
+
before { allow(GitReflow::Workflows::Core).to receive(:load_workflow).and_call_original }
|
38
|
+
it "evaluates the raw string in the context of the Core workflow" do
|
39
|
+
workflow_content = <<~WORKFLOW_CONTENT
|
40
|
+
command :dummy do
|
41
|
+
puts "Dummy"
|
42
|
+
end
|
43
|
+
WORKFLOW_CONTENT
|
44
|
+
fake_binding = instance_double(Binding)
|
45
|
+
expect(fake_binding).to receive(:eval).with(workflow_content)
|
46
|
+
expect(described_class).to receive(:binding).and_return(fake_binding)
|
47
|
+
GitReflow::Workflows::Core.load_raw_workflow(workflow_content)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
14
51
|
describe ".setup" do
|
15
|
-
subject {
|
52
|
+
subject { workflow.setup }
|
16
53
|
|
17
54
|
before do
|
18
55
|
allow(File).to receive(:exist?).and_return(false)
|
@@ -27,7 +64,8 @@ describe GitReflow::Workflows::Core do
|
|
27
64
|
context "core.editor git config has already been set" do
|
28
65
|
before do
|
29
66
|
allow(GitReflow::Config).to receive(:get) { "" }
|
30
|
-
allow(
|
67
|
+
allow(workflow.git_config).to receive(:get) { "" }
|
68
|
+
allow(workflow.git_config).to receive(:get).with('core.editor').and_return('emacs')
|
31
69
|
end
|
32
70
|
|
33
71
|
specify { expect { subject }.to_not have_run_command_silently "git config -f #{GitReflow::Config::CONFIG_FILE_PATH} --replace-all core.editor \"#{GitReflow.default_editor}\"", blocking: false }
|
@@ -83,9 +121,9 @@ describe GitReflow::Workflows::Core do
|
|
83
121
|
|
84
122
|
describe ".start" do
|
85
123
|
let(:feature_branch) { 'new_feature' }
|
86
|
-
subject {
|
124
|
+
subject { workflow.start feature_branch: feature_branch }
|
87
125
|
|
88
|
-
it "updates the local repo and
|
126
|
+
it "updates the local repo and creates a new branch" do
|
89
127
|
expect { subject }.to have_run_commands_in_order [
|
90
128
|
"git checkout master",
|
91
129
|
"git pull origin master",
|
@@ -107,13 +145,23 @@ describe GitReflow::Workflows::Core do
|
|
107
145
|
end
|
108
146
|
|
109
147
|
it "starts from a different base branch when one is supplied" do
|
110
|
-
expect {
|
148
|
+
expect { workflow.start feature_branch: feature_branch, base: 'development' }.to have_run_commands_in_order [
|
111
149
|
"git checkout development",
|
112
150
|
"git pull origin development",
|
113
151
|
"git push origin development:refs/heads/#{feature_branch}",
|
114
152
|
"git checkout --track -b #{feature_branch} origin/#{feature_branch}"
|
115
153
|
]
|
116
154
|
end
|
155
|
+
|
156
|
+
it "starts from a different base branch when one is configured" do
|
157
|
+
allow(GitReflow::Config).to receive(:get).with("reflow.base-branch").and_return("sudo-master")
|
158
|
+
expect { workflow.start feature_branch: feature_branch }.to have_run_commands_in_order [
|
159
|
+
"git checkout sudo-master",
|
160
|
+
"git pull origin sudo-master",
|
161
|
+
"git push origin sudo-master:refs/heads/#{feature_branch}",
|
162
|
+
"git checkout --track -b #{feature_branch} origin/#{feature_branch}"
|
163
|
+
]
|
164
|
+
end
|
117
165
|
end
|
118
166
|
|
119
167
|
describe ".review" do
|
@@ -124,11 +172,11 @@ describe GitReflow::Workflows::Core do
|
|
124
172
|
let(:inputs) { {} }
|
125
173
|
|
126
174
|
before do
|
127
|
-
allow(
|
175
|
+
allow(workflow).to receive(:remote_user).and_return(user)
|
128
176
|
allow(GitReflow).to receive(:git_server).and_return(GitReflow::GitServer)
|
129
|
-
allow(
|
130
|
-
allow(
|
131
|
-
allow(
|
177
|
+
allow(workflow.git_server).to receive(:get_build_status).and_return(Struct.new(:state, :description, :url, :target_url).new)
|
178
|
+
allow(workflow.git_server).to receive(:find_open_pull_request).and_return(nil)
|
179
|
+
allow(workflow.git_server).to receive(:create_pull_request).and_return(existing_gh_pull_request)
|
132
180
|
allow(File).to receive(:open).with(pull_request_message_file, 'w')
|
133
181
|
allow(File).to receive(:read).with(pull_request_message_file).and_return("bingo")
|
134
182
|
allow(File).to receive(:delete)
|
@@ -138,7 +186,7 @@ describe GitReflow::Workflows::Core do
|
|
138
186
|
})
|
139
187
|
end
|
140
188
|
|
141
|
-
subject {
|
189
|
+
subject { workflow.review inputs }
|
142
190
|
|
143
191
|
it "fetches updates to the base branch" do
|
144
192
|
expect { subject }.to have_run_command "git fetch origin master"
|
@@ -151,7 +199,7 @@ describe GitReflow::Workflows::Core do
|
|
151
199
|
it "uses the current branch name as the text for the PR" do
|
152
200
|
fake_file = double
|
153
201
|
expect(File).to receive(:open).with(pull_request_message_file, "w").and_yield(fake_file)
|
154
|
-
expect(fake_file).to receive(:write).with(
|
202
|
+
expect(fake_file).to receive(:write).with(workflow.current_branch)
|
155
203
|
subject
|
156
204
|
end
|
157
205
|
|
@@ -175,7 +223,7 @@ describe GitReflow::Workflows::Core do
|
|
175
223
|
context "and a PR template exists" do
|
176
224
|
let(:template_content) { "hey now" }
|
177
225
|
before do
|
178
|
-
allow(
|
226
|
+
allow(workflow).to receive(:pull_request_template).and_return(template_content)
|
179
227
|
end
|
180
228
|
|
181
229
|
it "uses the template's content for the PR" do
|
@@ -184,7 +232,6 @@ describe GitReflow::Workflows::Core do
|
|
184
232
|
expect(fake_file).to receive(:write).with(template_content)
|
185
233
|
subject
|
186
234
|
end
|
187
|
-
|
188
235
|
end
|
189
236
|
|
190
237
|
context "providing a base branch" do
|
@@ -197,7 +244,7 @@ describe GitReflow::Workflows::Core do
|
|
197
244
|
end
|
198
245
|
|
199
246
|
it "creates a pull request using the custom base branch" do
|
200
|
-
expect(
|
247
|
+
expect(workflow.git_server).to receive(:create_pull_request).with({
|
201
248
|
title: 'bingo',
|
202
249
|
body: "\n",
|
203
250
|
head: "#{user}:#{feature_branch}",
|
@@ -207,6 +254,25 @@ describe GitReflow::Workflows::Core do
|
|
207
254
|
end
|
208
255
|
end
|
209
256
|
|
257
|
+
context 'when a base branch is configured' do
|
258
|
+
before do
|
259
|
+
stub_command_line_inputs('Submit pull request? (Y)' => 'yes')
|
260
|
+
allow(GitReflow::Config).to receive(:get).and_call_original
|
261
|
+
allow(GitReflow::Config).to receive(:get).with('reflow.base-branch').and_return('racecar')
|
262
|
+
inputs.delete(:base)
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'creates a pull request using the custom base branch' do
|
266
|
+
expect(GitReflow.git_server).to receive(:create_pull_request).with({
|
267
|
+
title: 'bingo',
|
268
|
+
body: "\n",
|
269
|
+
head: "#{user}:#{feature_branch}",
|
270
|
+
base: 'racecar'
|
271
|
+
})
|
272
|
+
subject
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
210
276
|
context "providing only a title" do
|
211
277
|
let(:inputs) {{ title: "Amazing new feature" }}
|
212
278
|
|
@@ -217,7 +283,7 @@ describe GitReflow::Workflows::Core do
|
|
217
283
|
end
|
218
284
|
|
219
285
|
it "creates a pull request with only the given title" do
|
220
|
-
expect(
|
286
|
+
expect(workflow.git_server).to receive(:create_pull_request).with({
|
221
287
|
title: inputs[:title],
|
222
288
|
body: nil,
|
223
289
|
head: "#{user}:#{feature_branch}",
|
@@ -235,7 +301,7 @@ describe GitReflow::Workflows::Core do
|
|
235
301
|
end
|
236
302
|
|
237
303
|
context "providing only a body" do
|
238
|
-
let(:inputs) {{
|
304
|
+
let(:inputs) {{ message: "Please pull this in!" }}
|
239
305
|
|
240
306
|
before do
|
241
307
|
stub_command_line_inputs({
|
@@ -244,9 +310,9 @@ describe GitReflow::Workflows::Core do
|
|
244
310
|
end
|
245
311
|
|
246
312
|
it "creates a pull request with the body as both title and body" do
|
247
|
-
expect(
|
248
|
-
title: inputs[:
|
249
|
-
body: inputs[:
|
313
|
+
expect(workflow.git_server).to receive(:create_pull_request).with({
|
314
|
+
title: inputs[:message],
|
315
|
+
body: inputs[:message],
|
250
316
|
head: "#{user}:#{feature_branch}",
|
251
317
|
base: 'master'
|
252
318
|
})
|
@@ -255,7 +321,7 @@ describe GitReflow::Workflows::Core do
|
|
255
321
|
end
|
256
322
|
|
257
323
|
context "providing both title and body" do
|
258
|
-
let(:inputs) {{ title: "Amazing new feature",
|
324
|
+
let(:inputs) {{ title: "Amazing new feature", message: "Please pull this in!" }}
|
259
325
|
|
260
326
|
before do
|
261
327
|
stub_command_line_inputs({
|
@@ -264,9 +330,9 @@ describe GitReflow::Workflows::Core do
|
|
264
330
|
end
|
265
331
|
|
266
332
|
it "creates a pull request with only the given title" do
|
267
|
-
expect(
|
333
|
+
expect(workflow.git_server).to receive(:create_pull_request).with({
|
268
334
|
title: inputs[:title],
|
269
|
-
body: inputs[:
|
335
|
+
body: inputs[:message],
|
270
336
|
head: "#{user}:#{feature_branch}",
|
271
337
|
base: 'master'
|
272
338
|
})
|
@@ -276,7 +342,7 @@ describe GitReflow::Workflows::Core do
|
|
276
342
|
|
277
343
|
context "with existing pull request" do
|
278
344
|
before do
|
279
|
-
expect(
|
345
|
+
expect(workflow.git_server).to receive(:find_open_pull_request).and_return(existing_gh_pull_request)
|
280
346
|
allow(existing_gh_pull_request).to receive(:display_pull_request_summary)
|
281
347
|
end
|
282
348
|
|
@@ -296,7 +362,7 @@ describe GitReflow::Workflows::Core do
|
|
296
362
|
end
|
297
363
|
|
298
364
|
it "creates a pull request" do
|
299
|
-
expect(
|
365
|
+
expect(workflow.git_server).to receive(:create_pull_request).with({
|
300
366
|
title: 'bingo',
|
301
367
|
body: "\n",
|
302
368
|
head: "#{user}:#{feature_branch}",
|
@@ -306,9 +372,27 @@ describe GitReflow::Workflows::Core do
|
|
306
372
|
end
|
307
373
|
|
308
374
|
it "notifies the user that the pull request was created" do
|
309
|
-
expect(
|
375
|
+
expect(workflow.git_server).to receive(:create_pull_request).and_return(existing_gh_pull_request)
|
310
376
|
expect{ subject }.to have_said "Successfully created pull request ##{existing_gh_pull_request.number}: #{existing_gh_pull_request.title}\nPull Request URL: #{existing_gh_pull_request.html_url}\n", :success
|
311
377
|
end
|
378
|
+
|
379
|
+
context "when pull request creation fails" do
|
380
|
+
let(:github_error) { Github::Error::UnprocessableEntity.new(eval(Fixture.new('pull_requests/pull_request_branch_nonexistent_error.json').to_s)) }
|
381
|
+
|
382
|
+
it "retries creating a pull request" do
|
383
|
+
call_count = 0
|
384
|
+
allow(workflow.git_server).to receive(:create_pull_request) do
|
385
|
+
call_count += 1
|
386
|
+
(call_count <= 1) ? raise(github_error) : existing_gh_pull_request
|
387
|
+
end
|
388
|
+
expect{ subject }.to have_said "Successfully created pull request ##{existing_gh_pull_request.number}: #{existing_gh_pull_request.title}\nPull Request URL: #{existing_gh_pull_request.html_url}\n", :success
|
389
|
+
end
|
390
|
+
|
391
|
+
it "reports failures even after retrying" do
|
392
|
+
allow(workflow.git_server).to receive(:create_pull_request).and_raise github_error
|
393
|
+
expect { subject }.to have_said "Github Error: #{github_error.to_s}", :error
|
394
|
+
end
|
395
|
+
end
|
312
396
|
end
|
313
397
|
|
314
398
|
context "aborting during PR template review" do
|
@@ -319,7 +403,7 @@ describe GitReflow::Workflows::Core do
|
|
319
403
|
end
|
320
404
|
|
321
405
|
it "does not create a pull request" do
|
322
|
-
expect(
|
406
|
+
expect(workflow.git_server).to_not receive(:create_pull_request)
|
323
407
|
subject
|
324
408
|
end
|
325
409
|
|
@@ -333,17 +417,17 @@ describe GitReflow::Workflows::Core do
|
|
333
417
|
let(:feature_branch) { 'new-feature' }
|
334
418
|
let(:destination_branch) { nil }
|
335
419
|
|
336
|
-
subject {
|
420
|
+
subject { workflow.status destination_branch: destination_branch }
|
337
421
|
|
338
422
|
before do
|
339
423
|
allow(GitReflow).to receive(:git_server).and_return(GitReflow::GitServer)
|
340
|
-
allow(
|
424
|
+
allow(workflow.git_server).to receive(:get_build_status).and_return(Struct.new(:state, :description, :url, :target_url).new)
|
341
425
|
allow(GitReflow).to receive(:current_branch).and_return(feature_branch)
|
342
426
|
allow(existing_gh_pull_request).to receive(:display_pull_request_summary)
|
343
427
|
end
|
344
428
|
|
345
429
|
context "with no existing pull request" do
|
346
|
-
before { allow(
|
430
|
+
before { allow(workflow.git_server).to receive(:find_open_pull_request).with({from: feature_branch, to: 'master'}).and_return(nil) }
|
347
431
|
it { expect{ subject }.to have_said "No pull request exists for #{feature_branch} -> master", :notice }
|
348
432
|
it { expect{ subject }.to have_said "Run 'git reflow review master' to start the review process", :notice }
|
349
433
|
end
|
@@ -351,7 +435,7 @@ describe GitReflow::Workflows::Core do
|
|
351
435
|
context "with an existing pull request" do
|
352
436
|
let(:destination_branch) { 'master' }
|
353
437
|
before do
|
354
|
-
allow(
|
438
|
+
allow(workflow.git_server).to receive(:find_open_pull_request).and_return(existing_gh_pull_request)
|
355
439
|
end
|
356
440
|
|
357
441
|
it "displays a summary of the pull request" do
|
@@ -363,7 +447,19 @@ describe GitReflow::Workflows::Core do
|
|
363
447
|
let(:destination_branch) { 'develop' }
|
364
448
|
|
365
449
|
it "uses the custom destination branch to lookup the pull request" do
|
366
|
-
expect(
|
450
|
+
expect(workflow.git_server).to receive(:find_open_pull_request).with({from: feature_branch, to: destination_branch}).and_return(existing_gh_pull_request)
|
451
|
+
subject
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
context "when custom base-branch is configured" do
|
456
|
+
before do
|
457
|
+
allow(GitReflow::Config).to receive(:get).and_call_original
|
458
|
+
allow(GitReflow::Config).to receive(:get).with('reflow.base-branch').and_return('racecar')
|
459
|
+
end
|
460
|
+
subject { workflow.status }
|
461
|
+
it "uses the custom configured base-branch to lookup the pull request" do
|
462
|
+
expect(GitReflow.git_server).to receive(:find_open_pull_request).with({from: feature_branch, to: 'racecar'}).and_return(existing_gh_pull_request)
|
367
463
|
subject
|
368
464
|
end
|
369
465
|
end
|
@@ -373,7 +469,7 @@ describe GitReflow::Workflows::Core do
|
|
373
469
|
describe ".deploy" do
|
374
470
|
let(:deploy_command) { "bundle exec cap #{destination} deploy" }
|
375
471
|
let(:destination) { nil }
|
376
|
-
subject {
|
472
|
+
subject { workflow.deploy(destination_server: destination) }
|
377
473
|
|
378
474
|
before do
|
379
475
|
stub_command_line_inputs({
|
@@ -408,16 +504,16 @@ describe GitReflow::Workflows::Core do
|
|
408
504
|
describe ".stage" do
|
409
505
|
let(:feature_branch) { 'new-feature' }
|
410
506
|
|
411
|
-
subject {
|
507
|
+
subject { workflow.stage }
|
412
508
|
|
413
509
|
before do
|
414
|
-
allow(
|
415
|
-
allow(
|
510
|
+
allow(workflow).to receive(:current_branch).and_return(feature_branch)
|
511
|
+
allow(workflow.git_config).to receive(:get).and_call_original
|
416
512
|
allow(GitReflow::Workflows::Core).to receive(:deploy)
|
417
513
|
end
|
418
514
|
|
419
515
|
it "checks out and updates the staging branch" do
|
420
|
-
expect(
|
516
|
+
expect(workflow.git_config).to receive(:get).with('reflow.staging-branch', local: true).and_return('staging')
|
421
517
|
expect { subject }.to have_run_commands_in_order([
|
422
518
|
"git checkout staging",
|
423
519
|
"git pull origin staging",
|
@@ -428,9 +524,9 @@ describe GitReflow::Workflows::Core do
|
|
428
524
|
|
429
525
|
context "merge is not successful" do
|
430
526
|
before do
|
431
|
-
allow(
|
432
|
-
allow(
|
433
|
-
expect(
|
527
|
+
allow(workflow.git_config).to receive(:get).with('reflow.staging-branch', local: true).and_return('staging')
|
528
|
+
allow(workflow).to receive(:run_command_with_label).and_call_original
|
529
|
+
expect(workflow).to receive(:run_command_with_label).with("git merge #{feature_branch}", with_system: true).and_return(false)
|
434
530
|
end
|
435
531
|
|
436
532
|
it "notifies the user of unsuccessful merge" do
|
@@ -449,9 +545,9 @@ describe GitReflow::Workflows::Core do
|
|
449
545
|
|
450
546
|
context "merge is successful" do
|
451
547
|
before do
|
452
|
-
allow(
|
453
|
-
allow(
|
454
|
-
expect(
|
548
|
+
allow(workflow.git_config).to receive(:get).with('reflow.staging-branch', local: true).and_return('staging')
|
549
|
+
allow(workflow).to receive(:run_command_with_label).and_call_original
|
550
|
+
expect(workflow).to receive(:run_command_with_label).with("git merge #{feature_branch}", with_system: true).and_return(true).and_call_original
|
455
551
|
end
|
456
552
|
|
457
553
|
specify { expect{ subject }.to have_run_command "git push origin staging" }
|
@@ -469,19 +565,19 @@ describe GitReflow::Workflows::Core do
|
|
469
565
|
|
470
566
|
context "no staging branch has been setup" do
|
471
567
|
before do
|
472
|
-
allow(
|
568
|
+
allow(workflow.git_config).to receive(:get).with('reflow.staging-branch', local: true).and_return('')
|
473
569
|
stub_command_line_inputs({
|
474
570
|
"What's the name of your staging branch? (default: 'staging') " => "bobby"
|
475
571
|
})
|
476
572
|
end
|
477
573
|
|
478
574
|
it "sets the reflow.staging-branch git config to 'staging'" do
|
479
|
-
expect(
|
575
|
+
expect(workflow.git_config).to receive(:set).with("reflow.staging-branch", "bobby", local: true)
|
480
576
|
subject
|
481
577
|
end
|
482
578
|
|
483
579
|
it "checks out and updates the staging branch" do
|
484
|
-
allow(
|
580
|
+
allow(workflow.git_config).to receive(:set).with("reflow.staging-branch", "bobby", local: true)
|
485
581
|
expect { subject }.to have_run_commands_in_order([
|
486
582
|
"git checkout bobby",
|
487
583
|
"git pull origin bobby",
|
@@ -518,23 +614,25 @@ describe GitReflow::Workflows::Core do
|
|
518
614
|
let(:user) { 'reenhanced' }
|
519
615
|
let(:repo) { 'repo' }
|
520
616
|
|
521
|
-
subject {
|
617
|
+
subject { workflow.deliver }
|
522
618
|
|
523
619
|
before do
|
524
620
|
allow(GitReflow).to receive(:git_server).and_return(GitReflow::GitServer)
|
525
621
|
allow(GitReflow).to receive(:remote_user).and_return(user)
|
622
|
+
allow(workflow).to receive(:remote_user).and_return(user)
|
526
623
|
allow(GitReflow).to receive(:current_branch).and_return(feature_branch)
|
527
|
-
allow(
|
624
|
+
allow(workflow).to receive(:current_branch).and_return(feature_branch)
|
625
|
+
allow(workflow.git_server).to receive(:get_build_status).and_return(Struct.new(:state, :description, :url, :target_url).new)
|
528
626
|
end
|
529
627
|
|
530
628
|
context "pull request does not exist" do
|
531
|
-
before { allow(
|
629
|
+
before { allow(workflow.git_server).to receive(:find_open_pull_request).with( from: feature_branch, to: 'master').and_return(nil) }
|
532
630
|
specify { expect{ subject }.to have_said "No pull request exists for #{user}:#{feature_branch}\nPlease submit your branch for review first with \`git reflow review\`", :deliver_halted }
|
533
631
|
end
|
534
632
|
|
535
633
|
context "pull request exists" do
|
536
634
|
before do
|
537
|
-
allow(
|
635
|
+
allow(workflow.git_server).to receive(:find_open_pull_request).with( from: feature_branch, to: 'master').and_return(existing_gh_pull_request)
|
538
636
|
allow(GitReflow::Workflows::Core).to receive(:status)
|
539
637
|
end
|
540
638
|
|
@@ -585,11 +683,16 @@ describe GitReflow::Workflows::Core do
|
|
585
683
|
end
|
586
684
|
|
587
685
|
context "but forcing the deliver" do
|
588
|
-
subject {
|
686
|
+
subject { workflow.deliver force: true }
|
589
687
|
|
590
688
|
before do
|
591
689
|
allow(existing_gh_pull_request).to receive(:good_to_merge?).with(force: true).and_return(true)
|
592
|
-
allow(existing_gh_pull_request).to receive(:merge!).with(
|
690
|
+
allow(existing_gh_pull_request).to receive(:merge!).with(
|
691
|
+
force: true,
|
692
|
+
merge_method: "squash",
|
693
|
+
base: 'master',
|
694
|
+
skip_lgtm: false
|
695
|
+
)
|
593
696
|
end
|
594
697
|
|
595
698
|
it "displays the status of the PR" do
|
@@ -598,28 +701,74 @@ describe GitReflow::Workflows::Core do
|
|
598
701
|
end
|
599
702
|
|
600
703
|
it "merges the feature branch anyway" do
|
601
|
-
expect(existing_gh_pull_request).to receive(:merge!).with(
|
704
|
+
expect(existing_gh_pull_request).to receive(:merge!).with(
|
705
|
+
force: true,
|
706
|
+
merge_method: "squash",
|
707
|
+
base: 'master',
|
708
|
+
skip_lgtm: false
|
709
|
+
)
|
602
710
|
subject
|
603
711
|
end
|
604
712
|
end
|
605
713
|
end
|
606
714
|
|
607
715
|
context "and using a custom base branch" do
|
608
|
-
subject {
|
716
|
+
subject { workflow.deliver base: 'development' }
|
609
717
|
before do
|
610
|
-
expect(
|
718
|
+
expect(workflow.git_server).to receive(:find_open_pull_request).with( from: feature_branch, to: 'development').and_return(existing_gh_pull_request)
|
611
719
|
allow(existing_gh_pull_request).to receive(:good_to_merge?).and_return(true)
|
612
720
|
end
|
613
721
|
|
614
722
|
|
615
723
|
it "displays the status of the PR" do
|
616
|
-
allow(existing_gh_pull_request).to receive(:merge!).with(
|
724
|
+
allow(existing_gh_pull_request).to receive(:merge!).with(
|
725
|
+
base: 'development',
|
726
|
+
merge_method: "squash",
|
727
|
+
force: false,
|
728
|
+
skip_lgtm: false
|
729
|
+
)
|
617
730
|
expect(GitReflow::Workflows::Core).to receive(:status).with(destination_branch: 'development')
|
618
731
|
subject
|
619
732
|
end
|
620
733
|
|
621
734
|
it "merges the feature branch" do
|
622
|
-
expect(existing_gh_pull_request).to receive(:merge!).with(
|
735
|
+
expect(existing_gh_pull_request).to receive(:merge!).with(
|
736
|
+
base: "development",
|
737
|
+
merge_method: "squash",
|
738
|
+
force: false,
|
739
|
+
skip_lgtm: false
|
740
|
+
)
|
741
|
+
subject
|
742
|
+
end
|
743
|
+
end
|
744
|
+
|
745
|
+
context "when a custom base-branch is configured" do
|
746
|
+
subject { workflow.deliver }
|
747
|
+
before do
|
748
|
+
expect(GitReflow.git_server).to receive(:find_open_pull_request).with( from: feature_branch, to: 'racecar').and_return(existing_gh_pull_request)
|
749
|
+
allow(existing_gh_pull_request).to receive(:good_to_merge?).and_return(true)
|
750
|
+
allow(GitReflow::Config).to receive(:get).with('reflow.base-branch').and_return('racecar')
|
751
|
+
end
|
752
|
+
|
753
|
+
|
754
|
+
it "displays the status of the PR" do
|
755
|
+
allow(existing_gh_pull_request).to receive(:merge!).with(
|
756
|
+
base: 'racecar',
|
757
|
+
merge_method: "squash",
|
758
|
+
force: false,
|
759
|
+
skip_lgtm: false
|
760
|
+
)
|
761
|
+
expect(GitReflow::Workflows::Core).to receive(:status).with(destination_branch: 'racecar')
|
762
|
+
subject
|
763
|
+
end
|
764
|
+
|
765
|
+
it "merges the feature branch" do
|
766
|
+
expect(existing_gh_pull_request).to receive(:merge!).with(
|
767
|
+
base: "racecar",
|
768
|
+
merge_method: "squash",
|
769
|
+
force: false,
|
770
|
+
skip_lgtm: false
|
771
|
+
)
|
623
772
|
subject
|
624
773
|
end
|
625
774
|
end
|
@@ -627,36 +776,46 @@ describe GitReflow::Workflows::Core do
|
|
627
776
|
end
|
628
777
|
|
629
778
|
describe ".refresh" do
|
630
|
-
subject {
|
779
|
+
subject { workflow.refresh }
|
631
780
|
|
632
781
|
it "updates the feature branch with default remote repo and base branch" do
|
633
|
-
expect(
|
782
|
+
expect(workflow).to receive(:update_feature_branch).with(remote: 'origin', base: 'master')
|
634
783
|
subject
|
635
784
|
end
|
636
785
|
|
637
786
|
context "providing a custom base branch" do
|
638
|
-
subject {
|
787
|
+
subject { workflow.refresh base: 'development' }
|
639
788
|
|
640
789
|
it "updates the feature branch with default remote repo and base branch" do
|
641
|
-
expect(
|
790
|
+
expect(workflow).to receive(:update_feature_branch).with(remote: 'origin', base: 'development')
|
791
|
+
subject
|
792
|
+
end
|
793
|
+
end
|
794
|
+
|
795
|
+
context "when a custom base branch is configured" do
|
796
|
+
before { allow(workflow.git_config).to receive(:get).with('reflow.base-branch').and_return('racecar') }
|
797
|
+
subject { workflow.refresh }
|
798
|
+
|
799
|
+
it "updates the feature branch with custom base branch" do
|
800
|
+
expect(workflow).to receive(:update_feature_branch).with(remote: 'origin', base: 'racecar')
|
642
801
|
subject
|
643
802
|
end
|
644
803
|
end
|
645
804
|
|
646
805
|
context "provding a custom remote repo" do
|
647
|
-
subject {
|
806
|
+
subject { workflow.refresh remote: 'upstream' }
|
648
807
|
|
649
808
|
it "updates the feature branch with default remote repo and base branch" do
|
650
|
-
expect(
|
809
|
+
expect(workflow).to receive(:update_feature_branch).with(remote: 'upstream', base: 'master')
|
651
810
|
subject
|
652
811
|
end
|
653
812
|
end
|
654
813
|
|
655
814
|
context "providing a custom base branch and remote repo" do
|
656
|
-
subject {
|
815
|
+
subject { workflow.refresh remote: 'upstream', base: 'development' }
|
657
816
|
|
658
817
|
it "updates the feature branch with default remote repo and base branch" do
|
659
|
-
expect(
|
818
|
+
expect(workflow).to receive(:update_feature_branch).with(remote: 'upstream', base: 'development')
|
660
819
|
subject
|
661
820
|
end
|
662
821
|
end
|