Merge branch 'jk/cat-file-regression-fix' into maint
"git cat-file --batch=", an admittedly useless command, did not behave very well. * jk/cat-file-regression-fix: cat-file: handle --batch format with missing type/size cat-file: pass expand_data to print_object_or_die
This commit is contained in:
commit
6845e8a62d
@ -193,25 +193,28 @@ static size_t expand_format(struct strbuf *sb, const char *start, void *data)
|
||||
return end - start + 1;
|
||||
}
|
||||
|
||||
static void print_object_or_die(int fd, const unsigned char *sha1,
|
||||
enum object_type type, unsigned long size)
|
||||
static void print_object_or_die(int fd, struct expand_data *data)
|
||||
{
|
||||
if (type == OBJ_BLOB) {
|
||||
const unsigned char *sha1 = data->sha1;
|
||||
|
||||
assert(data->info.typep);
|
||||
|
||||
if (data->type == OBJ_BLOB) {
|
||||
if (stream_blob_to_fd(fd, sha1, NULL, 0) < 0)
|
||||
die("unable to stream %s to stdout", sha1_to_hex(sha1));
|
||||
}
|
||||
else {
|
||||
enum object_type rtype;
|
||||
unsigned long rsize;
|
||||
enum object_type type;
|
||||
unsigned long size;
|
||||
void *contents;
|
||||
|
||||
contents = read_sha1_file(sha1, &rtype, &rsize);
|
||||
contents = read_sha1_file(sha1, &type, &size);
|
||||
if (!contents)
|
||||
die("object %s disappeared", sha1_to_hex(sha1));
|
||||
if (rtype != type)
|
||||
if (type != data->type)
|
||||
die("object %s changed type!?", sha1_to_hex(sha1));
|
||||
if (rsize != size)
|
||||
die("object %s change size!?", sha1_to_hex(sha1));
|
||||
if (data->info.sizep && size != data->size)
|
||||
die("object %s changed size!?", sha1_to_hex(sha1));
|
||||
|
||||
write_or_die(fd, contents, size);
|
||||
free(contents);
|
||||
@ -250,7 +253,7 @@ static int batch_one_object(const char *obj_name, struct batch_options *opt,
|
||||
strbuf_release(&buf);
|
||||
|
||||
if (opt->print_contents) {
|
||||
print_object_or_die(1, data->sha1, data->type, data->size);
|
||||
print_object_or_die(1, data);
|
||||
write_or_die(1, "\n", 1);
|
||||
}
|
||||
return 0;
|
||||
@ -274,6 +277,13 @@ static int batch_objects(struct batch_options *opt)
|
||||
strbuf_expand(&buf, opt->format, expand_format, &data);
|
||||
data.mark_query = 0;
|
||||
|
||||
/*
|
||||
* If we are printing out the object, then always fill in the type,
|
||||
* since we will want to decide whether or not to stream.
|
||||
*/
|
||||
if (opt->print_contents)
|
||||
data.info.typep = &data.type;
|
||||
|
||||
/*
|
||||
* We are going to call get_sha1 on a potentially very large number of
|
||||
* objects. In most large cases, these will be actual object sha1s. The
|
||||
|
@ -85,6 +85,28 @@ $content"
|
||||
git cat-file --batch-check="%(objecttype) %(rest)" >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test -z "$content" ||
|
||||
test_expect_success "--batch without type ($type)" '
|
||||
{
|
||||
echo "$size" &&
|
||||
maybe_remove_timestamp "$content" $no_ts
|
||||
} >expect &&
|
||||
echo $sha1 | git cat-file --batch="%(objectsize)" >actual.full &&
|
||||
maybe_remove_timestamp "$(cat actual.full)" $no_ts >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test -z "$content" ||
|
||||
test_expect_success "--batch without size ($type)" '
|
||||
{
|
||||
echo "$type" &&
|
||||
maybe_remove_timestamp "$content" $no_ts
|
||||
} >expect &&
|
||||
echo $sha1 | git cat-file --batch="%(objecttype)" >actual.full &&
|
||||
maybe_remove_timestamp "$(cat actual.full)" $no_ts >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
}
|
||||
|
||||
hello_content="Hello World"
|
||||
|
Loading…
Reference in New Issue
Block a user