sequencer: add update-ref command

Add the boilerplate for an "update-ref" command in the sequencer. This
connects to the current no-op do_update_ref() which will be filled in
after more connections are created.

The syntax in the todo list will be "update-ref <ref-name>" to signal
that we should store the current commit as the value for updating
<ref-name> at the end of the rebase.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Derrick Stolee 2022-07-19 18:33:38 +00:00 коммит произвёл Junio C Hamano
Родитель d7ce9a2201
Коммит a97d79163e
3 изменённых файлов: 17 добавлений и 1 удалений

Просмотреть файл

@ -57,6 +57,9 @@ void append_todo_help(int command_count,
" create a merge commit using the original merge commit's\n" " create a merge commit using the original merge commit's\n"
" message (or the oneline, if no original merge commit was\n" " message (or the oneline, if no original merge commit was\n"
" specified); use -c <commit> to reword the commit message\n" " specified); use -c <commit> to reword the commit message\n"
"u, update-ref <ref> = track a placeholder for the <ref> to be updated\n"
" to this position in the new commits. The <ref> is\n"
" updated at the end of the rebase\n"
"\n" "\n"
"These lines can be re-ordered; they are executed from top to bottom.\n"); "These lines can be re-ordered; they are executed from top to bottom.\n");
unsigned edit_todo = !(shortrevisions && shortonto); unsigned edit_todo = !(shortrevisions && shortonto);

Просмотреть файл

@ -1723,6 +1723,7 @@ static struct {
[TODO_LABEL] = { 'l', "label" }, [TODO_LABEL] = { 'l', "label" },
[TODO_RESET] = { 't', "reset" }, [TODO_RESET] = { 't', "reset" },
[TODO_MERGE] = { 'm', "merge" }, [TODO_MERGE] = { 'm', "merge" },
[TODO_UPDATE_REF] = { 'u', "update-ref" },
[TODO_NOOP] = { 0, "noop" }, [TODO_NOOP] = { 0, "noop" },
[TODO_DROP] = { 'd', "drop" }, [TODO_DROP] = { 'd', "drop" },
[TODO_COMMENT] = { 0, NULL }, [TODO_COMMENT] = { 0, NULL },
@ -2504,7 +2505,7 @@ static int parse_insn_line(struct repository *r, struct todo_item *item,
command_to_string(item->command)); command_to_string(item->command));
if (item->command == TODO_EXEC || item->command == TODO_LABEL || if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
item->command == TODO_RESET) { item->command == TODO_RESET || item->command == TODO_UPDATE_REF) {
item->commit = NULL; item->commit = NULL;
item->arg_offset = bol - buf; item->arg_offset = bol - buf;
item->arg_len = (int)(eol - bol); item->arg_len = (int)(eol - bol);
@ -4104,6 +4105,11 @@ leave_merge:
return ret; return ret;
} }
static int do_update_ref(struct repository *r, const char *ref_name)
{
return 0;
}
static int is_final_fixup(struct todo_list *todo_list) static int is_final_fixup(struct todo_list *todo_list)
{ {
int i = todo_list->current; int i = todo_list->current;
@ -4479,6 +4485,12 @@ static int pick_commits(struct repository *r,
return error_with_patch(r, item->commit, return error_with_patch(r, item->commit,
arg, item->arg_len, arg, item->arg_len,
opts, res, 0); opts, res, 0);
} else if (item->command == TODO_UPDATE_REF) {
struct strbuf ref = STRBUF_INIT;
strbuf_add(&ref, arg, item->arg_len);
if ((res = do_update_ref(r, ref.buf)))
reschedule = 1;
strbuf_release(&ref);
} else if (!is_noop(item->command)) } else if (!is_noop(item->command))
return error(_("unknown command %d"), item->command); return error(_("unknown command %d"), item->command);

Просмотреть файл

@ -96,6 +96,7 @@ enum todo_command {
TODO_LABEL, TODO_LABEL,
TODO_RESET, TODO_RESET,
TODO_MERGE, TODO_MERGE,
TODO_UPDATE_REF,
/* commands that do nothing but are counted for reporting progress */ /* commands that do nothing but are counted for reporting progress */
TODO_NOOP, TODO_NOOP,
TODO_DROP, TODO_DROP,