summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 3023dc6)
raw | patch | inline | side by side (parent: 3023dc6)
author | Junio C Hamano <gitster@pobox.com> | |
Sat, 5 Jan 2008 20:09:55 +0000 (12:09 -0800) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Mon, 7 Jan 2008 02:41:43 +0000 (18:41 -0800) |
The plumbing level can understand that the user meant
"refs/heads/master" when the user says "master" or
"heads/master", but there is no easy way for the scripts to
figure it out without duplicating the dwim_ref() logic.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
"refs/heads/master" when the user says "master" or
"heads/master", but there is no easy way for the scripts to
figure it out without duplicating the dwim_ref() logic.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-rev-parse.txt | patch | blob | history | |
builtin-rev-parse.c | patch | blob | history |
index 329fce0aab417e5fe02845bd21b693f5200b3634..0cedc137288ad4ca87839c6daa959a104fe6dc2d 100644 (file)
possible '{caret}' prefix); this option makes them output in a
form as close to the original input as possible.
+--symbolic-full-name::
+ This is similar to \--symbolic, but it omits input that
+ are not refs (i.e. branch or tag names; or more
+ explicitly disambiguating "heads/master" form, when you
+ want to name the "master" branch when there is an
+ unfortunately named tag "master"), and show them as full
+ refnames (e.g. "refs/heads/master").
--all::
Show all refs found in `$GIT_DIR/refs`.
diff --git a/builtin-rev-parse.c b/builtin-rev-parse.c
index 20d1789e0161ed3d2d18cec94b1915f518a5d662..b9af1a5a554e21338531b88cd34bcb767d5f3848 100644 (file)
--- a/builtin-rev-parse.c
+++ b/builtin-rev-parse.c
#define NORMAL 0
#define REVERSED 1
static int show_type = NORMAL;
+
+#define SHOW_SYMBOLIC_ASIS 1
+#define SHOW_SYMBOLIC_FULL 2
static int symbolic;
static int abbrev;
static int output_sq;
if (type != show_type)
putchar('^');
- if (symbolic && name)
- show(name);
+ if (symbolic && name) {
+ if (symbolic == SHOW_SYMBOLIC_FULL) {
+ unsigned char discard[20];
+ char *full;
+
+ switch (dwim_ref(name, strlen(name), discard, &full)) {
+ case 0:
+ /*
+ * Not found -- not a ref. We could
+ * emit "name" here, but symbolic-full
+ * users are interested in finding the
+ * refs spelled in full, and they would
+ * need to filter non-refs if we did so.
+ */
+ break;
+ case 1: /* happy */
+ show(full);
+ break;
+ default: /* ambiguous */
+ error("refname '%s' is ambiguous", name);
+ break;
+ }
+ } else {
+ show(name);
+ }
+ }
else if (abbrev)
show(find_unique_abbrev(sha1, abbrev));
else
continue;
}
if (!strcmp(arg, "--symbolic")) {
- symbolic = 1;
+ symbolic = SHOW_SYMBOLIC_ASIS;
+ continue;
+ }
+ if (!strcmp(arg, "--symbolic-full-name")) {
+ symbolic = SHOW_SYMBOLIC_FULL;
continue;
}
if (!strcmp(arg, "--all")) {