[PATCH v3 09/16] diff: skip batch object download when possible
- From
- Garima Singh via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Mar 30, 2020, 00:31 UTC
- Message-ID
- <55824cda89c1dca7756c8c2d831d6e115f4a9ddb.1585528298.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.497.v3.git.1585528298.gitgitgadget@gmail.com>
From: Garima Singh <garima.singh@microsoft.com>
When computing changed-path Bloom filters or performing a name-only diff, we do not need the blob contents before completing the diff values. Thus, we do not need to download a pack containing the blobs we do not have on-disk before completing our diff calculation.
This prevents downloading every blob in a partial clone when computing changed path Bloom filters. It also prevents over-aggressive downloads during "git log --raw" commands.
Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Garima Singh <garima.singh@microsoft.com> --- bloom.c | 1 + diff.c | 8 +++++++- diff.h | 1 + 3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/bloom.c b/bloom.c index a16eee92331..dbcf594baec 100644 --- a/bloom.c +++ b/bloom.c @@ -142,6 +142,7 @@ struct bloom_filter *get_bloom_filter(struct repository *r, repo_diff_setup(r, &diffopt); diffopt.flags.recursive = 1; + diffopt.detect_rename = 0; diffopt.max_changes = max_changes; diff_setup_done(&diffopt); diff --git a/diff.c b/diff.c index 1010d806f50..63376adb011 100644 --- a/diff.c +++ b/diff.c @@ -4633,6 +4633,10 @@ void diff_setup_done(struct diff_options *options) if (!options->use_color || external_diff()) options->color_moved = 0; + if (!(options->output_format & ~(DIFF_FORMAT_NAME | DIFF_FORMAT_RAW)) && + !options->detect_rename) + options->skip_batch_download_objects = 1; + FREE_AND_NULL(options->parseopts); } @@ -6507,7 +6511,9 @@ static void add_if_missing(struct repository *r, void diffcore_std(struct diff_options *options) { - if (options->repo == the_repository && has_promisor_remote()) { + if (!options->skip_batch_download_objects && + options->repo == the_repository && + has_promisor_remote()) { /* * Prefetch the diff pairs that are about to be flushed. */ diff --git a/diff.h b/diff.h index 9443dc1b003..e9f104309c4 100644 --- a/diff.h +++ b/diff.h @@ -281,6 +281,7 @@ struct diff_options { int show_rename_progress; int dirstat_permille; int setup; + int skip_batch_download_objects; /* Number of hexdigits to abbreviate raw format output to. */ int abbrev;
-- gitgitgadget