[PATCH 09/10] diffcore-rename: limit dir_rename_counts computation to relevant dirs
- From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Feb 14, 2021, 07:59 UTC
- Message-ID
- <4e095ea7c4390cb47828bbba50af876249983870.1613289544.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.844.git.1613289544.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>
We are using dir_rename_counts to count the number of other directories that files within a directory moved to. We only need this information for directories that disappeared, though, so we can return early from update_dir_rename_counts() for other paths.
While dirs_removed provides the relevant information for us right now, we introduce a new info->relevant_source_dirs parameter because future optimizations will want to change how things are called somewhat.
Signed-off-by: Elijah Newren <newren@gmail.com> --- diffcore-rename.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/diffcore-rename.c b/diffcore-rename.c index 1e4a56adde2c..5de4497e04fa 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -371,6 +371,7 @@ struct dir_rename_info { struct strintmap idx_map; struct strmap dir_rename_guess; struct strmap *dir_rename_count; + struct strset *relevant_source_dirs; unsigned setup; }; @@ -460,7 +461,13 @@ static void update_dir_rename_counts(struct dir_rename_info *info, return; while (1) { + /* Get old_dir, skip if its directory isn't relevant. */ dirname_munge(old_dir); + if (info->relevant_source_dirs && + !strset_contains(info->relevant_source_dirs, old_dir)) + break; + + /* Get new_dir */ dirname_munge(new_dir); /* @@ -540,6 +547,9 @@ static void initialize_dir_rename_info(struct dir_rename_info *info, strintmap_init_with_options(&info->idx_map, -1, NULL, 0); strmap_init_with_options(&info->dir_rename_guess, NULL, 0); + /* Setup info->relevant_source_dirs */ + info->relevant_source_dirs = dirs_removed; + /* * Loop setting up both info->idx_map, and doing setup of * info->dir_rename_count.
-- gitgitgadget