@ -44,7 +44,11 @@ static const char **commit_argv;
@@ -44,7 +44,11 @@ static const char **commit_argv;
static int allow_rerere_auto;
static const char *me;
/* Merge strategy. */
static const char *strategy;
static const char **xopts;
static size_t xopts_nr, xopts_alloc;
#define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
@ -55,6 +59,17 @@ static const char * const *revert_or_cherry_pick_usage(void)
@@ -55,6 +59,17 @@ static const char * const *revert_or_cherry_pick_usage(void)
return action == REVERT ? revert_usage : cherry_pick_usage;
}
static int option_parse_x(const struct option *opt,
const char *arg, int unset)
{
if (unset)
return 0;
ALLOC_GROW(xopts, xopts_nr + 1, xopts_alloc);
xopts[xopts_nr++] = xstrdup(arg);
return 0;
}
static void parse_args(int argc, const char **argv)
{
const char * const * usage_str = revert_or_cherry_pick_usage();
@ -67,6 +82,8 @@ static void parse_args(int argc, const char **argv)
@@ -67,6 +82,8 @@ static void parse_args(int argc, const char **argv)
OPT_INTEGER('m', "mainline", &mainline, "parent number"),
OPT_RERERE_AUTOUPDATE(&allow_rerere_auto),
OPT_STRING(0, "strategy", &strategy, "strategy", "merge strategy"),
OPT_CALLBACK('X', "strategy-option", &xopts, "option",
"option for merge strategy", option_parse_x),
OPT_END(),
OPT_END(),
OPT_END(),
@ -311,18 +328,13 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
@@ -311,18 +328,13 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
struct merge_options o;
struct tree *result, *next_tree, *base_tree, *head_tree;
int clean, index_fd;
const char **xopt;
static struct lock_file index_lock;
index_fd = hold_locked_index(&index_lock, 1);
read_cache();
/*
* NEEDSWORK: cherry-picking between branches with
* different end-of-line normalization is a pain;
* plumb in an option to set o.renormalize?
* (or better: arbitrary -X options)
*/
init_merge_options(&o);
o.ancestor = base ? base_label : "(empty tree)";
o.branch1 = "HEAD";
@ -332,6 +344,9 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
@@ -332,6 +344,9 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
next_tree = next ? next->tree : empty_tree();
base_tree = base ? base->tree : empty_tree();
for (xopt = xopts; xopt != xopts + xopts_nr; xopt++)
parse_merge_opt(&o, *xopt);
clean = merge_trees(&o,
head_tree,
next_tree, base_tree, &result);
@ -503,7 +518,7 @@ static int do_pick_commit(void)
@@ -503,7 +518,7 @@ static int do_pick_commit(void)
commit_list_insert(base, &common);
commit_list_insert(next, &remotes);
res = try_merge_command(strategy, common,
res = try_merge_command(strategy, xopts_nr, xopts, common,
sha1_to_hex(head), remotes);
free_commit_list(common);
free_commit_list(remotes);