show-ref --hash=len, --abbrev=len, and --abbrev

This teaches show-ref to abbreviate the object name.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2006-10-01 00:27:27 -07:00
parent 936a9508cc
commit 2eaf22242f
2 changed files with 39 additions and 8 deletions

View File

@ -9,7 +9,7 @@ SYNOPSIS
-------- --------
[verse] [verse]
'git-show-ref' [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] 'git-show-ref' [-q|--quiet] [--verify] [-h|--head] [-d|--dereference]
[-s|--hash] [--tags] [--heads] [--] <pattern>... [-s|--hash] [--abbrev] [--tags] [--heads] [--] <pattern>...
DESCRIPTION DESCRIPTION
----------- -----------
@ -37,14 +37,13 @@ OPTIONS
-d, --dereference:: -d, --dereference::
Dereference tags into object IDs. They will be shown with "^{}" Dereference tags into object IDs as well. They will be shown with "^{}"
appended. appended.
-s, --hash:: -s, --hash::
Only show the SHA1 hash, not the reference name. When also using Only show the SHA1 hash, not the reference name. When also using
--dereference the dereferenced tag will still be shown after the SHA1, --dereference the dereferenced tag will still be shown after the SHA1.
this maybe a bug.
--verify:: --verify::
@ -52,6 +51,11 @@ OPTIONS
Aside from returning an error code of 1, it will also print an error Aside from returning an error code of 1, it will also print an error
message if '--quiet' was not specified. message if '--quiet' was not specified.
--abbrev, --abbrev=len::
Abbreviate the object name. When using `--hash`, you do
not have to say `--hash --abbrev`; `--hash=len` would do.
-q, --quiet:: -q, --quiet::
Do not print any results to stdout. When combined with '--verify' this Do not print any results to stdout. When combined with '--verify' this

View File

@ -6,12 +6,13 @@
static const char show_ref_usage[] = "git show-ref [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] [-s|--hash] [--tags] [--heads] [--] [pattern*]"; static const char show_ref_usage[] = "git show-ref [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] [-s|--hash] [--tags] [--heads] [--] [pattern*]";
static int deref_tags = 0, show_head = 0, tags_only = 0, heads_only = 0, static int deref_tags = 0, show_head = 0, tags_only = 0, heads_only = 0,
found_match = 0, verify = 0, quiet = 0, hash_only = 0; found_match = 0, verify = 0, quiet = 0, hash_only = 0, abbrev = 0;
static const char **pattern; static const char **pattern;
static int show_ref(const char *refname, const unsigned char *sha1, int flag, void *cbdata) static int show_ref(const char *refname, const unsigned char *sha1, int flag, void *cbdata)
{ {
struct object *obj; struct object *obj;
const char *hex;
if (tags_only || heads_only) { if (tags_only || heads_only) {
int match; int match;
@ -51,13 +52,16 @@ match:
} }
if (quiet) if (quiet)
return 0; return 0;
hex = find_unique_abbrev(sha1, abbrev);
if (hash_only) if (hash_only)
printf("%s\n", sha1_to_hex(sha1)); printf("%s\n", hex);
else else
printf("%s %s\n", sha1_to_hex(sha1), refname); printf("%s %s\n", hex, refname);
if (deref_tags && obj->type == OBJ_TAG) { if (deref_tags && obj->type == OBJ_TAG) {
obj = deref_tag(obj, refname, 0); obj = deref_tag(obj, refname, 0);
printf("%s %s^{}\n", sha1_to_hex(obj->sha1), refname); hex = find_unique_abbrev(obj->sha1, abbrev);
printf("%s %s^{}\n", hex, refname);
} }
return 0; return 0;
} }
@ -94,6 +98,29 @@ int cmd_show_ref(int argc, const char **argv, const char *prefix)
hash_only = 1; hash_only = 1;
continue; continue;
} }
if (!strncmp(arg, "--hash=", 7) ||
(!strncmp(arg, "--abbrev", 8) &&
(arg[8] == '=' || arg[8] == '\0'))) {
if (arg[3] != 'h' && !arg[8])
/* --abbrev only */
abbrev = DEFAULT_ABBREV;
else {
/* --hash= or --abbrev= */
char *end;
if (arg[3] == 'h') {
hash_only = 1;
arg += 7;
}
else
arg += 9;
abbrev = strtoul(arg, &end, 10);
if (*end || abbrev > 40)
usage(show_ref_usage);
if (abbrev < MINIMUM_ABBREV)
abbrev = MINIMUM_ABBREV;
}
continue;
}
if (!strcmp(arg, "--verify")) { if (!strcmp(arg, "--verify")) {
verify = 1; verify = 1;
continue; continue;