Matthias Kestenholz | 640ce10 | 2006-08-03 17:24:38 +0200 | [diff] [blame] | 1 | #include "builtin.h" |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 2 | #include "cache.h" |
Junio C Hamano | 8da1977 | 2006-09-20 22:02:01 -0700 | [diff] [blame] | 3 | #include "refs.h" |
Pierre Habouzit | 7855861 | 2007-10-07 23:18:23 +0200 | [diff] [blame] | 4 | #include "parse-options.h" |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 5 | |
Pierre Habouzit | 7855861 | 2007-10-07 23:18:23 +0200 | [diff] [blame] | 6 | static const char * const git_symbolic_ref_usage[] = { |
Nguyễn Thái Ngọc Duy | b10bf3f | 2012-08-20 19:32:46 +0700 | [diff] [blame] | 7 | N_("git symbolic-ref [options] name [ref]"), |
Johan Herland | 9ab55da | 2012-10-21 13:32:33 +0200 | [diff] [blame] | 8 | N_("git symbolic-ref -d [-q] name"), |
Pierre Habouzit | 7855861 | 2007-10-07 23:18:23 +0200 | [diff] [blame] | 9 | NULL |
| 10 | }; |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 11 | |
Johan Herland | 9ab55da | 2012-10-21 13:32:33 +0200 | [diff] [blame] | 12 | static int check_symref(const char *HEAD, int quiet, int shorten, int print) |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 13 | { |
| 14 | unsigned char sha1[20]; |
Junio C Hamano | 8da1977 | 2006-09-20 22:02:01 -0700 | [diff] [blame] | 15 | int flag; |
Jan Krüger | 42b0059 | 2012-02-27 23:10:38 +0100 | [diff] [blame] | 16 | const char *refname = resolve_ref_unsafe(HEAD, sha1, 0, &flag); |
Linus Torvalds | ed378ec | 2006-09-11 20:17:35 -0700 | [diff] [blame] | 17 | |
Jan Krüger | 42b0059 | 2012-02-27 23:10:38 +0100 | [diff] [blame] | 18 | if (!refname) |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 19 | die("No such ref: %s", HEAD); |
Junio C Hamano | a0f4280 | 2007-01-15 13:56:05 -0800 | [diff] [blame] | 20 | else if (!(flag & REF_ISSYMREF)) { |
| 21 | if (!quiet) |
| 22 | die("ref %s is not a symbolic ref", HEAD); |
| 23 | else |
Johan Herland | 9ab55da | 2012-10-21 13:32:33 +0200 | [diff] [blame] | 24 | return 1; |
Junio C Hamano | a0f4280 | 2007-01-15 13:56:05 -0800 | [diff] [blame] | 25 | } |
Johan Herland | 9ab55da | 2012-10-21 13:32:33 +0200 | [diff] [blame] | 26 | if (print) { |
| 27 | if (shorten) |
| 28 | refname = shorten_unambiguous_ref(refname, 0); |
| 29 | puts(refname); |
| 30 | } |
| 31 | return 0; |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 32 | } |
| 33 | |
Matthias Kestenholz | 640ce10 | 2006-08-03 17:24:38 +0200 | [diff] [blame] | 34 | int cmd_symbolic_ref(int argc, const char **argv, const char *prefix) |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 35 | { |
Johan Herland | 9ab55da | 2012-10-21 13:32:33 +0200 | [diff] [blame] | 36 | int quiet = 0, delete = 0, shorten = 0, ret = 0; |
Nicolas Pitre | 8b5157e | 2007-01-26 17:26:10 -0500 | [diff] [blame] | 37 | const char *msg = NULL; |
Pierre Habouzit | 7855861 | 2007-10-07 23:18:23 +0200 | [diff] [blame] | 38 | struct option options[] = { |
Jonathan Nieder | 8c83968 | 2010-11-08 13:54:48 -0600 | [diff] [blame] | 39 | OPT__QUIET(&quiet, |
Nguyễn Thái Ngọc Duy | b10bf3f | 2012-08-20 19:32:46 +0700 | [diff] [blame] | 40 | N_("suppress error message for non-symbolic (detached) refs")), |
Johan Herland | 9ab55da | 2012-10-21 13:32:33 +0200 | [diff] [blame] | 41 | OPT_BOOL('d', "delete", &delete, N_("delete symbolic ref")), |
Nguyễn Thái Ngọc Duy | b10bf3f | 2012-08-20 19:32:46 +0700 | [diff] [blame] | 42 | OPT_BOOL(0, "short", &shorten, N_("shorten ref output")), |
| 43 | OPT_STRING('m', NULL, &msg, N_("reason"), N_("reason of the update")), |
Pierre Habouzit | 7855861 | 2007-10-07 23:18:23 +0200 | [diff] [blame] | 44 | OPT_END(), |
| 45 | }; |
Junio C Hamano | a0f4280 | 2007-01-15 13:56:05 -0800 | [diff] [blame] | 46 | |
Johannes Schindelin | ef90d6d | 2008-05-14 18:46:53 +0100 | [diff] [blame] | 47 | git_config(git_default_config, NULL); |
Stephen Boyd | 3778292 | 2009-05-23 11:53:12 -0700 | [diff] [blame] | 48 | argc = parse_options(argc, argv, prefix, options, |
| 49 | git_symbolic_ref_usage, 0); |
Junio C Hamano | c01499e | 2013-10-16 10:26:39 -0700 | [diff] [blame] | 50 | if (msg && !*msg) |
Pierre Habouzit | 7855861 | 2007-10-07 23:18:23 +0200 | [diff] [blame] | 51 | die("Refusing to perform update with empty message"); |
Johan Herland | 9ab55da | 2012-10-21 13:32:33 +0200 | [diff] [blame] | 52 | |
| 53 | if (delete) { |
| 54 | if (argc != 1) |
| 55 | usage_with_options(git_symbolic_ref_usage, options); |
| 56 | ret = check_symref(argv[0], 1, 0, 0); |
| 57 | if (ret) |
| 58 | die("Cannot delete %s, not a symbolic ref", argv[0]); |
| 59 | return delete_ref(argv[0], NULL, REF_NODEREF); |
| 60 | } |
| 61 | |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 62 | switch (argc) { |
Pierre Habouzit | 7855861 | 2007-10-07 23:18:23 +0200 | [diff] [blame] | 63 | case 1: |
Johan Herland | 9ab55da | 2012-10-21 13:32:33 +0200 | [diff] [blame] | 64 | ret = check_symref(argv[0], quiet, shorten, 1); |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 65 | break; |
Pierre Habouzit | 7855861 | 2007-10-07 23:18:23 +0200 | [diff] [blame] | 66 | case 2: |
Jeff King | afe5d3d | 2009-01-29 03:33:02 -0500 | [diff] [blame] | 67 | if (!strcmp(argv[0], "HEAD") && |
Jeff King | e9cc02f | 2009-02-13 13:26:09 -0500 | [diff] [blame] | 68 | prefixcmp(argv[1], "refs/")) |
| 69 | die("Refusing to point HEAD outside of refs/"); |
Pierre Habouzit | 7855861 | 2007-10-07 23:18:23 +0200 | [diff] [blame] | 70 | create_symref(argv[0], argv[1], msg); |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 71 | break; |
| 72 | default: |
Pierre Habouzit | 7855861 | 2007-10-07 23:18:23 +0200 | [diff] [blame] | 73 | usage_with_options(git_symbolic_ref_usage, options); |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 74 | } |
Johan Herland | 9ab55da | 2012-10-21 13:32:33 +0200 | [diff] [blame] | 75 | return ret; |
Junio C Hamano | 8098a17 | 2005-09-30 14:26:57 -0700 | [diff] [blame] | 76 | } |