The `flag` parameter is a bitfield:
- - The least significant bit indicates whether this is an internal
- merge to consolidate ancestors for a recursive merge.
+ - The `LL_OPT_VIRTUAL_ANCESTOR` bit indicates whether this is an
+ internal merge to consolidate ancestors for a recursive merge.
- - The next two bits allow local conflicts to be automatically
+ - The `LL_OPT_FAVOR_MASK` bits allow local conflicts to be automatically
resolved in favor of one side or the other (as in 'git merge-file'
- `--ours`/`--theirs`/`--union` for 01, 10, and 11, respectively).
+ `--ours`/`--theirs`/`--union`).
+ They can be populated by `create_ll_flag`, whose argument can be
+ `XDL_MERGE_FAVOR_OURS`, `XDL_MERGE_FAVOR_THEIRS`, or
+ `XDL_MERGE_FAVOR_UNION`.
Everything else
---------------
* or common ancestor for an internal merge. Still return
* "conflicted merge" status.
*/
- mmfile_t *stolen = (flag & 01) ? orig : src1;
+ mmfile_t *stolen = (flag & LL_OPT_VIRTUAL_ANCESTOR) ? orig : src1;
result->ptr = stolen->ptr;
result->size = stolen->size;
memset(&xmp, 0, sizeof(xmp));
xmp.level = XDL_MERGE_ZEALOUS;
- xmp.favor= (flag >> 1) & 03;
+ xmp.favor = ll_opt_favor(flag);
if (git_xmerge_style >= 0)
xmp.style = git_xmerge_style;
if (marker_size > 0)
int flag, int marker_size)
{
/* Use union favor */
- flag = (flag & 1) | (XDL_MERGE_FAVOR_UNION << 1);
+ flag = (flag & LL_OPT_VIRTUAL_ANCESTOR) |
+ create_ll_flag(XDL_MERGE_FAVOR_UNION);
return ll_xdl_merge(drv_unused, result, path_unused,
orig, NULL, src1, NULL, src2, NULL,
flag, marker_size);
const char *ll_driver_name = NULL;
int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
const struct ll_merge_driver *driver;
- int virtual_ancestor = flag & 01;
+ int virtual_ancestor = flag & LL_OPT_VIRTUAL_ANCESTOR;
if (merge_renormalize) {
normalize_file(ancestor, path);
#ifndef LL_MERGE_H
#define LL_MERGE_H
+#define LL_OPT_VIRTUAL_ANCESTOR (1 << 0)
+#define LL_OPT_FAVOR_MASK ((1 << 1) | (1 << 2))
+#define LL_OPT_FAVOR_SHIFT 1
+
+static inline int ll_opt_favor(int flag)
+{
+ return (flag & LL_OPT_FAVOR_MASK) >> LL_OPT_FAVOR_SHIFT;
+}
+
+static inline int create_ll_flag(int favor)
+{
+ return ((favor << LL_OPT_FAVOR_SHIFT) & LL_OPT_FAVOR_MASK);
+}
+
int ll_merge(mmbuffer_t *result_buf,
const char *path,
mmfile_t *ancestor, const char *ancestor_label,
merge_status = ll_merge(result_buf, a->path, &orig, base_name,
&src1, name1, &src2, name2,
- (!!o->call_depth) | (favor << 1));
+ ((o->call_depth ? LL_OPT_VIRTUAL_ANCESTOR : 0) |
+ create_ll_flag(favor)));
free(name1);
free(name2);