]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diffcore-rename: limit dir_rename_counts computation to relevant dirs
authorElijah Newren <newren@gmail.com>
Sat, 27 Feb 2021 00:30:47 +0000 (00:30 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 27 Feb 2021 01:53:12 +0000 (17:53 -0800)
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.

If dirs_removed is passed to diffcore_rename_extended(), then it
provides the relevant bits of information for us to limit this counting
to relevant dirs.  If dirs_removed is not passed, we would need to
compute some replacement in order to do this limiting.  Introduce a new
info->relevant_source_dirs variable for this purpose, even though at
this stage we will only set it to dirs_removed for simplicity.

Reviewed-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diffcore-rename.c

index 10f8f4a301e336a715abaaed354fd38705730ac5..e5fa0cb555dd38933a1bf51bcb2512b022b28a3f 100644 (file)
@@ -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;
 };
 
@@ -442,7 +443,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);
 
                /*
@@ -521,6 +528,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.