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
List information: http://vger.kernel.org/majordomo-info.html
* 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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).