| #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; |
| } |