Skip to content

Commit

Permalink
rebase: one safety net, one bugfix and one optimization.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Nov 28, 2005
1 parent 36d277c commit 7f4bd5d
Showing 1 changed file with 27 additions and 1 deletion.
28 changes: 27 additions & 1 deletion git-rebase.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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 |
Expand Down

0 comments on commit 7f4bd5d

Please sign in to comment.