summaryrefslogtreecommitdiff
path: root/sequencer.c
diff options
context:
space:
mode:
authorPhillip Wood <phillip.wood@dunelm.org.uk>2020-08-17 17:40:03 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-08-19 22:19:59 (GMT)
commita3894aad67df655a9c7f3b511093f681d3a01fb7 (patch)
tree52dc920b2f4465db647f8b1f3b86c62b324f1a83 /sequencer.c
parent7573cec52c0274ceb166c425be4288f6b3103d6f (diff)
downloadgit-a3894aad67df655a9c7f3b511093f681d3a01fb7.zip
git-a3894aad67df655a9c7f3b511093f681d3a01fb7.tar.gz
git-a3894aad67df655a9c7f3b511093f681d3a01fb7.tar.bz2
rebase -i: support --ignore-date
Rebase is implemented with two different backends - 'apply' and 'merge' each of which support a different set of options. In particular the apply backend supports a number of options implemented by 'git am' that are not implemented in the merge backend. This means that the available options are different depending on which backend is used which is confusing. This patch adds support for the --ignore-date option to the merge backend. This option uses the current time as the author date rather than reusing the original author date when rewriting commits. We take care to handle the combination of --ignore-date and --committer-date-is-author-date in the same way as the apply backend. Original-patch-by: Rohit Ashiwal <rohit.ashiwal265@gmail.com> Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sequencer.c')
-rw-r--r--sequencer.c66
1 files changed, 54 insertions, 12 deletions
diff --git a/sequencer.c b/sequencer.c
index 78d09f9..4ccb545 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -150,6 +150,7 @@ static GIT_PATH_FUNC(rebase_path_refs_to_delete, "rebase-merge/refs-to-delete")
*/
static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
static GIT_PATH_FUNC(rebase_path_cdate_is_adate, "rebase-merge/cdate_is_adate")
+static GIT_PATH_FUNC(rebase_path_ignore_date, "rebase-merge/ignore_date")
static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
static GIT_PATH_FUNC(rebase_path_quiet, "rebase-merge/quiet")
@@ -959,7 +960,11 @@ static int run_git_commit(struct repository *r,
if (opts->committer_date_is_author_date)
argv_array_pushf(&cmd.env_array, "GIT_COMMITTER_DATE=%s",
+ opts->ignore_date ?
+ "" :
author_date_from_env_array(&cmd.env_array));
+ if (opts->ignore_date)
+ argv_array_push(&cmd.env_array, "GIT_AUTHOR_DATE=");
argv_array_push(&cmd.args, "commit");
@@ -1434,26 +1439,51 @@ static int try_to_commit(struct repository *r,
struct ident_split id;
struct strbuf date = STRBUF_INIT;
- if (split_ident_line(&id, author, (int)strlen(author)) < 0) {
- res = error(_("invalid author identity '%s'"), author);
- goto out;
- }
- if (!id.date_begin) {
- res = error(_("corrupt author: missing date information"));
- goto out;
+ if (!opts->ignore_date) {
+ if (split_ident_line(&id, author, (int)strlen(author)) < 0) {
+ res = error(_("invalid author identity '%s'"),
+ author);
+ goto out;
+ }
+ if (!id.date_begin) {
+ res = error(_(
+ "corrupt author: missing date information"));
+ goto out;
+ }
+ strbuf_addf(&date, "@%.*s %.*s",
+ (int)(id.date_end - id.date_begin),
+ id.date_begin,
+ (int)(id.tz_end - id.tz_begin),
+ id.tz_begin);
+ } else {
+ reset_ident_date();
}
- strbuf_addf(&date, "@%.*s %.*s",
- (int)(id.date_end - id.date_begin), id.date_begin,
- (int)(id.tz_end - id.tz_begin), id.tz_begin);
committer = fmt_ident(opts->committer_name,
opts->committer_email,
- WANT_COMMITTER_IDENT, date.buf,
+ WANT_COMMITTER_IDENT,
+ opts->ignore_date ? NULL : date.buf,
IDENT_STRICT);
strbuf_release(&date);
} else {
reset_ident_date();
}
+ if (opts->ignore_date) {
+ struct ident_split id;
+ char *name, *email;
+
+ if (split_ident_line(&id, author, strlen(author)) < 0) {
+ error(_("invalid author identity '%s'"), author);
+ goto out;
+ }
+ name = xmemdupz(id.name_begin, id.name_end - id.name_begin);
+ email = xmemdupz(id.mail_begin, id.mail_end - id.mail_begin);
+ author = fmt_ident(name, email, WANT_AUTHOR_IDENT, NULL,
+ IDENT_STRICT);
+ free(name);
+ free(email);
+ }
+
if (commit_tree_extended(msg->buf, msg->len, &tree, parents, oid,
author, committer, opts->gpg_sign, extra)) {
res = error(_("failed to write commit object"));
@@ -2583,6 +2613,11 @@ static int read_populate_opts(struct replay_opts *opts)
opts->committer_date_is_author_date = 1;
}
+ if (file_exists(rebase_path_ignore_date())) {
+ opts->allow_ff = 0;
+ opts->ignore_date = 1;
+ }
+
if (file_exists(rebase_path_reschedule_failed_exec()))
opts->reschedule_failed_exec = 1;
@@ -2675,6 +2710,8 @@ int write_basic_state(struct replay_opts *opts, const char *head_name,
write_file(rebase_path_keep_redundant_commits(), "%s", "");
if (opts->committer_date_is_author_date)
write_file(rebase_path_cdate_is_adate(), "%s", "");
+ if (opts->ignore_date)
+ write_file(rebase_path_ignore_date(), "%s", "");
if (opts->reschedule_failed_exec)
write_file(rebase_path_reschedule_failed_exec(), "%s", "");
@@ -3597,7 +3634,11 @@ static int do_merge(struct repository *r,
if (opts->committer_date_is_author_date)
argv_array_pushf(&cmd.env_array, "GIT_COMMITTER_DATE=%s",
+ opts->ignore_date ?
+ "" :
author_date_from_env_array(&cmd.env_array));
+ if (opts->ignore_date)
+ argv_array_push(&cmd.env_array, "GIT_AUTHOR_DATE=");
cmd.git_cmd = 1;
argv_array_push(&cmd.args, "merge");
@@ -3877,7 +3918,8 @@ static int pick_commits(struct repository *r,
if (opts->allow_ff)
assert(!(opts->signoff || opts->no_commit ||
opts->record_origin || opts->edit ||
- opts->committer_date_is_author_date));
+ opts->committer_date_is_author_date ||
+ opts->ignore_date));
if (read_and_refresh_cache(r, opts))
return -1;