Merge branch 'jc/cat-file-batch-default-format-optim'
Optimize away strbuf_expand() call with a hardcoded formatting logic specific for the default format in the --batch and --batch-check options of "git cat-file". * jc/cat-file-batch-default-format-optim: cat-file: skip expanding default formatmaint
commit
889860e1ad
|
@ -360,6 +360,13 @@ static void print_object_or_die(struct batch_options *opt, struct expand_data *d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void print_default_format(struct strbuf *scratch, struct expand_data *data)
|
||||||
|
{
|
||||||
|
strbuf_addf(scratch, "%s %s %"PRIuMAX"\n", oid_to_hex(&data->oid),
|
||||||
|
type_name(data->type),
|
||||||
|
(uintmax_t)data->size);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If "pack" is non-NULL, then "offset" is the byte offset within the pack from
|
* If "pack" is non-NULL, then "offset" is the byte offset within the pack from
|
||||||
* which the object may be accessed (though note that we may also rely on
|
* which the object may be accessed (though note that we may also rely on
|
||||||
|
@ -391,8 +398,14 @@ static void batch_object_write(const char *obj_name,
|
||||||
}
|
}
|
||||||
|
|
||||||
strbuf_reset(scratch);
|
strbuf_reset(scratch);
|
||||||
strbuf_expand(scratch, opt->format, expand_format, data);
|
|
||||||
strbuf_addch(scratch, '\n');
|
if (!opt->format) {
|
||||||
|
print_default_format(scratch, data);
|
||||||
|
} else {
|
||||||
|
strbuf_expand(scratch, opt->format, expand_format, data);
|
||||||
|
strbuf_addch(scratch, '\n');
|
||||||
|
}
|
||||||
|
|
||||||
batch_write(opt, scratch->buf, scratch->len);
|
batch_write(opt, scratch->buf, scratch->len);
|
||||||
|
|
||||||
if (opt->batch_mode == BATCH_MODE_CONTENTS) {
|
if (opt->batch_mode == BATCH_MODE_CONTENTS) {
|
||||||
|
@ -646,6 +659,8 @@ static void batch_objects_command(struct batch_options *opt,
|
||||||
strbuf_release(&input);
|
strbuf_release(&input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DEFAULT_FORMAT "%(objectname) %(objecttype) %(objectsize)"
|
||||||
|
|
||||||
static int batch_objects(struct batch_options *opt)
|
static int batch_objects(struct batch_options *opt)
|
||||||
{
|
{
|
||||||
struct strbuf input = STRBUF_INIT;
|
struct strbuf input = STRBUF_INIT;
|
||||||
|
@ -654,9 +669,6 @@ static int batch_objects(struct batch_options *opt)
|
||||||
int save_warning;
|
int save_warning;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
if (!opt->format)
|
|
||||||
opt->format = "%(objectname) %(objecttype) %(objectsize)";
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Expand once with our special mark_query flag, which will prime the
|
* Expand once with our special mark_query flag, which will prime the
|
||||||
* object_info to be handed to oid_object_info_extended for each
|
* object_info to be handed to oid_object_info_extended for each
|
||||||
|
@ -664,12 +676,17 @@ static int batch_objects(struct batch_options *opt)
|
||||||
*/
|
*/
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.mark_query = 1;
|
data.mark_query = 1;
|
||||||
strbuf_expand(&output, opt->format, expand_format, &data);
|
strbuf_expand(&output,
|
||||||
|
opt->format ? opt->format : DEFAULT_FORMAT,
|
||||||
|
expand_format,
|
||||||
|
&data);
|
||||||
data.mark_query = 0;
|
data.mark_query = 0;
|
||||||
strbuf_release(&output);
|
strbuf_release(&output);
|
||||||
if (opt->transform_mode)
|
if (opt->transform_mode)
|
||||||
data.split_on_whitespace = 1;
|
data.split_on_whitespace = 1;
|
||||||
|
|
||||||
|
if (opt->format && !strcmp(opt->format, DEFAULT_FORMAT))
|
||||||
|
opt->format = NULL;
|
||||||
/*
|
/*
|
||||||
* If we are printing out the object, then always fill in the type,
|
* If we are printing out the object, then always fill in the type,
|
||||||
* since we will want to decide whether or not to stream.
|
* since we will want to decide whether or not to stream.
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='Tests listing object info performance'
|
||||||
|
. ./perf-lib.sh
|
||||||
|
|
||||||
|
test_perf_large_repo
|
||||||
|
|
||||||
|
test_perf 'cat-file --batch-check' '
|
||||||
|
git cat-file --batch-all-objects --batch-check
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
Loading…
Reference in New Issue