summaryrefslogtreecommitdiff
path: root/sequencer.c
diff options
context:
space:
mode:
Diffstat (limited to 'sequencer.c')
-rw-r--r--sequencer.c77
1 files changed, 56 insertions, 21 deletions
diff --git a/sequencer.c b/sequencer.c
index 8c3ed3532a..61a8e0020d 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -221,6 +221,9 @@ static int git_sequencer_config(const char *k, const char *v, void *cb)
return ret;
}
+ if (opts->action == REPLAY_REVERT && !strcmp(k, "revert.reference"))
+ opts->commit_use_reference = git_config_bool(k, v);
+
status = git_gpg_config(k, v, NULL);
if (status)
return status;
@@ -919,7 +922,7 @@ static char *get_author(const char *message)
return NULL;
}
-static const char *author_date_from_env_array(const struct strvec *env)
+static const char *author_date_from_env(const struct strvec *env)
{
int i;
const char *date;
@@ -1000,7 +1003,7 @@ static int run_git_commit(const char *defmsg,
if (is_rebase_i(opts) &&
((opts->committer_date_is_author_date && !opts->ignore_date) ||
!(!defmsg && (flags & AMEND_MSG))) &&
- read_env_script(&cmd.env_array)) {
+ read_env_script(&cmd.env)) {
const char *gpg_opt = gpg_sign_opt_quoted(opts);
return error(_(staged_changes_advice),
@@ -1008,12 +1011,12 @@ static int run_git_commit(const char *defmsg,
}
if (opts->committer_date_is_author_date)
- strvec_pushf(&cmd.env_array, "GIT_COMMITTER_DATE=%s",
+ strvec_pushf(&cmd.env, "GIT_COMMITTER_DATE=%s",
opts->ignore_date ?
"" :
- author_date_from_env_array(&cmd.env_array));
+ author_date_from_env(&cmd.env));
if (opts->ignore_date)
- strvec_push(&cmd.env_array, "GIT_AUTHOR_DATE=");
+ strvec_push(&cmd.env, "GIT_AUTHOR_DATE=");
strvec_push(&cmd.args, "commit");
@@ -1346,6 +1349,7 @@ void print_commit_summary(struct repository *r,
log_tree_commit(&rev, commit);
}
+ release_revisions(&rev);
strbuf_release(&format);
}
@@ -2058,6 +2062,20 @@ 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)
+{
+ if (opts->commit_use_reference) {
+ struct pretty_print_context ctx = {
+ .abbrev = DEFAULT_ABBREV,
+ .date_mode.type = DATE_SHORT,
+ };
+ format_commit_message(commit, "%h (%s, %ad)", msgbuf, &ctx);
+ } else {
+ strbuf_addstr(msgbuf, oid_to_hex(&commit->object.oid));
+ }
+}
+
static int do_pick_commit(struct repository *r,
struct todo_item *item,
struct replay_opts *opts,
@@ -2166,14 +2184,20 @@ static int do_pick_commit(struct repository *r,
base_label = msg.label;
next = parent;
next_label = msg.parent_label;
- strbuf_addstr(&msgbuf, "Revert \"");
- strbuf_addstr(&msgbuf, msg.subject);
- strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
- strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
+ if (opts->commit_use_reference) {
+ strbuf_addstr(&msgbuf,
+ "# *** SAY WHY WE ARE REVERTING ON THE TITLE LINE ***");
+ } else {
+ strbuf_addstr(&msgbuf, "Revert \"");
+ strbuf_addstr(&msgbuf, msg.subject);
+ strbuf_addstr(&msgbuf, "\"");
+ }
+ strbuf_addstr(&msgbuf, "\n\nThis reverts commit ");
+ refer_to_commit(opts, &msgbuf, commit);
if (commit->parents && commit->parents->next) {
strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
- strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
+ refer_to_commit(opts, &msgbuf, parent);
}
strbuf_addstr(&msgbuf, ".\n");
} else {
@@ -3414,6 +3438,7 @@ static int make_patch(struct repository *r,
unuse_commit_buffer(commit, commit_buffer);
}
strbuf_release(&buf);
+ release_revisions(&log_tree_opt);
return res;
}
@@ -3911,7 +3936,7 @@ static int do_merge(struct repository *r,
/* Octopus merge */
struct child_process cmd = CHILD_PROCESS_INIT;
- if (read_env_script(&cmd.env_array)) {
+ if (read_env_script(&cmd.env)) {
const char *gpg_opt = gpg_sign_opt_quoted(opts);
ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
@@ -3919,12 +3944,12 @@ static int do_merge(struct repository *r,
}
if (opts->committer_date_is_author_date)
- strvec_pushf(&cmd.env_array, "GIT_COMMITTER_DATE=%s",
+ strvec_pushf(&cmd.env, "GIT_COMMITTER_DATE=%s",
opts->ignore_date ?
"" :
- author_date_from_env_array(&cmd.env_array));
+ author_date_from_env(&cmd.env));
if (opts->ignore_date)
- strvec_push(&cmd.env_array, "GIT_AUTHOR_DATE=");
+ strvec_push(&cmd.env, "GIT_AUTHOR_DATE=");
cmd.git_cmd = 1;
strvec_push(&cmd.args, "merge");
@@ -4524,6 +4549,7 @@ cleanup_head_ref:
&log_tree_opt.diffopt);
log_tree_diff_flush(&log_tree_opt);
}
+ release_revisions(&log_tree_opt);
}
flush_rewritten_pending();
if (!stat(rebase_path_rewritten_list(), &st) &&
@@ -5350,6 +5376,7 @@ int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
int reapply_cherry_picks = flags & TODO_LIST_REAPPLY_CHERRY_PICKS;
int skipped_commit = 0;
+ int ret = 0;
repo_init_revisions(r, &revs, NULL);
revs.verbose_header = 1;
@@ -5373,14 +5400,20 @@ int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
pp.fmt = revs.commit_format;
pp.output_encoding = get_log_output_encoding();
- if (setup_revisions(argc, argv, &revs, NULL) > 1)
- return error(_("make_script: unhandled options"));
+ if (setup_revisions(argc, argv, &revs, NULL) > 1) {
+ ret = error(_("make_script: unhandled options"));
+ goto cleanup;
+ }
- if (prepare_revision_walk(&revs) < 0)
- return error(_("make_script: error preparing revisions"));
+ if (prepare_revision_walk(&revs) < 0) {
+ ret = error(_("make_script: error preparing revisions"));
+ goto cleanup;
+ }
- if (rebase_merges)
- return make_script_with_merges(&pp, &revs, out, flags);
+ if (rebase_merges) {
+ ret = make_script_with_merges(&pp, &revs, out, flags);
+ goto cleanup;
+ }
while ((commit = get_revision(&revs))) {
int is_empty = is_original_commit_empty(commit);
@@ -5404,7 +5437,9 @@ int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
if (skipped_commit)
advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
_("use --reapply-cherry-picks to include skipped commits"));
- return 0;
+cleanup:
+ release_revisions(&revs);
+ return ret;
}
/*