Fix git-fetch while on detached HEAD not to give needlessly alarming errors
authorJunio C Hamano <junkio@cox.net>
Mon, 15 Jan 2007 21:56:05 +0000 (13:56 -0800)
committerJunio C Hamano <junkio@cox.net>
Mon, 15 Jan 2007 23:35:07 +0000 (15:35 -0800)
When we are on a detached HEAD, there is no current branch.
There is no reason to leak the error messages to the end user
since this is a situation we expect to see.

This adds -q option to git-symbolic-ref to exit without issuing
an error message if the given name is not a symbolic ref.

By the way, with or without this patch, there currently is no
good way to tell failure modes between "git symbolic-ref HAED"
and "git symbolic-ref HEAD".  Both says "is not a symbolic ref".

We may want to do something about it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Documentation/git-symbolic-ref.txt
builtin-symbolic-ref.c
git-parse-remote.sh

index 4bc35a1d4bfce9b92394ba0f3e98ed9943f66e2e..1e818bb02dcad32095e5e14236d177360fe0f3a1 100644 (file)
@@ -7,7 +7,7 @@ git-symbolic-ref - read and modify symbolic refs
 
 SYNOPSIS
 --------
-'git-symbolic-ref' <name> [<ref>]
+'git-symbolic-ref' [-q] <name> [<ref>]
 
 DESCRIPTION
 -----------
@@ -23,6 +23,14 @@ A symbolic ref is a regular file that stores a string that
 begins with `ref: refs/`.  For example, your `.git/HEAD` is
 a regular file whose contents is `ref: refs/heads/master`.
 
+OPTIONS
+-------
+
+-q::
+       Do not issue an error message if the <name> is not a
+       symbolic ref but a detached HEAD; instead exit with
+       non-zero status silently.
+
 NOTES
 -----
 In the past, `.git/HEAD` was a symbolic link pointing at
index d8be0527f4752131b0a1276ecedcc82714636c28..227c9d4a6274871b52420221d9d088bb3ac5554f 100644 (file)
@@ -3,9 +3,9 @@
 #include "refs.h"
 
 static const char git_symbolic_ref_usage[] =
-"git-symbolic-ref name [ref]";
+"git-symbolic-ref [-q] name [ref]";
 
-static void check_symref(const char *HEAD)
+static void check_symref(const char *HEAD, int quiet)
 {
        unsigned char sha1[20];
        int flag;
@@ -13,17 +13,41 @@ static void check_symref(const char *HEAD)
 
        if (!refs_heads_master)
                die("No such ref: %s", HEAD);
-       else if (!(flag & REF_ISSYMREF))
-               die("ref %s is not a symbolic ref", HEAD);
+       else if (!(flag & REF_ISSYMREF)) {
+               if (!quiet)
+                       die("ref %s is not a symbolic ref", HEAD);
+               else
+                       exit(1);
+       }
        puts(refs_heads_master);
 }
 
 int cmd_symbolic_ref(int argc, const char **argv, const char *prefix)
 {
+       int quiet = 0;
+
        git_config(git_default_config);
+
+       while (1 < argc) {
+               const char *arg = argv[1];
+               if (arg[0] != '-')
+                       break;
+               else if (!strcmp("-q", arg))
+                       quiet = 1;
+               else if (!strcmp("--", arg)) {
+                       argc--;
+                       argv++;
+                       break;
+               }
+               else
+                       die("unknown option %s", arg);
+               argc--;
+               argv++;
+       }
+
        switch (argc) {
        case 2:
-               check_symref(argv[1]);
+               check_symref(argv[1], quiet);
                break;
        case 3:
                create_symref(argv[1], argv[2]);
index d2e4c2b9aede8310879cea9c47bd3cee323f11af..4fc602082b23c695211b4333469ae0dce1a33727 100755 (executable)
@@ -49,7 +49,7 @@ get_remote_url () {
 }
 
 get_default_remote () {
-       curr_branch=$(git-symbolic-ref HEAD | sed -e 's|^refs/heads/||')
+       curr_branch=$(git-symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')
        origin=$(git-repo-config --get "branch.$curr_branch.remote")
        echo ${origin:-origin}
 }
@@ -137,7 +137,7 @@ canon_refs_list_for_fetch () {
                shift
                if test "$remote" = "$(get_default_remote)"
                then
-                       curr_branch=$(git-symbolic-ref HEAD | \
+                       curr_branch=$(git-symbolic-ref -q HEAD | \
                            sed -e 's|^refs/heads/||')
                        merge_branches=$(git-repo-config \
                            --get-all "branch.${curr_branch}.merge")