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

[PATCH v3 5/7] decorate: color each token separately

From
Andy Koppe <andy.koppe@gmail.com>
Date
Aug 10, 2023, 21:16 UTC
Message-ID
<20230810211619.19055-5-andy.koppe@gmail.com>
In-Reply-To
<20230810211619.19055-1-andy.koppe@gmail.com>

Wrap "tag:" prefixes and the arrows in "HEAD -> branch" annotations in their own color sequences, because otherwise tag names or arrows can end up uncolored when %w width formatting breaks lines just before them.

Use the commit color for arrows, for visual consistency with the '(', ',' and ')' symbols used as prefix, separator and suffix, which are also colored with the commit color.

Amend test t4207-log-decoration-colors.sh accordingly.
Signed-off-by: Andy Koppe <andy.koppe@gmail.com>
---
 log-tree.c                       | 14 +++++++---
 t/t4207-log-decoration-colors.sh | 44 ++++++++++++++++++--------------
 2 files changed, 36 insertions(+), 22 deletions(-)
diff --git a/log-tree.c b/log-tree.c
index 7c6d3f1ac3..3b62dca048 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -342,26 +342,34 @@ void format_decorations(struct strbuf *sb,
 		 * appeared, skipping the entry for current.
 		 */
 		if (decoration != current_and_HEAD) {
+			const char *color =
+				decorate_get_color(use_color, decoration->type);
+
 			if (*prefix) {
 				strbuf_addstr(sb, color_commit);
 				strbuf_addstr(sb, prefix);
 				strbuf_addstr(sb, color_reset);
 			}
 
-			strbuf_addstr(sb, decorate_get_color(use_color, decoration->type));
-			if (decoration->type == DECORATION_REF_TAG)
+			if (decoration->type == DECORATION_REF_TAG) {
+				strbuf_addstr(sb, color);
 				strbuf_addstr(sb, "tag: ");
+				strbuf_addstr(sb, color_reset);
+			}
 
+			strbuf_addstr(sb, color);
 			show_name(sb, decoration);
+			strbuf_addstr(sb, color_reset);
 
 			if (current_and_HEAD &&
 			    decoration->type == DECORATION_REF_HEAD) {
+				strbuf_addstr(sb, color_commit);
 				strbuf_addstr(sb, " -> ");
 				strbuf_addstr(sb, color_reset);
 				strbuf_addstr(sb, decorate_get_color(use_color, current_and_HEAD->type));
 				show_name(sb, current_and_HEAD);
+				strbuf_addstr(sb, color_reset);
 			}
-			strbuf_addstr(sb, color_reset);
 
 			prefix = separator;
 		}
diff --git a/t/t4207-log-decoration-colors.sh b/t/t4207-log-decoration-colors.sh
index ded33a82e2..21986a866d 100755
--- a/t/t4207-log-decoration-colors.sh
+++ b/t/t4207-log-decoration-colors.sh
@@ -53,15 +53,17 @@ cmp_filtered_decorations () {
 # to this test since it does not contain any decoration, hence --first-parent
 test_expect_success 'commit decorations colored correctly' '
 	cat >expect <<-EOF &&
-	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD -> \
-${c_reset}${c_branch}main${c_reset}${c_commit}, \
-${c_reset}${c_tag}tag: v1.0${c_reset}${c_commit}, \
-${c_reset}${c_tag}tag: B${c_reset}${c_commit})${c_reset} B
-${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A1${c_reset}${c_commit}, \
+	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD${c_reset}\
+${c_commit} -> ${c_reset}${c_branch}main${c_reset}${c_commit}, \
+${c_reset}${c_tag}tag: ${c_reset}${c_tag}v1.0${c_reset}${c_commit}, \
+${c_reset}${c_tag}tag: ${c_reset}${c_tag}B${c_reset}${c_commit})${c_reset} B
+${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\
+${c_tag}tag: ${c_reset}${c_tag}A1${c_reset}${c_commit}, \
 ${c_reset}${c_remoteBranch}other/main${c_reset}${c_commit})${c_reset} A1
-	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_stash}refs/stash${c_reset}${c_commit})${c_reset} \
-On main: Changes to A.t
-	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A${c_reset}${c_commit})${c_reset} A
+	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\
+${c_stash}refs/stash${c_reset}${c_commit})${c_reset} On main: Changes to A.t
+	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\
+${c_tag}tag: ${c_reset}${c_tag}A${c_reset}${c_commit})${c_reset} A
 	EOF
 
 	git log --first-parent --no-abbrev --decorate --oneline --color=always --all >actual &&
@@ -76,12 +78,14 @@ test_expect_success 'test coloring with replace-objects' '
 	git replace HEAD~1 HEAD~2 &&
 
 	cat >expect <<-EOF &&
-	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD -> \
-${c_reset}${c_branch}main${c_reset}${c_commit}, \
-${c_reset}${c_tag}tag: D${c_reset}${c_commit})${c_reset} D
-	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: C${c_reset}${c_commit}, \
+	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD${c_reset}\
+${c_commit} -> ${c_reset}${c_branch}main${c_reset}${c_commit}, \
+${c_reset}${c_tag}tag: ${c_reset}${c_tag}D${c_reset}${c_commit})${c_reset} D
+	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\
+${c_tag}tag: ${c_reset}${c_tag}C${c_reset}${c_commit}, \
 ${c_reset}${c_grafted}replaced${c_reset}${c_commit})${c_reset} B
-	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A${c_reset}${c_commit})${c_reset} A
+	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\
+${c_tag}tag: ${c_reset}${c_tag}A${c_reset}${c_commit})${c_reset} A
 EOF
 
 	git log --first-parent --no-abbrev --decorate --oneline --color=always HEAD >actual &&
@@ -100,13 +104,15 @@ test_expect_success 'test coloring with grafted commit' '
 	git replace --graft HEAD HEAD~2 &&
 
 	cat >expect <<-EOF &&
-	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD -> \
-${c_reset}${c_branch}main${c_reset}${c_commit}, \
-${c_reset}${c_tag}tag: D${c_reset}${c_commit}, \
+	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD${c_reset}\
+${c_commit} -> ${c_reset}${c_branch}main${c_reset}${c_commit}, \
+${c_reset}${c_tag}tag: ${c_reset}${c_tag}D${c_reset}${c_commit}, \
 ${c_reset}${c_grafted}replaced${c_reset}${c_commit})${c_reset} D
-	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: v1.0${c_reset}${c_commit}, \
-${c_reset}${c_tag}tag: B${c_reset}${c_commit})${c_reset} B
-	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A${c_reset}${c_commit})${c_reset} A
+	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\
+${c_tag}tag: ${c_reset}${c_tag}v1.0${c_reset}${c_commit}, \
+${c_reset}${c_tag}tag: ${c_reset}${c_tag}B${c_reset}${c_commit})${c_reset} B
+	${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\
+${c_tag}tag: ${c_reset}${c_tag}A${c_reset}${c_commit})${c_reset} A
 	EOF
 
 	git log --first-parent --no-abbrev --decorate --oneline --color=always HEAD >actual &&
-- 
2.42.0-rc1
Previous: Andy KoppeNext: Andy Koppe
Message 36 of 59 in “pretty: add %(decorate[:<options>]) format”
  1. pretty: add %(decorate[:<options>]) formatAndy Koppe, Jul 15, 2023
  2. pretty: add %(decorate[:<options>]) formatAndy Koppe, Jul 15, 2023
  3. Junio C HamanoJul 17, 2023
  4. Junio C HamanoJul 18, 2023
  5. Andy KoppeAug 11, 2023
  6. Glen ChooJul 19, 2023
  7. Phillip WoodJul 23, 2023
  8. Andy KoppeAug 11, 2023
  9. Junio C HamanoAug 11, 2023
  10. Andy KoppeAug 11, 2023
  11. Junio C HamanoAug 12, 2023
  12. Andy KoppeAug 11, 2023
  13. Junio C HamanoAug 15, 2023
  14. Andy KoppeAug 15, 2023
  15. Junio C HamanoAug 15, 2023
  16. main != master at github.com/git/gitAndy Koppe, Aug 15, 2023
  17. Taylor BlauAug 15, 2023
  18. Jeff KingAug 16, 2023
  19. rsbecker@nexbridge.comAug 16, 2023
  20. Junio C HamanoAug 18, 2023
  21. Johannes SchindelinAug 21, 2023
  22. Junio C HamanoAug 21, 2023
  23. ci: avoid building from the same commit in parallelJunio C Hamano, Aug 22, 2023
  24. Junio C HamanoAug 22, 2023
  25. Johannes SchindelinAug 22, 2023
  26. Junio C HamanoAug 22, 2023
  27. Johannes SchindelinAug 23, 2023
  28. Junio C HamanoAug 23, 2023
  29. Junio C HamanoAug 23, 2023
  30. Johannes SchindelinAug 25, 2023
  31. 1/7 pretty-formats: define "literal formatting code"Andy Koppe, Aug 10, 2023
  32. 2/7 pretty-formats: enclose options in angle bracketsAndy Koppe, Aug 10, 2023
  33. 4/7 decorate: avoid some unnecessary color overheadAndy Koppe, Aug 10, 2023
  34. 3/7 decorate: refactor format_decorations()Andy Koppe, Aug 10, 2023
  35. 6/7 pretty: add %(decorate[:<options>]) formatAndy Koppe, Aug 10, 2023
  36. 5/7 decorate: color each token separatelyAndy Koppe, Aug 10, 2023
  37. 7/7 pretty: add pointer and tag options to %(decorate)Andy Koppe, Aug 10, 2023
  38. Junio C HamanoAug 16, 2023
  39. 0/8 pretty: add %(decorate[:<options>]) formatAndy Koppe, Aug 20, 2023
  40. 1/8 pretty-formats: define "literal formatting code"Andy Koppe, Aug 20, 2023
  41. 2/8 pretty-formats: enclose options in angle bracketsAndy Koppe, Aug 20, 2023
  42. 5/8 decorate: color each token separatelyAndy Koppe, Aug 20, 2023
  43. 4/8 decorate: avoid some unnecessary color overheadAndy Koppe, Aug 20, 2023
  44. 3/8 decorate: refactor format_decorations()Andy Koppe, Aug 20, 2023
  45. 6/8 pretty: add %(decorate[:<options>]) formatAndy Koppe, Aug 20, 2023
  46. 7/8 pretty: add pointer and tag options to %(decorate)Andy Koppe, Aug 20, 2023
  47. 8/8 decorate: use commit color for HEAD arrowAndy Koppe, Aug 20, 2023
  48. 0/8 pretty: add %(decorate[:<options>]) formatAndy Koppe, Aug 20, 2023
  49. 1/8 pretty-formats: define "literal formatting code"Andy Koppe, Aug 20, 2023
  50. 2/8 pretty-formats: enclose options in angle bracketsAndy Koppe, Aug 20, 2023
  51. 4/8 decorate: avoid some unnecessary color overheadAndy Koppe, Aug 20, 2023
  52. 5/8 decorate: color each token separatelyAndy Koppe, Aug 20, 2023
  53. 3/8 decorate: refactor format_decorations()Andy Koppe, Aug 20, 2023
  54. 6/8 pretty: add %(decorate[:<options>]) formatAndy Koppe, Aug 20, 2023
  55. 8/8 decorate: use commit color for HEAD arrowAndy Koppe, Aug 20, 2023
  56. 7/8 pretty: add pointer and tag options to %(decorate)Andy Koppe, Aug 20, 2023
  57. Junio C HamanoAug 29, 2023
  58. Andy KoppeSep 1, 2023
  59. Junio C HamanoAug 21, 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.