@@ -381,6 +381,9 @@ def mktiny():
381381 def _assert_rev_parse_types (self , name , rev_obj ):
382382 rev_parse = self .rorepo .rev_parse
383383
384+ if rev_obj .type == 'tag' :
385+ rev_obj = rev_obj .object
386+
384387 # tree and blob type
385388 obj = rev_parse (name + '^{tree}' )
386389 assert obj == rev_obj .tree
@@ -439,9 +442,6 @@ def _assert_rev_parse(self, name):
439442 def test_rev_parse (self ):
440443 rev_parse = self .rorepo .rev_parse
441444
442- # it works with tags !
443- self ._assert_rev_parse ('0.1.4' )
444-
445445 # start from reference
446446 num_resolved = 0
447447 for ref in Reference .iter_items (self .rorepo ):
@@ -461,29 +461,53 @@ def test_rev_parse(self):
461461 # END for each reference
462462 assert num_resolved
463463
464+ # it works with tags !
465+ tag = self ._assert_rev_parse ('0.1.4' )
466+ assert tag .type == 'tag'
467+
464468 # try full sha directly ( including type conversion )
469+ assert tag .object == rev_parse (tag .object .hexsha )
470+ self ._assert_rev_parse_types (tag .object .hexsha , tag .object )
465471
466472
467473 # multiple tree types result in the same tree: HEAD^{tree}^{tree}:CHANGES
474+ rev = '0.1.4^{tree}^{tree}'
475+ assert rev_parse (rev ) == tag .object .tree
476+ assert rev_parse (rev + ':CHANGES' ) == tag .object .tree ['CHANGES' ]
477+
468478
469479 # try to get parents from first revision - it should fail as no such revision
470480 # exists
481+ first_rev = "33ebe7acec14b25c5f84f35a664803fcab2f7781"
482+ commit = rev_parse (first_rev )
483+ assert len (commit .parents ) == 0
484+ assert commit .hexsha == first_rev
485+ self .failUnlessRaises (BadObject , rev_parse , first_rev + "~" )
486+ self .failUnlessRaises (BadObject , rev_parse , first_rev + "^" )
487+
488+ # short SHA1
489+ commit2 = rev_parse (first_rev [:20 ])
490+ assert commit2 == commit
491+ commit2 = rev_parse (first_rev [:5 ])
492+ assert commit2 == commit
493+
471494
472495 # todo: dereference tag into a blob 0.1.7^{blob} - quite a special one
496+ # needs a tag which points to a blob
473497
474- # dereference tag using ^{} notation
475498
476- # ref^0 returns commit being pointed to, same with ref~0
499+ # ref^0 returns commit being pointed to, same with ref~0, and ^{}
477500 tag = rev_parse ('0.1.4' )
478- for token in ('~^' ):
479- assert tag .object == rev_parse ('0.1.4%s0 ' % token )
501+ for token in (( '~0' , '^0' , '^{}' ) ):
502+ assert tag .object == rev_parse ('0.1.4%s ' % token )
480503 # END handle multiple tokens
481504
482505 # missing closing brace commit^{tree
506+ self .failUnlessRaises (ValueError , rev_parse , '0.1.4^{tree' )
483507
484508 # missing starting brace
509+ self .failUnlessRaises (ValueError , rev_parse , '0.1.4^tree}' )
485510
486- # not enough parents ^10
487511
488512 # cannot handle rev-log for now
489513 self .failUnlessRaises (ValueError , rev_parse , "hi@there" )
0 commit comments