cat-file: add mailmap support to --batch-check option
Even though the cat-file command with `--batch-check` option does not
complain when `--use-mailmap` option is given, the latter option is
ignored. Compute the size of the object after replacing the idents and
report it instead.
In order to make `--batch-check` option honour the mailmap mechanism we
have to read the contents of the commit/tag object.
There were two ways to do it:
1. Make two calls to `oid_object_info_extended()`. If `--use-mailmap`
option is given, the first call will get us the type of the object
and second call will only be made if the object type is either a
commit or tag to get the contents of the object.
2. Make one call to `oid_object_info_extended()` to get the type of the
object. Then, if the object type is either of commit or tag, make a
call to `repo_read_object_file()` to read the contents of the object.
I benchmarked the following command with both the above approaches and
compared against the current implementation where `--use-mailmap`
option is ignored:
`git cat-file --use-mailmap --batch-all-objects --batch-check --buffer
--unordered`
The results can be summarized as follows:
Time (mean ± σ)
default 827.7 ms ± 104.8 ms
first approach 6.197 s ± 0.093 s
second approach 1.975 s ± 0.217 s
Since, the second approach is faster than the first one, I implemented
it in this patch.
The command git cat-file can now use the mailmap mechanism to replace
idents with canonical versions for commit and tag objects. There are
several options like `--batch`, `--batch-check` and `--batch-command`
that can be combined with `--use-mailmap`. But the documentation for
`--batch`, `--batch-check` and `--batch-command` doesn't say so. This
patch fixes that documentation.
Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: John Cai <johncai86@gmail.com>
Helped-by: Taylor Blau <me@ttaylorr.com>
Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Siddharth Asthana <siddharthasthana31@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
49050a043b
commit
a797c0ea04
@ -444,6 +444,9 @@ static void batch_object_write(const char *obj_name,
|
||||
if (!data->skip_object_info) {
|
||||
int ret;
|
||||
|
||||
if (use_mailmap)
|
||||
data->info.typep = &data->type;
|
||||
|
||||
if (pack)
|
||||
ret = packed_object_info(the_repository, pack, offset,
|
||||
&data->info);
|
||||
@ -457,6 +460,18 @@ static void batch_object_write(const char *obj_name,
|
||||
fflush(stdout);
|
||||
return;
|
||||
}
|
||||
|
||||
if (use_mailmap && (data->type == OBJ_COMMIT || data->type == OBJ_TAG)) {
|
||||
size_t s = data->size;
|
||||
char *buf = NULL;
|
||||
|
||||
buf = repo_read_object_file(the_repository, &data->oid, &data->type,
|
||||
&data->size);
|
||||
buf = replace_idents_using_mailmap(buf, &s);
|
||||
data->size = cast_size_t_to_ulong(s);
|
||||
|
||||
free(buf);
|
||||
}
|
||||
}
|
||||
|
||||
strbuf_reset(scratch);
|
||||
|
||||
Reference in New Issue
Block a user