diff options
Diffstat (limited to 'helpers/git-svn-commit')
-rwxr-xr-x | helpers/git-svn-commit | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/helpers/git-svn-commit b/helpers/git-svn-commit new file mode 100755 index 0000000..49cb0d3 --- /dev/null +++ b/helpers/git-svn-commit @@ -0,0 +1,60 @@ +#!/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 trying again." + exit 1 + fi +fi + +# Refresh / rebase to avoid future conflicts +safe_run git-refresh +safe_run git-rebase-all |