A few more options for git-cat-file
This adds '-e' option to git-cat-file, to test for the existence of the object. This also cleans up the option-parsing in git-cat-file slightly. [jc: HPA version had -n option which did rev-parse --verify; the real value of this patch is the option parsing cleanup.] Signed-off-by: H. Peter Anvin <hpa@zytor.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
e40b61fb6b
commit
7950571ad7
@ -8,7 +8,7 @@ git-cat-file - Provide content or type information for repository objects
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
'git-cat-file' (-t | -s | <type>) <object>
|
||||
'git-cat-file' (-t | -s | -e | <type>) <object>
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
@ -29,6 +29,10 @@ OPTIONS
|
||||
Instead of the content, show the object size identified by
|
||||
<object>.
|
||||
|
||||
-e::
|
||||
Suppress all output; instead exit with zero status if <object>
|
||||
exists and is a valid object.
|
||||
|
||||
<type>::
|
||||
Typically this matches the real type of <object> but asking
|
||||
for a type that can trivially be dereferenced from the given
|
||||
@ -39,8 +43,11 @@ OPTIONS
|
||||
|
||||
OUTPUT
|
||||
------
|
||||
If '-t' is specified, one of the <type>. If '-s' is specified,
|
||||
the size of the <object> in bytes.
|
||||
If '-t' is specified, one of the <type>.
|
||||
|
||||
If '-s' is specified, the size of the <object> in bytes.
|
||||
|
||||
If '-e' is specified, no output.
|
||||
|
||||
Otherwise the raw (though uncompressed) contents of the <object> will
|
||||
be returned.
|
||||
|
45
cat-file.c
45
cat-file.c
@ -11,27 +11,44 @@ int main(int argc, char **argv)
|
||||
char type[20];
|
||||
void *buf;
|
||||
unsigned long size;
|
||||
int opt;
|
||||
|
||||
setup_git_directory();
|
||||
if (argc != 3 || get_sha1(argv[2], sha1))
|
||||
usage("git-cat-file [-t | -s | <type>] <sha1>");
|
||||
usage("git-cat-file [-t|-s|-e|<type>] <sha1>");
|
||||
|
||||
if (!strcmp("-t", argv[1]) || !strcmp("-s", argv[1])) {
|
||||
if (!sha1_object_info(sha1, type,
|
||||
argv[1][1] == 's' ? &size : NULL)) {
|
||||
switch (argv[1][1]) {
|
||||
case 't':
|
||||
printf("%s\n", type);
|
||||
break;
|
||||
case 's':
|
||||
printf("%lu\n", size);
|
||||
break;
|
||||
}
|
||||
opt = 0;
|
||||
if ( argv[1][0] == '-' ) {
|
||||
opt = argv[1][1];
|
||||
if ( !opt || argv[1][2] )
|
||||
opt = -1; /* Not a single character option */
|
||||
}
|
||||
|
||||
buf = NULL;
|
||||
switch (opt) {
|
||||
case 't':
|
||||
if (!sha1_object_info(sha1, type, NULL)) {
|
||||
printf("%s\n", type);
|
||||
return 0;
|
||||
}
|
||||
buf = NULL;
|
||||
} else {
|
||||
break;
|
||||
|
||||
case 's':
|
||||
if (!sha1_object_info(sha1, type, &size)) {
|
||||
printf("%lu\n", size);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
return !has_sha1_file(sha1);
|
||||
|
||||
case 0:
|
||||
buf = read_object_with_reference(sha1, argv[1], &size, NULL);
|
||||
break;
|
||||
|
||||
default:
|
||||
die("git-cat-file: unknown option: %s\n", argv[1]);
|
||||
}
|
||||
|
||||
if (!buf)
|
||||
|
Loading…
Reference in New Issue
Block a user