Thread (22 messages) flat view 22 messages, 4 authors, 2016-06-15

Re: [PATCHv2 10/10] branch: Fix display of remote branches in refs/peers/*

From: Eric Sunshine <hidden>
Date: 2016-06-15 22:57:13

On Sat, May 11, 2013 at 12:21 PM, Johan Herland [off-list ref] wrote:
quoted hunk ↗ jump to hunk
diff --git a/builtin/branch.c b/builtin/branch.c
index 4480be2..9a6bce8 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -328,74 +326,80 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags,
        struct ref_list *ref_list = cb->ref_list;
        struct ref_item *newitem;
        struct commit *commit;
+       struct strbuf ref = STRBUF_INIT;
        int kind, i;
-       const char *prefix, *orig_refname = refname;
+       const char *pattern;
+       size_t refname_len = strlen(refname);

        static struct {
                int kind;
-               const char *prefix;
-               int pfxlen;
+               const char *pattern;
        } ref_kind[] = {
-               { REF_LOCAL_BRANCH, "refs/heads/", 11 },
-               { REF_REMOTE_BRANCH, "refs/remotes/", 13 },
+               { REF_LOCAL_BRANCH, "refs/heads/%*" },
+               { REF_REMOTE_BRANCH, "refs/remotes/%*" },
+               { REF_REMOTE_BRANCH, "refs/peers/%1/heads/%*" },
        };

        /* Detect kind */
        for (i = 0; i < ARRAY_SIZE(ref_kind); i++) {
-               prefix = ref_kind[i].prefix;
-               if (strncmp(refname, prefix, ref_kind[i].pfxlen))
+               if (refname_shorten(&ref, ref_kind[i].pattern, refname, refname_len))
                        continue;
                kind = ref_kind[i].kind;
-               refname += ref_kind[i].pfxlen;
+               pattern = ref_kind[i].pattern;
                break;
        }
        if (ARRAY_SIZE(ref_kind) <= i)
-               return 0;
+               goto out;

        /* Don't add types the caller doesn't want */
        if ((kind & ref_list->kinds) == 0)
-               return 0;
+               goto out;

-       if (!match_patterns(cb->pattern, refname))
-               return 0;
+       if (!match_patterns(cb->pattern, ref.buf))
+               goto out;

        commit = NULL;
        if (ref_list->verbose || ref_list->with_commit || merge_filter != NO_FILTER) {
                commit = lookup_commit_reference_gently(sha1, 1);
                if (!commit) {
-                       cb->ret = error(_("branch '%s' does not point at a commit"), refname);
-                       return 0;
+                       cb->ret = error(_("branch '%s' does not point at a commit"), ref.buf);
+                       goto out;
                }

                /* Filter with with_commit if specified */
                if (!is_descendant_of(commit, ref_list->with_commit))
-                       return 0;
+                       goto out;

                if (merge_filter != NO_FILTER)
                        add_pending_object(&ref_list->revs,
-                                          (struct object *)commit, refname);
+                                          (struct object *)commit, ref.buf);
        }

+       /*
+        * When displaying more then just remote-tracking branches, make the
s/then/than/
quoted hunk ↗ jump to hunk
+        * remote-tracking branches more explicit, e.g. instead of printing
+        * "origin/master", we should print "remote/origin/master" (or
+        * "peers/origin/heads/master").
+        */
+       if (kind == REF_REMOTE_BRANCH && ref_list->kinds != REF_REMOTE_BRANCH)
+               refname_shorten(&ref, "refs/%*", refname, refname_len);
+
        ALLOC_GROW(ref_list->list, ref_list->index + 1, ref_list->alloc);

        /* Record the new item */
        newitem = &(ref_list->list[ref_list->index++]);
        strbuf_init(&newitem->name, 0);
-       strbuf_addstr(&newitem->name, refname);
+       strbuf_addbuf(&newitem->name, &ref);
        newitem->kind = kind;
        newitem->commit = commit;
        strbuf_init(&newitem->dest, 0);
-       orig_refname = resolve_symref(orig_refname, prefix);
-       if (orig_refname)
-               strbuf_addstr(&newitem->dest, orig_refname);
-       /* adjust for "remotes/" */
-       if (newitem->kind == REF_REMOTE_BRANCH &&
-           ref_list->kinds != REF_REMOTE_BRANCH)
-               strbuf_insert(&newitem->name, 0, "remotes/", 8);
+       resolve_symref(&newitem->dest, pattern, refname);
        newitem->width = utf8_strwidth(newitem->name.buf);
        if (newitem->width > ref_list->maxwidth)
                ref_list->maxwidth = newitem->width;

+out:
+       strbuf_release(&ref);
        return 0;
 }
diff --git a/refs.c b/refs.c
index 188a9eb..a78199a 100644
--- a/refs.c
+++ b/refs.c
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help