revert: Save command-line options for continuing operation
In the same spirit as ".git/sequencer/head" and ".git/sequencer/todo", introduce ".git/sequencer/opts" to persist the replay_opts structure for continuing after a conflict resolution. Use the gitconfig format for this file so that it looks like: [options] signoff = true record-origin = true mainline = 1 strategy = recursive strategy-option = patience strategy-option = ours Helped-by: Jonathan Nieder <jrnieder@gmail.com> Helped-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
04d3d3cfc4
commit
6f0322633b
@ -64,6 +64,7 @@ struct replay_opts {
|
|||||||
#define SEQ_DIR "sequencer"
|
#define SEQ_DIR "sequencer"
|
||||||
#define SEQ_HEAD_FILE "sequencer/head"
|
#define SEQ_HEAD_FILE "sequencer/head"
|
||||||
#define SEQ_TODO_FILE "sequencer/todo"
|
#define SEQ_TODO_FILE "sequencer/todo"
|
||||||
|
#define SEQ_OPTS_FILE "sequencer/opts"
|
||||||
|
|
||||||
static const char *action_name(const struct replay_opts *opts)
|
static const char *action_name(const struct replay_opts *opts)
|
||||||
{
|
{
|
||||||
@ -695,6 +696,37 @@ static void save_todo(struct commit_list *todo_list, struct replay_opts *opts)
|
|||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void save_opts(struct replay_opts *opts)
|
||||||
|
{
|
||||||
|
const char *opts_file = git_path(SEQ_OPTS_FILE);
|
||||||
|
|
||||||
|
if (opts->no_commit)
|
||||||
|
git_config_set_in_file(opts_file, "options.no-commit", "true");
|
||||||
|
if (opts->edit)
|
||||||
|
git_config_set_in_file(opts_file, "options.edit", "true");
|
||||||
|
if (opts->signoff)
|
||||||
|
git_config_set_in_file(opts_file, "options.signoff", "true");
|
||||||
|
if (opts->record_origin)
|
||||||
|
git_config_set_in_file(opts_file, "options.record-origin", "true");
|
||||||
|
if (opts->allow_ff)
|
||||||
|
git_config_set_in_file(opts_file, "options.allow-ff", "true");
|
||||||
|
if (opts->mainline) {
|
||||||
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
strbuf_addf(&buf, "%d", opts->mainline);
|
||||||
|
git_config_set_in_file(opts_file, "options.mainline", buf.buf);
|
||||||
|
strbuf_release(&buf);
|
||||||
|
}
|
||||||
|
if (opts->strategy)
|
||||||
|
git_config_set_in_file(opts_file, "options.strategy", opts->strategy);
|
||||||
|
if (opts->xopts) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < opts->xopts_nr; i++)
|
||||||
|
git_config_set_multivar_in_file(opts_file,
|
||||||
|
"options.strategy-option",
|
||||||
|
opts->xopts[i], "^$", 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int pick_commits(struct replay_opts *opts)
|
static int pick_commits(struct replay_opts *opts)
|
||||||
{
|
{
|
||||||
struct commit_list *todo_list = NULL;
|
struct commit_list *todo_list = NULL;
|
||||||
@ -717,6 +749,7 @@ static int pick_commits(struct replay_opts *opts)
|
|||||||
die(_("Can't cherry-pick into empty head"));
|
die(_("Can't cherry-pick into empty head"));
|
||||||
}
|
}
|
||||||
save_head(sha1_to_hex(sha1));
|
save_head(sha1_to_hex(sha1));
|
||||||
|
save_opts(opts);
|
||||||
|
|
||||||
for (cur = todo_list; cur; cur = cur->next) {
|
for (cur = todo_list; cur; cur = cur->next) {
|
||||||
save_todo(cur, opts);
|
save_todo(cur, opts);
|
||||||
|
@ -33,10 +33,35 @@ test_expect_success setup '
|
|||||||
|
|
||||||
test_expect_success 'cherry-pick persists data on failure' '
|
test_expect_success 'cherry-pick persists data on failure' '
|
||||||
pristine_detach initial &&
|
pristine_detach initial &&
|
||||||
test_must_fail git cherry-pick base..anotherpick &&
|
test_must_fail git cherry-pick -s base..anotherpick &&
|
||||||
test_path_is_dir .git/sequencer &&
|
test_path_is_dir .git/sequencer &&
|
||||||
test_path_is_file .git/sequencer/head &&
|
test_path_is_file .git/sequencer/head &&
|
||||||
test_path_is_file .git/sequencer/todo
|
test_path_is_file .git/sequencer/todo &&
|
||||||
|
test_path_is_file .git/sequencer/opts
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'cherry-pick persists opts correctly' '
|
||||||
|
pristine_detach initial &&
|
||||||
|
test_must_fail git cherry-pick -s -m 1 --strategy=recursive -X patience -X ours base..anotherpick &&
|
||||||
|
test_path_is_dir .git/sequencer &&
|
||||||
|
test_path_is_file .git/sequencer/head &&
|
||||||
|
test_path_is_file .git/sequencer/todo &&
|
||||||
|
test_path_is_file .git/sequencer/opts &&
|
||||||
|
echo "true" >expect &&
|
||||||
|
git config --file=.git/sequencer/opts --get-all options.signoff >actual &&
|
||||||
|
test_cmp expect actual &&
|
||||||
|
echo "1" >expect &&
|
||||||
|
git config --file=.git/sequencer/opts --get-all options.mainline >actual &&
|
||||||
|
test_cmp expect actual &&
|
||||||
|
echo "recursive" >expect &&
|
||||||
|
git config --file=.git/sequencer/opts --get-all options.strategy >actual &&
|
||||||
|
test_cmp expect actual &&
|
||||||
|
cat >expect <<-\EOF &&
|
||||||
|
patience
|
||||||
|
ours
|
||||||
|
EOF
|
||||||
|
git config --file=.git/sequencer/opts --get-all options.strategy-option >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'cherry-pick cleans up sequencer state upon success' '
|
test_expect_success 'cherry-pick cleans up sequencer state upon success' '
|
||||||
|
Reference in New Issue
Block a user