diff options
Diffstat (limited to 'builtin-symbolic-ref.c')
-rw-r--r-- | builtin-symbolic-ref.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/builtin-symbolic-ref.c b/builtin-symbolic-ref.c new file mode 100644 index 0000000000..d41b40640b --- /dev/null +++ b/builtin-symbolic-ref.c @@ -0,0 +1,71 @@ +#include "builtin.h" +#include "cache.h" +#include "refs.h" + +static const char git_symbolic_ref_usage[] = +"git-symbolic-ref [-q] [-m <reason>] name [ref]"; + +static void check_symref(const char *HEAD, int quiet) +{ + unsigned char sha1[20]; + 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], quiet); + break; + case 3: + create_symref(argv[1], argv[2], msg); + break; + default: + usage(git_symbolic_ref_usage); + } + return 0; +} |