pullermann 1.0.6 → 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.
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: []