sequencer: extract revert message formatting into shared function

The logic for formatting revert commit messages (handling "Revert" and
"Reapply" cases, appending "This reverts commit <ref>.", and handling
merge-parent references) currently lives inline in do_pick_commit().
The upcoming replay --revert mode needs to reuse this logic.

Extract all of this into a new sequencer_format_revert_message()
function. The function takes a repository, the subject line, commit,
parent, a use_commit_reference flag, and the output strbuf. It handles
both regular reverts ("Revert "<subject>"") and revert-of-revert cases
("Reapply "<subject>""), and uses refer_to_commit() internally to
format the commit reference.

Update refer_to_commit() to take a struct repository parameter instead
of relying on the_repository, and a bool instead of reading from
replay_opts directly. This makes it usable from the new shared function
without pulling in sequencer-specific state.

Signed-off-by: Siddharth Asthana <siddharthasthana31@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Siddharth Asthana
2026-03-26 01:53:51 +05:30
committed by Junio C Hamano
parent 864f55e190
commit 1e6434ebbd
2 changed files with 59 additions and 32 deletions

View File

@@ -2198,15 +2198,16 @@ static int should_edit(struct replay_opts *opts) {
return opts->edit;
}
static void refer_to_commit(struct replay_opts *opts,
struct strbuf *msgbuf, struct commit *commit)
static void refer_to_commit(struct repository *r, struct strbuf *msgbuf,
const struct commit *commit,
bool use_commit_reference)
{
if (opts->commit_use_reference) {
if (use_commit_reference) {
struct pretty_print_context ctx = {
.abbrev = DEFAULT_ABBREV,
.date_mode.type = DATE_SHORT,
};
repo_format_commit_message(the_repository, commit,
repo_format_commit_message(r, commit,
"%h (%s, %ad)", msgbuf, &ctx);
} else {
strbuf_addstr(msgbuf, oid_to_hex(&commit->object.oid));
@@ -2356,38 +2357,14 @@ static int do_pick_commit(struct repository *r,
*/
if (command == TODO_REVERT) {
const char *orig_subject;
base = commit;
base_label = msg.label;
next = parent;
next_label = msg.parent_label;
if (opts->commit_use_reference) {
strbuf_commented_addf(&ctx->message, comment_line_str,
"*** SAY WHY WE ARE REVERTING ON THE TITLE LINE ***");
} else if (skip_prefix(msg.subject, "Revert \"", &orig_subject) &&
/*
* We don't touch pre-existing repeated reverts, because
* theoretically these can be nested arbitrarily deeply,
* thus requiring excessive complexity to deal with.
*/
!starts_with(orig_subject, "Revert \"")) {
strbuf_addstr(&ctx->message, "Reapply \"");
strbuf_addstr(&ctx->message, orig_subject);
strbuf_addstr(&ctx->message, "\n");
} else {
strbuf_addstr(&ctx->message, "Revert \"");
strbuf_addstr(&ctx->message, msg.subject);
strbuf_addstr(&ctx->message, "\"\n");
}
strbuf_addstr(&ctx->message, "\nThis reverts commit ");
refer_to_commit(opts, &ctx->message, commit);
if (commit->parents && commit->parents->next) {
strbuf_addstr(&ctx->message, ", reversing\nchanges made to ");
refer_to_commit(opts, &ctx->message, parent);
}
strbuf_addstr(&ctx->message, ".\n");
sequencer_format_revert_message(r, msg.subject, commit,
parent,
opts->commit_use_reference,
&ctx->message);
} else {
const char *p;
@@ -5572,6 +5549,43 @@ out:
return res;
}
void sequencer_format_revert_message(struct repository *r,
const char *subject,
const struct commit *commit,
const struct commit *parent,
bool use_commit_reference,
struct strbuf *message)
{
const char *orig_subject;
if (use_commit_reference) {
strbuf_commented_addf(message, comment_line_str,
"*** SAY WHY WE ARE REVERTING ON THE TITLE LINE ***");
} else if (skip_prefix(subject, "Revert \"", &orig_subject) &&
/*
* We don't touch pre-existing repeated reverts, because
* theoretically these can be nested arbitrarily deeply,
* thus requiring excessive complexity to deal with.
*/
!starts_with(orig_subject, "Revert \"")) {
strbuf_addstr(message, "Reapply \"");
strbuf_addstr(message, orig_subject);
strbuf_addstr(message, "\n");
} else {
strbuf_addstr(message, "Revert \"");
strbuf_addstr(message, subject);
strbuf_addstr(message, "\"\n");
}
strbuf_addstr(message, "\nThis reverts commit ");
refer_to_commit(r, message, commit, use_commit_reference);
if (commit->parents && commit->parents->next) {
strbuf_addstr(message, ", reversing\nchanges made to ");
refer_to_commit(r, message, parent, use_commit_reference);
}
strbuf_addstr(message, ".\n");
}
void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
{
unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;

View File

@@ -271,4 +271,17 @@ int sequencer_determine_whence(struct repository *r, enum commit_whence *whence)
*/
int sequencer_get_update_refs_state(const char *wt_dir, struct string_list *refs);
/*
* Format a revert commit message with appropriate 'Revert "<subject>"' or
* 'Reapply "<subject>"' prefix and 'This reverts commit <ref>.' body.
* When use_commit_reference is set, <ref> is an abbreviated hash with
* subject and date; otherwise the full hex hash is used.
*/
void sequencer_format_revert_message(struct repository *r,
const char *subject,
const struct commit *commit,
const struct commit *parent,
bool use_commit_reference,
struct strbuf *message);
#endif /* SEQUENCER_H */