merge-ort: add a special minimal index just for renormalization

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>

Elijah Newren committed Mar 20, 2021 at 00:03 UTC ea305a68fd7427f84f90709e598624341f5627c8
1 file changed +20
merge-ort.c
+20
@@ -18,6 +18,7 @@
18 #include "merge-ort.h"
19
20 #include "alloc.h"
21 +#include "attr.h"
22 #include "blob.h"
23 #include "cache-tree.h"
24 #include "commit.h"
@@ -220,6 +221,16 @@ struct merge_options_internal {
221 */
222 struct rename_info renames;
223
224 + /*
225 + * attr_index: hacky minimal index used for renormalization
226 + *
227 + * renormalization code _requires_ an index, though it only needs to
228 + * find a .gitattributes file within the index. So, when
229 + * renormalization is important, we create a special index with just
230 + * that one file.
231 + */
232 + struct index_state attr_index;
233 +
234 /*
235 * current_dir_name, toplevel_dir: temporary vars
236 *
@@ -399,6 +410,9 @@ static void clear_or_reinit_internal_opts(struct merge_options_internal *opti,
410 string_list_clear(&opti->paths_to_free, 0);
411 opti->paths_to_free.strdup_strings = 0;
412
413 + if (opti->attr_index.cache_nr)
414 + discard_index(&opti->attr_index);
415 +
416 /* Free memory used by various renames maps */
417 for (i = MERGE_SIDE1; i <= MERGE_SIDE2; ++i) {
418 strintmap_func(&renames->dirs_removed[i]);
@@ -3407,6 +3421,8 @@ void merge_finalize(struct merge_options *opt,
3421 {
3422 struct merge_options_internal *opti = result->priv;
3423
3424 + if (opt->renormalize)
3425 + git_attr_set_direction(GIT_ATTR_CHECKIN);
3426 assert(opt->priv == NULL);
3427
3428 clear_or_reinit_internal_opts(opti, 0);
@@ -3482,6 +3498,10 @@ static void merge_start(struct merge_options *opt, struct merge_result *result)
3498 /* Default to histogram diff. Actually, just hardcode it...for now. */
3499 opt->xdl_opts = DIFF_WITH_ALG(opt, HISTOGRAM_DIFF);
3500
3501 + /* Handle attr direction stuff for renormalization */
3502 + if (opt->renormalize)
3503 + git_attr_set_direction(GIT_ATTR_CHECKOUT);
3504 +
3505 /* Initialization of opt->priv, our internal merge data */
3506 trace2_region_enter("merge", "allocate/init", opt->repo);
3507 if (opt->priv) {