From: Mike Crowe <mac@mcrowe.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org
Subject: Re: git diff --quiet exits with 1 on clean tree with CRLF conversions
Date: Mon, 20 Feb 2017 15:33:22 +0000 [thread overview]
Message-ID: <20170220153322.GA8352@mcrowe.com> (raw)
In-Reply-To: <20170217221958.GA12163@mcrowe.com>
On Friday 17 February 2017 at 22:19:58 +0000, Mike Crowe wrote:
> On Friday 17 February 2017 at 14:05:17 -0800, Junio C Hamano wrote:
> > Mike Crowe <mac@mcrowe.com> writes:
> >
> > > If "git diff --quiet" finds it necessary to compare actual file contents,
> > > and a file requires CRLF conversion, then it incorrectly exits with an exit
> > > code of 1 even if there have been no changes.
> > >
> > > The patch below adds a test file that shows the problem.
> >
> > If "git diff" does not show any output and "git diff --exit-code" or
> > "git diff --quiet" says there are differences, then it is a bug.
> >
> > I would however have expected that any culprit would involve a code
> > that says "under QUICK option, we do not have to bother doing
> > this". The part you quoted:
> >
> > > if (!DIFF_FILE_VALID(p->one) || /* (1) */
> > > !DIFF_FILE_VALID(p->two) ||
> > > (p->one->oid_valid && p->two->oid_valid) ||
> > > (p->one->mode != p->two->mode) ||
> > > diff_populate_filespec(p->one, CHECK_SIZE_ONLY) ||
> > > diff_populate_filespec(p->two, CHECK_SIZE_ONLY) ||
> > > (p->one->size != p->two->size) ||
> > > !diff_filespec_is_identical(p->one, p->two)) /* (2) */
> > > p->skip_stat_unmatch_result = 1;
> >
> > is used by "git diff" with and without "--quiet", afacr, so I
> > suspect that the bug lies somewhere else.
>
> I can't say that I really understand the code fully, but it appears that
> the first pass generates a queue of files that contain differences. The
> result of the quiet diff comes from the size of that queue,
> diff_queued_diff.nr, being non-zero in diffcore_std. I'm assuming that the
> result of the noisy diff comes from actually comparing the files.
>
> But, I've only spent a short while looking so I may have got the wrong end
> of the stick.
Tricking Git into checking the actual file contents (by passing
--ignore-space-change for example) is sufficient to ensure that the exit
status is never 1 when it should be zero. (Of course that option has other
unwanted effects in this case.)
I think that if there's a risk that file contents will undergo conversion
then this should force the diff to check the file contents. Something like:
diff --git a/diff.c b/diff.c
index 051761b..bee1662 100644
--- a/diff.c
+++ b/diff.c
@@ -3413,13 +3413,14 @@ void diff_setup_done(struct diff_options *options)
/*
* Most of the time we can say "there are changes"
* only by checking if there are changed paths, but
- * --ignore-whitespace* options force us to look
- * inside contents.
+ * --ignore-whitespace* options or text conversion
+ * force us to look inside contents.
*/
if (DIFF_XDL_TST(options, IGNORE_WHITESPACE) ||
DIFF_XDL_TST(options, IGNORE_WHITESPACE_CHANGE) ||
- DIFF_XDL_TST(options, IGNORE_WHITESPACE_AT_EOL))
+ DIFF_XDL_TST(options, IGNORE_WHITESPACE_AT_EOL) ||
+ DIFF_OPT_TST(options, ALLOW_TEXTCONV))
DIFF_OPT_SET(options, DIFF_FROM_CONTENTS);
else
DIFF_OPT_CLR(options, DIFF_FROM_CONTENTS);
This solves the problem for me and my test case now passes. Unfortunately
it breaks the 'removing and adding subproject' test case in
t3040-subprojects-basic at the line:
test_expect_code 1 git diff -M --name-status --exit-code HEAD^ HEAD
presumably because after the rename has been detected the file contents are
identical. :( A rename of a single file appears to still be handled
correctly.
Mike.
next prev parent reply other threads:[~2017-02-20 15:33 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-17 21:26 git diff --quiet exits with 1 on clean tree with CRLF conversions Mike Crowe
2017-02-17 22:05 ` Junio C Hamano
2017-02-17 22:19 ` Mike Crowe
2017-02-20 15:33 ` Mike Crowe [this message]
2017-02-20 21:25 ` Junio C Hamano
2017-02-25 15:32 ` Mike Crowe
2017-02-27 20:17 ` Junio C Hamano
2017-02-28 18:06 ` Torsten Bögershausen
2017-02-28 21:50 ` Junio C Hamano
2017-03-01 17:04 ` [PATCH v1 1/1] " tboegi
2017-03-01 21:14 ` Junio C Hamano
2017-03-01 21:54 ` Junio C Hamano
2017-03-02 8:53 ` Jeff King
2017-03-02 17:52 ` Junio C Hamano
2017-03-02 19:12 ` Jeff King
2017-03-02 18:51 ` [PATCH v2] diff: do not short-cut CHECK_SIZE_ONLY check in diff_populate_filespec() Junio C Hamano
2017-03-02 14:20 ` [PATCH v1 1/1] git diff --quiet exits with 1 on clean tree with CRLF conversions Mike Crowe
2017-03-02 18:20 ` Torsten Bögershausen
2017-03-02 18:33 ` Junio C Hamano
2017-03-02 20:03 ` Mike Crowe
2017-03-03 17:02 ` Torsten Bögershausen
2017-03-03 17:47 ` Junio C Hamano
2017-03-04 6:25 ` Torsten Bögershausen
2017-03-04 19:59 ` Junio C Hamano
2017-03-01 21:25 ` Mike Crowe
2017-03-01 23:29 ` Junio C Hamano
2017-03-02 18:17 ` Torsten Bögershausen
2017-03-03 17:01 ` Mike Crowe
2017-03-02 15:38 ` git status reports file modified when only line-endings have changed (was git diff --quiet exits with 1 on clean tree with CRLF conversions) Mike Crowe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170220153322.GA8352@mcrowe.com \
--to=mac@mcrowe.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.