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

Re: [PATCH] diff: don't read index when --no-index is given

From
Thomas Gummerer <t.gummerer@gmail.com>
Date
Dec 9, 2013, 21:13 UTC
Message-ID
<87ppp5n2xp.fsf@gmail.com>
In-Reply-To
<xmqqwqjdydga.fsf@gitster.dls.corp.google.com>
[Sorry for not seeing this before sending out v2.]
Junio C Hamano <gitster@pobox.com> writes:
Show 48 quoted lines
> Thomas Gummerer <t.gummerer@gmail.com> writes:
>
>> git diff --no-index ... currently reads the index, during setup, when
>> calling gitmodules_config().  In the usual case this gives us some
>> performance drawbacks, but it's especially annoying if there is a broken
>> index file.
>>
>> Avoid calling the unnecessary gitmodules_config() when the --no-index
>> option is given.  Also add a test to guard against similar breakages in the future.
>>
>> Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
>> ---
>>  builtin/diff.c           | 13 +++++++++++--
>>  t/t4053-diff-no-index.sh |  6 ++++++
>>  2 files changed, 17 insertions(+), 2 deletions(-)
>>
>> diff --git a/builtin/diff.c b/builtin/diff.c
>> index adb93a9..47c0833 100644
>> --- a/builtin/diff.c
>> +++ b/builtin/diff.c
>> @@ -257,7 +257,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
>>  	int blobs = 0, paths = 0;
>>  	const char *path = NULL;
>>  	struct blobinfo blob[2];
>> -	int nongit;
>> +	int nongit, no_index = 0;
>>  	int result = 0;
>>
>>  	/*
>> @@ -282,9 +282,18 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
>>  	 *
>>  	 * Other cases are errors.
>>  	 */
>> +	for (i = 1; i < argc; i++) {
>> +		if (!strcmp(argv[i], "--"))
>> +			break;
>> +		if (!strcmp(argv[i], "--no-index")) {
>> +			no_index = 1;
>> +			break;
>> +		}
>> +	}
>
> This seems to duplicate only half the logic at the beginning of
> diff_no_index(), right?  E.g., running "git diff /var/tmp/[12]"
> inside a working tree that is controlled by a Git repository when
> /var/tmp/ is outside, we do want to behave as if the command line
> were "git diff --no-index /var/tmp/[12]", but this half duplication
> makes these two behave differently, no?

Yes you're right, I missed that. "git diff /var/tmp/[12]" inside a working tree with a broken index has the same problems, which should be fixed too. I'll try to fix that and send a new patch afterwards.

Show 26 quoted lines
> I think the issue you are trying to address is worth tackling, but I
> wonder if a bit of preparatory refactoring is necessary to avoid the
> partial duplication.
>
>>  	prefix = setup_git_directory_gently(&nongit);
>> -	gitmodules_config();
>> +	if (!no_index)
>> +		gitmodules_config();
>>  	git_config(git_diff_ui_config, NULL);
>>
>>  	init_revisions(&rev, prefix);
>> diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh
>> index 979e983..a24ae4d 100755
>> --- a/t/t4053-diff-no-index.sh
>> +++ b/t/t4053-diff-no-index.sh
>> @@ -29,4 +29,10 @@ test_expect_success 'git diff --no-index relative path outside repo' '
>>  	)
>>  '
>>
>> +test_expect_success 'git diff --no-index with broken index' '
>> +	cd repo &&
>> +	echo broken >.git/index &&
>> +	test_expect_code 0 git diff --no-index a ../non/git/a
>> +'
>> +
>>  test_done

-- Thomas

Previous: Junio C HamanoNext: Thomas Gummerer
Message 12 of 30 in “diff: don't read index when --no-index is given”
  1. diff: don't read index when --no-index is givenThomas Gummerer, Dec 9, 2013
  2. Jonathan NiederDec 9, 2013
  3. Jens LehmannDec 9, 2013
  4. Jonathan NiederDec 9, 2013
  5. Thomas GummererDec 9, 2013
  6. Jonathan NiederDec 9, 2013
  7. diff: don't read index when --no-index is givenThomas Gummerer, Dec 9, 2013
  8. Torsten BögershausenDec 9, 2013
  9. Eric SunshineDec 9, 2013
  10. Thomas GummererDec 9, 2013
  11. Junio C HamanoDec 9, 2013
  12. Thomas GummererDec 9, 2013
  13. 1/2 diff: move no-index detection to builtin/diff.cThomas Gummerer, Dec 10, 2013
  14. 2/2 diff: don't read index when --no-index is givenThomas Gummerer, Dec 10, 2013
  15. Jonathan NiederDec 10, 2013
  16. Thomas GummererDec 10, 2013
  17. Jonathan NiederDec 10, 2013
  18. Thomas GummererDec 10, 2013
  19. 1/2 diff: move no-index detection to builtin/diff.cThomas Gummerer, Dec 11, 2013
  20. 2/2 diff: don't read index when --no-index is givenThomas Gummerer, Dec 11, 2013
  21. Junio C HamanoDec 12, 2013
  22. Jonathan NiederDec 14, 2013
  23. Jonathan NiederDec 14, 2013
  24. Thomas GummererDec 14, 2013
  25. Junio C HamanoDec 16, 2013
  26. 1/2 diff: add test for --no-index executed outside repoThomas Gummerer, Dec 16, 2013
  27. 2/2 diff: avoid some nestingThomas Gummerer, Dec 16, 2013
  28. Junio C HamanoDec 16, 2013
  29. 1/2 diff: move no-index detection to builtin/diff.cThomas Gummerer, Dec 14, 2013
  30. 2/2 diff: don't read index when --no-index is givenThomas Gummerer, Dec 14, 2013

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.