|  | #!/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 | 
|  |  |