Skip to content
  • Junio C Hamano's avatar
    revision: do not peel tags used in range notation · 895c5ba3
    Junio C Hamano authored
    
    
    A range notation "A..B" means exactly the same thing as what "^A B"
    means, i.e. the set of commits that are reachable from B but not
    from A.  But the internal representation after the revision parser
    parsed these two notations are subtly different.
    
     - "rev-list ^A B" leaves A and B in the revs->pending.objects[]
       array, with the former marked as UNINTERESTING and the revision
       traversal machinery propagates the mark to underlying commit
       objects A^0 and B^0.
    
     - "rev-list A..B" peels tags and leaves A^0 (marked as
       UNINTERESTING) and B^0 in revs->pending.objects[] array before
       the traversal machinery kicks in.
    
    This difference usually does not matter, but starts to matter when
    the --objects option is used.  For example, we see this:
    
        $ git rev-list --objects v1.8.4^1..v1.8.4 | grep $(git rev-parse v1.8.4)
        $ git rev-list --objects v1.8.4 ^v1.8.4^1 | grep $(git rev-parse v1.8.4)
        04f013dc38d7512eadb915eba22efc414f18b869 v1.8.4
    
    With the former invocation, the revision traversal machinery never
    hears about the tag v1.8.4 (it only sees the result of peeling it,
    i.e. the commit v1.8.4^0), and the tag itself does not appear in the
    output.  The latter does send the tag object itself to the output.
    
    Make the range notation keep the unpeeled objects and feed them to
    the traversal machinery to fix this inconsistency.
    
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    895c5ba3