git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 0/1] extend the truncating pretty formats

From
Philip Oakley <philipoakley@iee.email>
Date
Nov 1, 2022, 22:57 UTC
Message-ID
<20221101225724.2165-1-philipoakley@iee.email>
In-Reply-To
<20221030185614.3842-1-philipoakley@iee.email>
Changes since V1.

Added tests for the [L]Trunc in both t/t4205-log-pretty-formats and t/t6006-rev-list-format matching the existing tests, which I'd missed before. Thanks to Taylor for point out my error.

Use NULL rather than the empty string "" const which strbuf_utf8_replace accepts. Also remove unnecessary brackets.

Added suggestive examples for which end of the string are left and right when truncating, along with middle.

Aside: no attempt at clarifying the potential man page confusion over
`<` in the '%<(<N>[,..` placeholder character sequence and subsequent
entries.

[V1] <20221030185614.3842-1-philipoakley@iee.email> A recent enquiry on the Git-Users list asked for horizontal log graphs similar to those used in the manual ASCII art graphs. These use single or double character short strings for commits.

The existing pretty pretty-formats are unable to truncate to single or double characters because of their use of ellipsis `..`. As a starter, let's add left and right hard truncation options to the existing options as a preparatory step for potential `--horizontal` graphs.

It is noted that the  truncation options do not have any tests yet.

Also cc'ing Nsengiyumva who has proposed to look at unifying the ref-filter and --pretty formats [1]

-- Philip

To: Git List <git@vger.kernel.org>
Cc: NSENGIYUMVA WILBERFORCE <nsengiyumvawilberforce@gmail.com>
Cc: Taylor Blau <me@ttaylorr.com>
Cc: Junio C Hamano <gitster@pobox.com>
[1] https://lore.kernel.org/git/CA+PPyiE=baAoVkrghE5GQMt984AcaL=XBAQRsVRbN8w7jQA+ig@mail.gmail.com/
Philip Oakley (1):
  pretty-formats: add hard truncation, without ellipsis, options
 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(-)
1:  0f3a12c66c ! 1:  35f83cac94 pretty-formats: add hard truncation, without ellipsis, options
    @@ Documentation/pretty-formats.txt: The placeholders are:
      				  least N columns, padding spaces on
      				  the right if necessary.  Optionally
     -				  truncate at the beginning (ltrunc),
    -+				  truncate (with ellipsis '..') at the beginning (ltrunc),
    - 				  the middle (mtrunc) or the end
    - 				  (trunc) if the output is longer than
    +-				  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.
    @@ pretty.c: static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */
      			break;
     +		case trunc_left_hard:
     +			strbuf_utf8_replace(&local_sb,
    -+					    0, len - (padding),
    -+					    "");
    ++					    0, len - padding,
    ++					    NULL);
     +			break;
     +		case trunc_right_hard:
     +			strbuf_utf8_replace(&local_sb,
    -+					    padding, len - (padding),
    -+					    "");
    ++					    padding, len - padding,
    ++					    NULL);
     +			break;
      		case trunc_none:
      			break;
      		}
    +
    + ## t/t4205-log-pretty-formats.sh ##
    +@@ t/t4205-log-pretty-formats.sh: 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 &&
    +@@ t/t4205-log-pretty-formats.sh: 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 &&
    +@@ t/t4205-log-pretty-formats.sh: 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 &&
    +@@ t/t4205-log-pretty-formats.sh: 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 &&
    +@@ t/t4205-log-pretty-formats.sh: 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 <long@me.com>" &&
    ++	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 &&
    +@@ t/t4205-log-pretty-formats.sh: 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" |
    +
    + ## t/t6006-rev-list-format.sh ##
    +@@ t/t6006-rev-list-format.sh: 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 <<EOF
    ++commit $head2
    ++changed (ge${changed_utf8_part}ndert) f
    ++commit $head1
    ++added (hinzugef${added_utf8_part}gt)Z
    ++EOF
    ++
    + test_format body %b <<EOF
    + commit $head2
    + commit $head1
    +@@ t/t6006-rev-list-format.sh: commit $head1
    + added (hinzugef${added_utf8_part_iso88591}gt..
    + EOF
    + 
    ++# need qz qz_to_tab_space
    ++test_format complex-subject-Trunc "%<($truncate_count,Trunc)%s" qz_to_tab_space <<EOF
    ++commit $head3
    ++Test printing of com
    ++commit $head2
    ++changed (ge${changed_utf8_part_iso88591}ndert) f
    ++commit $head1
    ++added (hinzugef${added_utf8_part_iso88591}gt)Z
    ++EOF
    ++
    + test_format complex-subject-mtrunc "%<($truncate_count,mtrunc)%s" <<EOF
    + commit $head3
    + Test prin..ex bodies
    +@@ t/t6006-rev-list-format.sh: commit $head1
    + .. (hinzugef${added_utf8_part_iso88591}gt) foo
    + EOF
    + 
    ++test_format complex-subject-Ltrunc "%<($truncate_count,Ltrunc)%s" <<EOF
    ++commit $head3
    ++ng of complex bodies
    ++commit $head2
    ++anged (ge${changed_utf8_part_iso88591}ndert) foo
    ++commit $head1
    ++ed (hinzugef${added_utf8_part_iso88591}gt) foo
    ++EOF
    + test_expect_success 'setup expected messages (for test %b)' '
    + 	cat <<-EOF >expected.utf-8 &&
    + 	commit $head3
    +@@ t/t6006-rev-list-format.sh: 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 <<EOF
    ++commit $head3
    ++Test printing of com
    ++commit $head2
    ++changed (ge${changed_utf8_part}ndert) f
    ++commit $head1
    ++added (hinzugef${added_utf8_part}gt)Z
    ++EOF
    ++
    + test_format complex-subject-commitencoding-unset-mtrunc "%<($truncate_count,mtrunc)%s" <<EOF
    + commit $head3
    + Test prin..ex bodies
    +@@ t/t6006-rev-list-format.sh: commit $head1
    + .. (hinzugef${added_utf8_part}gt) foo
    + EOF
    + 
    ++test_format complex-subject-commitencoding-unset-Ltrunc "%<($truncate_count,Ltrunc)%s" <<EOF
    ++commit $head3
    ++ng of complex bodies
    ++commit $head2
    ++anged (ge${changed_utf8_part}ndert) foo
    ++commit $head1
    ++ed (hinzugef${added_utf8_part}gt) foo
    ++EOF
    ++
    + test_format complex-body-commitencoding-unset %b <expected.utf-8
    + 
    + test_expect_success '%x00 shows NUL' '
-- 
2.38.1.windows.1
Previous: Philip OakleyNext: Philip Oakley
Message 7 of 30 in “extend the truncating pretty formats”
  1. 0/1 extend the truncating pretty formatsPhilip Oakley, Oct 30, 2022
  2. 1/1 pretty-formats: add hard truncation, without ellipsis, optionsPhilip Oakley, Oct 30, 2022
  3. Taylor BlauOct 30, 2022
  4. Philip OakleyOct 30, 2022
  5. Taylor BlauOct 30, 2022
  6. Philip OakleyOct 30, 2022
  7. 0/1 extend the truncating pretty formatsPhilip Oakley, Nov 1, 2022
  8. 1/1 pretty-formats: add hard truncation, without ellipsis, optionsPhilip Oakley, Nov 1, 2022
  9. Philip OakleyNov 1, 2022
  10. Taylor BlauNov 2, 2022
  11. pretty-formats: add hard truncation, without ellipsis, optionsPhilip Oakley, Nov 2, 2022
  12. pretty-formats: add hard truncation, without ellipsis, optionsPhilip Oakley, Nov 12, 2022
  13. Junio C HamanoNov 21, 2022
  14. Philip OakleyNov 21, 2022
  15. Junio C HamanoNov 22, 2022
  16. Philip OakleyNov 23, 2022
  17. Junio C HamanoNov 25, 2022
  18. Philip OakleyNov 26, 2022
  19. Philip OakleyNov 26, 2022
  20. Junio C HamanoNov 26, 2022
  21. Philip OakleyNov 28, 2022
  22. Junio C HamanoNov 29, 2022
  23. Philip OakleyDec 7, 2022
  24. Junio C HamanoDec 7, 2022
  25. 0/5 Pretty formats: Clarify column alignmentPhilip Oakley, Jan 19, 2023
  26. 3/5 doc: pretty-formats document negative column alignmentsPhilip Oakley, Jan 19, 2023
  27. 1/5 doc: pretty-formats: separate parameters from placeholdersPhilip Oakley, Jan 19, 2023
  28. 2/5 doc: pretty-formats: delineate `%<|(` parameter valuesPhilip Oakley, Jan 19, 2023
  29. 4/5 doc: pretty-formats describe use of ellipsis in truncationPhilip Oakley, Jan 19, 2023
  30. 5/5 doc: pretty-formats note wide char limitations, and add testsPhilip Oakley, Jan 19, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.