• J
    tag: do not show ambiguous tag names as "tags/foo" · 0571979b
    Jeff King 提交于
    Since b7cc53e9 (tag.c: use 'ref-filter' APIs, 2015-07-11),
    git-tag has started showing tags with ambiguous names (i.e.,
    when both "heads/foo" and "tags/foo" exists) as "tags/foo"
    instead of just "foo". This is both:
    
      - pointless; the output of "git tag" includes only
        refs/tags, so we know that "foo" means the one in
        "refs/tags".
    
    and
    
      - ambiguous; in the original output, we know that the line
        "foo" means that "refs/tags/foo" exists. In the new
        output, it is unclear whether we mean "refs/tags/foo" or
        "refs/tags/tags/foo".
    
    The reason this happens is that commit b7cc53e9 switched
    git-tag to use ref-filter's "%(refname:short)" output
    formatting, which was adapted from for-each-ref. This more
    general code does not know that we care only about tags, and
    uses shorten_unambiguous_ref to get the short-name. We need
    to tell it that we care only about "refs/tags/", and it
    should shorten with respect to that value.
    
    In theory, the ref-filter code could figure this out by us
    passing FILTER_REFS_TAGS. But there are two complications
    there:
    
      1. The handling of refname:short is deep in formatting
         code that does not even have our ref_filter struct, let
         alone the arguments to the filter_ref struct.
    
      2. In git v2.7.0, we expose the formatting language to the
         user. If we follow this path, it will mean that
         "%(refname:short)" behaves differently for "tag" versus
         "for-each-ref" (including "for-each-ref refs/tags/"),
         which can lead to confusion.
    
    Instead, let's add a new modifier to the formatting
    language, "strip", to remove a specific set of prefix
    components. This fixes "git tag", and lets users invoke the
    same behavior from their own custom formats (for "tag" or
    "for-each-ref") while leaving ":short" with its same
    consistent meaning in all places.
    
    We introduce a test in t7004 for "git tag", which fails
    without this patch. We also add a similar test in t3203 for
    "git branch", which does not actually fail. But since it is
    likely that "branch" will eventually use the same formatting
    code, the test helps defend against future regressions.
    Signed-off-by: NJeff King <peff@peff.net>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    0571979b
t3203-branch-output.sh 3.9 KB