git-topic 0.1.6.4 → 0.2.1
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/.vimspell.utf8.add +9 -0
- data/.vimspell.utf8.add.spl +0 -0
- data/README.rdoc +57 -27
- data/Rakefile +10 -0
- data/VERSION.yml +3 -3
- data/bin/git-topic-completion +58 -0
- data/lib/core_ext.rb +74 -12
- data/lib/git_topic.rb +145 -12
- data/lib/git_topic/cli.rb +105 -13
- data/lib/git_topic/comment.rb +273 -0
- data/lib/git_topic/git.rb +66 -3
- data/lib/git_topic/naming.rb +26 -5
- data/share/completion.bash +28 -0
- data/spec/bash_completion.rb +2 -0
- data/spec/comment_spec.rb +396 -0
- data/spec/git_topic_accept_spec.rb +78 -0
- data/spec/git_topic_comment_spec.rb +393 -0
- data/spec/git_topic_comments_spec.rb +47 -0
- data/spec/git_topic_done_spec.rb +94 -0
- data/spec/git_topic_install_aliases_spec.rb +32 -0
- data/spec/git_topic_reject_spec.rb +112 -0
- data/spec/git_topic_review_spec.rb +115 -0
- data/spec/git_topic_status_spec.rb +63 -0
- data/spec/git_topic_work_on_spec.rb +121 -0
- data/spec/spec_helper.rb +136 -0
- metadata +34 -11
- data/git-topic +0 -13
- data/git-topic.gemspec +0 -190
- data/spec/git_topic_spec.rb +0 -502
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe GitTopic do
|
5
|
+
|
6
|
+
describe "#comments" do
|
7
|
+
|
8
|
+
describe "on a branch with no comments" do
|
9
|
+
|
10
|
+
before( :each ) do
|
11
|
+
use_repo 'in-progress'
|
12
|
+
GitTopic.work_on 'pirates-advanced'
|
13
|
+
end
|
14
|
+
after( :each ) { Dir.chdir '..' }
|
15
|
+
|
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
|
+
|
23
|
+
|
24
|
+
describe "on a branch with comments" do
|
25
|
+
|
26
|
+
before( :each ) do
|
27
|
+
use_repo 'in-progress'
|
28
|
+
GitTopic.work_on 'krakens'
|
29
|
+
end
|
30
|
+
|
31
|
+
after( :each ) { Dir.chdir '..' }
|
32
|
+
|
33
|
+
it "should invoke git log to display the comments" do
|
34
|
+
GitTopic.should_receive( :git ) do |cmd|
|
35
|
+
cmd.should =~ /log/
|
36
|
+
cmd.should =~ %r{origin/master\.\.}
|
37
|
+
cmd.should =~ /--no-standard-notes/
|
38
|
+
cmd.should =~ %r{--show-notes=refs/notes/reviews/#{@user}/krakens}
|
39
|
+
end
|
40
|
+
|
41
|
+
lambda{ GitTopic.comments }.should_not raise_error
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe GitTopic do
|
5
|
+
|
6
|
+
describe "#done" do
|
7
|
+
|
8
|
+
describe "in in-progress" do
|
9
|
+
|
10
|
+
before( :each ) { use_repo 'in-progress' }
|
11
|
+
after( :each ) { Dir.chdir '..' }
|
12
|
+
|
13
|
+
describe "without an argument" do
|
14
|
+
|
15
|
+
it "should fail if the working tree is dirty" do
|
16
|
+
GitTopic.work_on 'zombie-basic'
|
17
|
+
dirty_branch!
|
18
|
+
|
19
|
+
lambda{ GitTopic.done }.should raise_error
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should fail if not on a wip branch" do
|
23
|
+
`git checkout master > /dev/null 2> /dev/null`
|
24
|
+
lambda{ GitTopic.done }.should raise_error
|
25
|
+
end
|
26
|
+
|
27
|
+
it "
|
28
|
+
should push the wip branch to origin in the review namespace, delete the
|
29
|
+
local branch, and leave the user on master
|
30
|
+
".oneline do
|
31
|
+
|
32
|
+
git_branches.should include( "wip/#{@user}/zombie-basic" )
|
33
|
+
git_remote_branches.should_not include( "review/#{@user}/zombie-basic" )
|
34
|
+
GitTopic.work_on 'zombie-basic'
|
35
|
+
GitTopic.done
|
36
|
+
|
37
|
+
git_branches.should_not include( "wip/#{@user}/zombie-basic" )
|
38
|
+
git_remote_branches.should include( "review/#{@user}/zombie-basic" )
|
39
|
+
git_remote_branches.should_not include( "wip/#{@user}/zombie-basic" )
|
40
|
+
git_branch.should == 'master'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "with an argument" do
|
45
|
+
|
46
|
+
it "should fail for non-wip branch arguments" do
|
47
|
+
git_branches.should_not include( "wip/#{@user}/invalid-branch" )
|
48
|
+
lambda{ GitTopic.done( 'invalid-branch' )}.should raise_error
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should succeed for superfluous wip-branch arguments" do
|
52
|
+
git_branches.should include( "wip/#{@user}/zombie-basic" )
|
53
|
+
git_remote_branches.should_not include( "review/#{@user}/zombie-basic" )
|
54
|
+
GitTopic.work_on 'zombie-basic'
|
55
|
+
GitTopic.done( 'zombie-basic' )
|
56
|
+
|
57
|
+
git_branches.should_not include( "wip/#{@user}/zombie-basic" )
|
58
|
+
git_remote_branches.should include( "review/#{@user}/zombie-basic" )
|
59
|
+
git_remote_branches.should_not include( "wip/#{@user}/zombie-basic" )
|
60
|
+
git_branch.should == 'master'
|
61
|
+
end
|
62
|
+
|
63
|
+
it "
|
64
|
+
should succeed for wip-branch arguments, and leave the user on the
|
65
|
+
same branch
|
66
|
+
".oneline do
|
67
|
+
git_branches.should include( "wip/#{@user}/pirates-advanced" )
|
68
|
+
git_branches.should include( "wip/#{@user}/zombie-basic" )
|
69
|
+
git_remote_branches.should_not include( "review/#{@user}/zombie-basic" )
|
70
|
+
|
71
|
+
GitTopic.work_on 'pirates-advanced'
|
72
|
+
GitTopic.done 'zombie-basic'
|
73
|
+
|
74
|
+
git_branch.should == "wip/#{@user}/pirates-advanced"
|
75
|
+
git_branches.should_not include( "wip/#{@user}/zombie-basic" )
|
76
|
+
git_remote_branches.should include( "review/#{@user}/zombie-basic" )
|
77
|
+
git_remote_branches.should_not include( "wip/#{@user}/zombie-basic" )
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should succeed for fully-qualified wip-branch arguments" do
|
81
|
+
git_branches.should include( "wip/#{@user}/zombie-basic" )
|
82
|
+
git_remote_branches.should_not include( "review/#{@user}/zombie-basic" )
|
83
|
+
GitTopic.done( "wip/#{@user}/zombie-basic" )
|
84
|
+
|
85
|
+
git_branches.should_not include( "wip/#{@user}/zombie-basic" )
|
86
|
+
git_remote_branches.should include( "review/#{@user}/zombie-basic" )
|
87
|
+
git_remote_branches.should_not include( "wip/#{@user}/zombie-basic" )
|
88
|
+
git_branch.should == 'master'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe GitTopic do
|
5
|
+
|
6
|
+
describe "#install_aliases" do
|
7
|
+
it "should install aliases" do
|
8
|
+
GitTopic.install_aliases :local => true
|
9
|
+
git_config( 'alias.work-on' ).should == 'topic work-on'
|
10
|
+
git_config( 'alias.done' ).should == 'topic done'
|
11
|
+
git_config( 'alias.review' ).should == 'topic review'
|
12
|
+
git_config( 'alias.accept' ).should == 'topic accept'
|
13
|
+
git_config( 'alias.reject' ).should == 'topic reject'
|
14
|
+
git_config( 'alias.comment' ).should == 'topic comment'
|
15
|
+
git_config( 'alias.comments' ).should == 'topic comments'
|
16
|
+
|
17
|
+
git_config( 'alias.w' ).should == 'topic work-on'
|
18
|
+
git_config( 'alias.r' ).should == 'topic review'
|
19
|
+
git_config( 'alias.st' ).should == 'topic status --prepended'
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should provide feedback to the user" do
|
23
|
+
GitTopic.install_aliases :local => true
|
24
|
+
$?.success?.should == true
|
25
|
+
@output.should_not be_nil
|
26
|
+
@output.should_not be_empty
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RejectFirstComment = %Q{
|
4
|
+
Spec 123: I have some general comments, mostly relating to the quality
|
5
|
+
of our zombie-control policies. Basically, they're not
|
6
|
+
working.
|
7
|
+
|
8
|
+
./zombies
|
9
|
+
|
10
|
+
Line 2
|
11
|
+
Spec 123: I suggest we do the following instead:
|
12
|
+
zombies.each{ |z| reason_with( z )}
|
13
|
+
zomies.select do |z|
|
14
|
+
z.unconvinced?
|
15
|
+
end.each do |z|
|
16
|
+
destroy z
|
17
|
+
end
|
18
|
+
This should take care of our issues with zombies.
|
19
|
+
}.strip
|
20
|
+
|
21
|
+
describe GitTopic do
|
22
|
+
|
23
|
+
describe "#reject" do
|
24
|
+
|
25
|
+
describe "while on a review branch" do
|
26
|
+
before( :each ) do
|
27
|
+
use_repo 'in-progress'
|
28
|
+
GitTopic.review 'user24601/zombie-basic'
|
29
|
+
end
|
30
|
+
after( :each ) { Dir.chdir '..' }
|
31
|
+
|
32
|
+
describe "with no specified argument" do
|
33
|
+
it "
|
34
|
+
should move branch to the rejected namespace and destroy the local and
|
35
|
+
remote review branches
|
36
|
+
".oneline do
|
37
|
+
|
38
|
+
git_branch.should == 'review/user24601/zombie-basic'
|
39
|
+
GitTopic.reject
|
40
|
+
git_branch.should == 'master'
|
41
|
+
git_branches.should_not include( 'review/user24601/zombie-basic' )
|
42
|
+
git_remote_branches.should_not include( 'review/user24601/zombie-basic' )
|
43
|
+
git_remote_branches.should include( 'rejected/user24601/zombie-basic' )
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should provide feedback to the user" do
|
47
|
+
GitTopic.reject
|
48
|
+
$?.success?.should == true
|
49
|
+
@output.should_not be_nil
|
50
|
+
@output.should_not be_empty
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should auto-save comments with the --save-comments options" do
|
54
|
+
GitTopic.stub!( :invoke_git_editor ) do |path|
|
55
|
+
File.open( path, 'w' ) do |f|
|
56
|
+
f.puts %Q{
|
57
|
+
I have some general comments, mostly relating to the quality of our
|
58
|
+
zombie-control policies. Basically, they're not working.
|
59
|
+
}.cleanup
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
File.open( 'zombies', 'a' ) do |f|
|
64
|
+
f.puts %Q{
|
65
|
+
# I suggest we do the following instead:
|
66
|
+
# zombies.each{ |z| reason_with( z )}
|
67
|
+
# zomies.select do |z|
|
68
|
+
# z.unconvinced?
|
69
|
+
# end.each do |z|
|
70
|
+
# destroy z
|
71
|
+
# end
|
72
|
+
# This should take care of our issues with zombies.
|
73
|
+
}.cleanup
|
74
|
+
end
|
75
|
+
GitTopic.should_receive( :invoke_git_editor ).once
|
76
|
+
GitTopic.should_receive(
|
77
|
+
:git_author_name_short
|
78
|
+
).once.and_return( "Spec 123" )
|
79
|
+
|
80
|
+
lambda do
|
81
|
+
GitTopic.reject :save_comments => true
|
82
|
+
end.should_not raise_error
|
83
|
+
|
84
|
+
git_notes_list(
|
85
|
+
"refs/notes/reviews/user24601/zombie-basic"
|
86
|
+
).should_not be_empty
|
87
|
+
|
88
|
+
git_notes_show(
|
89
|
+
"refs/notes/reviews/user24601/zombie-basic",
|
90
|
+
"origin/rejected/user24601/zombie-basic"
|
91
|
+
).should == RejectFirstComment
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should fail if the working tree is dirty" do
|
95
|
+
dirty_branch!
|
96
|
+
lambda{ GitTopic.reject }.should raise_error
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "while not on a review branch" do
|
102
|
+
before( :each ) { use_repo 'in-progress' }
|
103
|
+
after( :each ) { Dir.chdir '..' }
|
104
|
+
|
105
|
+
it "should fail" do
|
106
|
+
lambda{ GitTopic.reject }.should raise_error
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe GitTopic do
|
5
|
+
|
6
|
+
describe "#review" do
|
7
|
+
|
8
|
+
describe "with no review branches" do
|
9
|
+
before( :each ) { use_repo 'fresh' }
|
10
|
+
after( :each ) { Dir.chdir '..' }
|
11
|
+
|
12
|
+
it "should report that there is nothing to do" do
|
13
|
+
git_remote_branches.each do |b|
|
14
|
+
b.should_not =~ /review/
|
15
|
+
end
|
16
|
+
|
17
|
+
GitTopic.review
|
18
|
+
@output.should =~ /nothing to review/
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "with exactly one review branch" do
|
23
|
+
before( :each ) do
|
24
|
+
use_repo 'in-progress'
|
25
|
+
seen_a_review_b = false
|
26
|
+
git_remote_branches.each do |b|
|
27
|
+
if b =~ %r{review/user24601/(?!zombie-basic)}
|
28
|
+
system "git push origin :refs/heads/#{b} > /dev/null 2> /dev/null"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
after( :each ) { Dir.chdir '..' }
|
33
|
+
|
34
|
+
it "should switch to the sole review branch when given no arguments." do
|
35
|
+
git_remote_branches.select do |branch|
|
36
|
+
branch =~ %r{review/user24601}
|
37
|
+
end.should == ['review/user24601/zombie-basic']
|
38
|
+
GitTopic.review
|
39
|
+
git_branch.should == 'review/user24601/zombie-basic'
|
40
|
+
git_branch_remote.should == 'origin'
|
41
|
+
git_branch_merge.should == 'refs/heads/review/user24601/zombie-basic'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "with some review branches" do
|
46
|
+
before( :each ) { use_repo 'in-progress' }
|
47
|
+
after( :each ) { Dir.chdir '..' }
|
48
|
+
|
49
|
+
it "
|
50
|
+
should create a local tracking branch for the oldest remote review
|
51
|
+
branch if none was specified
|
52
|
+
".oneline do
|
53
|
+
|
54
|
+
git_remote_branches.should include 'review/user24601/zombie-basic'
|
55
|
+
GitTopic.review
|
56
|
+
git_branch.should == 'review/user24601/zombie-basic'
|
57
|
+
git_branch_remote.should == 'origin'
|
58
|
+
git_branch_merge.should == 'refs/heads/review/user24601/zombie-basic'
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should use the local tracking branch, if one exists" do
|
62
|
+
git_remote_branches.should include 'review/user24601/zombie-basic'
|
63
|
+
|
64
|
+
GitTopic.review 'zombie-basic'
|
65
|
+
system "git checkout master > /dev/null 2> /dev/null"
|
66
|
+
|
67
|
+
git_branch.should == "master"
|
68
|
+
lambda do
|
69
|
+
GitTopic.review 'zombie-basic'
|
70
|
+
end.should_not raise_error
|
71
|
+
git_branch.should == "review/user24601/zombie-basic"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should provide feedback to the user" do
|
75
|
+
GitTopic.review
|
76
|
+
$?.success?.should == true
|
77
|
+
@output.should_not be_nil
|
78
|
+
@output.should_not be_empty
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should create a local tracking branch for the specified topic" do
|
82
|
+
git_remote_branches.should include 'review/user24601/ninja-basic'
|
83
|
+
GitTopic.review( 'user24601/ninja-basic' )
|
84
|
+
git_branch.should == 'review/user24601/ninja-basic'
|
85
|
+
git_branch_remote.should == 'origin'
|
86
|
+
git_branch_merge.should == 'refs/heads/review/user24601/ninja-basic'
|
87
|
+
end
|
88
|
+
|
89
|
+
it "
|
90
|
+
should accept only a topic arg (vice <user>/<topic>) when the topic is
|
91
|
+
unambiguous.
|
92
|
+
".oneline do
|
93
|
+
git_remote_branches.should include 'review/user24601/ninja-basic'
|
94
|
+
GitTopic.review( 'ninja-basic' )
|
95
|
+
git_branch.should == 'review/user24601/ninja-basic'
|
96
|
+
git_branch_remote.should == 'origin'
|
97
|
+
git_branch_merge.should == 'refs/heads/review/user24601/ninja-basic'
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should handle fully-qualified topic args" do
|
101
|
+
git_remote_branches.should include 'review/user24601/ninja-basic'
|
102
|
+
lambda{ GitTopic.review( 'review/user24601/ninja-basic' )}.should_not raise_error
|
103
|
+
git_branch.should == 'review/user24601/ninja-basic'
|
104
|
+
git_branch_remote.should == 'origin'
|
105
|
+
git_branch_merge.should == 'refs/heads/review/user24601/ninja-basic'
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should error if an illegal topic is specified" do
|
109
|
+
lambda{ GitTopic.review( 'fakeuser/faketopic' )}.should raise_error
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe GitTopic do
|
5
|
+
|
6
|
+
describe "#status" do
|
7
|
+
|
8
|
+
describe "with pending review branches" do
|
9
|
+
|
10
|
+
before( :each ) { use_repo 'in-progress' }
|
11
|
+
after( :each ) { Dir.chdir '..' }
|
12
|
+
|
13
|
+
|
14
|
+
it "should not show my review branches, but it should show others'" do
|
15
|
+
git_remote_branches.should include "review/#{@user}/pirates"
|
16
|
+
|
17
|
+
GitTopic.status
|
18
|
+
@output.should_not be_nil
|
19
|
+
|
20
|
+
@output.should_not =~ /^#\s*pirates\s*$/m
|
21
|
+
@output.should =~ /^#\s*ninja-basic\s*$/m
|
22
|
+
@output.should =~ /^#\s*zombie-basic\s*$/m
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should not show others' rejected topics" do
|
26
|
+
git_remote_branches.should include 'review/user24601/ninja-basic'
|
27
|
+
GitTopic.review 'user24601/ninja-basic'
|
28
|
+
GitTopic.reject
|
29
|
+
git_remote_branches.should_not include 'review/user24601/ninja-basic'
|
30
|
+
git_remote_branches.should include 'rejected/user24601/ninja-basic'
|
31
|
+
|
32
|
+
@output.clear
|
33
|
+
GitTopic.status
|
34
|
+
@output.should_not =~ %r{ninja-basic}
|
35
|
+
end
|
36
|
+
|
37
|
+
it "
|
38
|
+
should show my rejected topics, and note that they have comments, when
|
39
|
+
they do.
|
40
|
+
" do
|
41
|
+
git_remote_branches.should include "rejected/#{@user}/krakens"
|
42
|
+
GitTopic.status
|
43
|
+
@output.should_not be_nil
|
44
|
+
|
45
|
+
@output.should =~ /^#\s*krakens\s*\(reviewer comments\)\s*$/m
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
describe "passed the --prepended flag" do
|
52
|
+
before( :each ) { use_repo 'in-progress' }
|
53
|
+
after( :each ) { Dir.chdir '..' }
|
54
|
+
|
55
|
+
it "should invoke git status before producing its output" do
|
56
|
+
GitTopic.status( :prepended => true )
|
57
|
+
@output.should_not be_nil
|
58
|
+
@output.should =~ /# On branch master/
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|