Skip to content

Commit

Permalink
Merge branch 'jk/cat-file-regression-fix'
Browse files Browse the repository at this point in the history
"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
  • Loading branch information
Junio C Hamano committed Dec 27, 2013
2 parents 2b0a564 + 6554dfa commit 604ada4
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 10 deletions.
30 changes: 20 additions & 10 deletions builtin/cat-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -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
Expand Down
22 changes: 22 additions & 0 deletions t/t1006-cat-file.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit 604ada4

Please sign in to comment.