12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #!/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 ] || [ "$OTHER" = "" ]; then
- echo "Error! Could not find an svn/git revision for commit $COMMIT!"
- echo
- echo "Possible problems are:"
- echo " * Your revision number ($COMMIT) is wrong"
- echo " * This tree is not up to date (before that commit)"
- echo " * This commit in in another three (llvm, clang, compiler-rt, etc)"
- 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
|