git-review 0.6.1 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/git-review.rb +38 -37
- metadata +4 -4
data/lib/git-review.rb
CHANGED
@@ -11,14 +11,14 @@ class GitReview
|
|
11
11
|
def help
|
12
12
|
puts 'Usage: git review <command>'
|
13
13
|
puts 'Manage review workflow for projects hosted on GitHub (using pull requests).'
|
14
|
-
puts
|
14
|
+
puts
|
15
15
|
puts 'Available commands:'
|
16
16
|
puts ' list [--reverse] List all pending requests.'
|
17
17
|
puts ' show <number> [--full] Show details of a single request.'
|
18
18
|
puts ' browse <number> Open a browser window and review a specified request.'
|
19
19
|
puts ' checkout <number> Checkout a specified request\'s changes to your local repository.'
|
20
|
-
puts '
|
21
|
-
puts '
|
20
|
+
puts ' merge <number> Accept a specified request by merging it into master.'
|
21
|
+
puts ' close <number> Close a specified request.'
|
22
22
|
puts ' create Create a new request.'
|
23
23
|
end
|
24
24
|
|
@@ -41,7 +41,7 @@ class GitReview
|
|
41
41
|
return
|
42
42
|
end
|
43
43
|
puts "Pending requests for '#{source}'"
|
44
|
-
puts 'ID
|
44
|
+
puts 'ID Updated Comments Title'
|
45
45
|
puts output.compact
|
46
46
|
end
|
47
47
|
|
@@ -55,15 +55,14 @@ class GitReview
|
|
55
55
|
puts "Created : #{@pending_request['created_at']}"
|
56
56
|
puts "Votes : #{@pending_request['votes']}"
|
57
57
|
puts "Comments : #{@pending_request['comments']}"
|
58
|
-
puts
|
58
|
+
puts
|
59
59
|
puts "Title : #{@pending_request['title']}"
|
60
|
-
puts
|
61
|
-
puts
|
60
|
+
puts 'Body :'
|
61
|
+
puts
|
62
62
|
puts @pending_request['body']
|
63
|
-
puts
|
63
|
+
puts
|
64
64
|
puts '------------'
|
65
|
-
puts
|
66
|
-
puts "cmd: git diff #{option}HEAD...#{sha}"
|
65
|
+
puts
|
67
66
|
puts git("diff --color=always #{option}HEAD...#{sha}")
|
68
67
|
end
|
69
68
|
|
@@ -74,11 +73,17 @@ class GitReview
|
|
74
73
|
|
75
74
|
# Checkout a specified request's changes to your local repository.
|
76
75
|
def checkout
|
77
|
-
|
76
|
+
return unless request_exists?
|
77
|
+
puts 'Checking out changes to your local repository.'
|
78
|
+
puts 'To get back to your original state, just run:'
|
79
|
+
puts
|
80
|
+
puts ' git checkout master'
|
81
|
+
puts
|
82
|
+
git "checkout origin/#{@pending_request['head']['ref']}"
|
78
83
|
end
|
79
84
|
|
80
85
|
# Accept a specified request by merging it into master.
|
81
|
-
def
|
86
|
+
def merge
|
82
87
|
return unless request_exists?
|
83
88
|
option = @args.shift
|
84
89
|
unless @pending_request['head']['repository']
|
@@ -86,25 +91,28 @@ class GitReview
|
|
86
91
|
user = @pending_request['head']['user']['login']
|
87
92
|
url = @pending_request['patch_url']
|
88
93
|
puts "Sorry, #{user} deleted the source repository, git-review doesn't support this."
|
89
|
-
puts
|
94
|
+
puts 'You can manually patch your repo by running:'
|
90
95
|
puts
|
91
96
|
puts " curl #{url} | git am"
|
92
97
|
puts
|
93
|
-
puts
|
98
|
+
puts 'Tell the contributor not to do this.'
|
94
99
|
return false
|
95
100
|
end
|
96
101
|
message = "Accepting request and merging into '#{target}':\n\n"
|
97
102
|
message += "#{@pending_request['title']}\n\n"
|
98
103
|
message += "#{@pending_request['body']}\n\n"
|
99
|
-
|
100
|
-
|
104
|
+
exec_cmd = "merge --no-ff #{option} -m '#{message}' #{@pending_request['head']['sha']}"
|
105
|
+
puts
|
106
|
+
puts " git #{exec_cmd}"
|
107
|
+
puts
|
108
|
+
git(exec_cmd)
|
101
109
|
end
|
102
110
|
|
103
|
-
#
|
104
|
-
def
|
111
|
+
# Close a specified request.
|
112
|
+
def close
|
105
113
|
return unless request_exists?
|
106
114
|
Octokit.post("issues/close/#{source_repo}/#{@pending_request['number']}")
|
107
|
-
puts
|
115
|
+
puts 'Successfully closed request.' unless request_exists?(@pending_request['number'])
|
108
116
|
end
|
109
117
|
|
110
118
|
# Create a new request.
|
@@ -115,11 +123,11 @@ class GitReview
|
|
115
123
|
last_request_id = @pending_requests.collect{|req| req['number'] }.sort.last.to_i
|
116
124
|
title = "[Review] Request from '#{github_login}' @ '#{source}'"
|
117
125
|
# TODO: Insert commit messages (that are not yet in master) into body (since this will be displayed inside the mail that is sent out).
|
118
|
-
body =
|
126
|
+
body = 'Please review the following changes:'
|
119
127
|
# Create the actual pull request.
|
120
128
|
Octokit.create_pull_request(target_repo, target_branch, source_branch, title, body)
|
121
129
|
# Switch back to target_branch and check for success.
|
122
|
-
git "
|
130
|
+
git "commit #{target_branch}"
|
123
131
|
update
|
124
132
|
potential_new_request = @pending_requests.find{ |req| req['title'] == title }
|
125
133
|
puts 'Successfully created new request.' if potential_new_request['number'] > last_request_id
|
@@ -161,7 +169,7 @@ class GitReview
|
|
161
169
|
update unless request_id.nil?
|
162
170
|
request_id ||= @args.shift.to_i
|
163
171
|
if request_id == 0
|
164
|
-
puts
|
172
|
+
puts 'Please specify a valid ID.'
|
165
173
|
return false
|
166
174
|
end
|
167
175
|
@pending_request = @pending_requests.find{ |req| req['number'] == request_id }
|
@@ -174,9 +182,7 @@ class GitReview
|
|
174
182
|
@pending_requests = Octokit.pull_requests(source_repo)
|
175
183
|
repos = @pending_requests.collect do |req|
|
176
184
|
repo = req['head']['repository']
|
177
|
-
#
|
178
|
-
next if repo.nil? or not has_sha?(req['head']['sha'])
|
179
|
-
"#{repo['owner']}/#{repo['name']}"
|
185
|
+
"#{repo['owner']}/#{repo['name']}" unless repo.nil?
|
180
186
|
end
|
181
187
|
host = URI.parse(github_endpoint).host
|
182
188
|
repos.uniq.compact.each do |repo|
|
@@ -185,7 +191,7 @@ class GitReview
|
|
185
191
|
end
|
186
192
|
|
187
193
|
# System call to 'git'.
|
188
|
-
def git(command, chomp=true)
|
194
|
+
def git(command, chomp = true)
|
189
195
|
s = `git #{command}`
|
190
196
|
s.chomp! if chomp
|
191
197
|
s
|
@@ -228,13 +234,6 @@ class GitReview
|
|
228
234
|
"#{target_repo}/#{target_branch}"
|
229
235
|
end
|
230
236
|
|
231
|
-
# Returns a boolean stating whether a specified commit exists.
|
232
|
-
# TODO: Check if this is still necessary, since we don't cache anymore.
|
233
|
-
def has_sha?(sha)
|
234
|
-
git("show #{sha} 2>&1")
|
235
|
-
$?.exitstatus == 0
|
236
|
-
end
|
237
|
-
|
238
237
|
# Returns a boolean stating whether a specified commit has already been merged.
|
239
238
|
def merged?(sha)
|
240
239
|
not git("rev-list #{sha} ^HEAD 2>&1").split("\n").size > 0
|
@@ -256,20 +255,21 @@ class GitReview
|
|
256
255
|
|
257
256
|
# Get GitHub user name.
|
258
257
|
def github_login
|
259
|
-
git(
|
258
|
+
git('config --get-all github.user')
|
260
259
|
end
|
261
260
|
|
262
261
|
# Get GitHub token.
|
263
262
|
def github_token
|
264
|
-
git(
|
263
|
+
git('config --get-all github.token')
|
265
264
|
end
|
266
265
|
|
267
266
|
# Determine GitHub endpoint (defaults to 'https://github.com/').
|
268
267
|
def github_endpoint
|
269
|
-
host = git(
|
268
|
+
host = git('config --get-all github.host')
|
270
269
|
host.empty? ? 'https://github.com/' : host
|
271
270
|
end
|
272
271
|
|
272
|
+
# Returns an array consisting of information on the user and the project.
|
273
273
|
def repo_info
|
274
274
|
# Read config_hash from local git config.
|
275
275
|
config_hash = {}
|
@@ -281,7 +281,7 @@ class GitReview
|
|
281
281
|
# Extract user and project name from GitHub URL.
|
282
282
|
url = config_hash['remote.origin.url']
|
283
283
|
user, project = github_user_and_project(url)
|
284
|
-
|
284
|
+
# If there are no results yet, look for 'insteadof' substitutions in URL and try again.
|
285
285
|
unless (user and project)
|
286
286
|
short, base = github_insteadof_matching(config_hash, url)
|
287
287
|
if short and base
|
@@ -292,6 +292,7 @@ class GitReview
|
|
292
292
|
[user, project]
|
293
293
|
end
|
294
294
|
|
295
|
+
# Looks for 'insteadof' substitutions in URL.
|
295
296
|
def github_insteadof_matching(config_hash, url)
|
296
297
|
first = config_hash.collect { |key,value|
|
297
298
|
[value, /url\.(.*github\.com.*)\.insteadof/.match(key)]
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-review
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 1
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 0.6.
|
9
|
+
- 3
|
10
|
+
version: 0.6.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dominik Bamberger, Cristian Messel
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-11-09 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|