#!/usr/bin/env bash # This script commits to SVN via Git-Svn dcommit. It also adds some checks to # make sure you're not trying to commit from master, and warns about multiple # commits, as they're not always intentional and could mean you're trying to # commit from the wrong branch. # # The script will refresh your master and branches to make sure you have an # up-to-date branch before committing, as that would mess up your local svn # setup or would at least block your commit from going through. . llvm-common force=no if [[ $1 = '-f' ]]; then force=yes fi branch=`get_branch` if [[ $branch = 'master' ]]; then echo " --- Can't commit master branch" exit 1 fi revs=`git log --pretty=oneline --abbrev-commit --graph --decorate | grep -n master | head -1 | cut -d ":" -f 1` revs=$((revs-1)) if [[ $revs = 0 ]]; then echo " --- No patches in current branch" exit 1 fi if [[ $revs != 1 && $force != 'yes' ]]; then echo " --- Too many patches in current branch, use -f to force commit" exit 1 fi # Prepare safe_run git-refresh safe_run git checkout $branch safe_run git rebase master # Actuall SVN commit. Try to recover once. git svn dcommit if [[ $? != 0 ]]; then echo " == SVN COMMIT ERROR ==" # If we're in the base dir, try it again. if [ -d .git/svn ]; then echo "We're in base dir, cleaning SVN info and trying again" rm -rf .git/svn safe_run git svn rebase safe_run git svn dcommit else echo "Not in base dir, won't try anything. But if you" echo "saw the message 'resource out of date', remove" echo "the .git/svn directory and try again." exit 1 fi fi # Refresh / rebase to avoid future conflicts safe_run git-refresh safe_run git-rebase