octopolo 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +9 -0
- data/lib/octopolo/git.rb +4 -1
- data/lib/octopolo/github/pull_request.rb +22 -0
- data/lib/octopolo/github.rb +4 -0
- data/lib/octopolo/scripts/deployable.rb +4 -0
- data/lib/octopolo/scripts/stage_up.rb +4 -0
- data/lib/octopolo/version.rb +1 -1
- data/spec/octopolo/git_spec.rb +18 -3
- data/spec/octopolo/github/pull_request_spec.rb +44 -0
- data/spec/octopolo/scripts/deployable_spec.rb +21 -5
- data/spec/octopolo/scripts/stage_up_spec.rb +29 -12
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce85f0e7584c097f6057eb0f0290419beadbb7c0
|
4
|
+
data.tar.gz: 2aa223c174ba9b35fb2a2c91fc3bb9c951d9d29e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 685c5bc181c5cf915e86b8359ea8edd1224c84a03da2847cd5f3c17d594186d602ae34bb9d52bee20ac49fb5aae528acbd75390b1ec8fa9858d4c885f9b27a30
|
7
|
+
data.tar.gz: 88a1262406cae5fb72644cbbc1354820fa7f0a1b7917c6593cab6618a2221f6ee5ed3e4053d353d9ae5ef701e14d66eb2e64bf0e430d0df2ac10044e6a2bc3ad
|
data/CHANGELOG.markdown
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
#### v1.1.0
|
2
|
+
* Auto pull request
|
3
|
+
|
4
|
+
> Scott Trenda, Brian Bergstrom: Chris Arcand: https://github.com/sportngin/octopolo/pull/70
|
5
|
+
|
6
|
+
* issue64 - improve git if_clean check
|
7
|
+
|
8
|
+
> newzac: Scott Trenda, Brian Bergstrom: https://github.com/sportngin/octopolo/pull/69
|
9
|
+
|
1
10
|
#### v1.0.2
|
2
11
|
* Fix Rake Depenency Issues
|
3
12
|
|
data/lib/octopolo/git.rb
CHANGED
@@ -5,6 +5,7 @@ module Octopolo
|
|
5
5
|
class Git
|
6
6
|
NO_BRANCH = "(no branch)"
|
7
7
|
DEFAULT_DIRTY_MESSAGE = "Your Git index is not clean. Commit, stash, or otherwise clean up the index before continuing."
|
8
|
+
DIRTY_CONFIRM_MESSAGE = "Your Git index is not clean. Do you want to continue?"
|
8
9
|
# we use date-based tags, so look for anything starting with a 4-digit year
|
9
10
|
RELEASE_TAG_FILTER = /^\d{4}.*/
|
10
11
|
RECENT_TAG_LIMIT = 9
|
@@ -109,7 +110,7 @@ module Octopolo
|
|
109
110
|
|
110
111
|
# Public: Perform the block if the Git index is clean
|
111
112
|
def self.if_clean(message=DEFAULT_DIRTY_MESSAGE)
|
112
|
-
if clean?
|
113
|
+
if clean? || cli.ask_boolean(DIRTY_CONFIRM_MESSAGE)
|
113
114
|
yield
|
114
115
|
else
|
115
116
|
alert_dirty_index message
|
@@ -122,6 +123,7 @@ module Octopolo
|
|
122
123
|
cli.say message
|
123
124
|
cli.say " "
|
124
125
|
perform "status"
|
126
|
+
raise DirtyIndex
|
125
127
|
end
|
126
128
|
|
127
129
|
# Public: Merge the given remote branch into the current branch
|
@@ -276,5 +278,6 @@ module Octopolo
|
|
276
278
|
CheckoutFailed = Class.new(StandardError)
|
277
279
|
MergeFailed = Class.new(StandardError)
|
278
280
|
NoBranchOfType = Class.new(StandardError)
|
281
|
+
DirtyIndex = Class.new(StandardError)
|
279
282
|
end
|
280
283
|
end
|
@@ -6,6 +6,10 @@ module Octopolo
|
|
6
6
|
module GitHub
|
7
7
|
class PullRequest < Issue
|
8
8
|
|
9
|
+
extend CLIWrapper
|
10
|
+
extend ConfigWrapper
|
11
|
+
extend UserConfigWrapper
|
12
|
+
|
9
13
|
# Public: All closed pull requests for a given repo
|
10
14
|
#
|
11
15
|
# repo_name - Full name ("account/repo") of the repo in question
|
@@ -65,6 +69,24 @@ module Octopolo
|
|
65
69
|
@commits ||= Commit.for_pull_request self
|
66
70
|
end
|
67
71
|
|
72
|
+
def self.current
|
73
|
+
current_branch = Git.current_branch
|
74
|
+
query = "repo:#{config.github_repo} type:pr is:open head:#{current_branch}"
|
75
|
+
pulls = GitHub.search_issues(query)
|
76
|
+
if pulls.total_count!= 1
|
77
|
+
cli.say "Multiple pull requests found for branch #{current_branch}" if pulls.total_count > 1
|
78
|
+
cli.say "No pull request found for branch #{current_branch}" if pulls.total_count < 1
|
79
|
+
return nil
|
80
|
+
else
|
81
|
+
cli.say "Pull request for current branch is number #{pulls.items.first.number}"
|
82
|
+
pulls.items.first
|
83
|
+
|
84
|
+
end
|
85
|
+
rescue => e
|
86
|
+
cli.say "An error occurred while getting the current branch: #{e.message}"
|
87
|
+
return nil
|
88
|
+
end
|
89
|
+
|
68
90
|
end
|
69
91
|
end
|
70
92
|
end
|
data/lib/octopolo/github.rb
CHANGED
@@ -24,6 +24,10 @@ module Octopolo
|
|
24
24
|
|
25
25
|
# Public: Perform the script
|
26
26
|
def execute
|
27
|
+
if (!self.pull_request_id)
|
28
|
+
current = GitHub::PullRequest.current
|
29
|
+
self.pull_request_id = current.number if current
|
30
|
+
end
|
27
31
|
self.pull_request_id ||= cli.prompt("Pull Request ID: ")
|
28
32
|
GitHub.connect do
|
29
33
|
if config.deployable_label
|
@@ -18,6 +18,10 @@ module Octopolo
|
|
18
18
|
|
19
19
|
# Public: Perform the script
|
20
20
|
def execute
|
21
|
+
if (!self.pull_request_id)
|
22
|
+
current = GitHub::PullRequest.current
|
23
|
+
self.pull_request_id = current.number if current
|
24
|
+
end
|
21
25
|
self.pull_request_id ||= cli.prompt("Pull Request ID: ")
|
22
26
|
PullRequestMerger.perform Git::STAGING_PREFIX, Integer(pull_request_id)
|
23
27
|
end
|
data/lib/octopolo/version.rb
CHANGED
data/spec/octopolo/git_spec.rb
CHANGED
@@ -125,6 +125,8 @@ module Octopolo
|
|
125
125
|
context ".if_clean" do
|
126
126
|
let(:custom_message) { "Some other message" }
|
127
127
|
|
128
|
+
before { Git.cli = cli }
|
129
|
+
|
128
130
|
it "performs the block if the git index is clean" do
|
129
131
|
Git.should_receive(:clean?) { true }
|
130
132
|
Math.should_receive(:log).with(1)
|
@@ -134,18 +136,31 @@ module Octopolo
|
|
134
136
|
end
|
135
137
|
end
|
136
138
|
|
137
|
-
it "
|
139
|
+
it "performs the block if the git index is not clean and user responds yes" do
|
138
140
|
Git.should_receive(:clean?) { false }
|
141
|
+
cli.should_receive(:ask_boolean).with(Git::DIRTY_CONFIRM_MESSAGE) { true }
|
142
|
+
Math.should_receive(:log).with(1)
|
143
|
+
|
144
|
+
Git.if_clean do
|
145
|
+
Math.log 1
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
it "does not perform the block if the git index is not clean and user responds no" do
|
150
|
+
Git.should_receive(:clean?) { false }
|
151
|
+
cli.should_receive(:ask_boolean).with(Git::DIRTY_CONFIRM_MESSAGE) { false}
|
139
152
|
Math.should_not_receive(:log)
|
140
153
|
Git.should_receive(:alert_dirty_index).with(Git::DEFAULT_DIRTY_MESSAGE)
|
141
154
|
|
155
|
+
|
142
156
|
Git.if_clean do
|
143
157
|
Math.log 1
|
144
158
|
end
|
145
159
|
end
|
146
160
|
|
147
|
-
it "prints a custom message if git index is not clean" do
|
161
|
+
it "prints a custom message if git index is not clean and user responds no" do
|
148
162
|
Git.should_receive(:clean?) { false }
|
163
|
+
cli.should_receive(:ask_boolean).with(Git::DIRTY_CONFIRM_MESSAGE) { false }
|
149
164
|
Math.should_not_receive(:log)
|
150
165
|
Git.should_receive(:alert_dirty_index).with(custom_message)
|
151
166
|
|
@@ -166,7 +181,7 @@ module Octopolo
|
|
166
181
|
cli.should_receive(:say).with(" ")
|
167
182
|
Git.should_receive(:perform).with("status")
|
168
183
|
|
169
|
-
Git.alert_dirty_index message
|
184
|
+
expect{Git.alert_dirty_index message}.to raise_error
|
170
185
|
end
|
171
186
|
end
|
172
187
|
|
@@ -287,6 +287,50 @@ module Octopolo
|
|
287
287
|
end
|
288
288
|
end
|
289
289
|
|
290
|
+
context ".current" do
|
291
|
+
let(:branch_name) { "branch-name" }
|
292
|
+
let(:error_message) { "some error message" }
|
293
|
+
let(:pull) { PullRequest.new repo_name, pr_number }
|
294
|
+
|
295
|
+
before do
|
296
|
+
Octopolo.config.stub(:github_repo) { repo_name }
|
297
|
+
end
|
298
|
+
|
299
|
+
it "calls GitHub.pull_requests with the current repo/branch and return a single pull request" do
|
300
|
+
Git.should_receive(:current_branch) { branch_name }
|
301
|
+
GitHub.should_receive(:search_issues) { double(total_count: 1, items: [pull]) }
|
302
|
+
PullRequest.current.should == pull
|
303
|
+
end
|
304
|
+
|
305
|
+
it "returns nil when Git.current_branch fails" do
|
306
|
+
Git.should_receive(:current_branch) { raise error_message }
|
307
|
+
CLI.should_receive(:say).with("An error occurred while getting the current branch: #{error_message}")
|
308
|
+
PullRequest.current.should == nil
|
309
|
+
end
|
310
|
+
|
311
|
+
it "returns nil when GitHub.pull_requests fails" do
|
312
|
+
Git.should_receive(:current_branch) { branch_name }
|
313
|
+
GitHub.should_receive(:search_issues) { raise error_message }
|
314
|
+
CLI.should_receive(:say).with("An error occurred while getting the current branch: #{error_message}")
|
315
|
+
PullRequest.current.should == nil
|
316
|
+
end
|
317
|
+
|
318
|
+
it "returns nil when more than one PR exists" do
|
319
|
+
Git.should_receive(:current_branch) { branch_name }
|
320
|
+
GitHub.should_receive(:search_issues) { double(total_count: 2, items: [pull, pull]) }
|
321
|
+
CLI.should_receive(:say).with("Multiple pull requests found for branch #{branch_name}")
|
322
|
+
PullRequest.current.should == nil
|
323
|
+
end
|
324
|
+
|
325
|
+
it "returns nil when no PR exists" do
|
326
|
+
Git.should_receive(:current_branch) { branch_name }
|
327
|
+
GitHub.should_receive(:search_issues) { double(total_count: 0, items: []) }
|
328
|
+
CLI.should_receive(:say).with("No pull request found for branch #{branch_name}")
|
329
|
+
PullRequest.current.should == nil
|
330
|
+
end
|
331
|
+
|
332
|
+
end
|
333
|
+
|
290
334
|
context "labeling" do
|
291
335
|
let(:label1) { Label.new(name: "low-risk", color: "343434") }
|
292
336
|
let(:label2) { Label.new(name: "high-risk", color: '565656') }
|
@@ -10,7 +10,7 @@ module Octopolo
|
|
10
10
|
let(:config) { stub(user_notifications: ['NickLaMuro'],
|
11
11
|
github_repo: 'grumpy_cat',
|
12
12
|
deployable_label: true) }
|
13
|
-
let(:pull_request) { stub(add_labels: true, remove_labels: true) }
|
13
|
+
let(:pull_request) { stub(add_labels: true, remove_labels: true, number: 7) }
|
14
14
|
before do
|
15
15
|
allow(subject).to receive(:cli) { cli }
|
16
16
|
allow(subject).to receive(:config) { config }
|
@@ -33,10 +33,26 @@ module Octopolo
|
|
33
33
|
context "without a PR ID passed in with the command" do
|
34
34
|
subject { described_class.new }
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
.
|
39
|
-
|
36
|
+
context "with an existing PR for the current branch" do
|
37
|
+
before do
|
38
|
+
GitHub::PullRequest.should_receive(:current) { pull_request }
|
39
|
+
end
|
40
|
+
|
41
|
+
it "takes the pull requests ID from the current branch" do
|
42
|
+
PullRequestMerger.should_receive(:perform).with(Git::DEPLOYABLE_PREFIX, pull_request.number, :user_notifications => config.user_notifications)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "without an existing PR for the current branch" do
|
47
|
+
before do
|
48
|
+
GitHub::PullRequest.should_receive(:current) { nil }
|
49
|
+
end
|
50
|
+
|
51
|
+
it "prompts for a PR ID" do
|
52
|
+
cli.should_receive(:prompt)
|
53
|
+
.with("Pull Request ID: ")
|
54
|
+
.and_return("42")
|
55
|
+
end
|
40
56
|
end
|
41
57
|
end
|
42
58
|
|
@@ -20,28 +20,45 @@ module Octopolo
|
|
20
20
|
context "with no PR passed in from the command args" do
|
21
21
|
subject { StageUp.new }
|
22
22
|
|
23
|
-
context "with
|
23
|
+
context "with an existing PR for the current branch" do
|
24
24
|
before do
|
25
|
-
|
26
|
-
.with("Pull Request ID: ")
|
27
|
-
.and_return("42")
|
25
|
+
GitHub::PullRequest.should_receive(:current) { GitHub::PullRequest.new("account/repo", 7) }
|
28
26
|
end
|
29
27
|
|
30
|
-
it "
|
31
|
-
PullRequestMerger.should_receive(:perform).with(Git::STAGING_PREFIX,
|
28
|
+
it "takes the pull requests ID from the current branch" do
|
29
|
+
PullRequestMerger.should_receive(:perform).with(Git::STAGING_PREFIX, 7)
|
32
30
|
subject.execute
|
33
31
|
end
|
34
32
|
end
|
35
33
|
|
36
|
-
context "
|
34
|
+
context "without an existing PR for the current branch" do
|
37
35
|
before do
|
38
|
-
|
39
|
-
.with("Pull Request ID: ")
|
40
|
-
.and_return("foo")
|
36
|
+
GitHub::PullRequest.should_receive(:current) { nil }
|
41
37
|
end
|
42
38
|
|
43
|
-
|
44
|
-
|
39
|
+
context "with a PR passed in through the cli" do
|
40
|
+
before do
|
41
|
+
cli.should_receive(:prompt)
|
42
|
+
.with("Pull Request ID: ")
|
43
|
+
.and_return("42")
|
44
|
+
end
|
45
|
+
|
46
|
+
it "delegates the work to PullRequestMerger" do
|
47
|
+
PullRequestMerger.should_receive(:perform).with(Git::STAGING_PREFIX, 42)
|
48
|
+
subject.execute
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "with no PR passed in from the cli" do
|
53
|
+
before do
|
54
|
+
cli.should_receive(:prompt)
|
55
|
+
.with("Pull Request ID: ")
|
56
|
+
.and_return("foo")
|
57
|
+
end
|
58
|
+
|
59
|
+
it "delegates the work to PullRequestMerger" do
|
60
|
+
expect{ subject.execute }.to raise_error(ArgumentError)
|
61
|
+
end
|
45
62
|
end
|
46
63
|
end
|
47
64
|
end
|