git-review 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/git-review.rb +75 -35
- metadata +7 -7
data/lib/git-review.rb
CHANGED
@@ -17,24 +17,27 @@ class GitReview
|
|
17
17
|
puts ' list [--reverse] List all open requests.'
|
18
18
|
puts ' show <number> [--full] Show details of a single request.'
|
19
19
|
puts ' browse <number> Open a browser window and review a specified request.'
|
20
|
+
# puts ' checkout <number> Checkout a specified request\'s changes to your local repository.'
|
21
|
+
puts ' accept <number> Accept a specified request by merging it into master.'
|
22
|
+
puts ' decline <number> Decline and close a specified request.'
|
20
23
|
puts ' create Create a new request.'
|
21
|
-
puts ' merge <number> Sign off a specified request by merging it into master.'
|
22
24
|
end
|
23
25
|
|
24
26
|
# List all open requests.
|
25
27
|
def list
|
26
|
-
puts "Open
|
28
|
+
puts "Open requests for '#{source_repo}/#{source_branch}'"
|
27
29
|
option = @args.shift
|
28
30
|
open_requests = get_pull_info
|
29
31
|
open_requests.reverse! if option == '--reverse'
|
32
|
+
# TODO: Refactor to get rid of unnecessary variables and computation.
|
30
33
|
count = 0
|
34
|
+
puts 'ID Date Comments Title'
|
31
35
|
open_requests.each do |pull|
|
32
36
|
line = []
|
33
|
-
line << format_text(pull['number'],
|
34
|
-
line << format_text(Date.parse(pull['created_at']).strftime(
|
35
|
-
line << format_text(pull['comments'],
|
36
|
-
line << format_text(pull['title'],
|
37
|
-
line << format_text(pull['head']['label'], 20)
|
37
|
+
line << format_text(pull['number'], 6)
|
38
|
+
line << format_text(Date.parse(pull['created_at']).strftime('%d-%b-%y'), 10)
|
39
|
+
line << format_text(pull['comments'], 10)
|
40
|
+
line << format_text(pull['title'], 94)
|
38
41
|
sha = pull['head']['sha']
|
39
42
|
if not_merged?(sha)
|
40
43
|
puts line.join ' '
|
@@ -42,7 +45,7 @@ class GitReview
|
|
42
45
|
end
|
43
46
|
end
|
44
47
|
if count == 0
|
45
|
-
puts ' --
|
48
|
+
puts ' -- No open requests. --'
|
46
49
|
end
|
47
50
|
end
|
48
51
|
|
@@ -76,31 +79,14 @@ class GitReview
|
|
76
79
|
Launchy.open(@review['html_url']) if review_exists?
|
77
80
|
end
|
78
81
|
|
79
|
-
#
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
target_repo = "#{@user}/#{@repo}"
|
84
|
-
target_branch = 'master'
|
85
|
-
source_branch = git('branch', false).match(/\*(.*)/)[0][2..-1]
|
86
|
-
title = "Review request: #{github_login} wants to merge changes from '#{source_branch}' into #{target_repo}'s branch '#{target_branch}'."
|
87
|
-
# TODO: Insert commit messages (that are not yet in master) into body (since this will be displayed inside the mail that is sent out).
|
88
|
-
body = 'my body'
|
89
|
-
# Create the actual pull request.
|
90
|
-
Octokit.create_pull_request(target_repo, target_branch, source_branch, title, body)
|
91
|
-
# Switch back to target_branch and check for success.
|
92
|
-
git "co #{target_branch}"
|
93
|
-
update
|
94
|
-
potential_new_review = get_pull_info.find{ |review| review['title'] == title}
|
95
|
-
if potential_new_review['number'] > last_review_id
|
96
|
-
puts 'Review request successfully created.'
|
97
|
-
else
|
98
|
-
puts 'Creating new review request failed.'
|
99
|
-
end
|
82
|
+
# Checkout a specified request's changes to your local repository.
|
83
|
+
# TODO: Implement this.
|
84
|
+
def checkout
|
85
|
+
puts 'Under construction... ;-)'
|
100
86
|
end
|
101
87
|
|
102
|
-
#
|
103
|
-
def
|
88
|
+
# Accept a specified request by merging it into master.
|
89
|
+
def accept
|
104
90
|
return unless review_exists?
|
105
91
|
option = @args.shift
|
106
92
|
if @review['head']['repository']
|
@@ -118,7 +104,7 @@ class GitReview
|
|
118
104
|
return false
|
119
105
|
end
|
120
106
|
s = @review['head']['sha']
|
121
|
-
message = "
|
107
|
+
message = "Accepting request ##{@review['number']} from #{o}/#{r}\n\n---\n\n"
|
122
108
|
message += @review['body'].gsub("'", '')
|
123
109
|
if option == '--log'
|
124
110
|
message += "\n\n---\n\nMerge Log:\n"
|
@@ -129,6 +115,31 @@ class GitReview
|
|
129
115
|
exec(cmd)
|
130
116
|
end
|
131
117
|
|
118
|
+
# Decline and close a specified request.
|
119
|
+
def decline
|
120
|
+
return unless review_exists?
|
121
|
+
Octokit.post("issues/close/#{source_repo}/#{@review['number']}")
|
122
|
+
puts "Successfully declined request." unless review_exists?(@review['number'])
|
123
|
+
end
|
124
|
+
|
125
|
+
# Create a new request.
|
126
|
+
# TODO: Support creating requests to other repositories and branches (like the original repo, this has been forked from).
|
127
|
+
def create
|
128
|
+
# TODO: Create and push to a remote branch if necessary.
|
129
|
+
# Gather information.
|
130
|
+
last_review_id = get_pull_info.collect{|review| review['number']}.sort.last.to_i
|
131
|
+
title = "[Review] Request from '#{github_login}' @ '#{source_repo}/#{source_branch}'"
|
132
|
+
# TODO: Insert commit messages (that are not yet in master) into body (since this will be displayed inside the mail that is sent out).
|
133
|
+
body = "You are requested to review the following changes:"
|
134
|
+
# Create the actual pull request.
|
135
|
+
Octokit.create_pull_request(target_repo, target_branch, source_branch, title, body)
|
136
|
+
# Switch back to target_branch and check for success.
|
137
|
+
git "co #{target_branch}"
|
138
|
+
update
|
139
|
+
potential_new_review = get_pull_info.find{ |review| review['title'] == title}
|
140
|
+
puts 'Review request successfully created.' if potential_new_review['number'] > last_review_id
|
141
|
+
end
|
142
|
+
|
132
143
|
# Start a console session (used for debugging).
|
133
144
|
def console
|
134
145
|
puts 'Entering debug console.'
|
@@ -165,8 +176,15 @@ class GitReview
|
|
165
176
|
end
|
166
177
|
|
167
178
|
# Check existence of specified review and assign @review.
|
168
|
-
def review_exists?
|
169
|
-
review_id
|
179
|
+
def review_exists?(review_id = nil)
|
180
|
+
# NOTE: If review_id is not set explicitly we might need to update to get the
|
181
|
+
# latest changes from GitHub, as this is called from within another method.
|
182
|
+
update if review_id.nil?
|
183
|
+
review_id ||= @args.shift.to_i
|
184
|
+
if review_id == 0
|
185
|
+
puts "Please specify a valid ID."
|
186
|
+
return false
|
187
|
+
end
|
170
188
|
@review = get_pull_info.find{ |review| review['number'] == review_id}
|
171
189
|
puts "Review '#{review_id}' does not exist." unless @review
|
172
190
|
not @review.nil?
|
@@ -184,6 +202,28 @@ class GitReview
|
|
184
202
|
info.to_s.gsub("\n", ' ')[0, size].ljust(size)
|
185
203
|
end
|
186
204
|
|
205
|
+
# Returns a string that specifies the source repo.
|
206
|
+
def source_repo
|
207
|
+
"#{@user}/#{@repo}"
|
208
|
+
end
|
209
|
+
|
210
|
+
# Returns a string that specifies the source branch.
|
211
|
+
def source_branch
|
212
|
+
git('branch', false).match(/\*(.*)/)[0][2..-1]
|
213
|
+
end
|
214
|
+
|
215
|
+
# Returns a string that specifies the target repo.
|
216
|
+
def target_repo
|
217
|
+
# TODO: Enable possibility to manually override this and set arbitrary repositories.
|
218
|
+
source_repo
|
219
|
+
end
|
220
|
+
|
221
|
+
# Returns a string that specifies the target branch.
|
222
|
+
def target_branch
|
223
|
+
# TODO: Enable possibility to manually override this and set arbitrary branches.
|
224
|
+
'master'
|
225
|
+
end
|
226
|
+
|
187
227
|
def fetch_stale_forks
|
188
228
|
pulls = get_pull_info
|
189
229
|
repos = {}
|
@@ -263,7 +303,7 @@ class GitReview
|
|
263
303
|
end
|
264
304
|
|
265
305
|
def cache_pull_info
|
266
|
-
response = Octokit.pull_requests(
|
306
|
+
response = Octokit.pull_requests(source_repo)
|
267
307
|
save_data({'review' => response}, REVIEW_CACHE_FILE)
|
268
308
|
end
|
269
309
|
|
metadata
CHANGED
@@ -5,17 +5,17 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 5
|
9
|
+
- 0
|
10
|
+
version: 0.5.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
|
-
-
|
13
|
+
- Dominik Bamberger, Cristian Messel
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-14 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -62,7 +62,7 @@ dependencies:
|
|
62
62
|
version: 0.5.1
|
63
63
|
type: :runtime
|
64
64
|
version_requirements: *id003
|
65
|
-
description:
|
65
|
+
description: Manage review workflow for projects hosted on GitHub (using pull requests).
|
66
66
|
email: bamberger.dominik@gmail.com
|
67
67
|
executables:
|
68
68
|
- git-review
|
@@ -107,6 +107,6 @@ rubyforge_project:
|
|
107
107
|
rubygems_version: 1.5.2
|
108
108
|
signing_key:
|
109
109
|
specification_version: 3
|
110
|
-
summary: facilitates
|
110
|
+
summary: facilitates GitHub code reviews
|
111
111
|
test_files: []
|
112
112
|
|