Skip to content

Commit 41b10d5

Browse files
committed
sequencer (rebase -i): write an author-script file
When the interactive rebase aborts, it writes out an author-script file to record the author information for the current commit. As we are about to teach the sequencer how to perform the actions behind an interactive rebase, it needs to write those author-script files, too. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
1 parent 564a8b3 commit 41b10d5

1 file changed

Lines changed: 49 additions & 0 deletions

File tree

sequencer.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,52 @@ static int is_index_unchanged(void)
448448
return !hashcmp(active_cache_tree->sha1, head_commit->tree->object.oid.hash);
449449
}
450450

451+
static void write_author_script(const char *message)
452+
{
453+
struct strbuf buf = STRBUF_INIT;
454+
const char *eol;
455+
456+
for (;;)
457+
if (!*message || starts_with(message, "\n")) {
458+
missing_author:
459+
/* Missing 'author' line? */
460+
unlink(author_script());
461+
return;
462+
}
463+
else if (skip_prefix(message, "author ", &message))
464+
break;
465+
else if ((eol = strchr(message, '\n')))
466+
message = eol + 1;
467+
else
468+
goto missing_author;
469+
470+
strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
471+
while (*message && *message != '\n' && *message != '\r')
472+
if (skip_prefix(message, " <", &message))
473+
break;
474+
else if (*message != '\'')
475+
strbuf_addch(&buf, *(message++));
476+
else
477+
strbuf_addf(&buf, "'\\\\%c'", *(message++));
478+
strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
479+
while (*message && *message != '\n' && *message != '\r')
480+
if (skip_prefix(message, "> ", &message))
481+
break;
482+
else if (*message != '\'')
483+
strbuf_addch(&buf, *(message++));
484+
else
485+
strbuf_addf(&buf, "'\\\\%c'", *(message++));
486+
strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
487+
while (*message && *message != '\n' && *message != '\r')
488+
if (*message != '\'')
489+
strbuf_addch(&buf, *(message++));
490+
else
491+
strbuf_addf(&buf, "'\\\\%c'", *(message++));
492+
strbuf_addstr(&buf, "'\n");
493+
write_file(author_script(), buf.buf);
494+
strbuf_release(&buf);
495+
}
496+
451497
static char **read_author_script()
452498
{
453499
struct strbuf script = STRBUF_INIT;
@@ -894,6 +940,9 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
894940
}
895941
}
896942

943+
if (IS_REBASE_I())
944+
write_author_script(msg.message);
945+
897946
if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
898947
res = do_recursive_merge(base, next, base_label, next_label,
899948
head, &msgbuf, opts);

0 commit comments

Comments
 (0)