git_reflow 0.4.2 → 0.5.0
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/.gitignore +1 -0
- data/Appraisals +12 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +41 -25
- data/README.rdoc +15 -5
- data/Rakefile +3 -2
- data/circle.yml +16 -0
- data/git_reflow.gemspec +3 -0
- data/lib/git_reflow.rb +35 -32
- data/lib/git_reflow/commands/setup.rb +1 -1
- data/lib/git_reflow/config.rb +25 -4
- data/lib/git_reflow/git_server/base.rb +43 -24
- data/lib/git_reflow/git_server/bit_bucket.rb +166 -0
- data/lib/git_reflow/git_server/git_hub.rb +89 -72
- data/lib/git_reflow/sandbox.rb +15 -0
- data/lib/git_reflow/version.rb +1 -1
- data/spec/fixtures/repositories/commit.json +53 -0
- data/spec/git_reflow_spec.rb +25 -28
- data/spec/lib/git_reflow/config_spec.rb +35 -0
- data/spec/lib/git_server/bit_bucket_spec.rb +110 -0
- data/spec/lib/git_server/git_hub_spec.rb +22 -29
- data/spec/support/command_line_helpers.rb +17 -1
- data/spec/support/github_helpers.rb +8 -7
- metadata +52 -3
data/lib/git_reflow/sandbox.rb
CHANGED
@@ -2,6 +2,13 @@ module GitReflow
|
|
2
2
|
module Sandbox
|
3
3
|
extend self
|
4
4
|
|
5
|
+
COLOR_FOR_LABEL = {
|
6
|
+
notice: :yellow,
|
7
|
+
error: :red,
|
8
|
+
deliver_halted: :red,
|
9
|
+
success: :green
|
10
|
+
}
|
11
|
+
|
5
12
|
def run(command, options = {})
|
6
13
|
options = { loud: true }.merge(options)
|
7
14
|
|
@@ -20,6 +27,14 @@ module GitReflow
|
|
20
27
|
run(command, options)
|
21
28
|
end
|
22
29
|
|
30
|
+
def say(message, label_type = :plain)
|
31
|
+
if COLOR_FOR_LABEL[label_type]
|
32
|
+
puts "[#{ label_type.to_s.gsub('_', ' ').colorize(COLOR_FOR_LABEL[label_type]) }] #{message}"
|
33
|
+
else
|
34
|
+
puts message
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
23
38
|
# WARNING: this currently only supports OS X and UBUNTU
|
24
39
|
def ask_to_open_in_browser(url)
|
25
40
|
if RUBY_PLATFORM =~ /darwin|linux/i
|
data/lib/git_reflow/version.rb
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
{
|
2
|
+
"sha": "6dcb09b5b57875f334f61aebed695e2e4193db5e",
|
3
|
+
"commit": {
|
4
|
+
"url": "https://api.github.com/repos/reenhanced/repo/git/commits/6dcb09b5b57875f334f61aebed695e2e4193db5e",
|
5
|
+
"sha": "6dcb09b5b57875f334f61aebed695e2e4193db5e",
|
6
|
+
"author": {
|
7
|
+
"name": "Monalisa Octocat",
|
8
|
+
"email": "support@github.com",
|
9
|
+
"date": "2011-04-14T16:00:49Z"
|
10
|
+
},
|
11
|
+
"committer": {
|
12
|
+
"name": "Monalisa Octocat",
|
13
|
+
"email": "support@github.com",
|
14
|
+
"date": "2011-04-14T16:00:49Z"
|
15
|
+
},
|
16
|
+
"message": "Fix all the bugs",
|
17
|
+
"tree": {
|
18
|
+
"url": "https://api.github.com/repos/reenhanced/repo/tree/6dcb09b5b57875f334f61aebed695e2e4193db5e",
|
19
|
+
"sha": "6dcb09b5b57875f334f61aebed695e2e4193db5e"
|
20
|
+
}
|
21
|
+
},
|
22
|
+
"author": {
|
23
|
+
"login": "reenhanced",
|
24
|
+
"id": 1,
|
25
|
+
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
|
26
|
+
"url": "https://api.github.com/users/reenhanced"
|
27
|
+
},
|
28
|
+
"committer": {
|
29
|
+
"login": "reenhanced",
|
30
|
+
"id": 1,
|
31
|
+
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
|
32
|
+
"url": "https://api.github.com/users/reenhanced"
|
33
|
+
},
|
34
|
+
"parents": [
|
35
|
+
{
|
36
|
+
"url": "https://api.github.com/repos/reenhanced/repo/commits/6dcb09b5b57875f334f61aebed695e2e4193db5e",
|
37
|
+
"sha": "6dcb09b5b57875f334f61aebed695e2e4193db5e"
|
38
|
+
}
|
39
|
+
],
|
40
|
+
"stats": {
|
41
|
+
"additions": 104,
|
42
|
+
"deletions": 4,
|
43
|
+
"total": 108
|
44
|
+
},
|
45
|
+
"files": [
|
46
|
+
{
|
47
|
+
"filename": "file1.txt",
|
48
|
+
"additions": 10,
|
49
|
+
"deletions": 2,
|
50
|
+
"total": 12
|
51
|
+
}
|
52
|
+
]
|
53
|
+
}
|
data/spec/git_reflow_spec.rb
CHANGED
@@ -15,7 +15,7 @@ describe GitReflow do
|
|
15
15
|
|
16
16
|
let(:github_authorizations) { Github::Client::Authorizations.new }
|
17
17
|
let(:existing_pull_requests) { JSON.parse(fixture('pull_requests/pull_requests.json').read).collect { |pull| Hashie::Mash.new(pull)} }
|
18
|
-
let(:existing_pull_request) { existing_pull_requests.first }
|
18
|
+
let(:existing_pull_request) { GitReflow::GitServer::GitHub::PullRequest.new existing_pull_requests.first }
|
19
19
|
|
20
20
|
before do
|
21
21
|
HighLine.any_instance.stub(:ask) do |terminal, question|
|
@@ -45,13 +45,13 @@ describe GitReflow do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
context 'with no existing pull request' do
|
48
|
-
before { git_server.stub(:
|
48
|
+
before { git_server.stub(:find_open_pull_request).with({from: feature_branch, to: base_branch}).and_return(nil) }
|
49
49
|
it { expect{ subject }.to have_output "\n[notice] No pull request exists for #{feature_branch} -> #{base_branch}" }
|
50
50
|
it { expect{ subject }.to have_output "[notice] Run 'git reflow review #{base_branch}' to start the review process" }
|
51
51
|
end
|
52
52
|
|
53
53
|
context 'with an existing pull request' do
|
54
|
-
before { git_server.stub(:
|
54
|
+
before { git_server.stub(:find_open_pull_request).with({from: feature_branch, to: base_branch}).and_return(existing_pull_request) }
|
55
55
|
|
56
56
|
it 'displays a summary of the pull request and asks to open it in the browser' do
|
57
57
|
GitReflow.should_receive(:display_pull_request_summary).with(existing_pull_request)
|
@@ -82,7 +82,7 @@ describe GitReflow do
|
|
82
82
|
:password => password,
|
83
83
|
:repo => repo,
|
84
84
|
:branch => branch,
|
85
|
-
:pull => inputs
|
85
|
+
:pull => Hashie::Mash.new(inputs)
|
86
86
|
})
|
87
87
|
end
|
88
88
|
|
@@ -90,20 +90,20 @@ describe GitReflow do
|
|
90
90
|
|
91
91
|
it "fetches the latest changes to the destination branch" do
|
92
92
|
GitReflow.should_receive(:fetch_destination).with(inputs['base'])
|
93
|
-
github.should_receive(:
|
93
|
+
github.should_receive(:find_open_pull_request).and_return(nil)
|
94
94
|
github.stub(:create_pull_request).and_return(existing_pull_request)
|
95
95
|
subject
|
96
96
|
end
|
97
97
|
|
98
98
|
it "pushes the latest current branch to the origin repo" do
|
99
99
|
GitReflow.should_receive(:push_current_branch)
|
100
|
-
github.should_receive(:
|
100
|
+
github.should_receive(:find_open_pull_request).and_return(nil)
|
101
101
|
github.stub(:create_pull_request).and_return(existing_pull_request)
|
102
102
|
subject
|
103
103
|
end
|
104
104
|
|
105
105
|
context "pull request doesn't exist" do
|
106
|
-
before { github.stub(:
|
106
|
+
before { github.stub(:find_open_pull_request).and_return(nil) }
|
107
107
|
|
108
108
|
it "successfully creates a pull request if I do not provide one" do
|
109
109
|
existing_pull_request.stub(:title).and_return(inputs['title'])
|
@@ -117,13 +117,13 @@ describe GitReflow do
|
|
117
117
|
GitReflow.stub(:push_current_branch)
|
118
118
|
github_error = Github::Error::UnprocessableEntity.new( eval(fixture('pull_requests/pull_request_exists_error.json').read) )
|
119
119
|
github.stub(:create_pull_request).with(inputs.except('state')).and_raise(github_error)
|
120
|
-
GitReflow.stub(:display_pull_request_summary)
|
120
|
+
GitReflow.stub(:display_pull_request_summary)
|
121
121
|
end
|
122
122
|
|
123
123
|
subject { GitReflow.review inputs }
|
124
124
|
|
125
125
|
it "displays a pull request summary for the existing pull request" do
|
126
|
-
GitReflow.should_receive(:display_pull_request_summary)
|
126
|
+
GitReflow.should_receive(:display_pull_request_summary)
|
127
127
|
subject
|
128
128
|
end
|
129
129
|
|
@@ -164,7 +164,7 @@ describe GitReflow do
|
|
164
164
|
end
|
165
165
|
|
166
166
|
it "looks for a pull request matching the feature branch and destination branch" do
|
167
|
-
github.should_receive(:
|
167
|
+
github.should_receive(:find_open_pull_request).with(from: branch, to: 'master')
|
168
168
|
subject
|
169
169
|
end
|
170
170
|
|
@@ -172,7 +172,6 @@ describe GitReflow do
|
|
172
172
|
before do
|
173
173
|
github.stub(:get_build_status).and_return(build_status)
|
174
174
|
github.stub(:has_pull_request_comments?).and_return(true)
|
175
|
-
github.stub(:find_authors_of_open_pull_request_comments).and_return([])
|
176
175
|
github.stub(:comment_authors_for_pull_request).and_return(['codenamev'])
|
177
176
|
end
|
178
177
|
|
@@ -181,12 +180,11 @@ describe GitReflow do
|
|
181
180
|
|
182
181
|
before do
|
183
182
|
# just stubbing these in a locked state as the test is specific to this scenario
|
184
|
-
GitReflow.stub(:find_authors_of_open_pull_request_comments).and_return([])
|
185
183
|
GitReflow.stub(:has_pull_request_comments?).and_return(true)
|
186
184
|
end
|
187
185
|
|
188
186
|
it "halts delivery and notifies user of a failed build" do
|
189
|
-
expect { subject }.to
|
187
|
+
expect { subject }.to have_said "#{build_status.description}: #{build_status.target_url}", :deliver_halted
|
190
188
|
end
|
191
189
|
end
|
192
190
|
|
@@ -196,7 +194,6 @@ describe GitReflow do
|
|
196
194
|
|
197
195
|
before do
|
198
196
|
# stubbing unrelated results so we can just test that it made it insdide the conditional block
|
199
|
-
GitReflow.stub(:find_authors_of_open_pull_request_comments).and_return([])
|
200
197
|
GitReflow.stub(:has_pull_request_comments?).and_return(true)
|
201
198
|
GitReflow.stub(:comment_authors_for_pull_request).and_return([])
|
202
199
|
GitReflow.stub(:update_destination).and_return(true)
|
@@ -205,7 +202,7 @@ describe GitReflow do
|
|
205
202
|
end
|
206
203
|
|
207
204
|
it "ignores build status when not setup" do
|
208
|
-
expect { subject }.to
|
205
|
+
expect { subject }.to have_said "Merge complete!", :success
|
209
206
|
end
|
210
207
|
end
|
211
208
|
|
@@ -215,12 +212,14 @@ describe GitReflow do
|
|
215
212
|
context 'and has comments' do
|
216
213
|
before do
|
217
214
|
GitReflow.stub(:has_pull_request_comments?).and_return(true)
|
218
|
-
GitReflow.stub(:find_authors_of_open_pull_request_comments).and_return([])
|
219
215
|
end
|
220
216
|
|
221
217
|
context 'but there is a LGTM' do
|
222
218
|
let(:lgtm_comment_authors) { ['nhance'] }
|
223
|
-
before
|
219
|
+
before do
|
220
|
+
github.stub(:approvals).and_return(lgtm_comment_authors)
|
221
|
+
github.stub(:reviewers_pending_response).and_return([])
|
222
|
+
end
|
224
223
|
|
225
224
|
it "includes the pull request body in the commit message" do
|
226
225
|
squash_message = "#{existing_pull_request.body}\nCloses ##{existing_pull_request.number}\n\nLGTM given by: @nhance\n"
|
@@ -232,8 +231,8 @@ describe GitReflow do
|
|
232
231
|
let(:first_commit_message) { "We'll do it live." }
|
233
232
|
|
234
233
|
before do
|
235
|
-
existing_pull_request
|
236
|
-
github.stub(:
|
234
|
+
existing_pull_request.description = ''
|
235
|
+
github.stub(:find_open_pull_request).and_return(existing_pull_request)
|
237
236
|
GitReflow.stub(:get_first_commit_message).and_return(first_commit_message)
|
238
237
|
github.stub(:comment_authors_for_pull_request).and_return(lgtm_comment_authors)
|
239
238
|
end
|
@@ -262,8 +261,7 @@ describe GitReflow do
|
|
262
261
|
end
|
263
262
|
|
264
263
|
it "commits the changes for the squash merge" do
|
265
|
-
subject
|
266
|
-
$output.should include 'Merge complete!'
|
264
|
+
expect{ subject }.to have_said 'Merge complete!', :success
|
267
265
|
end
|
268
266
|
|
269
267
|
context "and cleaning up feature branch" do
|
@@ -333,7 +331,7 @@ describe GitReflow do
|
|
333
331
|
context "and there were issues commiting the squash merge to the base branch" do
|
334
332
|
before { stub_with_fallback(GitReflow, :run_command_with_label).with('git commit', {with_system: true}).and_return false }
|
335
333
|
it "notifies user of issues commiting the squash merge of the feature branch" do
|
336
|
-
expect { subject }.to
|
334
|
+
expect { subject }.to have_said("There were problems commiting your feature... please check the errors above and try again.", :error)
|
337
335
|
end
|
338
336
|
end
|
339
337
|
|
@@ -341,9 +339,9 @@ describe GitReflow do
|
|
341
339
|
|
342
340
|
context 'but there are still unaddressed comments' do
|
343
341
|
let(:open_comment_authors) { ['nhance', 'codenamev'] }
|
344
|
-
before { github.stub(:
|
342
|
+
before { github.stub(:reviewers_pending_response).and_return(open_comment_authors) }
|
345
343
|
it "notifies the user to get their code reviewed" do
|
346
|
-
expect { subject }.to
|
344
|
+
expect { subject }.to have_said "You still need a LGTM from: #{open_comment_authors.join(', ')}", :deliver_halted
|
347
345
|
end
|
348
346
|
end
|
349
347
|
end
|
@@ -351,11 +349,10 @@ describe GitReflow do
|
|
351
349
|
context 'but has no comments' do
|
352
350
|
before do
|
353
351
|
github.stub(:has_pull_request_comments?).and_return(false)
|
354
|
-
github.stub(:find_authors_of_open_pull_request_comments).and_return([])
|
355
352
|
end
|
356
353
|
|
357
354
|
it "notifies the user to get their code reviewed" do
|
358
|
-
expect { subject }.to
|
355
|
+
expect { subject }.to have_said "Your code has not been reviewed yet.", :deliver_halted
|
359
356
|
end
|
360
357
|
end
|
361
358
|
|
@@ -376,10 +373,10 @@ describe GitReflow do
|
|
376
373
|
end
|
377
374
|
|
378
375
|
context "and no pull request exists for the feature branch to the destination branch" do
|
379
|
-
before { github.stub(:
|
376
|
+
before { github.stub(:find_open_pull_request).and_return(nil) }
|
380
377
|
|
381
378
|
it "notifies the user of a missing pull request" do
|
382
|
-
expect { subject }.to
|
379
|
+
expect { subject }.to have_said "No pull request exists for #{user}:#{branch}\nPlease submit your branch for review first with \`git reflow review\`", :deliver_halted
|
383
380
|
end
|
384
381
|
end
|
385
382
|
end
|
@@ -4,6 +4,11 @@ describe GitReflow::Config do
|
|
4
4
|
describe ".get(key)" do
|
5
5
|
subject { GitReflow::Config.get('chucknorris.roundhouse') }
|
6
6
|
it { expect{ subject }.to have_run_command_silently 'git config --get chucknorris.roundhouse' }
|
7
|
+
|
8
|
+
context "and getting all values" do
|
9
|
+
subject { GitReflow::Config.get('chucknorris.roundhouse', all: true) }
|
10
|
+
it { expect{ subject }.to have_run_command_silently 'git config --get-all chucknorris.roundhouse' }
|
11
|
+
end
|
7
12
|
end
|
8
13
|
|
9
14
|
describe ".set(key)" do
|
@@ -15,4 +20,34 @@ describe GitReflow::Config do
|
|
15
20
|
it { expect{ subject }.to have_run_command_silently 'git config --replace-all chucknorris.roundhouse "to the face"' }
|
16
21
|
end
|
17
22
|
end
|
23
|
+
|
24
|
+
describe ".unset(key)" do
|
25
|
+
subject { GitReflow::Config.unset('chucknorris.roundhouse') }
|
26
|
+
it { expect{ subject }.to have_run_command_silently 'git config --global --unset chucknorris.roundhouse ' }
|
27
|
+
|
28
|
+
context "for multi-value keys" do
|
29
|
+
subject { GitReflow::Config.unset('chucknorris.roundhouse', value: 'to the face') }
|
30
|
+
it { expect{ subject }.to have_run_command_silently 'git config --global --unset chucknorris.roundhouse "to the face"' }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "for current project only" do
|
34
|
+
subject { GitReflow::Config.unset('chucknorris.roundhouse', local: true) }
|
35
|
+
it { expect{ subject }.to have_run_command_silently 'git config --unset chucknorris.roundhouse ' }
|
36
|
+
|
37
|
+
context "for multi-value keys" do
|
38
|
+
subject { GitReflow::Config.unset('chucknorris.roundhouse', value: 'to the face', local: true) }
|
39
|
+
it { expect{ subject }.to have_run_command_silently 'git config --unset chucknorris.roundhouse "to the face"' }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe ".add(key)" do
|
45
|
+
subject { GitReflow::Config.add('chucknorris.roundhouse', 'to the face') }
|
46
|
+
it { expect{ subject }.to have_run_command_silently 'git config --global --add chucknorris.roundhouse "to the face"' }
|
47
|
+
|
48
|
+
context "for current project only" do
|
49
|
+
subject { GitReflow::Config.add('chucknorris.roundhouse', 'to the face', local: true) }
|
50
|
+
it { expect{ subject }.to have_run_command_silently 'git config --add chucknorris.roundhouse "to the face"' }
|
51
|
+
end
|
52
|
+
end
|
18
53
|
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitReflow::GitServer::BitBucket do
|
4
|
+
let(:user) { 'reenhanced' }
|
5
|
+
let(:password) { 'shazam' }
|
6
|
+
let(:repo) { 'repo' }
|
7
|
+
let(:api_key) { 'a1b2c3d4e5f6g7h8i9j0' }
|
8
|
+
let(:hostname) { 'hostname.local' }
|
9
|
+
let(:api_endpoint) { 'https://bitbucket.org/api/1.0' }
|
10
|
+
let(:site) { 'https://bitbucket.org' }
|
11
|
+
let(:remote_url) { "git@bitbucket.org:#{user}/#{repo}.git" }
|
12
|
+
|
13
|
+
before do
|
14
|
+
HighLine.any_instance.stub(:ask) do |terminal, question|
|
15
|
+
values = {
|
16
|
+
"Please enter your BitBucket username: " => user
|
17
|
+
}
|
18
|
+
return_value = values[question]
|
19
|
+
question = ""
|
20
|
+
return_value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#initialize(options)' do
|
25
|
+
subject { GitReflow::GitServer::BitBucket.new({}) }
|
26
|
+
|
27
|
+
it 'sets the reflow git server provider to BitBucket in the git config' do
|
28
|
+
GitReflow::Config.should_receive(:set).once.with('reflow.git-server', 'BitBucket')
|
29
|
+
subject
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'storing git config settings only for this project' do
|
33
|
+
subject { GitReflow::GitServer::BitBucket.new(project_only: true) }
|
34
|
+
|
35
|
+
it 'sets the enterprise site and api as the site and api endpoints for the BitBucket provider in the git config' do
|
36
|
+
GitReflow::Config.should_receive(:set).once.with('reflow.git-server', 'BitBucket', local: true)
|
37
|
+
subject
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#authenticate' do
|
44
|
+
let(:bitbucket) { GitReflow::GitServer::BitBucket.new( { }) }
|
45
|
+
let!(:bitbucket_api) { BitBucket.new }
|
46
|
+
subject { bitbucket.authenticate }
|
47
|
+
|
48
|
+
context 'already authenticated' do
|
49
|
+
it "notifies the user of successful setup" do
|
50
|
+
GitReflow::Config.should_receive(:set).with('reflow.git-server', 'BitBucket')
|
51
|
+
allow(GitReflow::Config).to receive(:get).with('remote.origin.url').and_return(remote_url)
|
52
|
+
allow(GitReflow::Config).to receive(:get).with('bitbucket.user').and_return(user)
|
53
|
+
allow(GitReflow::Config).to receive(:get).with('bitbucket.api-key', reload: true).and_return(api_key)
|
54
|
+
expect { subject }.to have_output "\nYour BitBucket account was already setup with:"
|
55
|
+
expect { subject }.to have_output "\tUser Name: #{user}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'not yet authenticated' do
|
60
|
+
context 'with valid BitBucket credentials' do
|
61
|
+
before do
|
62
|
+
GitReflow::Config.stub(:get).and_return('')
|
63
|
+
GitReflow::Config.stub(:set)
|
64
|
+
GitReflow::Config.stub(:set).with('bitbucket.api-key', reload: true).and_return(api_key)
|
65
|
+
allow(GitReflow::Config).to receive(:get).with('bitbucket.api-key', reload: true).and_return('')
|
66
|
+
allow(GitReflow::Config).to receive(:get).with('remote.origin.url').and_return(remote_url)
|
67
|
+
allow(GitReflow::Config).to receive(:get).with('reflow.local-projects').and_return('')
|
68
|
+
bitbucket.stub(:connection).and_return double(repos: double(all: []))
|
69
|
+
end
|
70
|
+
|
71
|
+
it "prompts me to setup an API key" do
|
72
|
+
expect { subject }.to have_output "\nIn order to connect your BitBucket account,"
|
73
|
+
expect { subject }.to have_output "you'll need to generate an API key for your team"
|
74
|
+
expect { subject }.to have_output "Visit https://bitbucket.org/account/user/reenhanced/api-key/, to generate it\n"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
xdescribe '#create_pull_request(options)' do
|
81
|
+
let(:title) { 'Fresh title' }
|
82
|
+
let(:body) { 'Funky body' }
|
83
|
+
let(:current_branch) { 'new-feature' }
|
84
|
+
|
85
|
+
it 'creates a pull request using the remote user and repo' do
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
xdescribe '#find_pull_request(from, to)' do
|
90
|
+
end
|
91
|
+
|
92
|
+
xdescribe '#pull_request_comments(pull_request)' do
|
93
|
+
end
|
94
|
+
|
95
|
+
xdescribe '#has_pull_request_comments?(pull_request)' do
|
96
|
+
end
|
97
|
+
|
98
|
+
xdescribe '#get_build_status(sha)' do
|
99
|
+
end
|
100
|
+
|
101
|
+
xdescribe '#find_authors_of_open_pull_request_comments(pull_request)' do
|
102
|
+
end
|
103
|
+
|
104
|
+
xdescribe '#comment_authors_for_pull_request(pull_request, options = {})' do
|
105
|
+
end
|
106
|
+
|
107
|
+
xdescribe '#get_commited_time(commit_sha)' do
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
@@ -28,9 +28,8 @@ describe GitReflow::GitServer::GitHub do
|
|
28
28
|
return_value
|
29
29
|
end
|
30
30
|
|
31
|
-
github.stub(:remote_user).and_return(user)
|
32
|
-
github.stub(:remote_repo_name).and_return(repo)
|
33
|
-
github.stub(:run).with('hostname', loud: false).and_return(hostname)
|
31
|
+
github.class.stub(:remote_user).and_return(user)
|
32
|
+
github.class.stub(:remote_repo_name).and_return(repo)
|
34
33
|
end
|
35
34
|
|
36
35
|
describe '#initialize(options)' do
|
@@ -58,6 +57,10 @@ describe GitReflow::GitServer::GitHub do
|
|
58
57
|
context 'storing git config settings only for this project' do
|
59
58
|
subject { GitReflow::GitServer::GitHub.new(project_only: true) }
|
60
59
|
|
60
|
+
before do
|
61
|
+
GitReflow::Config.should_receive(:get).twice.with('reflow.local-projects', all: true).and_return("#{user}/#{repo}")
|
62
|
+
end
|
63
|
+
|
61
64
|
it 'sets the enterprise site and api as the site and api endpoints for the GitHub provider in the git config' do
|
62
65
|
GitReflow::Config.should_receive(:set).once.with('github.site', github_site, local: true).and_call_original
|
63
66
|
GitReflow::Config.should_receive(:set).once.with('github.endpoint', github_api_endpoint, local: true)
|
@@ -107,8 +110,12 @@ describe GitReflow::GitServer::GitHub do
|
|
107
110
|
end
|
108
111
|
|
109
112
|
context "exclusive to project" do
|
110
|
-
let(:github)
|
111
|
-
|
113
|
+
let(:github) do
|
114
|
+
allow(GitReflow::GitServer::GitHub).to receive(:project_only?).and_return(true)
|
115
|
+
allow(GitReflow::GitServer::GitHub).to receive(:remote_user).and_return(user)
|
116
|
+
allow(GitReflow::GitServer::GitHub).to receive(:remote_repo_name).and_return(repo)
|
117
|
+
GitReflow::GitServer::GitHub.new(project_only: true)
|
118
|
+
end
|
112
119
|
|
113
120
|
it "creates _local_ git config keys for github connections" do
|
114
121
|
expect{ subject }.to_not have_run_command_silently "git config --global --replace-all github.site \"#{GitReflow::GitServer::GitHub.site_url}\""
|
@@ -120,6 +127,7 @@ describe GitReflow::GitServer::GitHub do
|
|
120
127
|
expect{ subject }.to have_run_command_silently "git config --replace-all github.endpoint \"#{GitReflow::GitServer::GitHub.api_endpoint}\""
|
121
128
|
expect{ subject }.to have_run_command_silently "git config --replace-all github.oauth-token \"#{oauth_token_hash[:token]}\""
|
122
129
|
expect{ subject }.to have_run_command_silently "git config --replace-all reflow.git-server \"GitHub\""
|
130
|
+
expect{ subject }.to have_run_command_silently "git config --global --add reflow.local-projects \"#{user}/#{repo}\""
|
123
131
|
end
|
124
132
|
end
|
125
133
|
|
@@ -159,7 +167,7 @@ describe GitReflow::GitServer::GitHub do
|
|
159
167
|
let(:body) { 'Funky body' }
|
160
168
|
let(:current_branch) { 'new-feature' }
|
161
169
|
|
162
|
-
before { github.stub(:current_branch).and_return(current_branch) }
|
170
|
+
before { github.class.stub(:current_branch).and_return(current_branch) }
|
163
171
|
|
164
172
|
it 'creates a pull request using the remote user and repo' do
|
165
173
|
github_api.stub(:pull_requests)
|
@@ -168,16 +176,19 @@ describe GitReflow::GitServer::GitHub do
|
|
168
176
|
end
|
169
177
|
end
|
170
178
|
|
171
|
-
describe '#
|
172
|
-
subject { github.
|
179
|
+
describe '#find_open_pull_request(from, to)' do
|
180
|
+
subject { github.find_open_pull_request({ from: 'new-feature', to: 'master'}) }
|
173
181
|
|
174
182
|
it 'looks for an open pull request matching the remote user/repo' do
|
175
|
-
subject.should == existing_pull_requests.first
|
183
|
+
subject.number.should == existing_pull_requests.first.number
|
176
184
|
end
|
177
185
|
|
178
186
|
context 'no pull request exists' do
|
179
|
-
before
|
180
|
-
|
187
|
+
before do
|
188
|
+
github_api.stub(:pull_requests)
|
189
|
+
github_api.pull_requests.should_receive(:all).and_return([])
|
190
|
+
end
|
191
|
+
it { should == nil }
|
181
192
|
end
|
182
193
|
end
|
183
194
|
|
@@ -198,21 +209,6 @@ describe GitReflow::GitServer::GitHub do
|
|
198
209
|
end
|
199
210
|
end
|
200
211
|
|
201
|
-
describe '#has_pull_request_comments?(pull_request)' do
|
202
|
-
let(:existing_pull_request) { Hashie::Mash.new JSON.parse(fixture('pull_requests/pull_request.json').read) }
|
203
|
-
let(:pull_request_comments) { JSON.parse(fixture('pull_requests/comments.json').read).collect {|c| Hashie::Mash.new(c) } }
|
204
|
-
|
205
|
-
before { github.stub(:pull_request_comments).and_return([pull_request_comments]) }
|
206
|
-
subject { github.has_pull_request_comments?(existing_pull_request) }
|
207
|
-
|
208
|
-
it { should == true }
|
209
|
-
|
210
|
-
context 'no comments exist for the given pull request' do
|
211
|
-
before { github.stub(:pull_request_comments).and_return([]) }
|
212
|
-
it { should == false }
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
212
|
describe '#get_build_status(sha)' do
|
217
213
|
let(:sha) { '6dcb09b5b57875f334f61aebed695e2e4193db5e' }
|
218
214
|
subject { github.get_build_status(sha) }
|
@@ -224,9 +220,6 @@ describe GitReflow::GitServer::GitHub do
|
|
224
220
|
end
|
225
221
|
end
|
226
222
|
|
227
|
-
describe '#find_authors_of_open_pull_request_comments(pull_request)' do
|
228
|
-
end
|
229
|
-
|
230
223
|
describe '#comment_authors_for_pull_request(pull_request, options = {})' do
|
231
224
|
end
|
232
225
|
|