Thomas Gummerer <t.gummerer@xxxxxxxxx> writes: > git diff --no-index ... currently reads the index, during setup, when > calling gitmodules_config(). This results in worse performance when the > index is not actually needed. This patch avoids calling > gitmodules_config() when the --no-index option is given. The times for > executing "git diff --no-index" in the WebKit repository are improved as > follows: > > Test HEAD~3 HEAD > ------------------------------------------------------------------ > 4001.1: diff --no-index 0.24(0.15+0.09) 0.01(0.00+0.00) -95.8% > > An additional improvement of this patch is that "git diff --no-index" no > longer breaks when the index file is corrupt, which makes it possible to > use it for investigating the broken repository. > > To improve the possible usage as investigation tool for broken > repositories, setup_git_directory_gently() is also not called when the > --no-index option is given. > > Also add a test to guard against future breakages, and a performance > test to show the improvements. > > Signed-off-by: Thomas Gummerer <t.gummerer@xxxxxxxxx> > --- Looks reasonable. Thanks. Will queue. > builtin/diff.c | 7 +++++-- > t/perf/p4001-diff-no-index.sh | 22 ++++++++++++++++++++++ > t/t4053-diff-no-index.sh | 15 +++++++++++++++ > 3 files changed, 42 insertions(+), 2 deletions(-) > create mode 100755 t/perf/p4001-diff-no-index.sh > > diff --git a/builtin/diff.c b/builtin/diff.c > index da69e4a..ea1dd65 100644 > --- a/builtin/diff.c > +++ b/builtin/diff.c > @@ -298,7 +298,9 @@ int cmd_diff(int argc, const char **argv, const char *prefix) > break; > } > > - prefix = setup_git_directory_gently(&nongit); > + if (!no_index) > + prefix = setup_git_directory_gently(&nongit); > + > /* > * Treat git diff with at least one path outside of the > * repo the same as if the command would have been executed > @@ -311,7 +313,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix) > !path_inside_repo(prefix, argv[i + 1])))) > no_index = DIFF_NO_INDEX_IMPLICIT; > > - gitmodules_config(); > + if (!no_index) > + gitmodules_config(); > git_config(git_diff_ui_config, NULL); > > init_revisions(&rev, prefix); > diff --git a/t/perf/p4001-diff-no-index.sh b/t/perf/p4001-diff-no-index.sh > new file mode 100755 > index 0000000..683be69 > --- /dev/null > +++ b/t/perf/p4001-diff-no-index.sh > @@ -0,0 +1,22 @@ > +#!/bin/sh > + > +test_description="Test diff --no-index performance" > + > +. ./perf-lib.sh > + > +test_perf_large_repo > +test_checkout_worktree > + > +file1=$(git ls-files | tail -n 2 | head -1) > +file2=$(git ls-files | tail -n 1 | head -1) > + > +test_expect_success "empty files, so they take no time to diff" " > + echo >$file1 && > + echo >$file2 > +" > + > +test_perf "diff --no-index" " > + git diff --no-index $file1 $file2 >/dev/null > +" > + > +test_done > diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh > index 979e983..077c775 100755 > --- a/t/t4053-diff-no-index.sh > +++ b/t/t4053-diff-no-index.sh > @@ -29,4 +29,19 @@ 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 && > + git diff --no-index a ../non/git/a > + ) > +' > + > +test_expect_success 'git diff outside repo with broken index' ' > + ( > + cd repo && > + git diff ../non/git/a ../non/git/b > + ) > +' > + > test_done -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html