git-topic 0.2.4.1 → 0.2.5

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/History.rdoc CHANGED
@@ -1,3 +1,13 @@
1
+ === 0.2.5
2
+
3
+ * issues closed
4
+ - 9 git comments <spec> now asks for the right range.
5
+ - 11 git comments now falls back to name-rev, so works even for remote
6
+ branches.
7
+ - 16 shorthand aliases not installed by git-topic setup.
8
+ - 17 git comment reports to the user if they entered a blank comment.
9
+ - 20 refspecs now use +, i.e. they autoforce.
10
+
1
11
  ==== 0.2.4.1
2
12
 
3
13
  * issue 14 closed. Added --completion-help like output to
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 2
4
- :patch: 4
5
- :build: "1"
4
+ :patch: 5
5
+ :build:
data/lib/git_topic.rb CHANGED
@@ -233,25 +233,10 @@ module GitTopic
233
233
 
234
234
  diff_empty = git( "diff --diff-filter=M --quiet" ) && $?.success?
235
235
 
236
- case current_namespace
237
- when "wip"
238
- if existing_comments?
239
- raise "
240
- diff → comments not allowed when replying. Please make sure your
241
- working tree is completely clean and then invoke git-topic comment
242
- again.
243
- ".oneline unless diff_empty
244
-
245
- notes_from_reply_to_comments
246
- else
247
- puts "No comments to reply to. See git-topic comment --help for usage."
248
- return
249
- end
250
- when "review"
251
- if existing_comments?
252
- if opts[ :force_update ]
253
- notes_from_initial_comments( "edit" )
254
- else
236
+ added_comments =
237
+ case current_namespace
238
+ when "wip"
239
+ if existing_comments?
255
240
  raise "
256
241
  diff → comments not allowed when replying. Please make sure your
257
242
  working tree is completely clean and then invoke git-topic comment
@@ -259,25 +244,63 @@ module GitTopic
259
244
  ".oneline unless diff_empty
260
245
 
261
246
  notes_from_reply_to_comments
247
+ else
248
+ puts "No comments to reply to. See git-topic comment --help for usage."
249
+ return
250
+ end
251
+ when "review"
252
+ if existing_comments?
253
+ if opts[ :force_update ]
254
+ notes_from_initial_comments( "edit" )
255
+ else
256
+ raise "
257
+ diff → comments not allowed when replying. Please make sure your
258
+ working tree is completely clean and then invoke git-topic comment
259
+ again.
260
+ ".oneline unless diff_empty
261
+
262
+ notes_from_reply_to_comments
263
+ end
264
+ else
265
+ notes_from_initial_comments
262
266
  end
263
267
  else
264
- notes_from_initial_comments
268
+ raise "Inappropriate namespace for comments: [#{namespace}]"
265
269
  end
270
+
271
+ if added_comments
272
+ report "Your comments have been saved."
266
273
  else
267
- raise "Inappropriate namespace for comments: [#{namespace}]"
274
+ report "You did not write any comments. Nothing to save."
268
275
  end
269
-
270
- report "Your comments have been saved."
271
276
  end
272
277
 
273
278
  def comments( spec=nil, opts={} )
274
279
  args = [ spec ].compact
280
+ if args.empty? && current_branch.nil?
281
+ if guess = guess_branch
282
+ args << guess_branch
283
+
284
+ puts "
285
+ You are not on a branch and no topic branch was specified. Using
286
+ alternate name for HEAD, #{guess}.
287
+ ".oneline
288
+ else
289
+ puts "
290
+ You are not on a branch and no topic branch was specified. I could
291
+ not find an appropriate name for HEAD to guess.
292
+ "
293
+ return
294
+ end
295
+ end
296
+
275
297
  unless existing_comments? *args
276
298
  puts "There are no comments on this branch."
277
299
  return
278
300
  end
279
301
 
280
- git "log origin/master.. --show-notes=#{notes_ref *args} --no-standard-notes",
302
+ range = "origin/master..#{remote_branch *args}"
303
+ git "log #{range} --show-notes=#{notes_ref *args} --no-standard-notes",
281
304
  :show => true
282
305
  end
283
306
 
@@ -333,7 +356,7 @@ module GitTopic
333
356
  cmds = []
334
357
 
335
358
  cmds <<(
336
- "config --add remote.origin.fetch refs/notes/reviews/*:refs/notes/reviews/*"
359
+ "config --add remote.origin.fetch +refs/notes/reviews/*:refs/notes/reviews/*"
337
360
  ) unless has_setup_refspec?
338
361
 
339
362
  cmds <<(
@@ -356,10 +379,6 @@ module GitTopic
356
379
  "config #{flags} alias.reject 'topic reject'",
357
380
  "config #{flags} alias.comment 'topic comment'",
358
381
  "config #{flags} alias.comments 'topic comments'",
359
-
360
- "config #{flags} alias.w 'topic work-on'",
361
- "config #{flags} alias.r 'topic review'",
362
- "config #{flags} alias.st 'topic status --prepended'",
363
382
  ]
364
383
 
365
384
  report "Aliases installed Successfully.",
@@ -416,7 +435,7 @@ module GitTopic
416
435
  def has_setup_refspec?
417
436
  fetch_refspecs = capture_git( "config --get-all remote.origin.fetch" ).split( "\n" )
418
437
  fetch_refspecs.any? do |refspec|
419
- refspec == "refs/notes/reviews/*:refs/notes/reviews/*"
438
+ refspec == "+refs/notes/reviews/*:refs/notes/reviews/*"
420
439
  end
421
440
  end
422
441
 
@@ -247,10 +247,17 @@ module GitTopic::Comment
247
247
  notes,
248
248
  content,
249
249
  :author => git_author_name_short )
250
-
250
+
251
251
  File.open( edit_file, 'w' ){ |f| f.write( notes_with_reply )}
252
- git "notes --ref #{notes_ref} edit -F #{edit_file}",
253
- :must_succeed => true
252
+
253
+
254
+ if notes_with_reply != notes
255
+ git "notes --ref #{notes_ref} edit -F #{edit_file}",
256
+ :must_succeed => true
257
+ else
258
+ # No comments to add.
259
+ return false
260
+ end
254
261
  end
255
262
 
256
263
  def attrib( author, indent=0, max_w=16 )
data/lib/git_topic/git.rb CHANGED
@@ -56,6 +56,19 @@ module GitTopic::Git
56
56
  capture_git( "notes --ref #{ref} show" ).chomp
57
57
  end
58
58
 
59
+ def current_branch
60
+ @@current_branch ||= capture_git( "branch --no-color" ).split( "\n" ).find do |b|
61
+ b =~ %r{^\*}
62
+ end[ 2..-1 ]
63
+ @@current_branch = nil if @@current_branch == '(no branch)'
64
+
65
+ @@current_branch
66
+ end
67
+
68
+ def guess_branch
69
+ capture_git( "name-rev --name-only HEAD" )
70
+ end
71
+
59
72
 
60
73
  def display_git_output?
61
74
  @@display_git_output ||= false
@@ -29,6 +29,18 @@ module GitTopic::Naming
29
29
  "rejected/#{user}/#{strip_namespace topic}"
30
30
  end
31
31
 
32
+ def remote_branch( spec=current_branch )
33
+ parts = topic_parts( spec )
34
+
35
+ remote_branches.find do |remote_branch|
36
+ bp = topic_parts( remote_branch )
37
+
38
+ parts.all? do |part, value|
39
+ bp[part] == value
40
+ end
41
+ end
42
+ end
43
+
32
44
 
33
45
  def find_remote_review_branch( topic )
34
46
  others_review_branches.find{|b| b.index topic}
@@ -57,7 +69,10 @@ module GitTopic::Naming
57
69
  def topic_parts( ref, opts={} )
58
70
  p = {}
59
71
  parts = ref.split( '/' )
72
+
73
+ parts.shift if parts.first == 'remotes'
60
74
  parts.shift if parts.first == "origin"
75
+
61
76
  case parts.size
62
77
  when 3
63
78
  p[:namespace], p[:user], p[:topic] = parts
@@ -100,12 +115,6 @@ module GitTopic::Naming
100
115
  $1
101
116
  end
102
117
 
103
- def current_branch
104
- @@current_branch ||= capture_git( "branch --no-color" ).split( "\n" ).find do |b|
105
- b =~ %r{^\*}
106
- end[ 2..-1 ]
107
- end
108
-
109
118
  def branches
110
119
  @@branches ||= capture_git( "branch --no-color" ).split( "\n" ).map{|b| b[2..-1]}
111
120
  end
data/spec/comment_spec.rb CHANGED
@@ -333,9 +333,11 @@ describe GitTopic::Comment do
333
333
  lambda{ notes_from_reply_to_comments }.should raise_error
334
334
  end
335
335
 
336
- it "should add the users' comments as replies to the originals" do
336
+ it "
337
+ should add the users' comments as replies to the originals and return true
338
+ ".oneline do
337
339
  self.should_receive( :existing_comments? ). and_return( true )
338
- self.should_receive( :existing_comments ). and_return( ExistingComment )
340
+ self.should_receive( :existing_comments ). and_return( ExistingComment )
339
341
  self.should_receive( :git_dir ). and_return( "." )
340
342
  self.should_receive( :git_author_name_short ). and_return( "Spec 456" )
341
343
  self.should_receive( :notes_ref ).
@@ -348,9 +350,27 @@ describe GitTopic::Comment do
348
350
  File.read( "./COMMENT_EDITMSG" ).should == CommentWithReply
349
351
  end
350
352
 
351
- lambda{ notes_from_reply_to_comments }.should_not raise_error
353
+ lambda do
354
+ notes_from_reply_to_comments.should == true
355
+ end.should_not raise_error
352
356
  end
353
357
 
358
+ it "should return false if the user added no comments" do
359
+ self.should_receive( :existing_comments? ). and_return( true )
360
+ self.should_receive( :existing_comments ). and_return( ExistingComment )
361
+ self.should_receive( :git_dir ). and_return( "." )
362
+ self.should_receive( :git_author_name_short ). and_return( "Spec 456" )
363
+ self.should_not_receive( :notes_ref )
364
+ self.stub!( :invoke_git_editor ) do |path|
365
+ File.open( path, 'w' ) do |f|
366
+ f.write ExistingComment.lines.map{ |l| "# #{l}" }.join
367
+ end
368
+ end
369
+ self.should_receive( :invoke_git_editor )
370
+ self.should_not_receive( :git )
371
+
372
+ notes_from_reply_to_comments.should == false
373
+ end
354
374
  end
355
375
 
356
376
 
@@ -319,6 +319,46 @@ describe GitTopic do
319
319
  "refs/notes/reviews/user24601/ninja-basic"
320
320
  ).should == SecondComment
321
321
  end
322
+
323
+ it "should report success to the user" do
324
+ GitTopic.should_receive( :invoke_git_editor ).once
325
+ GitTopic.should_receive(
326
+ :git_author_name_short
327
+ ).once.and_return( "Spec 123" )
328
+
329
+ lambda{ GitTopic.comment }.should_not raise_error
330
+ @output.should =~ /comments have been saved/i
331
+ end
332
+
333
+ it "should fail (and report the failure) if the user entered no comments" do
334
+ git_notes_list(
335
+ "refs/notes/reviews/user24601/ninja-basic"
336
+ ).should_not be_empty
337
+ git_notes_show(
338
+ "refs/notes/reviews/user24601/ninja-basic"
339
+ ).should == FirstComment
340
+
341
+ GitTopic.stub!( :invoke_git_editor ) do |path|
342
+ File.open( path, 'w' ) do |f|
343
+ f.write FirstComment.lines.map{ |l| "# #{l}" }.join
344
+ end
345
+ end
346
+ GitTopic.should_receive( :invoke_git_editor ).once
347
+ GitTopic.should_receive(
348
+ :git_author_name_short
349
+ ).once.and_return( "Spec 123" )
350
+
351
+ lambda{ GitTopic.comment }.should_not raise_error
352
+ git_notes_list(
353
+ "refs/notes/reviews/user24601/ninja-basic"
354
+ ).should_not be_empty
355
+
356
+ git_notes_show(
357
+ "refs/notes/reviews/user24601/ninja-basic"
358
+ ).should == FirstComment
359
+
360
+ @output.should =~ /nothing to save/i
361
+ end
322
362
  end
323
363
 
324
364
 
@@ -93,6 +93,31 @@ describe GitTopic do
93
93
 
94
94
 
95
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\.\.origin/wip/#{@user}/krakens}
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
105
+ end
106
+
107
+ describe "on a commit named by a topic branch with comments" do
108
+
109
+ before( :each ) do
110
+ use_repo 'in-progress'
111
+ system "git checkout origin/rejected/#{@user}/krakens > /dev/null 2> /dev/null"
112
+ end
113
+
114
+ it "should report the topic it's guessing to look for comments on" do
115
+ lambda{ GitTopic.comments }.should_not raise_error
116
+ @output.should =~ /no topic branch/i
117
+ @output.should =~ /krakens/i
118
+ end
119
+
120
+ it "should guess a topic and show its comments" do
96
121
  GitTopic.should_receive( :git ) do |cmd|
97
122
  cmd.should =~ /log/
98
123
  cmd.should =~ %r{origin/master\.\.}
@@ -102,6 +127,7 @@ describe GitTopic do
102
127
 
103
128
  lambda{ GitTopic.comments }.should_not raise_error
104
129
  end
130
+
105
131
  end
106
132
  end
107
133
 
@@ -4,6 +4,8 @@ require 'spec_helper'
4
4
  describe GitTopic do
5
5
 
6
6
  describe "#install_aliases" do
7
+ before( :each ){ use_repo 'in-progress' }
8
+
7
9
  it "should install aliases" do
8
10
  GitTopic.install_aliases :local => true
9
11
  git_config( 'alias.work-on' ).should == 'topic work-on'
@@ -13,10 +15,6 @@ describe GitTopic do
13
15
  git_config( 'alias.reject' ).should == 'topic reject'
14
16
  git_config( 'alias.comment' ).should == 'topic comment'
15
17
  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
18
  end
21
19
 
22
20
  it "should provide feedback to the user" do
@@ -11,7 +11,7 @@ describe GitTopic do
11
11
 
12
12
  %x{
13
13
  git config --get-all remote.origin.fetch
14
- }.should_not =~ %r{refs/notes}
14
+ }.should_not =~ %r{\+refs/notes}
15
15
 
16
16
  GitTopic.setup
17
17
 
data/spec/spec_helper.rb CHANGED
@@ -16,7 +16,8 @@ class << GitTopic
16
16
 
17
17
  define_method( "#{m}_with_nocache" ) do
18
18
  rv = send( "#{m}_without_nocache" )
19
- GitTopic::Naming::ClassMethods.class_variable_set( "@@#{m}", nil )
19
+ GitTopic::Naming::ClassMethods.class_variable_set( "@@#{m}", nil )
20
+ GitTopic::Git::ClassMethods.class_variable_set( "@@#{m}", nil )
20
21
  rv
21
22
  end
22
23
  alias_method_chain m.to_sym, :nocache
metadata CHANGED
@@ -5,9 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 4
9
- - 1
10
- version: 0.2.4.1
8
+ - 5
9
+ version: 0.2.5
11
10
  platform: ruby
12
11
  authors:
13
12
  - David J. Hamilton
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-08-14 00:00:00 -07:00
17
+ date: 2010-08-27 00:00:00 -07:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency