diff options
author | Junio C Hamano <junkio@cox.net> | 2007-01-15 13:56:05 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-01-15 15:35:07 -0800 |
commit | a0f4280f9e5decd384fe5cc9e30414b901aeb478 (patch) | |
tree | 927157116ad3f3af9b1982c68cba6b35afd12948 | |
parent | 15261e3b33de3b49cc0a7d1b36b8685e02931ad7 (diff) | |
download | git-a0f4280f9e5decd384fe5cc9e30414b901aeb478.tar.gz |
Fix git-fetch while on detached HEAD not to give needlessly alarming errors
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>
-rw-r--r-- | Documentation/git-symbolic-ref.txt | 10 | ||||
-rw-r--r-- | builtin-symbolic-ref.c | 34 | ||||
-rwxr-xr-x | git-parse-remote.sh | 4 |
3 files changed, 40 insertions, 8 deletions
diff --git a/Documentation/git-symbolic-ref.txt b/Documentation/git-symbolic-ref.txt index 4bc35a1d4b..1e818bb02d 100644 --- a/Documentation/git-symbolic-ref.txt +++ b/Documentation/git-symbolic-ref.txt @@ -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 diff --git a/builtin-symbolic-ref.c b/builtin-symbolic-ref.c index d8be0527f4..227c9d4a62 100644 --- a/builtin-symbolic-ref.c +++ b/builtin-symbolic-ref.c @@ -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]); diff --git a/git-parse-remote.sh b/git-parse-remote.sh index d2e4c2b9ae..4fc602082b 100755 --- a/git-parse-remote.sh +++ b/git-parse-remote.sh @@ -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") |