From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 25B83C433FE for ; Wed, 2 Nov 2022 12:09:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230132AbiKBMJH (ORCPT ); Wed, 2 Nov 2022 08:09:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36134 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230019AbiKBMJG (ORCPT ); Wed, 2 Nov 2022 08:09:06 -0400 Received: from smtp-out-5.talktalk.net (smtp-out-5.talktalk.net [62.24.135.69]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6DE5D22516 for ; Wed, 2 Nov 2022 05:09:04 -0700 (PDT) Received: from localhost.localdomain ([88.110.102.84]) by smtp.talktalk.net with SMTP id qCYHoZiBslLbyqCYHoNXhP; Wed, 02 Nov 2022 12:09:02 +0000 X-Originating-IP: [88.110.102.84] X-Spam: 0 X-OAuthority: v=2.3 cv=OJpZIhSB c=1 sm=1 tr=0 a=f4UhoLCnUTRb1HgAgoWw0g==:117 a=f4UhoLCnUTRb1HgAgoWw0g==:17 a=MKtGQD3n3ToA:10 a=1oJP67jkp3AA:10 a=ldyaYNNxDcoA:10 a=HHGDD-5mAAAA:8 a=XRdKQQ8PZa9jRCTDqK0A:9 From: Philip Oakley To: GitList Cc: Self , Junio C Hamano , Taylor Blau , NSENGIYUMVA WILBERFORCE Subject: [PATCH v3] pretty-formats: add hard truncation, without ellipsis, options Date: Wed, 2 Nov 2022 12:08:53 +0000 Message-Id: <20221102120853.2013-1-philipoakley@iee.email> X-Mailer: git-send-email 2.38.1.281.g83ef3ded8d In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CMAE-Envelope: MS4wfIjwSuS2PzbjJ2mi8m0RvaY3Nl7FUUZ6inpZBK9phAInMLWitBn84qcNbnLkmKVJlYNRP2A/yRStOg3lZUwhY2Mvyt0oaqFtUrCC5ojjYUNvgH3okvN1 Jl3MVnsdrl3X6NFi+d0CQuubzWC4kKKsLgDTmT7bVSwp2iRj1mvkdlFvi5gjBSLE6R79XWmWn7c4CmIyBbuDtuOvpa53kUNPLwaqJerVHlwBB/JCNFMnPeoO 73Zkl0DUjJu2E6FdqeJI6uUffdAeezhfF7LnClVaC2NqTntF4pIBPHKdmAl1y1857ck7aQtsdXm1p1iFpC+OVg== Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Instead of truncating with "..", add options to replace with the empty string, implied by passing NULL, and adjust the padding length calculation. Extend the existing tests for these pretty formats to include `Trunc` and Ltrunc` options matching the `trunc` and `ltrunc` tests. Signed-off-by: Philip Oakley --- With updated commit message. No other changes. --- Documentation/pretty-formats.txt | 11 +++--- pretty.c | 18 ++++++++- t/t4205-log-pretty-formats.sh | 67 ++++++++++++++++++++++++++++++++ t/t6006-rev-list-format.sh | 45 +++++++++++++++++++++ 4 files changed, 135 insertions(+), 6 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index 0b4c1c8d98..0bd339db33 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -146,14 +146,15 @@ The placeholders are: '%m':: left (`<`), right (`>`) or boundary (`-`) mark '%w([[,[,]]])':: switch line wrapping, like the -w option of linkgit:git-shortlog[1]. -'%<([,trunc|ltrunc|mtrunc])':: make the next placeholder take at +'%<([,trunc|ltrunc|mtrunc|Trunc|Ltrunc])':: make the next placeholder take at least N columns, padding spaces on the right if necessary. Optionally - truncate at the beginning (ltrunc), - the middle (mtrunc) or the end - (trunc) if the output is longer than - N columns. Note that truncating + truncate (with ellipsis '..') at the beginning (ltrunc) `..ft`, + the middle (mtrunc) `mi..le` or the end + (trunc) `rig..` if the output is longer than + N columns. Note that truncating with ellipsis only works correctly with N >= 2. + Use (Trunc|Ltrunc) for hard truncation without ellipsis. '%<|()':: make the next placeholder take at least until Nth columns, padding spaces on the right if necessary '%>()', '%>|()':: similar to '%<()', '%<|()' respectively, diff --git a/pretty.c b/pretty.c index 6cb363ae1c..1e873d3f41 100644 --- a/pretty.c +++ b/pretty.c @@ -857,7 +857,9 @@ enum trunc_type { trunc_none, trunc_left, trunc_middle, - trunc_right + trunc_right, + trunc_left_hard, + trunc_right_hard }; struct format_commit_context { @@ -1145,6 +1147,10 @@ static size_t parse_padding_placeholder(const char *placeholder, c->truncate = trunc_left; else if (starts_with(start, "mtrunc)")) c->truncate = trunc_middle; + else if (starts_with(start, "Ltrunc)")) + c->truncate = trunc_left_hard; + else if (starts_with(start, "Trunc)")) + c->truncate = trunc_right_hard; else return 0; } else @@ -1743,6 +1749,16 @@ static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */ padding - 2, len - (padding - 2), ".."); break; + case trunc_left_hard: + strbuf_utf8_replace(&local_sb, + 0, len - padding, + NULL); + break; + case trunc_right_hard: + strbuf_utf8_replace(&local_sb, + padding, len - padding, + NULL); + break; case trunc_none: break; } diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index e448ef2928..55dca30798 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -261,6 +261,17 @@ test_expect_success 'left alignment formatting with trunc' ' test_cmp expected actual ' +test_expect_success 'left alignment formatting with Trunc' ' + git log --pretty="tformat:%<(10,Trunc)%s" >actual && + qz_to_tab_space <<-\EOF >expected && + message tw + message on + add bar Z + initial. a + EOF + test_cmp expected actual +' + test_expect_success 'left alignment formatting with trunc. i18n.logOutputEncoding' ' git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,trunc)%s" >actual && qz_to_tab_space <<-\EOF | iconv -f utf-8 -t $test_encoding >expected && @@ -272,6 +283,17 @@ test_expect_success 'left alignment formatting with trunc. i18n.logOutputEncodin test_cmp expected actual ' +test_expect_success 'left alignment formatting with Trunc. i18n.logOutputEncoding' ' + git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,Trunc)%s" >actual && + qz_to_tab_space <<-\EOF | iconv -f utf-8 -t $test_encoding >expected && + message tw + message on + add bar Z + initial. a + EOF + test_cmp expected actual +' + test_expect_success 'left alignment formatting with ltrunc' ' git log --pretty="tformat:%<(10,ltrunc)%s" >actual && qz_to_tab_space <<-EOF >expected && @@ -283,6 +305,18 @@ test_expect_success 'left alignment formatting with ltrunc' ' test_cmp expected actual ' +test_expect_success 'left alignment formatting with Ltrunc' ' + git log --pretty="tformat:%<(10,Ltrunc)%s" >actual && + qz_to_tab_space <<-EOF >expected && + essage two + essage one + add bar Z + an${sample_utf8_part}lich + EOF + test_cmp expected actual +' + + test_expect_success 'left alignment formatting with ltrunc. i18n.logOutputEncoding' ' git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,ltrunc)%s" >actual && qz_to_tab_space <<-EOF | iconv -f utf-8 -t $test_encoding >expected && @@ -294,6 +328,16 @@ test_expect_success 'left alignment formatting with ltrunc. i18n.logOutputEncodi test_cmp expected actual ' +test_expect_success 'left alignment formatting with Ltrunc. i18n.logOutputEncoding' ' + git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,Ltrunc)%s" >actual && + qz_to_tab_space <<-EOF | iconv -f utf-8 -t $test_encoding >expected && + essage two + essage one + add bar Z + an${sample_utf8_part}lich + EOF + test_cmp expected actual +' test_expect_success 'left alignment formatting with mtrunc' ' git log --pretty="tformat:%<(10,mtrunc)%s" >actual && qz_to_tab_space <<-\EOF >expected && @@ -507,6 +551,19 @@ test_expect_success 'left/right alignment formatting with stealing' ' EOF test_cmp expected actual ' + +test_expect_success 'left/right hard alignment formatting with stealing' ' + git commit --amend -m short --author "long long long " && + git log --pretty="tformat:%<(10,Trunc)%s%>>(10,Ltrunc)% an" >actual && + cat <<-\EOF >expected && + short long long long + message on A U Thor + add bar A U Thor + initial. a A U Thor + EOF + test_cmp expected actual +' + test_expect_success 'left/right alignment formatting with stealing. i18n.logOutputEncoding' ' git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,trunc)%s%>>(10,ltrunc)% an" >actual && cat <<-\EOF | iconv -f utf-8 -t $test_encoding >expected && @@ -517,6 +574,16 @@ test_expect_success 'left/right alignment formatting with stealing. i18n.logOutp EOF test_cmp expected actual ' +test_expect_success 'left/right alignment formatting with stealing. i18n.logOutputEncoding' ' + git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,Trunc)%s%>>(10,Ltrunc)% an" >actual && + cat <<-\EOF | iconv -f utf-8 -t $test_encoding >expected && + short long long long + message on A U Thor + add bar A U Thor + initial. a A U Thor + EOF + test_cmp expected actual +' test_expect_success 'strbuf_utf8_replace() not producing NUL' ' git log --color --pretty="tformat:%<(10,trunc)%s%>>(10,ltrunc)%C(auto)%d" | diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh index 41d0ca00b1..8dcc8000d1 100755 --- a/t/t6006-rev-list-format.sh +++ b/t/t6006-rev-list-format.sh @@ -218,6 +218,14 @@ commit $head1 added (hinzugef${added_utf8_part}gt.. EOF +# ZZZ for a space? +test_format subject-truncated "%<($truncate_count,Trunc)%s" qz_to_tab_space <expected.utf-8 && commit $head3 @@ -455,6 +481,16 @@ commit $head1 added (hinzugef${added_utf8_part}gt.. EOF +# need qz_to_tab_space +test_format complex-subject-commitencoding-unset-Trunc "%<($truncate_count,Trunc)%s" qz_to_tab_space <