X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=builtin-symbolic-ref.c;h=d41b40640b96e7d5568174c7d16088c29d361d42;hb=204d409247e7bbc7848569462aa11a87e373c8d6;hp=b4ec6f28ed8903ec160ce0747fd1916f69bbacdc;hpb=efced1e06e475c6e7c0b1ba0eaedf7046c01cde5;p=thirdparty%2Fgit.git diff --git a/builtin-symbolic-ref.c b/builtin-symbolic-ref.c index b4ec6f28ed..d41b40640b 100644 --- a/builtin-symbolic-ref.c +++ b/builtin-symbolic-ref.c @@ -1,32 +1,68 @@ #include "builtin.h" #include "cache.h" +#include "refs.h" static const char git_symbolic_ref_usage[] = -"git-symbolic-ref name [ref]"; +"git-symbolic-ref [-q] [-m ] name [ref]"; -static void check_symref(const char *HEAD) +static void check_symref(const char *HEAD, int quiet) { unsigned char sha1[20]; - const char *git_HEAD = strdup(git_path("%s", HEAD)); - const char *git_refs_heads_master = resolve_ref(git_HEAD, sha1, 0); - if (git_refs_heads_master) { - /* we want to strip the .git/ part */ - int pfxlen = strlen(git_HEAD) - strlen(HEAD); - puts(git_refs_heads_master + pfxlen); - } - else + int flag; + const char *refs_heads_master = resolve_ref(HEAD, sha1, 0, &flag); + + if (!refs_heads_master) die("No such ref: %s", 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; + const char *msg = NULL; + 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("-m", arg)) { + argc--; + argv++; + if (argc <= 1) + break; + msg = argv[1]; + if (!*msg) + die("Refusing to perform update with empty message"); + if (strchr(msg, '\n')) + die("Refusing to perform update with \\n in message"); + } + 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(strdup(git_path("%s", argv[1])), argv[2]); + create_symref(argv[1], argv[2], msg); break; default: usage(git_symbolic_ref_usage);