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
data/.vimspell.utf8.add
ADDED
Binary file
|
data/README.rdoc
CHANGED
@@ -1,11 +1,21 @@
|
|
1
|
-
=
|
1
|
+
= git-topic
|
2
2
|
|
3
3
|
git-topic is a git command to help with a particular kind of workflow, in which
|
4
4
|
all work is written by an author, and reviewed by someone else.
|
5
5
|
|
6
|
-
== Workflow in brief
|
7
6
|
|
8
|
-
|
7
|
+
= Requirements
|
8
|
+
|
9
|
+
* git-topic has only been tested on debian flavours of linux. Other unix-like
|
10
|
+
environments should work.
|
11
|
+
* git >= 1.7.1 (older versions may work, except for comment and comments
|
12
|
+
commands)
|
13
|
+
* ruby >= 1.9.2-rc1 (older versions may work)
|
14
|
+
|
15
|
+
|
16
|
+
= Workflow
|
17
|
+
== Workflow in brief
|
18
|
+
=== Doing Work
|
9
19
|
|
10
20
|
1. Create a topic branch in the wip namespace.
|
11
21
|
2. Do some work.
|
@@ -17,7 +27,7 @@ all work is written by an author, and reviewed by someone else.
|
|
17
27
|
2. Do some work, resolve the reviewer's issues.
|
18
28
|
3. go to step 3, above.
|
19
29
|
|
20
|
-
===
|
30
|
+
=== Reviewing
|
21
31
|
|
22
32
|
1. Create a local branch from a review branch somebody else pushed.
|
23
33
|
2. Review their work.
|
@@ -27,9 +37,8 @@ all work is written by an author, and reviewed by someone else.
|
|
27
37
|
the review namespace.
|
28
38
|
|
29
39
|
|
30
|
-
==
|
31
|
-
|
32
|
-
=== Working on a topic (e.g. feature, or bugfix) foo
|
40
|
+
== Workflow without git-topic
|
41
|
+
=== Working on a topic (e.g. feature, or bugfix) foo
|
33
42
|
|
34
43
|
# Create a new branch and switch to it.
|
35
44
|
git checkout -b wip/hal/foo
|
@@ -60,7 +69,7 @@ all work is written by an author, and reviewed by someone else.
|
|
60
69
|
|
61
70
|
|
62
71
|
|
63
|
-
===
|
72
|
+
=== Reviewing a topic (no proposed changes)
|
64
73
|
|
65
74
|
# update origin
|
66
75
|
git fetch origin
|
@@ -86,19 +95,19 @@ all work is written by an author, and reviewed by someone else.
|
|
86
95
|
|
87
96
|
|
88
97
|
|
89
|
-
===
|
98
|
+
=== Reviewing a topic (proposed changes)
|
90
99
|
|
91
100
|
As above, but if, after examining the code you feel some changes are
|
92
101
|
appropriate, you can either:
|
93
102
|
|
94
|
-
====
|
103
|
+
==== do them yourself and have the other person review and merge
|
95
104
|
|
96
105
|
# do some changes, then destroy the old review branch and make a new one
|
97
106
|
# with the cleaned up code. Now the owner is changed from djh to hal, so
|
98
107
|
# djh must review and merge into master
|
99
108
|
git push origin review/djh/bar:review/hal/bar :review/djh/bar
|
100
109
|
|
101
|
-
====
|
110
|
+
==== do some (or no) changes, but with some TODOs for the original author.
|
102
111
|
|
103
112
|
# do your changes on review/djh/bar
|
104
113
|
|
@@ -110,9 +119,8 @@ appropriate, you can either:
|
|
110
119
|
# review/djh/bar
|
111
120
|
|
112
121
|
|
113
|
-
==
|
114
|
-
|
115
|
-
=== Doing Work
|
122
|
+
== Workflow with git-topic
|
123
|
+
=== Doing Work
|
116
124
|
|
117
125
|
# Work on a (possibly new, possibly rejected) topic
|
118
126
|
git topic work-on <topic>
|
@@ -121,7 +129,7 @@ appropriate, you can either:
|
|
121
129
|
git topic done [<topic>]
|
122
130
|
|
123
131
|
|
124
|
-
===
|
132
|
+
=== Reviewing
|
125
133
|
|
126
134
|
# see if we have any topics to review (or rejected topics to fix up)
|
127
135
|
git topic status
|
@@ -131,10 +139,18 @@ appropriate, you can either:
|
|
131
139
|
# happy with the review, get it into master
|
132
140
|
git topic accept
|
133
141
|
|
134
|
-
# unhappy with the review
|
142
|
+
# unhappy with the review
|
143
|
+
# edit files to add file-specific comments (see git-topic comment --help for
|
144
|
+
# details).
|
145
|
+
|
146
|
+
# save your file specific comments, and launch an editor to enter general
|
147
|
+
# comments about the topic.
|
148
|
+
git topic comment
|
149
|
+
|
150
|
+
# push the topic to rejected.
|
135
151
|
git topic reject
|
136
152
|
|
137
|
-
==
|
153
|
+
== Again, but with aliases
|
138
154
|
|
139
155
|
# first install aliases
|
140
156
|
# add --local if you don't want to update your global aliases
|
@@ -144,6 +160,10 @@ appropriate, you can either:
|
|
144
160
|
# git w <topic>
|
145
161
|
git work-on <topic>
|
146
162
|
|
163
|
+
# see reviewer's comments
|
164
|
+
git comments
|
165
|
+
|
166
|
+
# finished, submit work
|
147
167
|
git done
|
148
168
|
|
149
169
|
|
@@ -157,22 +177,32 @@ appropriate, you can either:
|
|
157
177
|
|
158
178
|
git accept
|
159
179
|
# or
|
180
|
+
git comment
|
160
181
|
git reject
|
161
182
|
|
162
|
-
==
|
183
|
+
== Bash autocompletion
|
184
|
+
|
185
|
+
See git-topic --completion-help for details. In short, you have to do some
|
186
|
+
manual work, because loading completions as a gem is too slow (see Misc, below,
|
187
|
+
and ruby issue 3465[1]).
|
188
|
+
|
189
|
+
1. Make sure you source share/completion.bash __before__ sourcing git's standard
|
190
|
+
completion.
|
191
|
+
|
192
|
+
2. Copy bin/git-topic-completion to your gem env's default bin dir, overriding
|
193
|
+
the generated git-topic-completion. Otherwise, autocompletion will be too
|
194
|
+
slow to be useful.
|
195
|
+
|
196
|
+
== Misc
|
163
197
|
|
164
198
|
At present the binary is stupidly slow. Actually, the binary is not slow, but
|
165
199
|
all rubygems binaries are slow. See ruby issue 3465[1]. One way around this is
|
166
|
-
to modify
|
200
|
+
to modify your PATH so you invoke the binary directly (instead of the rubygem
|
167
201
|
wrapper). Alternatively, put up with a 300ms load time until you have a ruby
|
168
202
|
with the issue fixed.
|
169
203
|
|
170
|
-
== Obvious Features Missing
|
171
|
-
|
172
|
-
1. shell autocomplete
|
173
|
-
|
174
204
|
|
175
|
-
==
|
205
|
+
== Note on Patches/Pull Requests
|
176
206
|
|
177
207
|
1. Fork the project.
|
178
208
|
2. Make your feature addition or bug fix.
|
@@ -183,10 +213,10 @@ with the issue fixed.
|
|
183
213
|
can ignore when I pull)
|
184
214
|
5. Send me a pull request. Bonus points for topic branches.
|
185
215
|
|
186
|
-
==
|
216
|
+
== Copyright
|
187
217
|
|
188
|
-
Copyright
|
218
|
+
Copyright © 2010 David J. Hamilton. See LICENSE for details.
|
189
219
|
|
190
|
-
==
|
220
|
+
== References
|
191
221
|
|
192
222
|
1. http://redmine.ruby-lang.org/issues/show/3465
|
data/Rakefile
CHANGED
@@ -33,11 +33,21 @@ begin
|
|
33
33
|
git work-on <topic>
|
34
34
|
|
35
35
|
see README.rdoc for more (any) details.
|
36
|
+
|
37
|
+
|
38
|
+
To make use of bash autocompletion, you must do the following:
|
39
|
+
|
40
|
+
1. Make sure you source share/completion.bash before you source git's completion.
|
41
|
+
2. Optionally, copy git-topic-completion to your gem's bin directory.
|
42
|
+
This is to sidestep ruby issue 3465 which makes loading gems far too
|
43
|
+
slow for autocompletion.
|
36
44
|
}
|
37
45
|
gem.email = "git-topic@hjdivad.com"
|
38
46
|
gem.homepage = "http://github.com/hjdivad/git-topic"
|
39
47
|
gem.authors = ["David J. Hamilton"]
|
40
48
|
|
49
|
+
gem.files.exclude 'git-topic'
|
50
|
+
|
41
51
|
if File.exists? 'Gemfile'
|
42
52
|
require 'bundler'
|
43
53
|
bundler = Bundler.load
|
data/VERSION.yml
CHANGED
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
|
4
|
+
module GitTopic; end
|
5
|
+
|
6
|
+
module GitTopic::Completion
|
7
|
+
class << self
|
8
|
+
|
9
|
+
def user
|
10
|
+
ENV['USER']
|
11
|
+
end
|
12
|
+
|
13
|
+
def branches
|
14
|
+
`git branch -a --no-color`.split( "\n" ).map do |l|
|
15
|
+
l.gsub( /->.*$/, '' )[ 2..-1 ]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def others_review_branches
|
20
|
+
branches.map do |b|
|
21
|
+
b =~ %r{^remotes/origin/review/(.*)} && $1
|
22
|
+
end.reject do |b|
|
23
|
+
b =~ %r{^#{user}/}
|
24
|
+
end.compact
|
25
|
+
end
|
26
|
+
|
27
|
+
def my_reject_review_and_local_wip_branches
|
28
|
+
branches.map do |b|
|
29
|
+
b =~ %r{^(wip)/#{user}/(.*)} ||
|
30
|
+
b =~ %r{^remotes/origin/(rejected)/#{user}/(.*)} ||
|
31
|
+
b =~ %r{^remotes/origin/(review)/#{user}/(.*)}
|
32
|
+
suggestion = [$1,$2].compact.join("/")
|
33
|
+
suggestion unless suggestion.strip.empty?
|
34
|
+
end.compact
|
35
|
+
end
|
36
|
+
|
37
|
+
def complete
|
38
|
+
suggestions =
|
39
|
+
case ARGV.shift
|
40
|
+
# TODO 2: if we let accept/reject take args, simply return
|
41
|
+
# others_review_branches here
|
42
|
+
when "accept"
|
43
|
+
when "reject"
|
44
|
+
when "done"
|
45
|
+
# nothing
|
46
|
+
when "work-on"
|
47
|
+
my_reject_review_and_local_wip_branches
|
48
|
+
when "review"
|
49
|
+
others_review_branches
|
50
|
+
end || []
|
51
|
+
|
52
|
+
suggestions.each{ |s| puts s }
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
GitTopic::Completion.complete
|
data/lib/core_ext.rb
CHANGED
@@ -7,22 +7,84 @@ require 'active_support/core_ext/string/inflections'
|
|
7
7
|
|
8
8
|
|
9
9
|
class String
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
def cleanup
|
11
|
+
indent = (index /^([ \t]+)/; $1) || ''
|
12
|
+
regex = /^#{Regexp::escape( indent )}/
|
13
|
+
strip.gsub regex, ''
|
14
|
+
end
|
15
|
+
|
16
|
+
def oneline
|
17
|
+
strip.gsub( /\n\s+/, ' ' )
|
18
|
+
end
|
19
|
+
|
20
|
+
# Annoyingly, the useful version of pluralize in texthelpers isn't in the
|
21
|
+
# string core extensions.
|
22
|
+
def pluralize_with_count( count )
|
23
|
+
count > 1 ? pluralize_without_count : singularize
|
24
|
+
end
|
25
|
+
alias_method_chain :pluralize, :count
|
15
26
|
|
16
|
-
|
17
|
-
|
27
|
+
def wrap( width, heading_indentation=nil, heading=nil )
|
28
|
+
# TODO 2: if indentation is nil, compute indentation
|
29
|
+
heading_indentation ||= 0
|
30
|
+
heading ||= ""
|
31
|
+
|
32
|
+
indentation = heading.size + heading_indentation
|
33
|
+
indent = ' ' * indentation
|
34
|
+
sbuf = "#{indent}"
|
35
|
+
line_w = indentation
|
36
|
+
|
37
|
+
original_indentation = nil
|
38
|
+
|
39
|
+
new_line = lambda do
|
40
|
+
sbuf << "\n#{indent}"
|
41
|
+
line_w = indentation
|
18
42
|
end
|
19
43
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
44
|
+
start_of_line = lambda { line_w == indentation }
|
45
|
+
|
46
|
+
split( "\n" ).each do |line|
|
47
|
+
if original_indentation.nil?
|
48
|
+
line =~ /^(\s*)/
|
49
|
+
original_indentation = $1.size
|
50
|
+
end
|
51
|
+
|
52
|
+
if line =~ /^\s{#{original_indentation}}\s/
|
53
|
+
sbuf << "\n#{indent}" unless start_of_line.call
|
54
|
+
sbuf << line.slice( original_indentation, line.size )
|
55
|
+
new_line.call
|
56
|
+
next
|
57
|
+
end
|
58
|
+
|
59
|
+
leading_space =
|
60
|
+
start_of_line.call ? '' : ' '
|
61
|
+
line.gsub!( %r/^\s{,#{original_indentation}}/, leading_space )
|
62
|
+
line.split( /(\s+)/ ).each do |word|
|
63
|
+
next if start_of_line.call && word.strip.empty?
|
64
|
+
|
65
|
+
if line_w + word.size <= width
|
66
|
+
sbuf << word
|
67
|
+
line_w += word.size
|
68
|
+
elsif start_of_line.call
|
69
|
+
sbuf << word[0...(size - indentation)]
|
70
|
+
new_line.call
|
71
|
+
word.slice! (size - indentation), word.size
|
72
|
+
else
|
73
|
+
new_line.call
|
74
|
+
redo
|
75
|
+
end
|
76
|
+
end
|
24
77
|
end
|
25
|
-
|
78
|
+
|
79
|
+
sbuf[ 0...heading.size ] = heading
|
80
|
+
|
81
|
+
sbuf
|
82
|
+
end
|
83
|
+
|
84
|
+
def wrap!( width, heading_indentation=nil, heading=nil )
|
85
|
+
self.replace wrap( width, heading_indentation, heading )
|
86
|
+
end
|
87
|
+
|
26
88
|
end
|
27
89
|
|
28
90
|
|
data/lib/git_topic.rb
CHANGED
@@ -7,13 +7,18 @@ require 'active_support/core_ext/hash/keys'
|
|
7
7
|
require 'core_ext'
|
8
8
|
require 'git_topic/git'
|
9
9
|
require 'git_topic/naming'
|
10
|
+
require 'git_topic/comment'
|
10
11
|
|
11
12
|
|
12
13
|
module GitTopic
|
13
14
|
include GitTopic::Git
|
14
15
|
include GitTopic::Naming
|
16
|
+
include GitTopic::Comment
|
15
17
|
|
16
|
-
GlobalOptKeys = [
|
18
|
+
GlobalOptKeys = [
|
19
|
+
:verbose, :help, :verbose_given, :version, :completion_help,
|
20
|
+
:completion_help_given
|
21
|
+
]
|
17
22
|
|
18
23
|
|
19
24
|
class << self
|
@@ -25,7 +30,7 @@ module GitTopic
|
|
25
30
|
# setup a remote branch, if necessary
|
26
31
|
wb = wip_branch( topic )
|
27
32
|
git(
|
28
|
-
"push origin HEAD
|
33
|
+
"push origin HEAD:refs/heads/#{wb}"
|
29
34
|
) unless remote_branches.include? "origin/#{wb}"
|
30
35
|
# switch to the new branch
|
31
36
|
git [ switch_to_branch( wb, "origin/#{wb}" )]
|
@@ -35,11 +40,22 @@ module GitTopic
|
|
35
40
|
if remote_branches.include? "origin/#{rej_branch}"
|
36
41
|
git [
|
37
42
|
"reset --hard origin/#{rej_branch}",
|
38
|
-
"push origin
|
43
|
+
"push origin :refs/heads/#{rej_branch} HEAD:refs/heads/#{wb}",
|
39
44
|
]
|
40
45
|
end
|
46
|
+
|
47
|
+
# Reset upstream, if specified
|
48
|
+
if opts[:upstream]
|
49
|
+
git "reset --hard #{opts[:upstream]}"
|
50
|
+
end
|
51
|
+
|
52
|
+
report "Switching branches to work on #{topic}."
|
53
|
+
if existing_comments?
|
54
|
+
report "You have reviewer comments on this topic."
|
55
|
+
end
|
41
56
|
end
|
42
57
|
|
58
|
+
|
43
59
|
# Done with the given topic. If none is specified, then topic is assumed to
|
44
60
|
# be the current branch (if it's a topic branch).
|
45
61
|
def done( topic=nil, opts={} )
|
@@ -61,12 +77,15 @@ module GitTopic
|
|
61
77
|
wb = wip_branch( topic )
|
62
78
|
rb = review_branch( topic )
|
63
79
|
git [
|
64
|
-
"push origin
|
80
|
+
"push origin refs/heads/#{wb}:refs/heads/#{rb} :refs/heads/#{wb}",
|
65
81
|
("checkout master" if strip_namespace( topic ) == current_topic),
|
66
82
|
"branch -D #{wip_branch( topic )}"
|
67
83
|
].compact
|
84
|
+
|
85
|
+
report "Completed topic #{topic}. It has been pushed for review."
|
68
86
|
end
|
69
87
|
|
88
|
+
|
70
89
|
# Produce status like
|
71
90
|
#
|
72
91
|
# # There are 2 topics you can review.
|
@@ -118,12 +137,13 @@ module GitTopic
|
|
118
137
|
end
|
119
138
|
end
|
120
139
|
|
140
|
+
|
121
141
|
# Switch to a review branch to check somebody else's code.
|
122
|
-
def review(
|
142
|
+
def review( ref=nil, opts={} )
|
123
143
|
rb = remote_branches_organized
|
124
144
|
review_branches = rb[:review]
|
125
145
|
|
126
|
-
if
|
146
|
+
if ref.nil?
|
127
147
|
# select the oldest (by HEAD) topic, if any exist
|
128
148
|
if review_branches.empty?
|
129
149
|
puts "nothing to review."
|
@@ -132,12 +152,12 @@ module GitTopic
|
|
132
152
|
user, topic = oldest_review_user_topic
|
133
153
|
end
|
134
154
|
else
|
135
|
-
p = topic_parts(
|
155
|
+
p = topic_parts( ref )
|
136
156
|
user, topic = p[:user], p[:topic]
|
137
157
|
end
|
138
158
|
|
139
159
|
if remote_topic_branch = find_remote_review_branch( topic )
|
140
|
-
# Get the actual user/topic, e.g. to get the user if
|
160
|
+
# Get the actual user/topic, e.g. to get the user if ref only specifies
|
141
161
|
# the topic.
|
142
162
|
real_user, real_topic = user_topic_name( remote_topic_branch )
|
143
163
|
git [
|
@@ -145,13 +165,17 @@ module GitTopic
|
|
145
165
|
review_branch( real_topic, real_user ),
|
146
166
|
remote_topic_branch )]
|
147
167
|
else
|
148
|
-
raise "No review topic found matching ‘#{
|
168
|
+
raise "No review topic found matching ‘#{ref}’"
|
149
169
|
end
|
170
|
+
|
171
|
+
report "Reviewing topic #{user}/#{topic}."
|
150
172
|
end
|
151
173
|
|
174
|
+
|
152
175
|
# Accept the branch currently being reviewed.
|
153
176
|
def accept( topic=nil, opts={} )
|
154
177
|
raise "Must be on a review branch." unless on_review_branch?
|
178
|
+
raise "Working tree must be clean" unless working_tree_clean?
|
155
179
|
|
156
180
|
# switch to master
|
157
181
|
# merge review branch, assuming FF
|
@@ -175,14 +199,95 @@ module GitTopic
|
|
175
199
|
|
176
200
|
rem_review_branch = find_remote_review_branch( topic ).gsub( %r{^origin/}, '' )
|
177
201
|
git [
|
178
|
-
"push origin master
|
202
|
+
"push origin master :refs/heads/#{rem_review_branch}",
|
179
203
|
"branch -d #{local_review_branch}"
|
180
204
|
]
|
205
|
+
|
206
|
+
report "Accepted topic #{user}/#{topic}."
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
def comment( opts={} )
|
211
|
+
diff_legal =
|
212
|
+
git( "diff --diff-filter=ACDRTUXB --quiet" ) &&
|
213
|
+
git( "diff --cached --diff-filter=ACDRTUXB --quiet" ) &&
|
214
|
+
$?.success?
|
215
|
+
|
216
|
+
raise "
|
217
|
+
Diffs are not comments. Files have been added, deleted or had their
|
218
|
+
modes changed. See
|
219
|
+
git diff --diff-filter=ACDRTUXB
|
220
|
+
for a list of changes preventing git-topic comment from saving your
|
221
|
+
comments.
|
222
|
+
".cleanup unless diff_legal
|
223
|
+
|
224
|
+
|
225
|
+
diff_empty = git( "diff --diff-filter=M --quiet" ) && $?.success?
|
226
|
+
|
227
|
+
case current_namespace
|
228
|
+
when "wip"
|
229
|
+
if existing_comments?
|
230
|
+
raise "
|
231
|
+
diff → comments not allowed when replying. Please make sure your
|
232
|
+
working tree is completely clean and then invoke git-topic comment
|
233
|
+
again.
|
234
|
+
".oneline unless diff_empty
|
235
|
+
|
236
|
+
notes_from_reply_to_comments
|
237
|
+
else
|
238
|
+
puts "No comments to reply to. See git-topic comment --help for usage."
|
239
|
+
return
|
240
|
+
end
|
241
|
+
when "review"
|
242
|
+
if existing_comments?
|
243
|
+
if opts[ :force_update ]
|
244
|
+
notes_from_initial_comments( "edit" )
|
245
|
+
else
|
246
|
+
raise "
|
247
|
+
diff → comments not allowed when replying. Please make sure your
|
248
|
+
working tree is completely clean and then invoke git-topic comment
|
249
|
+
again.
|
250
|
+
".oneline unless diff_empty
|
251
|
+
|
252
|
+
notes_from_reply_to_comments
|
253
|
+
end
|
254
|
+
else
|
255
|
+
notes_from_initial_comments
|
256
|
+
end
|
257
|
+
else
|
258
|
+
raise "Inappropriate namespace for comments: [#{namespace}]"
|
259
|
+
end
|
260
|
+
|
261
|
+
report "Your comments have been saved."
|
262
|
+
end
|
263
|
+
|
264
|
+
def comments( opts={} )
|
265
|
+
unless existing_comments?
|
266
|
+
puts "There are no comments on this branch."
|
267
|
+
return
|
268
|
+
end
|
269
|
+
|
270
|
+
git "log origin/master.. --show-notes=#{notes_ref} --no-standard-notes"
|
181
271
|
end
|
182
272
|
|
273
|
+
|
183
274
|
# Reject the branch currently being reviewed.
|
184
|
-
def reject(
|
275
|
+
def reject( topic_or_opts=nil, opts={} )
|
276
|
+
if topic_or_opts.is_a? Hash
|
277
|
+
topic = nil
|
278
|
+
opts = topic_or_opts
|
279
|
+
else
|
280
|
+
topic = topic_or_opts
|
281
|
+
end
|
282
|
+
|
185
283
|
raise "Must be on a review branch." unless on_review_branch?
|
284
|
+
unless working_tree_clean?
|
285
|
+
if opts[:save_comments]
|
286
|
+
comment
|
287
|
+
else
|
288
|
+
raise "Working tree must be clean without --save-comments."
|
289
|
+
end
|
290
|
+
end
|
186
291
|
|
187
292
|
# switch to master
|
188
293
|
# push to rejected, destroy remote
|
@@ -191,13 +296,21 @@ module GitTopic
|
|
191
296
|
|
192
297
|
rem_review_branch = find_remote_review_branch( topic ).gsub( %r{^origin/}, '' )
|
193
298
|
rem_rej_branch = remote_rejected_branch( topic, user )
|
299
|
+
|
300
|
+
refspecs = [
|
301
|
+
"refs/heads/#{current_branch}:refs/heads/#{rem_rej_branch}",
|
302
|
+
":refs/heads/#{rem_review_branch}",
|
303
|
+
].join( " " )
|
194
304
|
git [
|
195
305
|
"checkout master",
|
196
|
-
"push origin #{
|
306
|
+
"push origin #{refspecs}",
|
197
307
|
"branch -D #{current_branch}"
|
198
308
|
]
|
309
|
+
|
310
|
+
report "Rejected topic #{user}/#{topic}"
|
199
311
|
end
|
200
312
|
|
313
|
+
|
201
314
|
def install_aliases( opts={} )
|
202
315
|
opts.assert_valid_keys :local, :local_given, *GlobalOptKeys
|
203
316
|
|
@@ -209,11 +322,31 @@ module GitTopic
|
|
209
322
|
"config #{flags} alias.review 'topic review'",
|
210
323
|
"config #{flags} alias.accept 'topic accept'",
|
211
324
|
"config #{flags} alias.reject 'topic reject'",
|
325
|
+
"config #{flags} alias.comment 'topic comment'",
|
326
|
+
"config #{flags} alias.comments 'topic comments'",
|
212
327
|
|
213
328
|
"config #{flags} alias.w 'topic work-on'",
|
214
329
|
"config #{flags} alias.r 'topic review'",
|
215
330
|
"config #{flags} alias.st 'topic status --prepended'",
|
216
331
|
]
|
332
|
+
|
333
|
+
report "Aliases installed Successfully.",
|
334
|
+
"
|
335
|
+
Error installing aliases. re-run with --verbose flag for
|
336
|
+
details.
|
337
|
+
".oneline
|
338
|
+
end
|
339
|
+
|
340
|
+
|
341
|
+
protected
|
342
|
+
|
343
|
+
def report( success_msg, error_msg=nil )
|
344
|
+
if $?.success?
|
345
|
+
puts success_msg
|
346
|
+
else
|
347
|
+
error_msg ||= "Error running command. re-run with --verbose for details"
|
348
|
+
raise error_msg
|
349
|
+
end
|
217
350
|
end
|
218
351
|
|
219
352
|
end
|