octopolo 1.0.2 → 1.1.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/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
|