Merge branch 'en/ort-perf-batch-11'
Optimize out repeated rename detection in a sequence of mergy operations. * en/ort-perf-batch-11: merge-ort, diffcore-rename: employ cached renames when possible merge-ort: handle interactions of caching and rename/rename(1to1) cases merge-ort: add helper functions for using cached renames merge-ort: preserve cached renames for the appropriate side merge-ort: avoid accidental API mis-use merge-ort: add code to check for whether cached renames can be reused merge-ort: populate caches of rename detection results merge-ort: add data structures for in-memory caching of rename detection t6429: testcases for remembering renames fast-rebase: write conflict state to working tree, index, and HEAD fast-rebase: change assert() to BUG() Documentation/technical: describe remembering renames optimization t6423: rename file within directory that other side renamed
This commit is contained in:
@ -568,7 +568,8 @@ static void update_dir_rename_counts(struct dir_rename_info *info,
|
||||
static void initialize_dir_rename_info(struct dir_rename_info *info,
|
||||
struct strintmap *relevant_sources,
|
||||
struct strintmap *dirs_removed,
|
||||
struct strmap *dir_rename_count)
|
||||
struct strmap *dir_rename_count,
|
||||
struct strmap *cached_pairs)
|
||||
{
|
||||
struct hashmap_iter iter;
|
||||
struct strmap_entry *entry;
|
||||
@ -633,6 +634,17 @@ static void initialize_dir_rename_info(struct dir_rename_info *info,
|
||||
rename_dst[i].p->two->path);
|
||||
}
|
||||
|
||||
/* Add cached_pairs to counts */
|
||||
strmap_for_each_entry(cached_pairs, &iter, entry) {
|
||||
const char *old_name = entry->key;
|
||||
const char *new_name = entry->value;
|
||||
if (!new_name)
|
||||
/* known delete; ignore it */
|
||||
continue;
|
||||
|
||||
update_dir_rename_counts(info, dirs_removed, old_name, new_name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we collapse
|
||||
* dir_rename_count: old_directory -> {new_directory -> count}
|
||||
@ -1247,7 +1259,8 @@ static void handle_early_known_dir_renames(struct dir_rename_info *info,
|
||||
void diffcore_rename_extended(struct diff_options *options,
|
||||
struct strintmap *relevant_sources,
|
||||
struct strintmap *dirs_removed,
|
||||
struct strmap *dir_rename_count)
|
||||
struct strmap *dir_rename_count,
|
||||
struct strmap *cached_pairs)
|
||||
{
|
||||
int detect_rename = options->detect_rename;
|
||||
int minimum_score = options->rename_score;
|
||||
@ -1363,7 +1376,8 @@ void diffcore_rename_extended(struct diff_options *options,
|
||||
/* Preparation for basename-driven matching. */
|
||||
trace2_region_enter("diff", "dir rename setup", options->repo);
|
||||
initialize_dir_rename_info(&info, relevant_sources,
|
||||
dirs_removed, dir_rename_count);
|
||||
dirs_removed, dir_rename_count,
|
||||
cached_pairs);
|
||||
trace2_region_leave("diff", "dir rename setup", options->repo);
|
||||
|
||||
/* Utilize file basenames to quickly find renames. */
|
||||
@ -1560,5 +1574,5 @@ void diffcore_rename_extended(struct diff_options *options,
|
||||
|
||||
void diffcore_rename(struct diff_options *options)
|
||||
{
|
||||
diffcore_rename_extended(options, NULL, NULL, NULL);
|
||||
diffcore_rename_extended(options, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
Reference in New Issue
Block a user