threads / patch / 26323

patchNo color diff when redirecting to file

Subject: [PATCH] No color diff when redirecting to file

## tl;dr

7 messages between Jan 23, 2011 and Jan 24, 2011. Diffs are folded; open one to read it.

replies: 6people: 4as markdown or json

Sascha Peilicke· Jan 23, 2011, 13:10 UTC · lore

Previously, when having color diffs enabled and redirecting 'git diff' into a file, one ends up with a messed up file containing termcap color stuff. This change disables color when diff output is redirected into a file.

Signed-off-by: Sascha Peilicke <saschpe@gmx.de>
---
 diff.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)
Show changes to diff.c +5 −0
diff --git a/diff.c b/diff.c
index 5422c43..cd1ecb0 100644
--- a/diff.c
+++ b/diff.c
@@ -2854,6 +2854,11 @@ void diff_setup(struct diff_options *options)
 		DIFF_OPT_SET(options, COLOR_DIFF);
 	options->detect_rename = diff_detect_rename_default;
 
+	struct stat buf;
+	if (fstat(fileno(options->file), &buf) != -1 && S_ISREG(buf.st_mode)) {
+		DIFF_OPT_CLR(options, COLOR_DIFF);
+	}
+
 	if (diff_no_prefix) {
 		options->a_prefix = options->b_prefix = "";
 	} else if (!diff_mnemonic_prefix) {
-- 
1.7.3.4

-- 
Mit freundlichen Grüßen,
Sascha Peilicke
http://saschpe.wordpress.com
Johannes Sixt· Jan 23, 2011, 14:47 UTC · re: Sascha Peilicke · lore

Re: [PATCH] No color diff when redirecting to file

The subject line reads as if you want that color markup appears in a file.
On Sonntag, 23. Januar 2011, Sascha Peilicke wrote:
> Previously, when having color diffs enabled and redirecting 'git diff'
> into a file, one ends up with a messed up file containing termcap color
> stuff. This change disables color when diff output is redirected into a
> file.
But this description and the patch read as if you don't want it.

That said, I cannot reproduce. Perhaps your configuration says color.ui=always? If so, then this is expected behavior and not a bug, IMO.

-- Hannes
Matthieu Moy· Jan 23, 2011, 17:29 UTC · re: Johannes Sixt · lore

Re: [PATCH] No color diff when redirecting to file

Johannes Sixt <j6t@kdbg.org> writes:
> That said, I cannot reproduce. Perhaps your configuration says 
> color.ui=always? If so, then this is expected behavior and not a bug, IMO.
I think you're right.
I tested this (without the patch):

git diff => I get color, because I have color.ui = auto

git diff | cat => I don't get color

git diff --color=auto | cat => no color

git diff --color=always | cat => colors, because I've asked

this seems to be just the right behavior.
-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
Junio C Hamano· Jan 23, 2011, 23:32 UTC · re: Matthieu Moy · lore

Re: [PATCH] No color diff when redirecting to file

Matthieu Moy <Matthieu.Moy@grenoble-inp.fr> writes:
Show 22 quoted lines
> Johannes Sixt <j6t@kdbg.org> writes:
>
>> That said, I cannot reproduce. Perhaps your configuration says 
>> color.ui=always? If so, then this is expected behavior and not a bug, IMO.
>
> I think you're right.
>
> I tested this (without the patch):
>
> git diff
> => I get color, because I have color.ui = auto
>
> git diff | cat
> => I don't get color
>
> git diff --color=auto | cat
> => no color
>
> git diff --color=always | cat
> => colors, because I've asked
>
> this seems to be just the right behavior.

Overall I agree with the above observation, but the original poster says "redirecting into a _file_".

Another possibility is that the mysterious platform the original poster did not mention has a broken istty() that mistakes a file descriptor going to a file (instead of a pipe to another process) as connected to a tty.

Sascha Peilicke· Jan 24, 2011, 08:59 UTC · re: Matthieu Moy · lore

Re: [PATCH] No color diff when redirecting to file

On Sunday 23 January 2011 18:29:52 you wrote:
Show 22 quoted lines
> Johannes Sixt <j6t@kdbg.org> writes:
> > That said, I cannot reproduce. Perhaps your configuration says
> > color.ui=always? If so, then this is expected behavior and not a bug,
> > IMO.
> 
> I think you're right.
> 
> I tested this (without the patch):
> 
> git diff
> => I get color, because I have color.ui = auto
> 
> git diff | cat
> => I don't get color
> 
> git diff --color=auto | cat
> => no color
> 
> git diff --color=always | cat
> => colors, because I've asked
> 
> this seems to be just the right behavior.
try the same with
git diff > foo
works when
git diff --no-color > foo
-- 
Mit freundlichen Grüßen,
Sascha Peilicke
http://saschpe.wordpress.com
Matthieu Moy· Jan 24, 2011, 09:38 UTC · re: Sascha Peilicke · lore

Re: [PATCH] No color diff when redirecting to file

Sascha Peilicke <saschpe@gmx.de> writes:
> try the same with
>
> git diff > foo

git diff > foo && cat foo => no color.

git diff --no-color > foo && cat foo => no color either

git diff --color=always > foo && cat foo => colors.

Again, just the expected behavior.
If it helps:

$ uname -a Linux bauges 2.6.36-686 #1 SMP PREEMPT Fri Nov 5 10:35:38 CET 2010 i686 GNU/Linux $ git --version git version 1.7.4.rc1.17.ge7ece

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
Sascha Peilicke· Jan 24, 2011, 08:56 UTC · re: Johannes Sixt · lore

Re: [PATCH] No color diff when redirecting to file

On Sunday 23 January 2011 15:47:17 you wrote:
Show 12 quoted lines
> The subject line reads as if you want that color markup appears in a file.
> 
> On Sonntag, 23. Januar 2011, Sascha Peilicke wrote:
> > Previously, when having color diffs enabled and redirecting 'git diff'
> > into a file, one ends up with a messed up file containing termcap color
> > stuff. This change disables color when diff output is redirected into a
> > file.
> 
> But this description and the patch read as if you don't want it.
> 
> That said, I cannot reproduce. Perhaps your configuration says
> color.ui=always? If so, then this is expected behavior and not a bug, IMO.
Nope, it's color.ui=auto
-- 
Mit freundlichen Grüßen,
Sascha Peilicke
http://saschpe.wordpress.com

← back to recent threads