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

Re: [PATCH 0/3] Adding colors to git-add--interactive

From
Jeff King <peff@peff.net>
Date
Nov 11, 2007, 07:54 UTC
Message-ID
<20071111075446.GA26985@sigill.intra.peff.net>
In-Reply-To
<20071110180109.34febc3f@paradox.zwell.net>
On Sat, Nov 10, 2007 at 06:01:09PM -0600, Dan Zwell wrote:
> A bit of a recap--this feature was requested by a user a few weeks

Thanks for the recap; there have been enough iterations of this series that at least I forgot what was going on. The patches look reasonable, but I have a few comments (hopefully you have enough "umph" for one more iteration). I'll just inline them here.

[patch 1/3]:
> +my ($use_color, $prompt_color, $header_color, $help_color, $normal_color);
> +my $color_config = qx(git config --get color.interactive);

Why call git config here manually, but Git::config later (I think the answer is "because we don't call Git::config until a later patch", but it is probably best to remain consistent).

Show 16 quoted lines
> +sub colored {
> +	my $color = shift;
> +	my $string = join("", @_);
> +
> +	if ($use_color) {
> +		# Put a color code at the beginning of each line, a reset at the end
> +		# color after newlines that are not at the end of the string
> +		$string =~ s/(\n+)(.)/$1$color$2/g;
> +		# reset before newlines
> +		$string =~ s/(\n+)/$normal_color$1/g;
> +		# codes at beginning and end (if necessary):
> +		$string =~ s/^/$color/;
> +		$string =~ s/$/$normal_color/ unless $string =~ /\n$/;
> +	}
> +	return $string;
> +}

This also seems like a candidate for lib-ification in Git.pm, alongside color_to_ansi_code.

> -			print "$opts->{HEADER}\n";
> +			print colored $header_color, "$opts->{HEADER}\n";
I don't know if we have a style policy on calling
  user_defined_function $foo, $bar;
rather than
  user_defined_function($foo, $bar);

In fact, I don't know that we have much perl style policy at all. But I tend to shy away from the former because then the syntax requires that "colored" is always defined before the calling spot.

[patch 2/3]:
Show 10 quoted lines
> +		# Grab the 3 main colors in git color string format, with sane
> +		# (visible) defaults:
> +		my $repo = Git->repository();
> +		$prompt_color = Git::color_to_ansi_code(
> +			Git::config($repo, "color.interactive.prompt") || "bold blue");
> +		$header_color = Git::color_to_ansi_code(
> +			Git::config($repo, "color.interactive.header") || "bold");
> +		$help_color = Git::color_to_ansi_code(
> +			Git::config($repo, "color.interactive.help") || "red bold");
> +		$normal_color = Git::color_to_ansi_code("normal");

It is much more common (and proper OO, in the face of inheritance) to use

   $repo->config("color.interactive.prompt")
Show 10 quoted lines
> +=item color_to_ansi_code ( COLOR )
> +
> +Converts a git-style color string, like "underline blue white" to
> +an ANSI color code. The code is generated by Term::ANSIColor,
> +after the string is parsed into the format that is accepted by
> +that module. Used as follows:
> +
> +	print color_to_ansi_code("underline blue white");
> +	print "some text";
> +	print color_to_ansi_code("normal");

Yay, documentation! It would also be nice to have a test script that runs this through a few more complex git color specs.

Show 6 quoted lines
> +	my %attrib_mappings = (
> +		"bold"    => "bold",
> +		"ul"      => "underline",
> +		"blink"   => "blink",
> +		# not supported:
> +		#"dim"     => "",

Why not? I don't especially care about "dim" support, but if there is a good reason, then you should note it.

> +	foreach $word (split /\s+/, $git_string) {
> +		if ($word =~ /normal/) {
> +			$fg_done = "true";
> +		}
Why a regex instead of 'eq'? Also, should this be case insensitive?
> +		elsif ($word =~ /black|red|green|yellow/ ||
> +			   $word =~ /blue|magenta|cyan|white/) {

It looks like you are doing two regexes here just to meet whitespace guidelines. Look into the '/x' modifier to make your regex prettier (but again, consider 'eq').

> +	return Term::ANSIColor::color(join(" ", @ansi_words)||"reset");
Style: whitespace around ||
[patch 3/3]:
> +			# Not implemented:
> +			#$whitespace_color = Git::color_to_ansi_code(
> +				#Git::config($repo, "color.diff.whitespace") || "normal red");

Personally I would have just excluded the parsing, since it isn't implemented, but I don't think it matters.

> +sub colored_diff_hunk {

Perhaps this should also go in Git.pm? Though right now I don't know which other perl scripts would actually want to colorize a diff, so I don't think it matters.

> -	system(qw(git diff-index -p --cached HEAD --),
> -	       map { $_->{VALUE} } @them);
> +	system(qw(git diff -p --cached HEAD --), map { $_->{VALUE} } @them);
Now this was a surprise after reading the commit message.
-Peff
Previous: Dan ZwellNext: Junio C Hamano
Message 38 of 86 in “Color support added to git-add--interactive.”
  1. Color support added to git-add--interactive.Dan Zwell, Oct 13, 2007
  2. Jeff KingOct 13, 2007
  3. Frank LichtenheldOct 13, 2007
  4. Johannes SchindelinOct 13, 2007
  5. Wincent ColaiutaOct 13, 2007
  6. Jean-Luc HerrenOct 13, 2007
  7. Wincent ColaiutaOct 13, 2007
  8. Andreas EricssonOct 13, 2007
  9. Johannes SchindelinOct 13, 2007
  10. Jeff KingOct 13, 2007
  11. Jeff KingOct 13, 2007
  12. Dan ZwellOct 13, 2007
  13. Wincent ColaiutaOct 13, 2007
  14. Dan ZOct 13, 2007
  15. Jean-Luc HerrenOct 13, 2007
  16. Jeff KingOct 15, 2007
  17. Dan ZwellOct 17, 2007
  18. Shawn O. PearceOct 17, 2007
  19. Dan ZwellOct 17, 2007
  20. Shawn O. PearceOct 17, 2007
  21. 1/2 Added basic color support to git add --interactiveDan Zwell, Oct 22, 2007
  22. Dan ZwellOct 23, 2007
  23. Let git-add--interactive read "git colors" from git-configDan Zwell, Oct 23, 2007
  24. Jeff KingOct 23, 2007
  25. Shawn O. PearceOct 23, 2007
  26. Jeff KingOct 23, 2007
  27. Wincent ColaiutaOct 23, 2007
  28. Jeff KingOct 23, 2007
  29. Wincent ColaiutaOct 23, 2007
  30. 2/2 Let git-add--interactive read colors from git-configDan Zwell, Oct 22, 2007
  31. Jeff KingOct 23, 2007
  32. Dan ZwellOct 23, 2007
  33. 1/2 Added basic color support to git add --interactiveDan Zwell, Nov 3, 2007
  34. Jeff KingNov 4, 2007
  35. Junio C HamanoNov 4, 2007
  36. Jeff KingNov 4, 2007
  37. 0/3 Adding colors to git-add--interactiveDan Zwell, Nov 11, 2007
  38. Jeff KingNov 11, 2007
  39. Junio C HamanoNov 11, 2007
  40. Dan ZwellNov 11, 2007
  41. 0/5 Colors for git-add--interactiveDan Zwell, Nov 22, 2007
  42. Jeff KingNov 22, 2007
  43. Junio C HamanoNov 22, 2007
  44. 1/5 Added basic color support to git add --interactiveDan Zwell, Nov 22, 2007
  45. 2/5 Don't return 'undef' in case called in a vector context.Dan Zwell, Nov 22, 2007
  46. Jeff KingNov 22, 2007
  47. Junio C HamanoNov 22, 2007
  48. Dan ZwellNov 23, 2007
  49. 3/5 Added config_default($key, $default) to Git.pmDan Zwell, Nov 22, 2007
  50. Jeff KingNov 22, 2007
  51. 4/5 Let git-add--interactive read colors from configurationDan Zwell, Nov 22, 2007
  52. Jeff KingNov 22, 2007
  53. Junio C HamanoNov 22, 2007
  54. Jeff KingNov 22, 2007
  55. Dan ZwellNov 23, 2007
  56. Jeff KingNov 23, 2007
  57. Junio C HamanoNov 23, 2007
  58. 5/5 Added diff hunk coloring to git-add--interactiveDan Zwell, Nov 22, 2007
  59. Jeff KingNov 22, 2007
  60. Junio C HamanoNov 22, 2007
  61. Jeff KingNov 23, 2007
  62. Junio C HamanoNov 22, 2007
  63. 1/3 Added basic color support to git add --interactiveDan Zwell, Nov 11, 2007
  64. 2/3 Let git-add--interactive read colors from .gitconfigDan Zwell, Nov 11, 2007
  65. 3/3 Added diff hunk coloring to git-add--interactiveDan Zwell, Nov 11, 2007
  66. Junio C HamanoNov 11, 2007
  67. 0/3 Adding colors to git-add--interactiveDan Zwell, Nov 11, 2007
  68. Subject: [PATCH 1/3] Added basic color support to git add --interactiveDan Zwell, Nov 11, 2007
  69. Junio C HamanoNov 11, 2007
  70. Subject: [PATCH 2/3] Let git-add--interactive read colors from .gitconfigDan Zwell, Nov 11, 2007
  71. Junio C HamanoNov 11, 2007
  72. Junio C HamanoNov 11, 2007
  73. Dan ZwellNov 13, 2007
  74. Junio C HamanoNov 13, 2007
  75. Dan ZwellNov 13, 2007
  76. Jeff KingNov 13, 2007
  77. Junio C HamanoNov 13, 2007
  78. Dan ZwellNov 13, 2007
  79. Jakub NarebskiNov 13, 2007
  80. 2/2 Let git-add--interactive read colors from .gitconfigDan Zwell, Nov 3, 2007
  81. Junio C HamanoNov 3, 2007
  82. Dan ZwellNov 3, 2007
  83. Junio C HamanoNov 3, 2007
  84. Jeff KingOct 15, 2007
  85. Tom TobinOct 13, 2007
  86. Tom TobinOct 13, 2007

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.