Mercurial > dotfiles
view .shell.d/50.vcs_functions.sh @ 67:9f8bd97da0d4
hg-svn-rebase-all: improved rebasing so that merges no longer abort rebasing other branches.
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Wed, 01 Apr 2009 14:50:38 -0500 |
parents | 1b4067cc97ca |
children | 5232fa3d7ad3 |
line wrap: on
line source
## vcs_functions # This file contains a handful of functions that relate to using some version # control tool or other. function mq () { ( wcroot ; hg -R .hg/patches $@ ) } function ez-svn-sync() { local url local repo repo=$1 url=$2 svnadmin create $repo echo '#!/bin/sh' >> $repo/hooks/pre-revprop-change echo 'exit 0' >> $repo/hooks/pre-revprop-change chmod +x $repo/hooks/pre-revprop-change svnsync init file://`pwd`/$repo $url svnsync sync file://`pwd`/$repo } # Function to grab the url of an svn wc function svnurlof() { local url url=`svn info $1 2> /dev/null | grep '^URL: ' | sed 's/URL: //'` if [ x"$url" = "x" ] ; then url=`git svn info $1 2> /dev/null | grep '^URL: ' | sed 's/URL: //'` fi if [ x"$url" = "x" ] ; then local dir dir=$1 if [ x"$dir" = "x" ] ; then dir="." fi url=`hg -R $dir svn info 2> /dev/null | grep '^URL: ' | sed 's/URL: //'` fi if [ x"$url" = "x" ] ; then echo -n 'No repo found (tried svn, git-svn, hgsvnclient)' fi echo $url } function hg-svn-merge-branch() { local targetrev local striprev targetrev=$(hg id | cut -d ' ' -f 1) hg merge $1 hg ci -m "Merging $1" striprev=$(hg id | cut -d ' ' -f 1) hg co $targetrev hg diff -r$targetrev:$striprev | hg import - -m "Merged branch $1." hg strip $striprev } function hg-svn-rebase-all() { for b in `hg llog -u 'Augie Fackler <durin42@gmail.com>' --template '{branches}\n' | sort | uniq` do echo "rebase $b" hg co $b if [[ "$?" != "0" ]] ; then echo "abort: could not checkout $b" return fi hg parent --svn > /dev/null if [[ "$?" == "0" ]] ; then hg svn rebase || return else echo "Skip $b since it has a merge." fi done } function hg-ammend() { hg qimport -r . && hg qref && hg qfin qtip } function hg-svn-mkbranch() { local upstream upstream=$(hg svn url) local branchname if [ "x$1" = "x" ] ; then echo 'Must provide new branch name.' return 1 fi local d=`hg svn info | grep URL | sed 's/.*://'` local br=`echo $d | awk '{ if ( index($1, "trunk") ) { print "trunk" } else { x = index($1, "branches") ; if ( x != 0 ) { sub(".*/branches/", ""); sub("/.*", ""); print $0 } } }'` branchname=$br echo svn cp $upstream/$branchname $upstream/branches/$1 } # Function to clean locks out of svn wcs function clean_svn_source_trees() { for aa in */ ; do pushd $aa > /dev/null if [ -e .svn ] ; then echo $aa 'is an svn checkout, cleaning' && svn cleanup fi popd > /dev/null done } # Function to update source trees of known VCS tools in the working dir. # "known" means ones I'm forced to use on a regular basis function update_source_trees() { for aa in */ ; do pushd $aa > /dev/null || continue if [ -e .svn ] ; then echo $aa 'is an svn checkout, updating' svn up elif [ -e .hg/svn ] ; then echo $aa 'is an hg-svn checkout, updating' hg svn pull hg up elif [ -e .git/svn ] ; then echo $aa 'is a git-svn checkout, updating' git svn fetch git repack git gc elif [ -e .git ] ; then echo $aa 'is a git checkout, updating' git pull origin master git repack git gc elif [ -e .hg ] ; then echo $aa 'is an hg checkout, updating' && hg pull && hg up if [ -e .hg/patches/.hg ] ; then echo $aa 'has an mq, updating that too...' hg -R .hg/patches pull -u fi elif [ -e _MTN ] ; then echo $aa "is an mtn co, updating" && mtn pull && mtn up fi popd > /dev/null done } function vcs_current_branch() { git branch 2> /dev/null > /dev/null if [ $? = 0 ] ; then git branch --verbose | grep '^*' | sed 's/* //;s/ /:/;s/ .*//;s/:/ /' return 0 fi # when wc-ng comes out, we'll probably do the following # svn info 2> /dev/null > /dev/null if [ -e .svn ] ; then local d=`svn info | grep URL | sed 's/.*://'` local br=`echo $d | awk '{ if ( index($1, "trunk") ) { print "trunk" } else { x = index($1, "branches") ; if ( x != 0 ) { sub(".*/branches/", ""); sub("/.*", ""); print $0 } } }'` local rev=`svn info | grep Revision | sed 's/.*: /r/'` echo $br $rev return 0 fi hg branch 2> /dev/null > /dev/null if [ $? = 0 ] ; then local br=`hg branch | head -c 10` local rid=`hg parents | head -n 1 | awk '{print $2}' | head -c 7` echo "$br $rid" return 0 fi return 1 } # change to the root dir of the current wc function wcroot() { local root=`hg root 2> /dev/null` if [ x$root != 'x' ] ; then cd $root return 0 fi git branch 2> /dev/null > /dev/null if [ $? = 0 ] ; then while [ ! -e .git ] ; do cd .. done return 0 fi if [ -e .svn ] ; then while [ -e ../.svn ] ; do cd .. done return 0 fi echo No working copy found'!' }