- addressed the compatibility of --rebase-merges with --strategy
Thanks
Rohit
Rohit Ashiwal (6):
rebase -i: add --ignore-whitespace flag
sequencer: allow callers of read_author_script() to ignore fields
rebase -i: support --committer-date-is-author-date
sequencer: rename amend_author to author_to_rename
rebase -i: support --ignore-date
rebase: add --reset-author-date
Documentation/git-rebase.txt | 25 ++++-
builtin/rebase.c | 48 ++++++--
sequencer.c | 141 ++++++++++++++++++++++--
sequencer.h | 2 +
t/t3422-rebase-incompatible-options.sh | 2 -
t/t3433-rebase-options-compatibility.sh | 131 ++++++++++++++++++++++
6 files changed, 321 insertions(+), 28 deletions(-)
create mode 100755 t/t3433-rebase-options-compatibility.sh
Range-diff:
2: 77af1d66db ! 491: e155af5a39 rebase -i: add --ignore-whitespace flag
@@ -16,7 +16,7 @@
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@
- default is `--no-fork-point`, otherwise the default is `--fork-point`.
+ with `--keep-base` in order to drop those commits from your branch.
--ignore-whitespace::
+ Behaves differently depending on which backend is selected.
@@ -46,9 +46,8 @@
* --preserve-merges and --signoff
* --preserve-merges and --rebase-merges
+ * --preserve-merges and --ignore-whitespace
-+ * --rebase-merges and --ignore-whitespace
- * --rebase-merges and --strategy
- * --rebase-merges and --strategy-option
+ * --keep-base and --onto
+ * --keep-base and --root
diff --git a/builtin/rebase.c b/builtin/rebase.c
@@ -124,16 +123,6 @@
OPT_PASSTHRU_ARGV(0, "whitespace", &options.git_am_opts,
N_("action"), N_("passed to 'git apply'"), 0),
OPT_BIT('f', "force-rebase", &options.flags,
-@@
- }
-
- if (options.rebase_merges) {
-+ if (options.ignore_whitespace)
-+ die(_("cannot combine '--rebase-merges' with "
-+ "'--ignore-whitespace'"));
- if (strategy_options.nr)
- die(_("cannot combine '--rebase-merges' with "
- "'--strategy-option'"));
diff --git a/t/t3422-rebase-incompatible-options.sh b/t/t3422-rebase-incompatible-options.sh
--- a/t/t3422-rebase-incompatible-options.sh
3: 1f7f1407b2 = 492: 7ec673ebcb sequencer: allow callers of read_author_script() to ignore fields
4: cc1614154e ! 493: 5af0d628de rebase -i: support --committer-date-is-author-date
@@ -40,9 +40,9 @@
* --preserve-merges and --rebase-merges
* --preserve-merges and --ignore-whitespace
+ * --preserve-merges and --committer-date-is-author-date
- * --rebase-merges and --ignore-whitespace
- * --rebase-merges and --strategy
- * --rebase-merges and --strategy-option
+ * --keep-base and --onto
+ * --keep-base and --root
+
diff --git a/builtin/rebase.c b/builtin/rebase.c
--- a/builtin/rebase.c
@@ -173,10 +173,14 @@
+ struct ident_split ident;
+ struct strbuf date = STRBUF_INIT;
+
-+ if (split_ident_line(&ident, author, len) < 0)
-+ return error(_("malformed ident line"));
-+ if (!ident.date_begin)
-+ return error(_("corrupted author without date information"));
++ if (split_ident_line(&ident, author, len) < 0) {
++ res = error(_("malformed ident line"));
++ goto out;
++ }
++ if (!ident.date_begin) {
++ res = error(_("corrupted author without date information"));
++ goto out;
++ }
+
+ strbuf_addf(&date, "@%.*s %.*s",
+ (int)(ident.date_end - ident.date_begin), ident.date_begin,
@@ -296,7 +300,7 @@
+
+test_expect_success '--committer-date-is-author-date works with rebase -r' '
+ git checkout side &&
-+ git merge commit3 &&
++ git merge --no-ff commit3 &&
+ git rebase -r --root --committer-date-is-author-date &&
+ git rev-list HEAD >rev_list &&
+ while read HASH
5: 9e92c79bda = 494: c7846945dd sequencer: rename amend_author to author_to_rename
6: fc68e55e78 ! 495: 02f797b84d rebase -i: support --ignore-date
@@ -17,8 +17,8 @@
--ignore-date::
- This flag is passed to 'git am' to change the author date
- of each rebased commit (see linkgit:git-am[1]).
-+ Instead of using the given author date, reset it to the value
-+ same as the current time. This implies --force-rebase.
++ Instead of using the given author date, reset it to the
++ current time. This implies --force-rebase.
+
See also INCOMPATIBLE OPTIONS below.
@@ -35,9 +35,9 @@
* --preserve-merges and --ignore-whitespace
* --preserve-merges and --committer-date-is-author-date
+ * --preserve-merges and --ignore-date
- * --rebase-merges and --ignore-whitespace
- * --rebase-merges and --strategy
- * --rebase-merges and --strategy-option
+ * --keep-base and --onto
+ * --keep-base and --root
+
diff --git a/builtin/rebase.c b/builtin/rebase.c
--- a/builtin/rebase.c
@@ -83,10 +83,6 @@
}
- if (options.committer_date_is_author_date)
-+ if (options.ignore_date) {
-+ options.committer_date_is_author_date = 0;
-+ setenv("GIT_COMMITTER_DATE", "", 1);
-+ }
+ if (options.committer_date_is_author_date ||
+ options.ignore_date)
options.flags |= REBASE_FORCE;
@@ -128,35 +124,56 @@
+ }
+ len = ident.mail_end - ident.name_begin + 1;
+
-+ strbuf_addf(&new_author, "%.*s ", len, author);
++ strbuf_addf(&new_author, "%.*s ", len, ident.name_begin);
+ datestamp(&new_author);
+ return strbuf_detach(&new_author, NULL);
+}
+
-+static void push_dates(struct child_process *child)
++static void push_dates(struct child_process *child, int change_committer_date)
+{
+ time_t now = time(NULL);
+ struct strbuf date = STRBUF_INIT;
+
+ strbuf_addf(&date, "@%"PRIuMAX, (uintmax_t)now);
+ argv_array_pushf(&child->env_array, "GIT_AUTHOR_DATE=%s", date.buf);
-+ argv_array_pushf(&child->env_array, "GIT_COMMITTER_DATE=%s", date.buf);
++ if (change_committer_date)
++ argv_array_pushf(&child->env_array, "GIT_COMMITTER_DATE=%s", date.buf);
+ strbuf_release(&date);
+}
+
static const char staged_changes_advice[] =
N_("you have staged changes in your working tree\n"
"If these changes are meant to be squashed into the previous commit, run:\n"
+@@
+ return -1;
+
+ strbuf_addf(&datebuf, "@%s", date);
+- res = setenv("GIT_COMMITTER_DATE", datebuf.buf, 1);
++ res = setenv("GIT_COMMITTER_DATE",
++ opts->ignore_date ? "" : datebuf.buf, 1);
+
+ strbuf_release(&datebuf);
+ free(date);
@@
argv_array_push(&cmd.args, "--amend");
if (opts->gpg_sign)
argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
+ if (opts->ignore_date)
-+ push_dates(&cmd);
++ push_dates(&cmd, opts->committer_date_is_author_date);
if (defmsg)
argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
else if (!(flags & EDIT_MSG))
@@
+ strbuf_addf(&date, "@%.*s %.*s",
+ (int)(ident.date_end - ident.date_begin), ident.date_begin,
+ (int)(ident.tz_end - ident.tz_begin), ident.tz_begin);
+- res = setenv("GIT_COMMITTER_DATE", date.buf, 1);
++ res = setenv("GIT_COMMITTER_DATE",
++ opts->ignore_date ? "" : date.buf, 1);
+ strbuf_release(&date);
+
+ if (res)
+@@
reset_ident_date();
@@ -198,7 +215,7 @@
if (opts->gpg_sign)
argv_array_push(&cmd.args, opts->gpg_sign);
+ if (opts->ignore_date)
-+ push_dates(&cmd);
++ push_dates(&cmd, opts->committer_date_is_author_date);
/* Add the tips to be merged */
for (j = to_merge; j; j = j->next)
@@ -239,31 +256,25 @@
+ git commit --amend --date="$GIT_AUTHOR_DATE" &&
+ git rebase --ignore-date HEAD^ &&
+ git show HEAD --pretty="format:%ai" >authortime &&
-+ git show HEAD --pretty="format:%ci" >committertime &&
-+ grep "+0000" authortime &&
-+ grep "+0000" committertime
++ grep "+0000" authortime
+'
+
+test_expect_success '--ignore-date works with interactive backend' '
+ git commit --amend --date="$GIT_AUTHOR_DATE" &&
+ git rebase --ignore-date -i HEAD^ &&
+ git show HEAD --pretty="format:%ai" >authortime &&
-+ git show HEAD --pretty="format:%ci" >committertime &&
-+ grep "+0000" authortime &&
-+ grep "+0000" committertime
++ grep "+0000" authortime
+'
+
+test_expect_success '--ignore-date works with rebase -r' '
+ git checkout side &&
-+ git merge commit3 &&
++ git merge --no-ff commit3 &&
+ git rebase -r --root --ignore-date &&
+ git rev-list HEAD >rev_list &&
+ while read HASH
+ do
+ git show $HASH --pretty="format:%ai" >authortime
-+ git show $HASH --pretty="format:%ci" >committertime
+ grep "+0000" authortime
-+ grep "+0000" committertime
+ done <rev_list
+'
+
7: 396d5f16eb ! 496: 7a9fe1e612 rebase: add --reset-author-date
@@ -17,8 +17,8 @@
--ignore-date::
+--reset-author-date::
- Instead of using the given author date, reset it to the value
- same as the current time. This implies --force-rebase.
+ Instead of using the given author date, reset it to the
+ current time. This implies --force-rebase.
+
diff --git a/builtin/rebase.c b/builtin/rebase.c