pullermann 1.0.6 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/pullermann/pullermann.rb +47 -46
- metadata +7 -6
@@ -7,23 +7,25 @@ class Pullermann
|
|
7
7
|
:rerun_on_source_change,
|
8
8
|
:rerun_on_target_change,
|
9
9
|
:prepare_block,
|
10
|
-
:
|
11
|
-
:
|
10
|
+
:exec_block,
|
11
|
+
:logger,
|
12
|
+
:success
|
12
13
|
|
13
14
|
# Allow configuration blocks being passed to Pullermann.
|
15
|
+
# See the README.md for examples on how to call this method.
|
14
16
|
def self.setup
|
15
17
|
yield main_instance
|
16
18
|
end
|
17
19
|
|
18
|
-
def
|
20
|
+
def preparation(&block)
|
19
21
|
self.prepare_block = block
|
20
22
|
end
|
21
23
|
|
22
|
-
def
|
23
|
-
self.
|
24
|
+
def execution(&block)
|
25
|
+
self.exec_block = block
|
24
26
|
end
|
25
27
|
|
26
|
-
# The main Pullermann task. Call this to
|
28
|
+
# The main Pullermann task. Call this to run your code.
|
27
29
|
def self.run
|
28
30
|
main_instance.run
|
29
31
|
end
|
@@ -31,24 +33,20 @@ class Pullermann
|
|
31
33
|
def run
|
32
34
|
# Populate variables and setup environment.
|
33
35
|
configure
|
36
|
+
self.prepare_block.call
|
34
37
|
# Loop through all 'open' pull requests.
|
35
38
|
pull_requests.each do |request|
|
36
39
|
@request_id = request['number']
|
37
40
|
# Jump to next iteration if source and/or target haven't change since last run.
|
38
|
-
next unless
|
41
|
+
next unless run_necessary?
|
39
42
|
# GitHub always creates a merge commit for its 'Merge Button'.
|
43
|
+
# Pullermann reuses that commit to run the code on it.
|
40
44
|
switch_branch_to_merged_state
|
41
|
-
#
|
42
|
-
self.
|
43
|
-
#
|
44
|
-
#
|
45
|
-
|
46
|
-
self.test_block.call
|
47
|
-
# Unless already set, the success/failure is determined by the last
|
48
|
-
# command's return code.
|
49
|
-
@test_success ||= $? == 0
|
50
|
-
# We need to switch back to the original branch in case we need to test
|
51
|
-
# more pull requests.
|
45
|
+
# Run specified code (i.e. tests) for the project.
|
46
|
+
self.exec_block.call
|
47
|
+
# Unless self.success has already been set manually,
|
48
|
+
# the success/failure is determined by the last command's return code.
|
49
|
+
self.success ||= $? == 0
|
52
50
|
switch_branch_back
|
53
51
|
comment_on_github
|
54
52
|
end
|
@@ -63,8 +61,13 @@ class Pullermann
|
|
63
61
|
end
|
64
62
|
|
65
63
|
def configure
|
66
|
-
|
67
|
-
|
64
|
+
# Use existing logger or fall back to a new one with standard log level.
|
65
|
+
if self.logger
|
66
|
+
@log = self.logger
|
67
|
+
else
|
68
|
+
@log = Logger.new(STDOUT)
|
69
|
+
@log.level = Logger::INFO
|
70
|
+
end
|
68
71
|
# Set default fall back values for options that aren't set.
|
69
72
|
self.username ||= git_config['github.login']
|
70
73
|
self.password ||= git_config['github.password']
|
@@ -73,8 +76,8 @@ class Pullermann
|
|
73
76
|
self.rerun_on_source_change = true unless self.rerun_on_source_change == false
|
74
77
|
self.rerun_on_target_change = true unless self.rerun_on_target_change == false
|
75
78
|
# Find environment (tasks, project, ...).
|
76
|
-
|
77
|
-
|
79
|
+
self.prepare_block ||= lambda {}
|
80
|
+
self.exec_block ||= lambda { `rake` }
|
78
81
|
@github = connect_to_github
|
79
82
|
@github_fail = if self.username == self.username_fail
|
80
83
|
@github
|
@@ -109,11 +112,11 @@ class Pullermann
|
|
109
112
|
pulls
|
110
113
|
end
|
111
114
|
|
112
|
-
#
|
113
|
-
# - the pull request hasn't been
|
115
|
+
# (Re-)runs are necessary if:
|
116
|
+
# - the pull request hasn't been used for a run before.
|
114
117
|
# - the pull request has been updated since the last run.
|
115
118
|
# - the target (i.e. master) has been updated since the last run.
|
116
|
-
def
|
119
|
+
def run_necessary?
|
117
120
|
pull_request = @github.pull_request @project, @request_id
|
118
121
|
@log.info "Checking pull request ##{@request_id}: #{pull_request.title}"
|
119
122
|
# Compare current sha ids of target and source branch with those from the last test run.
|
@@ -134,7 +137,7 @@ class Pullermann
|
|
134
137
|
end
|
135
138
|
# If it's not mergeable, we need to delete all comments of former test runs.
|
136
139
|
unless pull_request.mergeable
|
137
|
-
@log.info 'Pull request not auto-mergeable. Not running
|
140
|
+
@log.info 'Pull request not auto-mergeable. Not running.'
|
138
141
|
if @comment
|
139
142
|
@log.info 'Deleting existing comment.'
|
140
143
|
call_github(old_comment_success?).delete_comment(@project, @comment.id)
|
@@ -145,18 +148,18 @@ class Pullermann
|
|
145
148
|
@log.info "Current target sha: '#{@target_head_sha}', pull sha: '#{@pull_head_sha}'."
|
146
149
|
@log.info "Last test run target sha: '#{shas[1]}', pull sha: '#{shas[2]}'."
|
147
150
|
if self.rerun_on_source_change && (shas[2] != @pull_head_sha)
|
148
|
-
@log.info 'Re-running
|
151
|
+
@log.info 'Re-running due to new commit in pull request.'
|
149
152
|
return true
|
150
153
|
elsif self.rerun_on_target_change && (shas[1] != @target_head_sha)
|
151
|
-
@log.info 'Re-running
|
154
|
+
@log.info 'Re-running due to new commit in target branch.'
|
152
155
|
return true
|
153
156
|
end
|
154
157
|
else
|
155
158
|
# If there are no comments yet, it has to be a new request.
|
156
|
-
@log.info 'New pull request detected,
|
159
|
+
@log.info 'New pull request detected, run needed.'
|
157
160
|
return true
|
158
161
|
end
|
159
|
-
@log.info "Not running
|
162
|
+
@log.info "Not running for request ##{@request_id}."
|
160
163
|
false
|
161
164
|
end
|
162
165
|
|
@@ -179,35 +182,34 @@ class Pullermann
|
|
179
182
|
`git checkout master &> /dev/null`
|
180
183
|
end
|
181
184
|
|
182
|
-
# Analyze old comment to see whether it was a successful or a failing one.
|
183
185
|
def old_comment_success?
|
184
186
|
return unless @comment
|
185
|
-
#
|
187
|
+
# Analyze old comment to see whether it was a successful or a failing one.
|
186
188
|
@comment.body.include? 'Well done!'
|
187
189
|
end
|
188
190
|
|
189
|
-
# Output the result to a comment on the pull request on GitHub.
|
190
191
|
def comment_on_github
|
191
192
|
# Determine comment message.
|
192
|
-
|
193
|
-
|
194
|
-
'
|
193
|
+
# TODO: Allow for custom messages.
|
194
|
+
message = if self.success
|
195
|
+
@log.info 'Successful run.'
|
196
|
+
'Well done! Your code is still running successfully after merging this pull request.'
|
195
197
|
else
|
196
|
-
@log.info '
|
197
|
-
'Unfortunately your
|
198
|
+
@log.info 'Failing run.'
|
199
|
+
'Unfortunately your code is failing after merging this pull request.'
|
198
200
|
end
|
199
201
|
message += "\n( master sha# #{@target_head_sha} ; pull sha# #{@pull_head_sha} )"
|
200
|
-
if old_comment_success? ==
|
202
|
+
if old_comment_success? == self.success
|
201
203
|
# Replace existing @comment's body with the correct connection.
|
202
|
-
@log.info "Updating existing #{notion(
|
203
|
-
call_github(
|
204
|
+
@log.info "Updating existing #{notion(self.success)} comment."
|
205
|
+
call_github(self.success).update_comment(@project, @comment['id'], message)
|
204
206
|
else
|
205
|
-
@log.info "Deleting existing #{notion(
|
207
|
+
@log.info "Deleting existing #{notion(!self.success)} comment."
|
206
208
|
# Delete old @comment with correct connection (if @comment exists).
|
207
|
-
call_github(
|
209
|
+
call_github(!self.success).delete_comment(@project, @comment['id']) if @comment
|
208
210
|
# Create new comment with correct connection.
|
209
|
-
@log.info "Adding new #{notion(
|
210
|
-
call_github(
|
211
|
+
@log.info "Adding new #{notion(self.success)} comment."
|
212
|
+
call_github(self.success).add_comment(@project, @request_id, message)
|
211
213
|
end
|
212
214
|
end
|
213
215
|
|
@@ -224,7 +226,6 @@ class Pullermann
|
|
224
226
|
# Checks '~/.gitconfig' for credentials.
|
225
227
|
def git_config
|
226
228
|
unless @git_config
|
227
|
-
# Read @git_config from local git config.
|
228
229
|
@git_config = {}
|
229
230
|
`git config --list`.split("\n").each do |line|
|
230
231
|
key, value = line.split('=')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pullermann
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -45,10 +45,10 @@ dependencies:
|
|
45
45
|
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
|
-
description: Pullermann runs your project's test suite on open
|
49
|
-
Afterwards it posts the result as a comment to the respective
|
50
|
-
|
51
|
-
merge the code.
|
48
|
+
description: Pullermann runs custom code (i.e. your project's test suite) on open
|
49
|
+
pull requests on GitHub. Afterwards it posts the result as a comment to the respective
|
50
|
+
request. This should give you an outlook on the future state of your repository
|
51
|
+
in case you accept the request and merge the code.
|
52
52
|
email: bamboo@suse.com
|
53
53
|
executables: []
|
54
54
|
extensions: []
|
@@ -82,5 +82,6 @@ rubyforge_project:
|
|
82
82
|
rubygems_version: 1.8.24
|
83
83
|
signing_key:
|
84
84
|
specification_version: 3
|
85
|
-
summary: An easy way to
|
85
|
+
summary: An easy way to loop through open pull requests and run code on the merged
|
86
|
+
branch.
|
86
87
|
test_files: []
|