]> git.ipfire.org Git - thirdparty/git.git/blobdiff - diffcore-rename.c
diffcore-rename: allow different missing_object_cb functions
[thirdparty/git.git] / diffcore-rename.c
index 3375e24659ea1a34eca48af6109fa534861c8c7c..8affa6130e2da2fb66a6b7c9b48d8bdc4114a2fd 100644 (file)
@@ -126,7 +126,7 @@ static int estimate_similarity(struct repository *r,
                               struct diff_filespec *src,
                               struct diff_filespec *dst,
                               int minimum_score,
-                              int skip_unmodified)
+                              struct diff_populate_filespec_options *dpf_opt)
 {
        /* src points at a file that existed in the original tree (or
         * optionally a file in the destination tree) and dst points
@@ -143,15 +143,6 @@ static int estimate_similarity(struct repository *r,
         */
        unsigned long max_size, delta_size, base_size, src_copied, literal_added;
        int score;
-       struct diff_populate_filespec_options dpf_options = {
-               .check_size_only = 1
-       };
-       struct prefetch_options prefetch_options = {r, skip_unmodified};
-
-       if (r == the_repository && has_promisor_remote()) {
-               dpf_options.missing_object_cb = prefetch;
-               dpf_options.missing_object_data = &prefetch_options;
-       }
 
        /* We deal only with regular files.  Symlink renames are handled
         * only when they are exact matches --- in other words, no edits
@@ -169,11 +160,13 @@ static int estimate_similarity(struct repository *r,
         * is a possible size - we really should have a flag to
         * say whether the size is valid or not!)
         */
+       dpf_opt->check_size_only = 1;
+
        if (!src->cnt_data &&
-           diff_populate_filespec(r, src, &dpf_options))
+           diff_populate_filespec(r, src, dpf_opt))
                return 0;
        if (!dst->cnt_data &&
-           diff_populate_filespec(r, dst, &dpf_options))
+           diff_populate_filespec(r, dst, dpf_opt))
                return 0;
 
        max_size = ((src->size > dst->size) ? src->size : dst->size);
@@ -191,11 +184,11 @@ static int estimate_similarity(struct repository *r,
        if (max_size * (MAX_SCORE-minimum_score) < delta_size * MAX_SCORE)
                return 0;
 
-       dpf_options.check_size_only = 0;
+       dpf_opt->check_size_only = 0;
 
-       if (!src->cnt_data && diff_populate_filespec(r, src, &dpf_options))
+       if (!src->cnt_data && diff_populate_filespec(r, src, dpf_opt))
                return 0;
-       if (!dst->cnt_data && diff_populate_filespec(r, dst, &dpf_options))
+       if (!dst->cnt_data && diff_populate_filespec(r, dst, dpf_opt))
                return 0;
 
        if (diffcore_count_changes(r, src, dst,
@@ -862,7 +855,11 @@ static int find_basename_matches(struct diff_options *options,
        int i, renames = 0;
        struct strintmap sources;
        struct strintmap dests;
-
+       struct diff_populate_filespec_options dpf_options = {
+               .check_binary = 0,
+               .missing_object_cb = NULL,
+               .missing_object_data = NULL
+       };
        /*
         * The prefeteching stuff wants to know if it can skip prefetching
         * blobs that are unmodified...and will then do a little extra work
@@ -873,7 +870,10 @@ static int find_basename_matches(struct diff_options *options,
         * the extra work necessary to check if rename_src entries are
         * unmodified would be a small waste.
         */
-       int skip_unmodified = 0;
+       struct prefetch_options prefetch_options = {
+               .repo = options->repo,
+               .skip_unmodified = 0
+       };
 
        /*
         * Create maps of basename -> fullname(s) for remaining sources and
@@ -910,6 +910,11 @@ static int find_basename_matches(struct diff_options *options,
                        strintmap_set(&dests, base, i);
        }
 
+       if (options->repo == the_repository && has_promisor_remote()) {
+               dpf_options.missing_object_cb = prefetch;
+               dpf_options.missing_object_data = &prefetch_options;
+       }
+
        /* Now look for basename matchups and do similarity estimation */
        for (i = 0; i < rename_src_nr; ++i) {
                char *filename = rename_src[i].p->one->path;
@@ -953,7 +958,7 @@ static int find_basename_matches(struct diff_options *options,
                        one = rename_src[src_index].p->one;
                        two = rename_dst[dst_index].p->two;
                        score = estimate_similarity(options->repo, one, two,
-                                                   minimum_score, skip_unmodified);
+                                                   minimum_score, &dpf_options);
 
                        /* If sufficiently similar, record as rename pair */
                        if (score < minimum_score)
@@ -1272,6 +1277,14 @@ void diffcore_rename_extended(struct diff_options *options,
        int num_sources, want_copies;
        struct progress *progress = NULL;
        struct dir_rename_info info;
+       struct diff_populate_filespec_options dpf_options = {
+               .check_binary = 0,
+               .missing_object_cb = NULL,
+               .missing_object_data = NULL
+       };
+       struct prefetch_options prefetch_options = {
+               .repo = options->repo
+       };
 
        trace2_region_enter("diff", "setup", options->repo);
        info.setup = 0;
@@ -1433,6 +1446,13 @@ void diffcore_rename_extended(struct diff_options *options,
                                (uint64_t)num_destinations * (uint64_t)num_sources);
        }
 
+       /* Finish setting up dpf_options */
+       prefetch_options.skip_unmodified = skip_unmodified;
+       if (options->repo == the_repository && has_promisor_remote()) {
+               dpf_options.missing_object_cb = prefetch;
+               dpf_options.missing_object_data = &prefetch_options;
+       }
+
        CALLOC_ARRAY(mx, st_mult(NUM_CANDIDATE_PER_DST, num_destinations));
        for (dst_cnt = i = 0; i < rename_dst_nr; i++) {
                struct diff_filespec *two = rename_dst[i].p->two;
@@ -1458,7 +1478,7 @@ void diffcore_rename_extended(struct diff_options *options,
                        this_src.score = estimate_similarity(options->repo,
                                                             one, two,
                                                             minimum_score,
-                                                            skip_unmodified);
+                                                            &dpf_options);
                        this_src.name_score = basename_same(one, two);
                        this_src.dst = i;
                        this_src.src = j;