]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sequencer: add update-ref command
authorDerrick Stolee <derrickstolee@github.com>
Tue, 19 Jul 2022 18:33:38 +0000 (18:33 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 19 Jul 2022 19:49:03 +0000 (12:49 -0700)
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>
rebase-interactive.c
sequencer.c
sequencer.h

index 22394224faa3b760a1cff0c4baea9cf2cdc23917..1ff07647af3472f827be1c5614a8638160f7788d 100644 (file)
@@ -57,6 +57,9 @@ void append_todo_help(int command_count,
 "        create a merge commit using the original merge commit's\n"
 "        message (or the oneline, if no original merge commit was\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"
 "These lines can be re-ordered; they are executed from top to bottom.\n");
        unsigned edit_todo = !(shortrevisions && shortonto);
index bcfd25c8c312b2350a6e5d3a8013e98f6c820b3b..cac18a708c06ccc742b87428f75e715d40b0ec8e 100644 (file)
@@ -1723,6 +1723,7 @@ static struct {
        [TODO_LABEL] = { 'l', "label" },
        [TODO_RESET] = { 't', "reset" },
        [TODO_MERGE] = { 'm', "merge" },
+       [TODO_UPDATE_REF] = { 'u', "update-ref" },
        [TODO_NOOP] = { 0,   "noop" },
        [TODO_DROP] = { 'd', "drop" },
        [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));
 
        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->arg_offset = bol - buf;
                item->arg_len = (int)(eol - bol);
@@ -4104,6 +4105,11 @@ leave_merge:
        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)
 {
        int i = todo_list->current;
@@ -4479,6 +4485,12 @@ static int pick_commits(struct repository *r,
                                return error_with_patch(r, item->commit,
                                                        arg, item->arg_len,
                                                        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))
                        return error(_("unknown command %d"), item->command);
 
index 8e38eb5ad73ba3ce9ddb5732d007c1bb1485eba0..d87feae36635b08440e0b98384b09e196b3e47c1 100644 (file)
@@ -96,6 +96,7 @@ enum todo_command {
        TODO_LABEL,
        TODO_RESET,
        TODO_MERGE,
+       TODO_UPDATE_REF,
        /* commands that do nothing but are counted for reporting progress */
        TODO_NOOP,
        TODO_DROP,