aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-11-28 13:00:31 -0800
committerJunio C Hamano <junkio@cox.net>2005-11-28 13:00:31 -0800
commit7f4bd5d831ea838668d1de5f5af022f763230eee (patch)
treefe3405797846971d38fb3d9fb4637199743a88f6
parent36d277c72d90d32f99616072b64a2652248f5264 (diff)
downloadgit-7f4bd5d831ea838668d1de5f5af022f763230eee.tar.gz
git-7f4bd5d831ea838668d1de5f5af022f763230eee.tar.xz
rebase: one safety net, one bugfix and one optimization.
When a .dotest from a previously failed rebase or patch application exists, rebase got confused and tried to apply mixture of what was already there and what is being rebased. Check the existence of the directory and barf. It failed with an mysterious "fatal: cannot read mbox" message if the branch being rebased is fully in sync with the base. Also if the branch is a proper descendant of the base, there is no need to run rebase logic. Prevent these from happening by checking where the merge-base is. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rwxr-xr-xgit-rebase.sh28
1 files changed, 27 insertions, 1 deletions
diff --git a/git-rebase.sh b/git-rebase.sh
index 2bc3a1299..638ff0dbc 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -5,9 +5,25 @@
. git-sh-setup
-# The other head is given
+# Make sure we do not have .dotest
+if mkdir .dotest
+then
+ rmdir .dotest
+else
+ echo >&2 '
+It seems that I cannot create a .dotest directory, and I wonder if you
+are in the middle of patch application or another rebase. If that is not
+the case, please rm -fr .dotest and run me again. I am stopping in case
+you still have something valuable there.'
+ exit 1
+fi
+
+# The other head is given. Make sure it is valid.
other=$(git-rev-parse --verify "$1^0") || exit
+# Make sure we have HEAD that is valid.
+head=$(git-rev-parse --verify "HEAD^0") || exit
+
# The tree must be really really clean.
git-update-index --refresh || exit
diff=$(git-diff-index --cached --name-status -r HEAD)
@@ -23,6 +39,16 @@ case "$#" in
git-checkout "$2" || exit
esac
+# If the HEAD is a proper descendant of $other, we do not even need
+# to rebase. Make sure we do not do needless rebase. In such a
+# case, merge-base should be the same as "$other".
+mb=$(git-merge-base "$other" "$head")
+if test "$mb" = "$other"
+then
+ echo >&2 "Current branch `git-symbolic-ref HEAD` is up to date."
+ exit 0
+fi
+
# Rewind the head to "$other"
git-reset --hard "$other"
git-format-patch -k --stdout --full-index "$other" ORIG_HEAD |