git_reflow 0.2.1 → 0.2.2
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.
- data/Gemfile.lock +11 -11
- data/git_reflow.gemspec +3 -3
- data/lib/git_reflow/version.rb +1 -1
- data/lib/git_reflow.rb +64 -27
- data/spec/spec_helper.rb +1 -1
- metadata +12 -12
data/Gemfile.lock
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
git_reflow (0.2.
|
5
|
-
|
6
|
-
|
4
|
+
git_reflow (0.2.2)
|
5
|
+
colorize (= 0.5.8)
|
6
|
+
github_api (= 0.7.0)
|
7
|
+
gli (= 2.1.0)
|
7
8
|
highline
|
8
9
|
httpclient
|
9
|
-
json_pure (= 1.7.5)
|
10
10
|
|
11
11
|
GEM
|
12
12
|
remote: http://rubygems.org/
|
@@ -17,9 +17,10 @@ GEM
|
|
17
17
|
cucumber (>= 1.1.1)
|
18
18
|
ffi (>= 1.0.11)
|
19
19
|
rspec (>= 2.7.0)
|
20
|
-
builder (3.
|
20
|
+
builder (3.1.3)
|
21
21
|
childprocess (0.3.5)
|
22
22
|
ffi (~> 1.0, >= 1.0.6)
|
23
|
+
colorize (0.5.8)
|
23
24
|
crack (0.3.1)
|
24
25
|
cucumber (1.2.1)
|
25
26
|
builder (>= 2.1.2)
|
@@ -33,15 +34,15 @@ GEM
|
|
33
34
|
gherkin (2.11.2)
|
34
35
|
json (>= 1.4.6)
|
35
36
|
git (1.2.5)
|
36
|
-
github_api (0.
|
37
|
+
github_api (0.7.0)
|
37
38
|
faraday (~> 0.8.1)
|
38
39
|
hashie (~> 1.2.0)
|
39
40
|
multi_json (~> 1.3)
|
40
41
|
nokogiri (~> 1.5.2)
|
41
42
|
oauth2
|
42
|
-
gli (2.
|
43
|
+
gli (2.1.0)
|
43
44
|
hashie (1.2.0)
|
44
|
-
highline (1.6.
|
45
|
+
highline (1.6.15)
|
45
46
|
httpauth (0.1)
|
46
47
|
httpclient (2.2.7)
|
47
48
|
jeweler (1.8.4)
|
@@ -50,7 +51,6 @@ GEM
|
|
50
51
|
rake
|
51
52
|
rdoc
|
52
53
|
json (1.7.5)
|
53
|
-
json_pure (1.7.5)
|
54
54
|
jwt (0.1.5)
|
55
55
|
multi_json (>= 1.0)
|
56
56
|
multi_json (1.3.6)
|
@@ -71,10 +71,10 @@ GEM
|
|
71
71
|
rspec-expectations (~> 2.11.0)
|
72
72
|
rspec-mocks (~> 2.11.0)
|
73
73
|
rspec-core (2.11.1)
|
74
|
-
rspec-expectations (2.11.
|
74
|
+
rspec-expectations (2.11.3)
|
75
75
|
diff-lcs (~> 1.1.3)
|
76
76
|
rspec-mocks (2.11.2)
|
77
|
-
webmock (1.8.
|
77
|
+
webmock (1.8.10)
|
78
78
|
addressable (>= 2.2.7)
|
79
79
|
crack (>= 0.1.7)
|
80
80
|
|
data/git_reflow.gemspec
CHANGED
@@ -23,10 +23,10 @@ spec = Gem::Specification.new do |s|
|
|
23
23
|
s.add_development_dependency('aruba', '~> 0.4.6')
|
24
24
|
s.add_development_dependency('jeweler')
|
25
25
|
s.add_development_dependency('webmock')
|
26
|
-
s.add_dependency('
|
27
|
-
s.add_dependency('
|
26
|
+
s.add_dependency('colorize', '0.5.8')
|
27
|
+
s.add_dependency('gli', '2.1.0')
|
28
28
|
s.add_dependency('highline')
|
29
29
|
s.add_dependency('httpclient')
|
30
|
-
s.add_dependency('github_api', '0.
|
30
|
+
s.add_dependency('github_api', '0.7.0')
|
31
31
|
s.post_install_message = "You need to setup your GitHub OAuth token\nPlease run 'git-reflow setup'"
|
32
32
|
end
|
data/lib/git_reflow/version.rb
CHANGED
data/lib/git_reflow.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
|
-
require 'json/pure'
|
4
3
|
require 'open-uri'
|
5
4
|
require "highline/import"
|
6
5
|
require 'httpclient'
|
7
6
|
require 'github_api'
|
7
|
+
require 'json/pure'
|
8
|
+
require 'colorize'
|
8
9
|
|
9
10
|
module GitReflow
|
10
11
|
extend self
|
@@ -39,20 +40,8 @@ module GitReflow
|
|
39
40
|
error_message = e.to_s
|
40
41
|
if error_message =~ /request already exists/i
|
41
42
|
existing_pull_request = find_pull_request( :from => current_branch, :to => options['base'] )
|
42
|
-
puts "
|
43
|
-
|
44
|
-
# check for needed lgtm's
|
45
|
-
pull_comments = pull_request_comments(existing_pull_request)
|
46
|
-
if pull_comments.any?
|
47
|
-
open_comment_authors = find_authors_of_open_pull_request_comments(existing_pull_request)
|
48
|
-
last_committed_at = Time.parse existing_pull_request.head.repo.updated_at
|
49
|
-
lgtm_authors = comment_authors_for_pull_request(existing_pull_request, :with => LGTM, :after => last_committed_at)
|
50
|
-
puts "[review] LGTM given by: #{lgtm_authors.join(', ')}" if lgtm_authors.any?
|
51
|
-
puts "[notice] You still need a LGTM from: #{open_comment_authors.join(', ')}" if open_comment_authors.any?
|
52
|
-
else
|
53
|
-
puts "[notice] No one has reviewed your pull request..."
|
54
|
-
end
|
55
|
-
|
43
|
+
puts "A pull request already exists for these branches:"
|
44
|
+
display_pull_request_summary(existing_pull_request)
|
56
45
|
ask_to_open_in_browser(existing_pull_request.html_url)
|
57
46
|
else
|
58
47
|
puts error_message
|
@@ -78,13 +67,13 @@ module GitReflow
|
|
78
67
|
if open_comment_authors.empty?
|
79
68
|
lgtm_authors = comment_authors_for_pull_request(existing_pull_request, :with => LGTM)
|
80
69
|
commit_message = get_first_commit_message
|
81
|
-
puts "Merging pull request ##{existing_pull_request
|
70
|
+
puts "Merging pull request ##{existing_pull_request.number}: '#{existing_pull_request.title}', from '#{existing_pull_request.head.label}' into '#{existing_pull_request.base.label}'"
|
82
71
|
|
83
72
|
update_destination(options['base'])
|
84
73
|
merge_feature_branch(:feature_branch => feature_branch,
|
85
74
|
:destination_branch => options['base'],
|
86
|
-
:pull_request_number => existing_pull_request
|
87
|
-
:message => "\nCloses ##{existing_pull_request
|
75
|
+
:pull_request_number => existing_pull_request.number,
|
76
|
+
:message => "\nCloses ##{existing_pull_request.number}\n\nLGTM given by: @#{lgtm_authors.join(', @')}\n")
|
88
77
|
append_to_squashed_commit_message(commit_message)
|
89
78
|
committed = system('git commit')
|
90
79
|
|
@@ -142,7 +131,6 @@ module GitReflow
|
|
142
131
|
`git log --pretty=format:"%s" --no-merges -n 1`.strip
|
143
132
|
end
|
144
133
|
|
145
|
-
private
|
146
134
|
|
147
135
|
def set_oauth_token(oauth_token)
|
148
136
|
`git config --global --replace-all github.oauth-token #{oauth_token}`
|
@@ -181,8 +169,8 @@ module GitReflow
|
|
181
169
|
def find_pull_request(options)
|
182
170
|
existing_pull_request = nil
|
183
171
|
github.pull_requests.all(remote_user, remote_repo_name, :state => 'open') do |pull_request|
|
184
|
-
if pull_request
|
185
|
-
pull_request
|
172
|
+
if pull_request.base.label == "#{remote_user}:#{options[:to]}" and
|
173
|
+
pull_request.head.label == "#{remote_user}:#{options[:from]}"
|
186
174
|
existing_pull_request = pull_request
|
187
175
|
break
|
188
176
|
end
|
@@ -191,8 +179,8 @@ module GitReflow
|
|
191
179
|
end
|
192
180
|
|
193
181
|
def pull_request_comments(pull_request)
|
194
|
-
comments = github.issues.comments.all remote_user, remote_repo_name, pull_request
|
195
|
-
review_comments = github.pull_requests.comments.all remote_user, remote_repo_name, pull_request
|
182
|
+
comments = github.issues.comments.all remote_user, remote_repo_name, pull_request.number
|
183
|
+
review_comments = github.pull_requests.comments.all remote_user, remote_repo_name, pull_request.number
|
196
184
|
comments + review_comments
|
197
185
|
end
|
198
186
|
|
@@ -200,21 +188,26 @@ module GitReflow
|
|
200
188
|
# first we'll gather all the authors that have commented on the pull request
|
201
189
|
all_comments = pull_request_comments(pull_request)
|
202
190
|
comment_authors = comment_authors_for_pull_request(pull_request)
|
191
|
+
lgtm_authors = []
|
203
192
|
|
204
193
|
# now we need to check that all the commented authors have given a lgtm after the last commit
|
205
194
|
all_comments.each do |comment|
|
206
195
|
next unless comment_authors.include?(comment.user.login)
|
207
|
-
pull_last_committed_at =
|
196
|
+
pull_last_committed_at = get_commited_time(pull_request.head.sha)
|
208
197
|
comment_created_at = Time.parse(comment.created_at)
|
209
198
|
if comment_created_at > pull_last_committed_at
|
210
|
-
if comment
|
211
|
-
|
199
|
+
if comment[:body] =~ LGTM
|
200
|
+
lgtm_authors << comment.user.login
|
212
201
|
else
|
213
202
|
comment_authors << comment.user.login unless comment_authors.include?(comment.user.login)
|
214
203
|
end
|
204
|
+
else
|
205
|
+
comment_authors -= [comment.user.login] if comment_authors.include?(comment.user.login)
|
215
206
|
end
|
216
207
|
end
|
217
208
|
|
209
|
+
comment_authors -= lgtm_authors
|
210
|
+
|
218
211
|
comment_authors || []
|
219
212
|
end
|
220
213
|
|
@@ -224,13 +217,57 @@ module GitReflow
|
|
224
217
|
|
225
218
|
all_comments.each do |comment|
|
226
219
|
next if options[:after] and Time.parse(comment.created_at) < options[:after]
|
227
|
-
comment_authors << comment.user.login if !comment_authors.include?(comment.user.login) and (options[:with].nil? or comment
|
220
|
+
comment_authors << comment.user.login if !comment_authors.include?(comment.user.login) and (options[:with].nil? or comment[:body] =~ options[:with])
|
228
221
|
end
|
229
222
|
|
230
223
|
# remove the current user from the list to check
|
231
224
|
comment_authors -= [github_user]
|
232
225
|
end
|
233
226
|
|
227
|
+
def display_pull_request_summary(pull_request)
|
228
|
+
summary_data = {
|
229
|
+
"branches" => "#{pull_request.head.label} -> #{pull_request.base.label}",
|
230
|
+
"number" => pull_request.number,
|
231
|
+
"url" => pull_request.html_url
|
232
|
+
}
|
233
|
+
|
234
|
+
notices = ""
|
235
|
+
reviewed_by = comment_authors_for_pull_request(pull_request).map {|author| author.colorize(:red) }
|
236
|
+
|
237
|
+
# check for needed lgtm's
|
238
|
+
pull_comments = pull_request_comments(pull_request)
|
239
|
+
if pull_comments.reject {|comment| comment.user.login == github_user}.any?
|
240
|
+
open_comment_authors = find_authors_of_open_pull_request_comments(pull_request)
|
241
|
+
last_committed_at = get_commited_time(pull_request.head.sha)
|
242
|
+
lgtm_authors = comment_authors_for_pull_request(pull_request, :with => LGTM, :after => last_committed_at)
|
243
|
+
|
244
|
+
summary_data.merge!("Last comment" => pull_comments.last.body)
|
245
|
+
|
246
|
+
if lgtm_authors.any?
|
247
|
+
reviewed_by.map! { |author| lgtm_authors.include?(author.uncolorize) ? author.colorize(:green) : author }
|
248
|
+
end
|
249
|
+
|
250
|
+
notices << "[notice] You still need a LGTM from: #{open_comment_authors.join(', ')}\n" if open_comment_authors.any?
|
251
|
+
else
|
252
|
+
notices << "[notice] No one has reviewed your pull request...\n"
|
253
|
+
end
|
254
|
+
|
255
|
+
summary_data['reviewed by'] = reviewed_by.join(', ')
|
256
|
+
|
257
|
+
padding_size = summary_data.keys.max_by(&:size).size + 2
|
258
|
+
summary_data.keys.sort.each do |name|
|
259
|
+
string_format = " %-#{padding_size}s %s\n"
|
260
|
+
printf string_format, "#{name}:", summary_data[name]
|
261
|
+
end
|
262
|
+
|
263
|
+
puts "\n#{notices}" if notices != ''
|
264
|
+
end
|
265
|
+
|
266
|
+
def get_commited_time(commit_sha)
|
267
|
+
last_commit = github.repos.commits.find remote_user, remote_repo_name, commit_sha
|
268
|
+
Time.parse last_commit.commit.author[:date]
|
269
|
+
end
|
270
|
+
|
234
271
|
# WARNING: this currently only supports OS X and UBUNTU
|
235
272
|
def ask_to_open_in_browser(url)
|
236
273
|
if RUBY_PLATFORM =~ /darwin|linux/i
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git_reflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-
|
14
|
+
date: 2012-09-17 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rake
|
@@ -110,13 +110,13 @@ dependencies:
|
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
|
-
name:
|
113
|
+
name: colorize
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
none: false
|
116
116
|
requirements:
|
117
117
|
- - '='
|
118
118
|
- !ruby/object:Gem::Version
|
119
|
-
version:
|
119
|
+
version: 0.5.8
|
120
120
|
type: :runtime
|
121
121
|
prerelease: false
|
122
122
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -124,15 +124,15 @@ dependencies:
|
|
124
124
|
requirements:
|
125
125
|
- - '='
|
126
126
|
- !ruby/object:Gem::Version
|
127
|
-
version:
|
127
|
+
version: 0.5.8
|
128
128
|
- !ruby/object:Gem::Dependency
|
129
|
-
name:
|
129
|
+
name: gli
|
130
130
|
requirement: !ruby/object:Gem::Requirement
|
131
131
|
none: false
|
132
132
|
requirements:
|
133
133
|
- - '='
|
134
134
|
- !ruby/object:Gem::Version
|
135
|
-
version: 1.
|
135
|
+
version: 2.1.0
|
136
136
|
type: :runtime
|
137
137
|
prerelease: false
|
138
138
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -140,7 +140,7 @@ dependencies:
|
|
140
140
|
requirements:
|
141
141
|
- - '='
|
142
142
|
- !ruby/object:Gem::Version
|
143
|
-
version: 1.
|
143
|
+
version: 2.1.0
|
144
144
|
- !ruby/object:Gem::Dependency
|
145
145
|
name: highline
|
146
146
|
requirement: !ruby/object:Gem::Requirement
|
@@ -180,7 +180,7 @@ dependencies:
|
|
180
180
|
requirements:
|
181
181
|
- - '='
|
182
182
|
- !ruby/object:Gem::Version
|
183
|
-
version: 0.
|
183
|
+
version: 0.7.0
|
184
184
|
type: :runtime
|
185
185
|
prerelease: false
|
186
186
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -188,7 +188,7 @@ dependencies:
|
|
188
188
|
requirements:
|
189
189
|
- - '='
|
190
190
|
- !ruby/object:Gem::Version
|
191
|
-
version: 0.
|
191
|
+
version: 0.7.0
|
192
192
|
description: Git Reflow manages your git workflow.
|
193
193
|
email:
|
194
194
|
- dev@reenhanced.com
|
@@ -250,7 +250,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
250
250
|
version: '0'
|
251
251
|
segments:
|
252
252
|
- 0
|
253
|
-
hash: -
|
253
|
+
hash: -900915323995072277
|
254
254
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
255
255
|
none: false
|
256
256
|
requirements:
|
@@ -259,7 +259,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
259
259
|
version: '0'
|
260
260
|
segments:
|
261
261
|
- 0
|
262
|
-
hash: -
|
262
|
+
hash: -900915323995072277
|
263
263
|
requirements: []
|
264
264
|
rubyforge_project:
|
265
265
|
rubygems_version: 1.8.24
|