Skip to content

Commit ea305a6

Browse files
newrengitster
authored andcommitted
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 <[email protected]> Reviewed-by: Derrick Stolee <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 72b3091 commit ea305a6

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

merge-ort.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "merge-ort.h"
1919

2020
#include "alloc.h"
21+
#include "attr.h"
2122
#include "blob.h"
2223
#include "cache-tree.h"
2324
#include "commit.h"
@@ -220,6 +221,16 @@ struct merge_options_internal {
220221
*/
221222
struct rename_info renames;
222223

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+
223234
/*
224235
* current_dir_name, toplevel_dir: temporary vars
225236
*
@@ -399,6 +410,9 @@ static void clear_or_reinit_internal_opts(struct merge_options_internal *opti,
399410
string_list_clear(&opti->paths_to_free, 0);
400411
opti->paths_to_free.strdup_strings = 0;
401412

413+
if (opti->attr_index.cache_nr)
414+
discard_index(&opti->attr_index);
415+
402416
/* Free memory used by various renames maps */
403417
for (i = MERGE_SIDE1; i <= MERGE_SIDE2; ++i) {
404418
strintmap_func(&renames->dirs_removed[i]);
@@ -3407,6 +3421,8 @@ void merge_finalize(struct merge_options *opt,
34073421
{
34083422
struct merge_options_internal *opti = result->priv;
34093423

3424+
if (opt->renormalize)
3425+
git_attr_set_direction(GIT_ATTR_CHECKIN);
34103426
assert(opt->priv == NULL);
34113427

34123428
clear_or_reinit_internal_opts(opti, 0);
@@ -3482,6 +3498,10 @@ static void merge_start(struct merge_options *opt, struct merge_result *result)
34823498
/* Default to histogram diff. Actually, just hardcode it...for now. */
34833499
opt->xdl_opts = DIFF_WITH_ALG(opt, HISTOGRAM_DIFF);
34843500

3501+
/* Handle attr direction stuff for renormalization */
3502+
if (opt->renormalize)
3503+
git_attr_set_direction(GIT_ATTR_CHECKOUT);
3504+
34853505
/* Initialization of opt->priv, our internal merge data */
34863506
trace2_region_enter("merge", "allocate/init", opt->repo);
34873507
if (opt->priv) {

0 commit comments

Comments
 (0)