git-topic 0.2.3.1 → 0.2.3.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/VERSION.yml +1 -1
- data/bin/git-topic-completion +11 -0
- data/lib/git_topic/cli.rb +10 -5
- data/lib/git_topic/git.rb +3 -2
- data/lib/git_topic/naming.rb +19 -18
- data/lib/git_topic.rb +56 -5
- data/share/completion.bash +10 -0
- data/spec/git_topic_accept_spec.rb +0 -3
- data/spec/git_topic_comment_spec.rb +0 -4
- data/spec/git_topic_comments_spec.rb +83 -20
- data/spec/git_topic_done_spec.rb +62 -1
- data/spec/git_topic_reject_spec.rb +56 -2
- data/spec/git_topic_review_spec.rb +0 -3
- data/spec/git_topic_setup_spec.rb +86 -0
- data/spec/git_topic_status_spec.rb +0 -2
- data/spec/git_topic_work_on_spec.rb +0 -2
- data/spec/spec_helper.rb +16 -2
- metadata +5 -3
data/VERSION.yml
CHANGED
data/bin/git-topic-completion
CHANGED
@@ -35,6 +35,14 @@ module GitTopic::Completion
|
|
35
35
|
end.compact
|
36
36
|
end
|
37
37
|
|
38
|
+
def all_reject_and_review_branches
|
39
|
+
branches.map do |b|
|
40
|
+
b =~ %r{^remotes/origin/(rejected|review)/(\S*)/(.*)}
|
41
|
+
suggestion = [$1,($2 unless $2 == user), $3].compact.join("/")
|
42
|
+
suggestion unless suggestion.strip.empty?
|
43
|
+
end.compact
|
44
|
+
end
|
45
|
+
|
38
46
|
def complete
|
39
47
|
suggestions =
|
40
48
|
case ARGV.shift
|
@@ -42,8 +50,11 @@ module GitTopic::Completion
|
|
42
50
|
# others_review_branches here
|
43
51
|
when "accept"
|
44
52
|
when "reject"
|
53
|
+
when "comment"
|
45
54
|
when "done"
|
46
55
|
# nothing
|
56
|
+
when "comments"
|
57
|
+
all_reject_and_review_branches
|
47
58
|
when "work-on"
|
48
59
|
my_reject_review_and_all_wip_branches
|
49
60
|
when "review"
|
data/lib/git_topic/cli.rb
CHANGED
@@ -161,11 +161,11 @@ module GitTopic
|
|
161
161
|
".oneline
|
162
162
|
when "comments"
|
163
163
|
banner "
|
164
|
-
git[-topic] comments
|
164
|
+
git[-topic] comments [<topic>]
|
165
165
|
|
166
|
-
View the comments for the current topic.
|
167
|
-
rejected, you should read these comments so you
|
168
|
-
appease the reviewer.
|
166
|
+
View the comments for <topic>, which defaults to the current topic.
|
167
|
+
If your branch was rejected, you should read these comments so you
|
168
|
+
know what to do to appease the reviewer.
|
169
169
|
|
170
170
|
Options:
|
171
171
|
".cleanup
|
@@ -221,6 +221,8 @@ module GitTopic
|
|
221
221
|
end
|
222
222
|
end
|
223
223
|
|
224
|
+
check_for_setup unless cmd == "setup"
|
225
|
+
|
224
226
|
opts = global_opts.merge( cmd_opts )
|
225
227
|
display_git_output! if opts[:verbose]
|
226
228
|
|
@@ -243,7 +245,8 @@ module GitTopic
|
|
243
245
|
when "comment"
|
244
246
|
comment opts
|
245
247
|
when "comments"
|
246
|
-
|
248
|
+
spec = ARGV.shift
|
249
|
+
comments spec, opts
|
247
250
|
when "accept"
|
248
251
|
topic = ARGV.shift
|
249
252
|
accept topic, opts
|
@@ -252,6 +255,8 @@ module GitTopic
|
|
252
255
|
reject topic, opts
|
253
256
|
when "install-aliases"
|
254
257
|
install_aliases opts
|
258
|
+
when "setup"
|
259
|
+
setup opts
|
255
260
|
end
|
256
261
|
rescue => error
|
257
262
|
puts "Error: #{error.message}"
|
data/lib/git_topic/git.rb
CHANGED
@@ -51,8 +51,9 @@ module GitTopic::Git
|
|
51
51
|
not capture_git( "notes --ref #{ref} list" ).chomp.empty?
|
52
52
|
end
|
53
53
|
|
54
|
-
def existing_comments
|
55
|
-
|
54
|
+
def existing_comments( spec=nil )
|
55
|
+
ref = notes_ref( *[ spec ].compact )
|
56
|
+
capture_git( "notes --ref #{ref} show" ).chomp
|
56
57
|
end
|
57
58
|
|
58
59
|
|
data/lib/git_topic/naming.rb
CHANGED
@@ -44,25 +44,20 @@ module GitTopic::Naming
|
|
44
44
|
|
45
45
|
|
46
46
|
def notes_ref( branch=current_branch )
|
47
|
-
user, topic = user_topic_name( branch )
|
47
|
+
user, topic = user_topic_name( branch, :lookup => true )
|
48
48
|
"refs/notes/reviews/#{user}/#{topic}"
|
49
49
|
end
|
50
50
|
|
51
51
|
|
52
|
-
def user_topic_name(
|
53
|
-
|
54
|
-
|
55
|
-
[$1, $2]
|
56
|
-
elsif branch =~ %r{^(?:\S*/)?(\S*?)/(\S*)}
|
57
|
-
[$1, $2]
|
58
|
-
else
|
59
|
-
raise "Cannot compute user_topic for [#{branch}]"
|
60
|
-
end
|
52
|
+
def user_topic_name( ref, opts={} )
|
53
|
+
p = topic_parts( ref, opts )
|
54
|
+
[ p[:user], p[:topic ] ]
|
61
55
|
end
|
62
56
|
|
63
|
-
def topic_parts( ref )
|
57
|
+
def topic_parts( ref, opts={} )
|
64
58
|
p = {}
|
65
59
|
parts = ref.split( '/' )
|
60
|
+
parts.shift if parts.first == "origin"
|
66
61
|
case parts.size
|
67
62
|
when 3
|
68
63
|
p[:namespace], p[:user], p[:topic] = parts
|
@@ -74,6 +69,19 @@ module GitTopic::Naming
|
|
74
69
|
else
|
75
70
|
raise "Unexpected topic: #{ref}"
|
76
71
|
end
|
72
|
+
|
73
|
+
if opts[:lookup] && p[:user].nil?
|
74
|
+
remote_branches_organized.find do |namespace, v|
|
75
|
+
v.find do |user, vv|
|
76
|
+
if vv.find{ |topic| topic == p[:topic] }
|
77
|
+
p[:user] = user
|
78
|
+
p[:namespace] = namespace
|
79
|
+
true
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
77
85
|
p
|
78
86
|
end
|
79
87
|
|
@@ -141,13 +149,6 @@ module GitTopic::Naming
|
|
141
149
|
namespace_ut[:review] ||= {}
|
142
150
|
namespace_ut[:rejected] ||= {}
|
143
151
|
|
144
|
-
namespace_ut[:rejected].each do |user, topics|
|
145
|
-
topics.map! do |topic|
|
146
|
-
suffix = " (reviewer comments) "
|
147
|
-
"#{topic}#{suffix if existing_comments?( "#{user}/#{topic}" )}"
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
152
|
namespace_ut[:review].reject!{|k,v| k == user}
|
152
153
|
namespace_ut
|
153
154
|
)
|
data/lib/git_topic.rb
CHANGED
@@ -76,8 +76,13 @@ module GitTopic
|
|
76
76
|
|
77
77
|
wb = wip_branch( topic )
|
78
78
|
rb = review_branch( topic )
|
79
|
+
refspecs = [
|
80
|
+
"refs/heads/#{wb}:refs/heads/#{rb}",
|
81
|
+
":refs/heads/#{wb}",
|
82
|
+
"refs/notes/reviews/*:refs/notes/reviews/*"
|
83
|
+
].join( " " )
|
79
84
|
git [
|
80
|
-
"push origin
|
85
|
+
"push origin #{refspecs}",
|
81
86
|
("checkout master" if strip_namespace( topic ) == current_topic),
|
82
87
|
"branch -D #{wip_branch( topic )}"
|
83
88
|
].compact
|
@@ -119,7 +124,11 @@ module GitTopic
|
|
119
124
|
end.join( "\n" )
|
120
125
|
end
|
121
126
|
|
122
|
-
rejected_topics = rejected_ut[ user ] || []
|
127
|
+
rejected_topics = (rejected_ut[ user ] || []).dup
|
128
|
+
rejected_topics.map! do |topic|
|
129
|
+
suffix = " (reviewer comments) "
|
130
|
+
"#{topic}#{suffix if existing_comments?( "#{user}/#{topic}" )}"
|
131
|
+
end
|
123
132
|
unless rejected_topics.empty?
|
124
133
|
sb << "\n" unless review_ut.empty?
|
125
134
|
verb = rejected_topics.size == 1 ? 'is' : 'are'
|
@@ -261,13 +270,14 @@ module GitTopic
|
|
261
270
|
report "Your comments have been saved."
|
262
271
|
end
|
263
272
|
|
264
|
-
def comments( opts={} )
|
265
|
-
|
273
|
+
def comments( spec=nil, opts={} )
|
274
|
+
args = [ spec ].compact
|
275
|
+
unless existing_comments? *args
|
266
276
|
puts "There are no comments on this branch."
|
267
277
|
return
|
268
278
|
end
|
269
279
|
|
270
|
-
git "log origin/master.. --show-notes=#{notes_ref} --no-standard-notes",
|
280
|
+
git "log origin/master.. --show-notes=#{notes_ref *args} --no-standard-notes",
|
271
281
|
:show => true
|
272
282
|
end
|
273
283
|
|
@@ -301,6 +311,7 @@ module GitTopic
|
|
301
311
|
refspecs = [
|
302
312
|
"refs/heads/#{current_branch}:refs/heads/#{rem_rej_branch}",
|
303
313
|
":refs/heads/#{rem_review_branch}",
|
314
|
+
"refs/notes/reviews/*:refs/notes/reviews/*"
|
304
315
|
].join( " " )
|
305
316
|
git [
|
306
317
|
"checkout master",
|
@@ -312,6 +323,15 @@ module GitTopic
|
|
312
323
|
end
|
313
324
|
|
314
325
|
|
326
|
+
# Setup .git/config.
|
327
|
+
#
|
328
|
+
# This amounts to setting up refspecs for origin fetching for review
|
329
|
+
# comments.
|
330
|
+
def setup( opts={} )
|
331
|
+
return if has_setup_refspec?
|
332
|
+
git "config --add remote.origin.fetch refs/notes/reviews/*:refs/notes/reviews/*"
|
333
|
+
end
|
334
|
+
|
315
335
|
def install_aliases( opts={} )
|
316
336
|
opts.assert_valid_keys :local, :local_given, *GlobalOptKeys
|
317
337
|
|
@@ -350,6 +370,37 @@ module GitTopic
|
|
350
370
|
end
|
351
371
|
end
|
352
372
|
|
373
|
+
|
374
|
+
def check_for_setup
|
375
|
+
git_dir = `git rev-parse --git-dir 2> /dev/null`.chomp
|
376
|
+
return if git_dir.empty?
|
377
|
+
|
378
|
+
suppress_whine = `git config topic.checkForNotesRef`.chomp == "false"
|
379
|
+
return if suppress_whine
|
380
|
+
|
381
|
+
unless has_setup_refspec?
|
382
|
+
STDERR.puts "
|
383
|
+
Warning: git repository is not set up for git topic. Review comments
|
384
|
+
will not automatically be pulled on git fetch. You have two options
|
385
|
+
for suppressing this message:
|
386
|
+
|
387
|
+
1. Run git-topic setup to setup fetch refspecs for origin.
|
388
|
+
2. Run git config topic.checkForNotesRef false.
|
389
|
+
If you do this, you can manually fetch reviewers' comments with
|
390
|
+
the following command
|
391
|
+
|
392
|
+
git fetch origin refs/notes/reviews/*:refs/notes/reviews/*
|
393
|
+
".cleanup
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
def has_setup_refspec?
|
398
|
+
fetch_refspecs = capture_git( "config --get-all remote.origin.fetch" ).split( "\n" )
|
399
|
+
fetch_refspecs.any? do |refspec|
|
400
|
+
refspec == "refs/notes/reviews/*:refs/notes/reviews/*"
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
353
404
|
end
|
354
405
|
end
|
355
406
|
|
data/share/completion.bash
CHANGED
@@ -26,3 +26,13 @@ _git_reject() {
|
|
26
26
|
__gitcomp "$(git-topic-completion reject 2> /dev/null)"
|
27
27
|
return
|
28
28
|
}
|
29
|
+
|
30
|
+
_git_comment() {
|
31
|
+
__gitcomp "$(git-topic-completion comment 2> /dev/null)"
|
32
|
+
return
|
33
|
+
}
|
34
|
+
|
35
|
+
_git_comments() {
|
36
|
+
__gitcomp "$(git-topic-completion comments 2> /dev/null)"
|
37
|
+
return
|
38
|
+
}
|
@@ -10,7 +10,6 @@ describe GitTopic do
|
|
10
10
|
use_repo 'in-progress'
|
11
11
|
GitTopic.review 'user24601/zombie-basic'
|
12
12
|
end
|
13
|
-
after( :each ) { Dir.chdir '..' }
|
14
13
|
|
15
14
|
describe "with no specified argument" do
|
16
15
|
it "
|
@@ -52,7 +51,6 @@ describe GitTopic do
|
|
52
51
|
@original_git_Head = git_head
|
53
52
|
GitTopic.review 'user24601/zombie-basic'
|
54
53
|
end
|
55
|
-
after( :each ) { Dir.chdir '..' }
|
56
54
|
|
57
55
|
it "should refuse to accept the review branch" do
|
58
56
|
git_branch.should == 'review/user24601/zombie-basic'
|
@@ -67,7 +65,6 @@ describe GitTopic do
|
|
67
65
|
|
68
66
|
describe "while not on a review branch" do
|
69
67
|
before( :each ) { use_repo 'in-progress' }
|
70
|
-
after( :each ) { Dir.chdir '..' }
|
71
68
|
|
72
69
|
it "should fail" do
|
73
70
|
lambda{ GitTopic.accept }.should raise_error
|
@@ -125,7 +125,6 @@ describe GitTopic do
|
|
125
125
|
use_repo 'in-progress'
|
126
126
|
GitTopic.review 'user24601/zombie-basic'
|
127
127
|
end
|
128
|
-
after( :each ) { Dir.chdir '..' }
|
129
128
|
|
130
129
|
|
131
130
|
it "should fail if the diff includes added lines not prefixed with #" do
|
@@ -249,7 +248,6 @@ describe GitTopic do
|
|
249
248
|
end
|
250
249
|
end
|
251
250
|
end
|
252
|
-
after( :each ) { Dir.chdir '..' }
|
253
251
|
|
254
252
|
|
255
253
|
it "should fail if the working tree is dirty" do
|
@@ -326,7 +324,6 @@ describe GitTopic do
|
|
326
324
|
|
327
325
|
describe "on a wip branch with no comments" do
|
328
326
|
before( :each ) { use_repo 'in-progress' }
|
329
|
-
after( :each ) { Dir.chdir '..' }
|
330
327
|
|
331
328
|
it "should report that there is nothing to do" do
|
332
329
|
GitTopic.work_on 'pirates-advanced'
|
@@ -351,7 +348,6 @@ describe GitTopic do
|
|
351
348
|
end
|
352
349
|
end
|
353
350
|
end
|
354
|
-
after( :each ) { Dir.chdir '..' }
|
355
351
|
|
356
352
|
|
357
353
|
it "should fail if the working tree is dirty" do
|
@@ -5,40 +5,103 @@ describe GitTopic do
|
|
5
5
|
|
6
6
|
describe "#comments" do
|
7
7
|
|
8
|
-
describe "
|
8
|
+
describe "with an argument" do
|
9
9
|
|
10
|
-
before( :each )
|
11
|
-
use_repo 'in-progress'
|
12
|
-
GitTopic.work_on 'pirates-advanced'
|
13
|
-
end
|
14
|
-
after( :each ) { Dir.chdir '..' }
|
10
|
+
before( :each ) { use_repo 'in-progress' }
|
15
11
|
|
16
|
-
it "should report that there are no comments" do
|
17
|
-
lambda{ GitTopic.comments }.should_not raise_error
|
18
|
-
@output.should_not be_nil
|
19
|
-
@output.should =~ /no comments/i
|
20
|
-
end
|
21
|
-
end
|
22
12
|
|
13
|
+
it "shows comments for the supplied topic" do
|
14
|
+
git_branch.should == 'master'
|
15
|
+
GitTopic.should_receive( :git ) do |cmd|
|
16
|
+
cmd.should =~ /log/
|
17
|
+
cmd.should =~ %r{origin/master\.\.}
|
18
|
+
cmd.should =~ /--no-standard-notes/
|
19
|
+
cmd.should =~ %r{--show-notes=refs/notes/reviews/#{@user}/krakens}
|
20
|
+
end
|
21
|
+
GitTopic.comments 'krakens'
|
22
|
+
end
|
23
23
|
|
24
|
-
|
24
|
+
it "should strip fully qualified namespaces" do
|
25
|
+
git_branch.should == 'master'
|
26
|
+
GitTopic.should_receive( :git ) do |cmd|
|
27
|
+
cmd.should =~ /log/
|
28
|
+
cmd.should =~ %r{origin/master\.\.}
|
29
|
+
cmd.should =~ /--no-standard-notes/
|
30
|
+
cmd.should =~ %r{--show-notes=refs/notes/reviews/#{@user}/krakens}
|
31
|
+
end
|
32
|
+
GitTopic.comments "rejected/#{@user}/krakens"
|
33
|
+
end
|
25
34
|
|
26
|
-
|
27
|
-
|
28
|
-
GitTopic.
|
35
|
+
it "should strip partially qualified namespaces" do
|
36
|
+
git_branch.should == 'master'
|
37
|
+
GitTopic.should_receive( :git ) do |cmd|
|
38
|
+
cmd.should =~ /log/
|
39
|
+
cmd.should =~ %r{origin/master\.\.}
|
40
|
+
cmd.should =~ /--no-standard-notes/
|
41
|
+
cmd.should =~ %r{--show-notes=refs/notes/reviews/#{@user}/krakens}
|
42
|
+
end
|
43
|
+
GitTopic.comments "#{@user}/krakens"
|
29
44
|
end
|
30
45
|
|
31
|
-
|
46
|
+
it "should strip fully qualified namespaces for other users" do
|
47
|
+
git_branch.should == 'master'
|
48
|
+
GitTopic.should_receive( :git ) do |cmd|
|
49
|
+
cmd.should =~ /log/
|
50
|
+
cmd.should =~ %r{origin/master\.\.}
|
51
|
+
cmd.should =~ /--no-standard-notes/
|
52
|
+
cmd.should =~ %r{--show-notes=refs/notes/reviews/user24601/ninja-basic}
|
53
|
+
end
|
54
|
+
GitTopic.comments "review/user24601/ninja-basic"
|
55
|
+
end
|
32
56
|
|
33
|
-
it "should
|
57
|
+
it "should strip partially qualified namespaces for other users" do
|
58
|
+
git_branch.should == 'master'
|
34
59
|
GitTopic.should_receive( :git ) do |cmd|
|
35
60
|
cmd.should =~ /log/
|
36
61
|
cmd.should =~ %r{origin/master\.\.}
|
37
62
|
cmd.should =~ /--no-standard-notes/
|
38
|
-
cmd.should =~ %r{--show-notes=refs/notes/reviews
|
63
|
+
cmd.should =~ %r{--show-notes=refs/notes/reviews/user24601/ninja-basic}
|
39
64
|
end
|
65
|
+
GitTopic.comments "user24601/ninja-basic"
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
40
69
|
|
41
|
-
|
70
|
+
describe "with no argument" do
|
71
|
+
|
72
|
+
describe "on a branch with no comments" do
|
73
|
+
|
74
|
+
before( :each ) do
|
75
|
+
use_repo 'in-progress'
|
76
|
+
GitTopic.work_on 'pirates-advanced'
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should report that there are no comments" do
|
80
|
+
lambda{ GitTopic.comments }.should_not raise_error
|
81
|
+
@output.should_not be_nil
|
82
|
+
@output.should =~ /no comments/i
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
describe "on a branch with comments" do
|
88
|
+
|
89
|
+
before( :each ) do
|
90
|
+
use_repo 'in-progress'
|
91
|
+
GitTopic.work_on 'krakens'
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
it "should invoke git log to display the comments" do
|
96
|
+
GitTopic.should_receive( :git ) do |cmd|
|
97
|
+
cmd.should =~ /log/
|
98
|
+
cmd.should =~ %r{origin/master\.\.}
|
99
|
+
cmd.should =~ /--no-standard-notes/
|
100
|
+
cmd.should =~ %r{--show-notes=refs/notes/reviews/#{@user}/krakens}
|
101
|
+
end
|
102
|
+
|
103
|
+
lambda{ GitTopic.comments }.should_not raise_error
|
104
|
+
end
|
42
105
|
end
|
43
106
|
end
|
44
107
|
|
data/spec/git_topic_done_spec.rb
CHANGED
@@ -5,10 +5,22 @@ describe GitTopic do
|
|
5
5
|
|
6
6
|
describe "#done" do
|
7
7
|
|
8
|
+
describe "while on a branch with no local refs/notes" do
|
9
|
+
before( :each ) { use_repo 'in-progress' }
|
10
|
+
|
11
|
+
it "should not error on a missing refs/notes" do
|
12
|
+
File.exists?(
|
13
|
+
"./.git/refs/notes/reviews/"
|
14
|
+
).should == true
|
15
|
+
FileUtils.rm_rf "./.git/refs/notes/"
|
16
|
+
lambda{ GitTopic.work_on 'krakens' }.should_not raise_error
|
17
|
+
lambda{ GitTopic.done }.should_not raise_error
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
8
21
|
describe "in in-progress" do
|
9
22
|
|
10
23
|
before( :each ) { use_repo 'in-progress' }
|
11
|
-
after( :each ) { Dir.chdir '..' }
|
12
24
|
|
13
25
|
describe "without an argument" do
|
14
26
|
|
@@ -39,6 +51,55 @@ describe GitTopic do
|
|
39
51
|
git_remote_branches.should_not include( "wip/#{@user}/zombie-basic" )
|
40
52
|
git_branch.should == 'master'
|
41
53
|
end
|
54
|
+
|
55
|
+
it "should push any replies to review comments" do
|
56
|
+
GitTopic.stub!( :invoke_git_editor ) do |path|
|
57
|
+
File.open( path, 'w' ) do |f|
|
58
|
+
f.puts %Q{
|
59
|
+
I have some general comments, mostly relating to the quality of our
|
60
|
+
zombie-control policies. Basically, they're not working.
|
61
|
+
}.cleanup
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
File.open( 'zombies', 'a' ) do |f|
|
66
|
+
f.puts %Q{
|
67
|
+
# I suggest we do the following instead:
|
68
|
+
# zombies.each{ |z| reason_with( z )}
|
69
|
+
# zomies.select do |z|
|
70
|
+
# z.unconvinced?
|
71
|
+
# end.each do |z|
|
72
|
+
# destroy z
|
73
|
+
# end
|
74
|
+
# This should take care of our issues with zombies.
|
75
|
+
}.cleanup
|
76
|
+
end
|
77
|
+
GitTopic.should_receive( :invoke_git_editor ).once
|
78
|
+
GitTopic.should_receive(
|
79
|
+
:git_author_name_short
|
80
|
+
).once.and_return( "Spec 123" )
|
81
|
+
|
82
|
+
File.exists?(
|
83
|
+
"../origin/refs/notes/reviews/#{@user}/krakens"
|
84
|
+
).should == false
|
85
|
+
|
86
|
+
lambda do
|
87
|
+
GitTopic.work_on 'krakens'
|
88
|
+
cmd = [
|
89
|
+
"echo 'harder than you might think' >> kraken",
|
90
|
+
"git commit kraken -m 'working on krakens'",
|
91
|
+
].join( " && " )
|
92
|
+
cmd << " 2> /dev/null > /dev/null"
|
93
|
+
system cmd
|
94
|
+
GitTopic.comment
|
95
|
+
GitTopic.done
|
96
|
+
end.should_not raise_error
|
97
|
+
|
98
|
+
File.exists?(
|
99
|
+
"../origin/refs/notes/reviews/#{@user}/krakens"
|
100
|
+
).should == true
|
101
|
+
end
|
102
|
+
|
42
103
|
end
|
43
104
|
|
44
105
|
describe "with an argument" do
|
@@ -22,12 +22,26 @@ describe GitTopic do
|
|
22
22
|
|
23
23
|
describe "#reject" do
|
24
24
|
|
25
|
+
|
26
|
+
describe "while on a review branch in a repo with no local refs/notes" do
|
27
|
+
before( :each ) { use_repo 'in-progress' }
|
28
|
+
|
29
|
+
it "should not error on a missing refs/notes" do
|
30
|
+
File.exists?(
|
31
|
+
"./.git/refs/notes/reviews/"
|
32
|
+
).should == true
|
33
|
+
FileUtils.rm_rf "./.git/refs/notes/"
|
34
|
+
lambda{ GitTopic.review }.should_not raise_error
|
35
|
+
lambda{ GitTopic.reject }.should_not raise_error
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
25
40
|
describe "while on a review branch" do
|
26
41
|
before( :each ) do
|
27
42
|
use_repo 'in-progress'
|
28
43
|
GitTopic.review 'user24601/zombie-basic'
|
29
44
|
end
|
30
|
-
after( :each ) { Dir.chdir '..' }
|
31
45
|
|
32
46
|
describe "with no specified argument" do
|
33
47
|
it "
|
@@ -43,6 +57,47 @@ describe GitTopic do
|
|
43
57
|
git_remote_branches.should include( 'rejected/user24601/zombie-basic' )
|
44
58
|
end
|
45
59
|
|
60
|
+
it "should push any review comments" do
|
61
|
+
GitTopic.stub!( :invoke_git_editor ) do |path|
|
62
|
+
File.open( path, 'w' ) do |f|
|
63
|
+
f.puts %Q{
|
64
|
+
I have some general comments, mostly relating to the quality of our
|
65
|
+
zombie-control policies. Basically, they're not working.
|
66
|
+
}.cleanup
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
File.open( 'zombies', 'a' ) do |f|
|
71
|
+
f.puts %Q{
|
72
|
+
# I suggest we do the following instead:
|
73
|
+
# zombies.each{ |z| reason_with( z )}
|
74
|
+
# zomies.select do |z|
|
75
|
+
# z.unconvinced?
|
76
|
+
# end.each do |z|
|
77
|
+
# destroy z
|
78
|
+
# end
|
79
|
+
# This should take care of our issues with zombies.
|
80
|
+
}.cleanup
|
81
|
+
end
|
82
|
+
GitTopic.should_receive( :invoke_git_editor ).once
|
83
|
+
GitTopic.should_receive(
|
84
|
+
:git_author_name_short
|
85
|
+
).once.and_return( "Spec 123" )
|
86
|
+
|
87
|
+
File.exists?(
|
88
|
+
"../origin/refs/notes/reviews/user24601/zombie-basic"
|
89
|
+
).should == false
|
90
|
+
|
91
|
+
lambda do
|
92
|
+
GitTopic.comment
|
93
|
+
GitTopic.reject
|
94
|
+
end.should_not raise_error
|
95
|
+
|
96
|
+
File.exists?(
|
97
|
+
"../origin/refs/notes/reviews/user24601/zombie-basic"
|
98
|
+
).should == true
|
99
|
+
end
|
100
|
+
|
46
101
|
it "should provide feedback to the user" do
|
47
102
|
GitTopic.reject
|
48
103
|
$?.success?.should == true
|
@@ -100,7 +155,6 @@ describe GitTopic do
|
|
100
155
|
|
101
156
|
describe "while not on a review branch" do
|
102
157
|
before( :each ) { use_repo 'in-progress' }
|
103
|
-
after( :each ) { Dir.chdir '..' }
|
104
158
|
|
105
159
|
it "should fail" do
|
106
160
|
lambda{ GitTopic.reject }.should raise_error
|
@@ -7,7 +7,6 @@ describe GitTopic do
|
|
7
7
|
|
8
8
|
describe "with no review branches" do
|
9
9
|
before( :each ) { use_repo 'fresh' }
|
10
|
-
after( :each ) { Dir.chdir '..' }
|
11
10
|
|
12
11
|
it "should report that there is nothing to do" do
|
13
12
|
git_remote_branches.each do |b|
|
@@ -29,7 +28,6 @@ describe GitTopic do
|
|
29
28
|
end
|
30
29
|
end
|
31
30
|
end
|
32
|
-
after( :each ) { Dir.chdir '..' }
|
33
31
|
|
34
32
|
it "should switch to the sole review branch when given no arguments." do
|
35
33
|
git_remote_branches.select do |branch|
|
@@ -44,7 +42,6 @@ describe GitTopic do
|
|
44
42
|
|
45
43
|
describe "with some review branches" do
|
46
44
|
before( :each ) { use_repo 'in-progress' }
|
47
|
-
after( :each ) { Dir.chdir '..' }
|
48
45
|
|
49
46
|
it "
|
50
47
|
should create a local tracking branch for the oldest remote review
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe GitTopic do
|
5
|
+
|
6
|
+
describe "#setup" do
|
7
|
+
before( :each ) { use_repo 'in-progress' }
|
8
|
+
|
9
|
+
|
10
|
+
it "should install reviews refspec for origin" do
|
11
|
+
|
12
|
+
%x{
|
13
|
+
git config --get-all remote.origin.fetch
|
14
|
+
}.should_not =~ %r{refs/notes}
|
15
|
+
|
16
|
+
GitTopic.setup
|
17
|
+
%x{
|
18
|
+
git config --get-all remote.origin.fetch
|
19
|
+
}.should =~ %r{refs/notes}
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be idempotent" do
|
23
|
+
File.exists?( ".git/config" ).should == true
|
24
|
+
GitTopic.setup
|
25
|
+
content = File.read( ".git/config" )
|
26
|
+
GitTopic.setup
|
27
|
+
|
28
|
+
File.read( ".git/config" ).should == content
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "for any non --help command" do
|
33
|
+
|
34
|
+
describe "when not in a git repository" do
|
35
|
+
before( :each ) do
|
36
|
+
Dir.chdir '/tmp'
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should not whine" do
|
40
|
+
git_dir.should == ""
|
41
|
+
GitTopic.run
|
42
|
+
@err.should_not =~ /setup/
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "
|
47
|
+
when in a git repository that is neither setup nor configured to nowhine
|
48
|
+
".oneline do
|
49
|
+
|
50
|
+
before( :each ) { use_repo 'in-progress' }
|
51
|
+
|
52
|
+
it "should ask the user to #setup or configure no-whine" do
|
53
|
+
with_argv( [] ) do
|
54
|
+
GitTopic.run
|
55
|
+
@err.should =~ /setup/
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "when in a git repository configured for nowhining" do
|
61
|
+
before( :each ) { use_repo 'in-progress' }
|
62
|
+
|
63
|
+
it "should not whine, even when refs are not set up" do
|
64
|
+
system "git config topic.checkForNotesRef false > /dev/null 2> /dev/null"
|
65
|
+
GitTopic.run
|
66
|
+
@err.should_not =~ /setup/
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "when in a git repository that is #setup" do
|
71
|
+
|
72
|
+
before( :each ) { use_repo 'in-progress' }
|
73
|
+
|
74
|
+
it "
|
75
|
+
should not whine, regardless of whether it is configured for whining or
|
76
|
+
not
|
77
|
+
".oneline do
|
78
|
+
|
79
|
+
GitTopic.setup
|
80
|
+
GitTopic.run
|
81
|
+
@err.should_not =~ /setup/
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -8,7 +8,6 @@ describe GitTopic do
|
|
8
8
|
describe "with pending review branches" do
|
9
9
|
|
10
10
|
before( :each ) { use_repo 'in-progress' }
|
11
|
-
after( :each ) { Dir.chdir '..' }
|
12
11
|
|
13
12
|
|
14
13
|
it "should not show my review branches, but it should show others'" do
|
@@ -52,7 +51,6 @@ describe GitTopic do
|
|
52
51
|
|
53
52
|
describe "passed the --prepended flag" do
|
54
53
|
before( :each ) { use_repo 'in-progress' }
|
55
|
-
after( :each ) { Dir.chdir '..' }
|
56
54
|
|
57
55
|
it "should invoke git status before producing its output" do
|
58
56
|
GitTopic.status( :prepended => true )
|
@@ -24,7 +24,6 @@ describe GitTopic do
|
|
24
24
|
|
25
25
|
describe "in fresh" do
|
26
26
|
before( :each ) { use_repo( 'fresh' )}
|
27
|
-
after( :each ) { Dir.chdir( '..' )}
|
28
27
|
|
29
28
|
it_should_behave_like "#work_on general cases"
|
30
29
|
|
@@ -56,7 +55,6 @@ describe GitTopic do
|
|
56
55
|
describe "in in-progress" do
|
57
56
|
|
58
57
|
before( :each ) { use_repo( 'in-progress' )}
|
59
|
-
after( :each ) { Dir.chdir( '..' )}
|
60
58
|
|
61
59
|
it_should_behave_like "#work_on general cases"
|
62
60
|
|
data/spec/spec_helper.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'fileutils'
|
4
4
|
|
5
5
|
require 'git_topic'
|
6
|
+
require 'git_topic/cli'
|
6
7
|
|
7
8
|
|
8
9
|
# Testing-specific monkeypatching # {{{
|
@@ -105,7 +106,7 @@ Rspec.configure do |c|
|
|
105
106
|
end
|
106
107
|
Dir.chdir @starting_dir
|
107
108
|
end
|
108
|
-
Dir.chdir
|
109
|
+
Dir.chdir "#{@starting_dir}/tmp"
|
109
110
|
|
110
111
|
# capture output
|
111
112
|
@output = ''
|
@@ -127,10 +128,14 @@ end
|
|
127
128
|
def use_repo( repo )
|
128
129
|
Dir.chdir( repo )
|
129
130
|
# Exit if e.g. GIT_DIR is set
|
130
|
-
raise "Spec error" unless
|
131
|
+
raise "Spec error" unless git_dir == '.git'
|
131
132
|
end
|
132
133
|
|
133
134
|
|
135
|
+
def git_dir
|
136
|
+
`git rev-parse --git-dir 2> /dev/null`.chomp
|
137
|
+
end
|
138
|
+
|
134
139
|
def git_branch
|
135
140
|
all_branches = `git branch --no-color`.split( "\n" )
|
136
141
|
current_branch = all_branches.find{|b| b =~ /^\*/}
|
@@ -190,5 +195,14 @@ def dirty_branch!
|
|
190
195
|
system "git add -N dirty"
|
191
196
|
end
|
192
197
|
|
198
|
+
|
199
|
+
def with_argv( val )
|
200
|
+
restore = ARGV.dup
|
201
|
+
ARGV.replace( val )
|
202
|
+
rv = yield
|
203
|
+
ARGV.replace( restore )
|
204
|
+
rv
|
205
|
+
end
|
206
|
+
|
193
207
|
# }}}
|
194
208
|
|
metadata
CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
6
6
|
- 0
|
7
7
|
- 2
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.2.3.
|
9
|
+
- 2
|
10
|
+
version: 0.2.3.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- David J. Hamilton
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-07-
|
18
|
+
date: 2010-07-29 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -187,6 +187,7 @@ files:
|
|
187
187
|
- spec/git_topic_install_aliases_spec.rb
|
188
188
|
- spec/git_topic_reject_spec.rb
|
189
189
|
- spec/git_topic_review_spec.rb
|
190
|
+
- spec/git_topic_setup_spec.rb
|
190
191
|
- spec/git_topic_status_spec.rb
|
191
192
|
- spec/git_topic_work_on_spec.rb
|
192
193
|
- spec/spec_helper.rb
|
@@ -302,6 +303,7 @@ test_files:
|
|
302
303
|
- spec/comment_spec.rb
|
303
304
|
- spec/git_topic_comment_spec.rb
|
304
305
|
- spec/spec_helper.rb
|
306
|
+
- spec/git_topic_setup_spec.rb
|
305
307
|
- spec/git_topic_work_on_spec.rb
|
306
308
|
- spec/git_topic_done_spec.rb
|
307
309
|
- spec/bash_completion.rb
|