Merge branch 'mb/fetch-call-a-non-branch-a-ref' into maint
authorJunio C Hamano <gitster@pobox.com>
Thu, 3 May 2012 22:29:25 +0000 (15:29 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 3 May 2012 22:29:25 +0000 (15:29 -0700)
The report from "git fetch" said "new branch" even for a non branch ref.

By Marc Branchaud
* mb/fetch-call-a-non-branch-a-ref:
fetch: describe new refs based on where it came from
fetch: Give remote_ref to update_local_ref() as well

builtin/fetch.c
t/t5510-fetch.sh
index cfb43df4e843970a7ff93078ea1bcbbdb9985260..1c8cb62445a3dc7a0ff1ff6d2663faec1bced167 100644 (file)
@@ -240,6 +240,7 @@ static int s_update_ref(const char *action,
 
 static int update_local_ref(struct ref *ref,
                            const char *remote,
+                           const struct ref *remote_ref,
                            struct strbuf *display)
 {
        struct commit *current = NULL, *updated;
@@ -293,13 +294,21 @@ static int update_local_ref(struct ref *ref,
                const char *msg;
                const char *what;
                int r;
-               if (!strncmp(ref->name, "refs/tags/", 10)) {
+               /*
+                * Nicely describe the new ref we're fetching.
+                * Base this on the remote's ref name, as it's
+                * more likely to follow a standard layout.
+                */
+               const char *name = remote_ref ? remote_ref->name : "";
+               if (!prefixcmp(name, "refs/tags/")) {
                        msg = "storing tag";
                        what = _("[new tag]");
-               }
-               else {
+               } else if (!prefixcmp(name, "refs/heads/")) {
                        msg = "storing head";
                        what = _("[new branch]");
+               } else {
+                       msg = "storing ref";
+                       what = _("[new ref]");
                }
 
                if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
@@ -466,7 +475,7 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 
                        strbuf_reset(&note);
                        if (ref) {
-                               rc |= update_local_ref(ref, what, &note);
+                               rc |= update_local_ref(ref, what, rm, &note);
                                free(ref);
                        } else
                                strbuf_addf(&note, "* %-*s %-*s -> FETCH_HEAD",
index 308c02ea75f3400b4d215e6091f03179a93943ad..d7a19a182941c7ab54b81bb8013835cfb8c5919f 100755 (executable)
@@ -162,6 +162,36 @@ test_expect_success 'fetch following tags' '
 
 '
 
+test_expect_success 'fetch uses remote ref names to describe new refs' '
+       cd "$D" &&
+       git init descriptive &&
+       (
+               cd descriptive &&
+               git config remote.o.url .. &&
+               git config remote.o.fetch "refs/heads/*:refs/crazyheads/*" &&
+               git config --add remote.o.fetch "refs/others/*:refs/heads/*" &&
+               git fetch o
+       ) &&
+       git tag -a -m "Descriptive tag" descriptive-tag &&
+       git branch descriptive-branch &&
+       git checkout descriptive-branch &&
+       echo "Nuts" >crazy &&
+       git add crazy &&
+       git commit -a -m "descriptive commit" &&
+       git update-ref refs/others/crazy HEAD &&
+       (
+               cd descriptive &&
+               git fetch o 2>actual &&
+               grep " -> refs/crazyheads/descriptive-branch$" actual |
+               test_i18ngrep "new branch" &&
+               grep " -> descriptive-tag$" actual |
+               test_i18ngrep "new tag" &&
+               grep " -> crazy$" actual |
+               test_i18ngrep "new ref"
+       ) &&
+       git checkout master
+'
+
 test_expect_success 'fetch must not resolve short tag name' '
 
        cd "$D" &&