aboutsummaryrefslogtreecommitdiff
path: root/helpers/git-svn-commit
diff options
context:
space:
mode:
Diffstat (limited to 'helpers/git-svn-commit')
-rwxr-xr-xhelpers/git-svn-commit60
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