X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=git-rebase--interactive.sh;h=a64d9d57ab5943ac4e065866ce0ccd7de5364a9a;hb=7d3580d74c6d801419dd91416f9a81750b7d4e2c;hp=090c3e51437969459f2b4f4625d5785d79c05084;hpb=03270628ed61f56431658eacd335b8f2f8ecc05a;p=git.git diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 090c3e514..a64d9d57a 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -56,9 +56,9 @@ output () { require_clean_work_tree () { # test if working tree is dirty git rev-parse --verify HEAD > /dev/null && - git update-index --refresh && - git diff-files --quiet && - git diff-index --cached --quiet HEAD -- || + git update-index --ignore-submodules --refresh && + git diff-files --quiet --ignore-submodules && + git diff-index --cached --quiet HEAD --ignore-submodules -- || die "Working tree is dirty" } @@ -73,14 +73,19 @@ comment_for_reflog () { esac } +last_count= mark_action_done () { sed -e 1q < "$TODO" >> "$DONE" sed -e 1d < "$TODO" >> "$TODO".new mv -f "$TODO".new "$TODO" - count=$(($(grep -ve '^$' -e '^#' < "$DONE" | wc -l))) - total=$(($count+$(grep -ve '^$' -e '^#' < "$TODO" | wc -l))) - printf "Rebasing (%d/%d)\r" $count $total - test -z "$VERBOSE" || echo + count=$(grep -c '^[^#]' < "$DONE") + total=$(($count+$(grep -c '^[^#]' < "$TODO"))) + if test "$last_count" != "$count" + then + last_count=$count + printf "Rebasing (%d/%d)\r" $count $total + test -z "$VERBOSE" || echo + fi } make_patch () { @@ -105,7 +110,7 @@ die_abort () { } has_action () { - grep -vqe '^$' -e '^#' "$1" + grep '^[^#]' "$1" >/dev/null } pick_one () { @@ -213,17 +218,19 @@ nth_string () { make_squash_message () { if test -f "$SQUASH_MSG"; then COUNT=$(($(sed -n "s/^# This is [^0-9]*\([1-9][0-9]*\).*/\1/p" \ - < "$SQUASH_MSG" | tail -n 1)+1)) + < "$SQUASH_MSG" | sed -ne '$p')+1)) echo "# This is a combination of $COUNT commits." - sed -n "2,\$p" < "$SQUASH_MSG" + sed -e 1d -e '2,/^./{ + /^$/d + }' <"$SQUASH_MSG" else COUNT=2 echo "# This is a combination of two commits." echo "# The first commit's message is:" echo git cat-file commit HEAD | sed -e '1,/^$/d' - echo fi + echo echo "# This is the $(nth_string $COUNT) commit message:" echo git cat-file commit $1 | sed -e '1,/^$/d' @@ -261,6 +268,10 @@ do_next () { warn warn " git commit --amend" warn + warn "Once you are satisfied with your changes, run" + warn + warn " git rebase --continue" + warn exit 0 ;; squash|s) @@ -363,17 +374,27 @@ do test -d "$DOTEST" || die "No interactive rebase running" - # commit if necessary - git rev-parse --verify HEAD > /dev/null && - git update-index --refresh && - git diff-files --quiet && - ! git diff-index --cached --quiet HEAD -- && - . "$DOTEST"/author-script && { - test ! -f "$DOTEST"/amend || git reset --soft HEAD^ - } && - export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE && - if ! git commit --no-verify -F "$DOTEST"/message -e + # Sanity check + git rev-parse --verify HEAD >/dev/null || + die "Cannot read HEAD" + git update-index --ignore-submodules --refresh && + git diff-files --quiet --ignore-submodules || + die "Working tree is dirty" + + # do we have anything to commit? + if git diff-index --cached --quiet --ignore-submodules HEAD -- then + : Nothing to commit -- skip this + else + . "$DOTEST"/author-script || + die "Cannot find the author identity" + if test -f "$DOTEST"/amend + then + git reset --soft HEAD^ || + die "Cannot rewind the HEAD" + fi + export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE && + git commit --no-verify -F "$DOTEST"/message -e || die "Could not commit staged changes." fi @@ -416,7 +437,7 @@ do shift ;; esac ;; - --merge) + -m|--merge) # we use merge anyway ;; -C*) @@ -454,6 +475,9 @@ do require_clean_work_tree + UPSTREAM=$(git rev-parse --verify "$1") || die "Invalid base" + test -z "$ONTO" && ONTO=$UPSTREAM + if test ! -z "$2" then output git show-ref --verify --quiet "refs/heads/$2" || @@ -463,12 +487,8 @@ do fi HEAD=$(git rev-parse --verify HEAD) || die "No HEAD?" - UPSTREAM=$(git rev-parse --verify "$1") || die "Invalid base" - mkdir "$DOTEST" || die "Could not create temporary $DOTEST" - test -z "$ONTO" && ONTO=$UPSTREAM - : > "$DOTEST"/interactive || die "Could not mark as interactive" git symbolic-ref HEAD > "$DOTEST"/head-name 2> /dev/null || echo "detached HEAD" > "$DOTEST"/head-name @@ -510,9 +530,9 @@ do # Rebase $SHORTUPSTREAM..$SHORTHEAD onto $SHORTONTO # # Commands: -# pick = use commit -# edit = use commit, but stop for amending -# squash = use commit, but meld into previous commit +# p, pick = use commit +# e, edit = use commit, but stop for amending +# s, squash = use commit, but meld into previous commit # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted.