]> git.ipfire.org Git - thirdparty/git.git/commit - builtin/branch.c
branch: fix shortening of non-remote symrefs
authorJeff King <peff@peff.net>
Sun, 3 Apr 2016 04:14:26 +0000 (00:14 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 5 Apr 2016 06:35:05 +0000 (23:35 -0700)
commit95c38fb0ed45d9eb529afeb704b840818ba3da4d
treebd1e2a04da9bacb9c4cc630ffb54a326f577397f
parenta0feb1b1870fbb74f65d6a8951e4b2e2a2347ecf
branch: fix shortening of non-remote symrefs

Commit aedcb7d (branch.c: use 'ref-filter' APIs, 2015-09-23)
adjusted the symref-printing code to look like this:

    if (item->symref) {
    skip_prefix(item->symref, "refs/remotes/", &desc);
    strbuf_addf(&out, " -> %s", desc);
    }

This has three bugs in it:

  1. It always skips past "refs/remotes/", instead of
     skipping past the prefix associated with the branch we
     are showing (so commonly we see "refs/remotes/" for the
     refs/remotes/origin/HEAD symref, but the previous code
     would skip "refs/heads/" when showing a symref it found
     in refs/heads/.

  2. If skip_prefix() does not match, it leaves "desc"
     untouched, and we show whatever happened to be in it
     (which is the refname from a call to skip_prefix()
     earlier in the function).

  3. If we do match with skip_prefix(), we stomp on the
     "desc" variable, which is later passed to
     add_verbose_info(). We probably want to retain the
     original refname there (though it likely doesn't matter
     in practice, since after all, one points to the other).

The fix to match the original code is fairly easy: record
the prefix to strip based on item->kind, and use it here.
However, since we already have a local variable named "prefix",
let's give the two prefixes verbose names so we don't
confuse them.

Signed-off-by: Jeff King <peff@peff.net>
Acked-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/branch.c
t/t3203-branch-output.sh