Using `git cat-file --use-mailmap` with `-s` option, like the following is allowed: git cat-file --use-mailmap -s <commit/tag object sha> The current implementation will return the same object size irrespective of the mailmap option, which is not as useful as it could be. When we use the mailmap mechanism to replace the idents, the size of the object can change and `-s` option would be more useful if it shows the size of the changed object. This patch implements that. Mentored-by: Christian Couder's avatarChristian Couder <christian.couder@xxxxxxxxx> Mentored-by: John Cai's avatarJohn Cai <johncai86@xxxxxxxxx> Signed-off-by: Siddharth Asthana <siddharthasthana31@xxxxxxxxx> --- Documentation/git-cat-file.txt | 4 +++- builtin/cat-file.c | 13 +++++++++++++ t/t4203-mailmap.sh | 10 ++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Documentation/git-cat-file.txt b/Documentation/git-cat-file.txt index 5792f21a72..708d094db4 100644 --- a/Documentation/git-cat-file.txt +++ b/Documentation/git-cat-file.txt @@ -45,7 +45,9 @@ OPTIONS -s:: Instead of the content, show the object size identified by - `<object>`. + `<object>`. If used with `--use-mailmap` option, will show the + size of updated object after replacing idents using the mailmap + mechanism. -e:: Exit with zero status if `<object>` exists and is a valid diff --git a/builtin/cat-file.c b/builtin/cat-file.c index 989eee0bb4..9942b93867 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -132,8 +132,21 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name, case 's': oi.sizep = &size; + + if (use_mailmap) { + oi.typep = &type; + oi.contentp = (void**)&buf; + } + if (oid_object_info_extended(the_repository, &oid, &oi, flags) < 0) die("git cat-file: could not get object info"); + + if (use_mailmap && (type == OBJ_COMMIT || type == OBJ_TAG)) { + size_t s = size; + buf = replace_idents_using_mailmap(buf, &s); + size = cast_size_t_to_ulong(s); + } + printf("%"PRIuMAX"\n", (uintmax_t)size); ret = 0; goto cleanup; diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh index cd1cab3e54..59513e7c57 100755 --- a/t/t4203-mailmap.sh +++ b/t/t4203-mailmap.sh @@ -1022,4 +1022,14 @@ test_expect_success '--mailmap enables mailmap in cat-file for annotated tag obj test_cmp expect actual ' +test_expect_success 'git cat-file -s returns correct size with --use-mailmap' ' + test_when_finished "rm .mailmap" && + cat >.mailmap <<-EOF && + C O Mitter <committer@xxxxxxxxxxx> Orig <orig@xxxxxxxxxxx> + EOF + echo "220" >expect && + git cat-file --use-mailmap -s HEAD >actual && + test_cmp expect actual +' + test_done -- 2.38.0.rc0.3.g53c2677cac