mirror of
https://github.com/git/git.git
synced 2024-11-28 20:44:04 +08:00
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:
parent
04d3d3cfc4
commit
6f0322633b
@ -64,6 +64,7 @@ struct replay_opts {
|
||||
#define SEQ_DIR "sequencer"
|
||||
#define SEQ_HEAD_FILE "sequencer/head"
|
||||
#define SEQ_TODO_FILE "sequencer/todo"
|
||||
#define SEQ_OPTS_FILE "sequencer/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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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"));
|
||||
}
|
||||
save_head(sha1_to_hex(sha1));
|
||||
save_opts(opts);
|
||||
|
||||
for (cur = todo_list; cur; cur = cur->next) {
|
||||
save_todo(cur, opts);
|
||||
|
@ -33,10 +33,35 @@ test_expect_success setup '
|
||||
|
||||
test_expect_success 'cherry-pick persists data on failure' '
|
||||
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_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' '
|
||||
|
Loading…
Reference in New Issue
Block a user