llvm-6502/utils/git-svn/git-svnrevert
Renato Golin 9e9c2aff71 Update git-svnrevert to accept git and svn revisions
Interchangeable commit ids can now be used on this git-svnrevert, which
will figure out what kind of commit that is (if you use format rNNNN for SVN
commits) and make sure the right ids are used in the right places.

It's a little bit more robust and user-friendly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219290 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-08 09:32:47 +00:00

60 lines
1.3 KiB
Bash
Executable File

#!/bin/bash
if [ $# -ne 1 ]; then
echo "Invalid arguments!"
echo "$0 <rNNNNNN | git-hash>"
exit 1
fi
if [ -n "$(git status -uno -s --porcelain)" ]; then
echo "You have unstashed changes. Please stash and then revert."
git status -uno
exit 1
fi
COMMIT=$1
OTHER=$(git svn find-rev "$COMMIT")
if [ $? -ne 0 ]; then
echo "Error! Could not find an svn/git revision for commit $COMMIT!"
exit 1
fi
if [ -n "$(echo $COMMIT | grep '^r[0-9]\+')" ]; then
SVN=`echo $COMMIT | sed -e 's/^r//'`
GIT=$OTHER
else
SVN=$OTHER
GIT=$COMMIT
fi
# Grab the one line message for our revert commit message.
ONE_LINE_MSG=$(git log --oneline $GIT -1 | cut -f2- -d " ")
# Revert the commit.
git revert --no-commit $GIT 2>/dev/null
if [ $? -ne 0 ]; then
echo "Error! Failed to revert commit r$SVN. Resetting to head."
git reset --hard HEAD
exit 1
fi
# Create a template in our .git directory.
TEMPLATE="`git rev-parse --git-dir`/git-svn-revert-template"
cat > $TEMPLATE <<EOF
Revert "$ONE_LINE_MSG"
This reverts commit r$SVN.
EOF
# Begin the commit but give our user an opportunity to edit it.
git commit --file="$TEMPLATE" --edit
if [ $? -ne 0 ]; then
echo "Error! Failed to commit reverting commit for commit r$SVN. Reverting to head."
git reset --hard HEAD
rm -rf $TEMPLATE
exit 1
fi
rm -rf $TEMPLATE