pullermann 1.0.6 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/pullermann/pullermann.rb +47 -46
  2. 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
- :test_block,
11
- :log_level
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 test_preparation(&block)
20
+ def preparation(&block)
19
21
  self.prepare_block = block
20
22
  end
21
23
 
22
- def test_execution(&block)
23
- self.test_block = block
24
+ def execution(&block)
25
+ self.exec_block = block
24
26
  end
25
27
 
26
- # The main Pullermann task. Call this to start testing.
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 test_run_necessary?
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
- # Prepare project and CI (e.g. Jenkins) for the test run.
42
- self.prepare_block.call
43
- # Run specified tests for the project.
44
- # NOTE: Either ensure the last call in that block runs your tests
45
- # or manually set @result to a boolean inside this block.
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
- @log = Logger.new(STDOUT)
67
- @log.level = self.log_level || Logger::INFO
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
- @prepare_block ||= lambda {}
77
- @test_block ||= lambda { `rake test` }
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
- # Test runs are necessary if:
113
- # - the pull request hasn't been tested before.
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 test_run_necessary?
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 tests.'
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 test due to new commit in pull request.'
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 test due to new commit in target branch.'
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, test run needed.'
159
+ @log.info 'New pull request detected, run needed.'
157
160
  return true
158
161
  end
159
- @log.info "Not running tests for request ##{@request_id}."
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
- # Determine boolean value.
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
- message = if @test_success
193
- @log.info 'Tests are passing.'
194
- 'Well done! All tests are still passing after merging this pull request.'
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 'Tests are failing.'
197
- 'Unfortunately your tests are failing after merging this pull request.'
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? == @test_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(@test_success)} comment."
203
- call_github(@test_success).update_comment(@project, @comment['id'], message)
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(!@test_success)} comment."
207
+ @log.info "Deleting existing #{notion(!self.success)} comment."
206
208
  # Delete old @comment with correct connection (if @comment exists).
207
- call_github(!@test_success).delete_comment(@project, @comment['id']) if @comment
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(@test_success)} comment."
210
- call_github(@test_success).add_comment(@project, @request_id, message)
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.6
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 pull requests on GitHub.
49
- Afterwards it posts the result as a comment to the respective request. That way
50
- you know whether your tests are still going to pass if you accept the request and
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 test pull requests.
85
+ summary: An easy way to loop through open pull requests and run code on the merged
86
+ branch.
86
87
  test_files: []