if ((flags & CREATE_ROOT_COMMIT) && !(flags & AMEND_MSG)) {
@@ -1013,10 +1025,18 @@ static int run_git_commit(struct repository *r,
if (res <= 0)
res = error_errno(_("could not read '%s'"), defmsg);
- else
+ else {
+ if (opts->ignore_date) {
+ if (!author)
+ BUG("ignore-date can only be used with "
+ "rebase -i, which must set the "
+ "author before committing the tree");
+ ignore_author_date(&author);
+ }
res = commit_tree(msg.buf, msg.len, cache_tree_oid,
NULL, &root_commit, author,
opts->gpg_sign);
+ }
strbuf_release(&msg);
strbuf_release(&script);
@@ -1046,6 +1066,8 @@ static int run_git_commit(struct repository *r,
argv_array_push(&cmd.args, "--amend");
if (opts->gpg_sign)
argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
+ if (opts->ignore_date)
+ argv_array_pushf(&cmd.args, "--date=%ld", time(NULL));
if (defmsg)
argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
else if (!(flags & EDIT_MSG))
@@ -1425,7 +1447,7 @@ static int try_to_commit(struct repository *r,
if (parse_head(r, ¤t_head))
return -1;
if (!(flags & AMEND_MSG) && opts->committer_date_is_author_date &&
- setenv_committer_date_to_author_date())
+ !opts->ignore_date && setenv_committer_date_to_author_date())
return -1;
if (flags & AMEND_MSG) {
const char *exclude_gpgsig[] = { "gpgsig", NULL };
@@ -1447,7 +1469,7 @@ static int try_to_commit(struct repository *r,
res = error(_("unable to parse commit author"));
goto out;
}
- if (opts->committer_date_is_author_date) {
+ if (opts->committer_date_is_author_date && !opts->ignore_date) {
char *date;
int len = strlen(author);
char *idx = memchr(author, '>', len);
@@ -1507,6 +1529,11 @@ static int try_to_commit(struct repository *r,
reset_ident_date();
+ if (opts->ignore_date) {
+ ignore_author_date(&author);
+ free(author_to_free);
+ author_to_free = (char *)author;
+ }
if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
oid, author, opts->gpg_sign, extra)) {
res = error(_("failed to write commit object"));
@@ -2583,6 +2610,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;
@@ -2667,6 +2699,8 @@ int write_basic_state(struct replay_opts *opts,
const char *head_name,
write_file(rebase_path_signoff(), "--signoff\n");
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", "");
@@ -3484,6 +3518,9 @@ static int do_merge(struct repository *r,
argv_array_push(&cmd.args, git_path_merge_msg(r));
if (opts->gpg_sign)
argv_array_push(&cmd.args, opts->gpg_sign);
+ if (opts->ignore_date)
+ argv_array_pushf(&cmd.args,
+ "GIT_AUTHOR_DATE=%ld", time(NULL));
/* Add the tips to be merged */
for (j = to_merge; j; j = j->next)
@@ -3756,7 +3793,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;
diff --git a/sequencer.h b/sequencer.h
index e6cba468db..73d0515a3e 100644
--- a/sequencer.h
+++ b/sequencer.h
@@ -44,6 +44,7 @@ struct replay_opts {
int quiet;
int reschedule_failed_exec;
int committer_date_is_author_date;
+ int ignore_date;
int mainline;
diff --git a/t/t3433-rebase-options-compatibility.sh
b/t/t3433-rebase-options-compatibility.sh
index ceab48a831..95d99c4b7b 100755
--- a/t/t3433-rebase-options-compatibility.sh
+++ b/t/t3433-rebase-options-compatibility.sh
@@ -81,4 +81,20 @@ test_expect_success
'--committer-date-is-author-date works with interactive back
test_cmp authortime committertime
'
+# Checking for +0000 in author time is enough since default
+# timezone is UTC, but the timezone used while committing
+# sets to +0530.