Skip to content

Commit

Permalink
git-rev-parse --symbolic-full-name
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
gitster committed Jan 7, 2008
1 parent 3023dc6 commit a6d97d4
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
7 changes: 7 additions & 0 deletions Documentation/git-rev-parse.txt
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,13 @@ OPTIONS
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`.
Expand Down
37 changes: 34 additions & 3 deletions builtin-rev-parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ static const char *def;
#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;
Expand Down Expand Up @@ -103,8 +106,32 @@ static void show_rev(int type, const unsigned char *sha1, const char *name)

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
Expand Down Expand Up @@ -421,7 +448,11 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
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")) {
Expand Down

0 comments on commit a6d97d4

Please sign in to comment.