mirror of
https://github.com/git/git.git
synced 2026-04-10 00:40:14 +02:00
Merge branch 'jk/cat-file-batch-optim'
Rework the reverted change to `cat-file --batch-check`. * jk/cat-file-batch-optim: cat-file: only split on whitespace when %(rest) is used
This commit is contained in:
@@ -119,6 +119,7 @@ struct expand_data {
|
||||
enum object_type type;
|
||||
unsigned long size;
|
||||
unsigned long disk_size;
|
||||
const char *rest;
|
||||
|
||||
/*
|
||||
* If mark_query is true, we do not expand anything, but rather
|
||||
@@ -126,6 +127,13 @@ struct expand_data {
|
||||
*/
|
||||
int mark_query;
|
||||
|
||||
/*
|
||||
* Whether to split the input on whitespace before feeding it to
|
||||
* get_sha1; this is decided during the mark_query phase based on
|
||||
* whether we have a %(rest) token in our format.
|
||||
*/
|
||||
int split_on_whitespace;
|
||||
|
||||
/*
|
||||
* After a mark_query run, this object_info is set up to be
|
||||
* passed to sha1_object_info_extended. It will point to the data
|
||||
@@ -163,6 +171,11 @@ static void expand_atom(struct strbuf *sb, const char *atom, int len,
|
||||
data->info.disk_sizep = &data->disk_size;
|
||||
else
|
||||
strbuf_addf(sb, "%lu", data->disk_size);
|
||||
} else if (is_atom("rest", atom, len)) {
|
||||
if (data->mark_query)
|
||||
data->split_on_whitespace = 1;
|
||||
else if (data->rest)
|
||||
strbuf_addstr(sb, data->rest);
|
||||
} else
|
||||
die("unknown format element: %.*s", len, atom);
|
||||
}
|
||||
@@ -273,7 +286,23 @@ static int batch_objects(struct batch_options *opt)
|
||||
warn_on_object_refname_ambiguity = 0;
|
||||
|
||||
while (strbuf_getline(&buf, stdin, '\n') != EOF) {
|
||||
int error = batch_one_object(buf.buf, opt, &data);
|
||||
int error;
|
||||
|
||||
if (data.split_on_whitespace) {
|
||||
/*
|
||||
* Split at first whitespace, tying off the beginning
|
||||
* of the string and saving the remainder (or NULL) in
|
||||
* data.rest.
|
||||
*/
|
||||
char *p = strpbrk(buf.buf, " \t");
|
||||
if (p) {
|
||||
while (*p && strchr(" \t", *p))
|
||||
*p++ = '\0';
|
||||
}
|
||||
data.rest = p;
|
||||
}
|
||||
|
||||
error = batch_one_object(buf.buf, opt, &data);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user