]> git.ipfire.org Git - thirdparty/git.git/blobdiff - git-rebase--interactive.sh
wildmatch: rename constants and update prototype
[thirdparty/git.git] / git-rebase--interactive.sh
index 2e1325824c5d1457a3a29fbf2b80661c05f035e6..84926783d1c4956727226bbabe796467819d36e5 100644 (file)
@@ -167,6 +167,14 @@ has_action () {
        sane_grep '^[^#]' "$1" >/dev/null
 }
 
+is_empty_commit() {
+       tree=$(git rev-parse -q --verify "$1"^{tree} 2>/dev/null ||
+               die "$1: not a commit that can be picked")
+       ptree=$(git rev-parse -q --verify "$1"^^{tree} 2>/dev/null ||
+               ptree=4b825dc642cb6eb9a060e54bf8d69288fbee4904)
+       test "$tree" = "$ptree"
+}
+
 # Run command with GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
 # GIT_AUTHOR_DATE exported from the current environment.
 do_with_author () {
@@ -191,12 +199,19 @@ git_sequence_editor () {
 
 pick_one () {
        ff=--ff
+
        case "$1" in -n) sha1=$2; ff= ;; *) sha1=$1 ;; esac
        case "$force_rebase" in '') ;; ?*) ff= ;; esac
        output git rev-parse --verify $sha1 || die "Invalid commit name: $sha1"
+
+       if is_empty_commit "$sha1"
+       then
+               empty_args="--allow-empty"
+       fi
+
        test -d "$rewritten" &&
                pick_one_preserving_merges "$@" && return
-       output git cherry-pick $ff "$@"
+       output git cherry-pick $empty_args $ff "$@"
 }
 
 pick_one_preserving_merges () {
@@ -533,11 +548,10 @@ do_next () {
        test -s "$todo" && return
 
        comment_for_reflog finish &&
-       shortonto=$(git rev-parse --short $onto) &&
        newhead=$(git rev-parse HEAD) &&
        case $head_name in
        refs/*)
-               message="$GIT_REFLOG_ACTION: $head_name onto $shortonto" &&
+               message="$GIT_REFLOG_ACTION: $head_name onto $onto" &&
                git update-ref -m "$message" $head_name $newhead $orig_head &&
                git symbolic-ref \
                  -m "$GIT_REFLOG_ACTION: returning to $head_name" \
@@ -780,9 +794,17 @@ git rev-list $merges_option --pretty=oneline --abbrev-commit \
        sed -n "s/^>//p" |
 while read -r shortsha1 rest
 do
+
+       if test -z "$keep_empty" && is_empty_commit $shortsha1
+       then
+               comment_out="# "
+       else
+               comment_out=
+       fi
+
        if test t != "$preserve_merges"
        then
-               printf '%s\n' "pick $shortsha1 $rest" >> "$todo"
+               printf '%s\n' "${comment_out}pick $shortsha1 $rest" >>"$todo"
        else
                sha1=$(git rev-parse $shortsha1)
                if test -z "$rebase_root"
@@ -801,7 +823,7 @@ do
                if test f = "$preserve"
                then
                        touch "$rewritten"/$sha1
-                       printf '%s\n' "pick $shortsha1 $rest" >> "$todo"
+                       printf '%s\n' "${comment_out}pick $shortsha1 $rest" >>"$todo"
                fi
        fi
 done
@@ -853,6 +875,12 @@ cat >> "$todo" << EOF
 #
 EOF
 
+if test -z "$keep_empty"
+then
+       echo "# Note that empty commits are commented out" >>"$todo"
+fi
+
+
 has_action "$todo" ||
        die_abort "Nothing to do"