@@ -18,7 +18,7 @@ typedef int (*ll_merge_fn)(const struct ll_merge_driver *,
1818 mmfile_t * orig , const char * orig_name ,
1919 mmfile_t * src1 , const char * name1 ,
2020 mmfile_t * src2 , const char * name2 ,
21- int flag ,
21+ const struct ll_merge_options * opts ,
2222 int marker_size );
2323
2424struct ll_merge_driver {
@@ -39,14 +39,18 @@ static int ll_binary_merge(const struct ll_merge_driver *drv_unused,
3939 mmfile_t * orig , const char * orig_name ,
4040 mmfile_t * src1 , const char * name1 ,
4141 mmfile_t * src2 , const char * name2 ,
42- int flag , int marker_size )
42+ const struct ll_merge_options * opts ,
43+ int marker_size )
4344{
45+ mmfile_t * stolen ;
46+ assert (opts );
47+
4448 /*
4549 * The tentative merge result is "ours" for the final round,
4650 * or common ancestor for an internal merge. Still return
4751 * "conflicted merge" status.
4852 */
49- mmfile_t * stolen = ( flag & LL_OPT_VIRTUAL_ANCESTOR ) ? orig : src1 ;
53+ stolen = opts -> virtual_ancestor ? orig : src1 ;
5054
5155 result -> ptr = stolen -> ptr ;
5256 result -> size = stolen -> size ;
@@ -60,9 +64,11 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused,
6064 mmfile_t * orig , const char * orig_name ,
6165 mmfile_t * src1 , const char * name1 ,
6266 mmfile_t * src2 , const char * name2 ,
63- int flag , int marker_size )
67+ const struct ll_merge_options * opts ,
68+ int marker_size )
6469{
6570 xmparam_t xmp ;
71+ assert (opts );
6672
6773 if (buffer_is_binary (orig -> ptr , orig -> size ) ||
6874 buffer_is_binary (src1 -> ptr , src1 -> size ) ||
@@ -74,12 +80,12 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused,
7480 orig , orig_name ,
7581 src1 , name1 ,
7682 src2 , name2 ,
77- flag , marker_size );
83+ opts , marker_size );
7884 }
7985
8086 memset (& xmp , 0 , sizeof (xmp ));
8187 xmp .level = XDL_MERGE_ZEALOUS ;
82- xmp .favor = ll_opt_favor ( flag ) ;
88+ xmp .favor = opts -> variant ;
8389 if (git_xmerge_style >= 0 )
8490 xmp .style = git_xmerge_style ;
8591 if (marker_size > 0 )
@@ -96,15 +102,17 @@ static int ll_union_merge(const struct ll_merge_driver *drv_unused,
96102 mmfile_t * orig , const char * orig_name ,
97103 mmfile_t * src1 , const char * name1 ,
98104 mmfile_t * src2 , const char * name2 ,
99- int flag , int marker_size )
105+ const struct ll_merge_options * opts ,
106+ int marker_size )
100107{
101108 /* Use union favor */
102- flag &= ~LL_OPT_FAVOR_MASK ;
103- flag |= create_ll_flag (XDL_MERGE_FAVOR_UNION );
109+ struct ll_merge_options o ;
110+ assert (opts );
111+ o = * opts ;
112+ o .variant = XDL_MERGE_FAVOR_UNION ;
104113 return ll_xdl_merge (drv_unused , result , path_unused ,
105114 orig , NULL , src1 , NULL , src2 , NULL ,
106- flag , marker_size );
107- return 0 ;
115+ & o , marker_size );
108116}
109117
110118#define LL_BINARY_MERGE 0
@@ -136,14 +144,16 @@ static int ll_ext_merge(const struct ll_merge_driver *fn,
136144 mmfile_t * orig , const char * orig_name ,
137145 mmfile_t * src1 , const char * name1 ,
138146 mmfile_t * src2 , const char * name2 ,
139- int flag , int marker_size )
147+ const struct ll_merge_options * opts ,
148+ int marker_size )
140149{
141150 char temp [4 ][50 ];
142151 struct strbuf cmd = STRBUF_INIT ;
143152 struct strbuf_expand_dict_entry dict [5 ];
144153 const char * args [] = { NULL , NULL };
145154 int status , fd , i ;
146155 struct stat st ;
156+ assert (opts );
147157
148158 dict [0 ].placeholder = "O" ; dict [0 ].value = temp [0 ];
149159 dict [1 ].placeholder = "A" ; dict [1 ].value = temp [1 ];
@@ -337,15 +347,21 @@ int ll_merge(mmbuffer_t *result_buf,
337347 mmfile_t * ancestor , const char * ancestor_label ,
338348 mmfile_t * ours , const char * our_label ,
339349 mmfile_t * theirs , const char * their_label ,
340- int flag )
350+ const struct ll_merge_options * opts )
341351{
342352 static struct git_attr_check check [2 ];
343353 const char * ll_driver_name = NULL ;
344354 int marker_size = DEFAULT_CONFLICT_MARKER_SIZE ;
345355 const struct ll_merge_driver * driver ;
346- int virtual_ancestor = flag & LL_OPT_VIRTUAL_ANCESTOR ;
347356
348- if (flag & LL_OPT_RENORMALIZE ) {
357+ if (!opts ) {
358+ struct ll_merge_options default_opts = {0 };
359+ return ll_merge (result_buf , path , ancestor , ancestor_label ,
360+ ours , our_label , theirs , their_label ,
361+ & default_opts );
362+ }
363+
364+ if (opts -> renormalize ) {
349365 normalize_file (ancestor , path );
350366 normalize_file (ours , path );
351367 normalize_file (theirs , path );
@@ -359,11 +375,11 @@ int ll_merge(mmbuffer_t *result_buf,
359375 }
360376 }
361377 driver = find_ll_merge_driver (ll_driver_name );
362- if (virtual_ancestor && driver -> recursive )
378+ if (opts -> virtual_ancestor && driver -> recursive )
363379 driver = find_ll_merge_driver (driver -> recursive );
364380 return driver -> fn (driver , result_buf , path , ancestor , ancestor_label ,
365381 ours , our_label , theirs , their_label ,
366- flag , marker_size );
382+ opts , marker_size );
367383}
368384
369385int ll_merge_marker_size (const char * path )
0 commit comments