1 #!/bin/bash 2 3 if [ $# -ne 1 ]; then 4 echo "Invalid arguments!" 5 echo "$0 <rNNNNNN | git-hash>" 6 exit 1 7 fi 8 9 if [ -n "$(git status -uno -s --porcelain)" ]; then 10 echo "You have unstashed changes. Please stash and then revert." 11 git status -uno 12 exit 1 13 fi 14 15 COMMIT=$1 16 OTHER=$(git svn find-rev "$COMMIT") 17 if [ $? -ne 0 ] || [ "$OTHER" = "" ]; then 18 echo "Error! Could not find an svn/git revision for commit $COMMIT!" 19 echo 20 echo "Possible problems are:" 21 echo " * Your revision number ($COMMIT) is wrong" 22 echo " * This tree is not up to date (before that commit)" 23 echo " * This commit in in another three (llvm, clang, compiler-rt, etc)" 24 exit 1 25 fi 26 27 if [ -n "$(echo $COMMIT | grep '^r[0-9]\+')" ]; then 28 SVN=`echo $COMMIT | sed -e 's/^r//'` 29 GIT=$OTHER 30 else 31 SVN=$OTHER 32 GIT=$COMMIT 33 fi 34 35 # Grab the one line message for our revert commit message. 36 ONE_LINE_MSG=$(git log --oneline $GIT -1 | cut -f2- -d " ") 37 38 # Revert the commit. 39 git revert --no-commit $GIT 2>/dev/null 40 if [ $? -ne 0 ]; then 41 echo "Error! Failed to revert commit r$SVN. Resetting to head." 42 git reset --hard HEAD 43 exit 1 44 fi 45 46 # Create a template in our .git directory. 47 TEMPLATE="`git rev-parse --git-dir`/git-svn-revert-template" 48 cat > $TEMPLATE <<EOF 49 Revert "$ONE_LINE_MSG" 50 51 This reverts commit r$SVN. 52 EOF 53 54 # Begin the commit but give our user an opportunity to edit it. 55 git commit --file="$TEMPLATE" --edit 56 if [ $? -ne 0 ]; then 57 echo "Error! Failed to commit reverting commit for commit r$SVN. Reverting to head." 58 git reset --hard HEAD 59 rm -rf $TEMPLATE 60 exit 1 61 fi 62 63 rm -rf $TEMPLATE 64 65