Skip to content

Commit

Permalink
Merge branch 'gs/rebase-allow-empty-message'
Browse files Browse the repository at this point in the history
"git rebase" learned to take "--allow-empty-message" option.

* gs/rebase-allow-empty-message:
  rebase: add --allow-empty-message option
  • Loading branch information
gitster committed Feb 21, 2018
2 parents c2bd43d + a6c612b commit 2f6128d
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 11 deletions.
5 changes: 5 additions & 0 deletions Documentation/git-rebase.txt
Expand Up @@ -244,6 +244,11 @@ leave out at most one of A and B, in which case it defaults to HEAD.
Keep the commits that do not change anything from its
parents in the result.

--allow-empty-message::
By default, rebasing commits with an empty message will fail.
This option overrides that behavior, allowing commits with empty
messages to be rebased.

--skip::
Restart the rebasing process by skipping the current patch.

Expand Down
2 changes: 2 additions & 0 deletions builtin/rebase--helper.c
Expand Up @@ -22,6 +22,8 @@ int cmd_rebase__helper(int argc, const char **argv, const char *prefix)
struct option options[] = {
OPT_BOOL(0, "ff", &opts.allow_ff, N_("allow fast-forward")),
OPT_BOOL(0, "keep-empty", &keep_empty, N_("keep empty commits")),
OPT_BOOL(0, "allow-empty-message", &opts.allow_empty_message,
N_("allow commits with empty messages")),
OPT_CMDMODE(0, "continue", &command, N_("continue rebase"),
CONTINUE),
OPT_CMDMODE(0, "abort", &command, N_("abort rebase"),
Expand Down
1 change: 1 addition & 0 deletions git-rebase--am.sh
Expand Up @@ -46,6 +46,7 @@ then
# makes this easy
git cherry-pick ${gpg_sign_opt:+"$gpg_sign_opt"} --allow-empty \
$allow_rerere_autoupdate --right-only "$revisions" \
$allow_empty_message \
${restrict_revision+^$restrict_revision}
ret=$?
else
Expand Down
25 changes: 15 additions & 10 deletions git-rebase--interactive.sh
Expand Up @@ -281,7 +281,7 @@ pick_one () {

test -d "$rewritten" &&
pick_one_preserving_merges "$@" && return
output eval git cherry-pick $allow_rerere_autoupdate \
output eval git cherry-pick $allow_rerere_autoupdate $allow_empty_message \
${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
"$strategy_args" $empty_args $ff "$@"

Expand Down Expand Up @@ -406,6 +406,7 @@ pick_one_preserving_merges () {
;;
*)
output eval git cherry-pick $allow_rerere_autoupdate \
$allow_empty_message \
${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
"$strategy_args" "$@" ||
die_with_patch $sha1 "$(eval_gettext "Could not pick \$sha1")"
Expand Down Expand Up @@ -559,7 +560,8 @@ do_next () {

mark_action_done
do_pick $sha1 "$rest"
git commit --amend --no-post-rewrite ${gpg_sign_opt:+"$gpg_sign_opt"} || {
git commit --amend --no-post-rewrite ${gpg_sign_opt:+"$gpg_sign_opt"} \
$allow_empty_message || {
warn "$(eval_gettext "\
Could not amend commit after successfully picking \$sha1... \$rest
This is most likely due to an empty commit message, or the pre-commit hook
Expand Down Expand Up @@ -607,21 +609,21 @@ you are able to reword the commit.")"
# This is an intermediate commit; its message will only be
# used in case of trouble. So use the long version:
do_with_author output git commit --amend --no-verify -F "$squash_msg" \
${gpg_sign_opt:+"$gpg_sign_opt"} ||
${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
die_failed_squash $sha1 "$rest"
;;
*)
# This is the final command of this squash/fixup group
if test -f "$fixup_msg"
then
do_with_author git commit --amend --no-verify -F "$fixup_msg" \
${gpg_sign_opt:+"$gpg_sign_opt"} ||
${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
die_failed_squash $sha1 "$rest"
else
cp "$squash_msg" "$GIT_DIR"/SQUASH_MSG || exit
rm -f "$GIT_DIR"/MERGE_MSG
do_with_author git commit --amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e \
${gpg_sign_opt:+"$gpg_sign_opt"} ||
${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
die_failed_squash $sha1 "$rest"
fi
rm -f "$squash_msg" "$fixup_msg"
Expand Down Expand Up @@ -754,7 +756,8 @@ case "$action" in
continue)
if test ! -d "$rewritten"
then
exec git rebase--helper ${force_rebase:+--no-ff} --continue
exec git rebase--helper ${force_rebase:+--no-ff} $allow_empty_message \
--continue
fi
# do we have anything to commit?
if git diff-index --cached --quiet HEAD --
Expand Down Expand Up @@ -794,11 +797,11 @@ In both cases, once you're done, continue with:
You have uncommitted changes in your working tree. Please commit them
first and then run 'git rebase --continue' again.")"
do_with_author git commit --amend --no-verify -F "$msg" -e \
${gpg_sign_opt:+"$gpg_sign_opt"} ||
${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
die "$(gettext "Could not commit staged changes.")"
else
do_with_author git commit --no-verify -F "$msg" -e \
${gpg_sign_opt:+"$gpg_sign_opt"} ||
${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message ||
die "$(gettext "Could not commit staged changes.")"
fi
fi
Expand All @@ -817,7 +820,8 @@ skip)

if test ! -d "$rewritten"
then
exec git rebase--helper ${force_rebase:+--no-ff} --continue
exec git rebase--helper ${force_rebase:+--no-ff} $allow_empty_message \
--continue
fi
do_rest
return 0
Expand Down Expand Up @@ -1016,7 +1020,8 @@ checkout_onto
if test -z "$rebase_root" && test ! -d "$rewritten"
then
require_clean_work_tree "rebase"
exec git rebase--helper ${force_rebase:+--no-ff} --continue
exec git rebase--helper ${force_rebase:+--no-ff} $allow_empty_message \
--continue
fi
do_rest

Expand Down
3 changes: 2 additions & 1 deletion git-rebase--merge.sh
Expand Up @@ -27,7 +27,8 @@ continue_merge () {
cmt=$(cat "$state_dir/current")
if ! git diff-index --quiet --ignore-submodules HEAD --
then
if ! git commit ${gpg_sign_opt:+"$gpg_sign_opt"} --no-verify -C "$cmt"
if ! git commit ${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message \
--no-verify -C "$cmt"
then
echo "Commit failed, please do not call \"git commit\""
echo "directly, but instead do one of the following: "
Expand Down
5 changes: 5 additions & 0 deletions git-rebase.sh
Expand Up @@ -24,6 +24,7 @@ m,merge! use merging strategies to rebase
i,interactive! let the user edit the list of commits to rebase
x,exec=! add exec lines after each commit of the editable list
k,keep-empty preserve empty commits during rebase
allow-empty-message allow rebasing commits with empty messages
f,force-rebase! force rebase even if branch is up to date
X,strategy-option=! pass the argument through to the merge strategy
stat! display a diffstat of what changed upstream
Expand Down Expand Up @@ -89,6 +90,7 @@ action=
preserve_merges=
autosquash=
keep_empty=
allow_empty_message=
test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
case "$(git config --bool commit.gpgsign)" in
true) gpg_sign_opt=-S ;;
Expand Down Expand Up @@ -262,6 +264,9 @@ do
--keep-empty)
keep_empty=yes
;;
--allow-empty-message)
allow_empty_message=--allow-empty-message
;;
--preserve-merges)
preserve_merges=t
test -z "$interactive_rebase" && interactive_rebase=implied
Expand Down
23 changes: 23 additions & 0 deletions t/t3405-rebase-malformed.sh
Expand Up @@ -3,6 +3,7 @@
test_description='rebase should handle arbitrary git message'

. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-rebase.sh

cat >F <<\EOF
This is an example of a commit log message
Expand All @@ -25,6 +26,7 @@ test_expect_success setup '
test_tick &&
git commit -m "Initial commit" &&
git branch diff-in-message &&
git branch empty-message-merge &&
git checkout -b multi-line-subject &&
cat F >file2 &&
Expand All @@ -45,6 +47,11 @@ test_expect_success setup '
git cat-file commit HEAD | sed -e "1,/^\$/d" >G0 &&
git checkout empty-message-merge &&
echo file3 >file3 &&
git add file3 &&
git commit --allow-empty-message -m "" &&
git checkout master &&
echo One >file1 &&
Expand All @@ -69,4 +76,20 @@ test_expect_success 'rebase commit with diff in message' '
test_cmp G G0
'

test_expect_success 'rebase -m commit with empty message' '
test_must_fail git rebase -m master empty-message-merge &&
git rebase --abort &&
git rebase -m --allow-empty-message master empty-message-merge
'

test_expect_success 'rebase -i commit with empty message' '
git checkout diff-in-message &&
set_fake_editor &&
test_must_fail env FAKE_COMMIT_MESSAGE=" " FAKE_LINES="reword 1" \
git rebase -i HEAD^ &&
git rebase --abort &&
FAKE_COMMIT_MESSAGE=" " FAKE_LINES="reword 1" \
git rebase -i --allow-empty-message HEAD^
'

test_done

0 comments on commit 2f6128d

Please sign in to comment.