]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge-ort: add a special minimal index just for renormalization
authorElijah Newren <newren@gmail.com>
Sat, 20 Mar 2021 00:03:45 +0000 (00:03 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 20 Mar 2021 19:35:40 +0000 (12:35 -0700)
renormalize_buffer() requires an index_state, which is something that
merge-ort does not operate with.  However, all the renormalization code
needs is an index with a .gitattributes file...plus a little bit of
setup.  Create such an index, along with the deallocation and
attr_direction handling.

A subsequent commit will add a function to finish the initialization
of this index.

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

index 34a91c43573752e685d9ca1d31d4b4a8dec58e32..3c606fa7e4b3d7323869816ddc2d496ba4b7ed56 100644 (file)
@@ -18,6 +18,7 @@
 #include "merge-ort.h"
 
 #include "alloc.h"
+#include "attr.h"
 #include "blob.h"
 #include "cache-tree.h"
 #include "commit.h"
@@ -220,6 +221,16 @@ struct merge_options_internal {
         */
        struct rename_info renames;
 
+       /*
+        * attr_index: hacky minimal index used for renormalization
+        *
+        * renormalization code _requires_ an index, though it only needs to
+        * find a .gitattributes file within the index.  So, when
+        * renormalization is important, we create a special index with just
+        * that one file.
+        */
+       struct index_state attr_index;
+
        /*
         * current_dir_name, toplevel_dir: temporary vars
         *
@@ -399,6 +410,9 @@ static void clear_or_reinit_internal_opts(struct merge_options_internal *opti,
        string_list_clear(&opti->paths_to_free, 0);
        opti->paths_to_free.strdup_strings = 0;
 
+       if (opti->attr_index.cache_nr)
+               discard_index(&opti->attr_index);
+
        /* Free memory used by various renames maps */
        for (i = MERGE_SIDE1; i <= MERGE_SIDE2; ++i) {
                strintmap_func(&renames->dirs_removed[i]);
@@ -3407,6 +3421,8 @@ void merge_finalize(struct merge_options *opt,
 {
        struct merge_options_internal *opti = result->priv;
 
+       if (opt->renormalize)
+               git_attr_set_direction(GIT_ATTR_CHECKIN);
        assert(opt->priv == NULL);
 
        clear_or_reinit_internal_opts(opti, 0);
@@ -3482,6 +3498,10 @@ static void merge_start(struct merge_options *opt, struct merge_result *result)
        /* Default to histogram diff.  Actually, just hardcode it...for now. */
        opt->xdl_opts = DIFF_WITH_ALG(opt, HISTOGRAM_DIFF);
 
+       /* Handle attr direction stuff for renormalization */
+       if (opt->renormalize)
+               git_attr_set_direction(GIT_ATTR_CHECKOUT);
+
        /* Initialization of opt->priv, our internal merge data */
        trace2_region_enter("merge", "allocate/init", opt->repo);
        if (opt->priv) {