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> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Johannes Schindelin committed
Jan 2, 2017 at 16:27 UTC
0473f28ad700b9bf4e7dd279f33950fdc968dfa2
1 file changed
+49
-1
sequencer.c
+49
-1
@@ -483,6 +483,52 @@ static int is_index_unchanged(void)
483
return !hashcmp(active_cache_tree->sha1, head_commit->tree->object.oid.hash);
484
}
485
486
+static int write_author_script(const char *message)
487
+{
488
+ struct strbuf buf = STRBUF_INIT;
489
+ const char *eol;
490
+ int res;
491
+
492
+ for (;;)
493
+ if (!*message || starts_with(message, "\n")) {
494
+missing_author:
495
+ /* Missing 'author' line? */
496
+ unlink(rebase_path_author_script());
497
+ return 0;
498
+ } else if (skip_prefix(message, "author ", &message))
499
+ break;
500
+ else if ((eol = strchr(message, '\n')))
501
+ message = eol + 1;
502
+ else
503
+ goto missing_author;
504
+
505
+ strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
506
+ while (*message && *message != '\n' && *message != '\r')
507
+ if (skip_prefix(message, " <", &message))
508
+ break;
509
+ else if (*message != '\'')
510
+ strbuf_addch(&buf, *(message++));
511
+ else
512
+ strbuf_addf(&buf, "'\\\\%c'", *(message++));
513
+ strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
514
+ while (*message && *message != '\n' && *message != '\r')
515
+ if (skip_prefix(message, "> ", &message))
516
+ break;
517
+ else if (*message != '\'')
518
+ strbuf_addch(&buf, *(message++));
519
+ else
520
+ strbuf_addf(&buf, "'\\\\%c'", *(message++));
521
+ strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
522
+ while (*message && *message != '\n' && *message != '\r')
523
+ if (*message != '\'')
524
+ strbuf_addch(&buf, *(message++));
525
+ else
526
+ strbuf_addf(&buf, "'\\\\%c'", *(message++));
527
+ res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
528
+ strbuf_release(&buf);
529
+ return res;
530
+}
531
+
532
/*
533
* Read the author-script file into an environment block, ready for use in
534
* run_command(), that can be free()d afterwards.
@@ -935,7 +981,9 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
981
}
982
}
983
938
- if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
984
+ if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
985
+ res = -1;
986
+ else if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
987
res = do_recursive_merge(base, next, base_label, next_label,
988
head, &msgbuf, opts);
989
if (res < 0)