Mercurial > dotfiles
view .shell.d/50.vcs_functions.sh @ 200:a563c21235ad
vcs-functions: add mq-snapshot
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Tue, 13 Apr 2010 14:49:00 -0500 |
parents | e1a49db5c6ff |
children | 9e45ac5350fd |
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 mq-snapshot () { mq ci -m "Applied on $(hg log -r qparent --template '{node|short}\n')" } function ezsvnsync() { if [ x"$1" = "x" ] ; then echo 'usage: ez-svn-sync repo url' return 0 fi local repo repo=$1 local url 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 } alias ez-svn-sync=ezsvnsync # 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, hgsubversion)' fi echo $url } function hgsvnmergebranch() { 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 } alias hg-svn-merge-branch=hgsvnmergebranch function hgsvnrebaseall() { for b in `hg log -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 rebase --svn || return else echo "Skip $b since it has a merge." fi done } alias hg-svn-rebase-all=hgsvnrebaseall function hgamend() { hg qimport -r . && hg qref && hg qfin qtip } alias hg-amend=hgamend function hgsvnmkbranch() { local upstream upstream=$(hg paths default | sed 's%/*$%%') 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 } alias hg-svn-mkbranch=hgsvnmkbranch # 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() { if ! ls -l | egrep ^d > /dev/null ; then ls -l | egrep ^d return fi local hgpath for aa in */ ; do pushd $aa > /dev/null || continue if [ -e .svn ] ; then echo $aa 'is an svn checkout, updating' svn up elif [ -e README.txt ] \ && [ -e format ] \ && grep "This is a Subversion repository; use the 'svnadmin' tool to examine" README.txt > /dev/null \ && svn pl --revprop -r 0 file://$(pwd) | fgrep svn:sync-from-url > /dev/null\ ; then echo "$aa looks like an svnsync clone, syncing" svnsync sync file://$(pwd) elif [ -e .git/svn ] ; then echo $aa 'is a git-svn checkout, updating' git svn fetch elif [ -e .git ] ; then echo $aa 'is a git checkout, updating' git pull origin master elif [ -e .hg ] ; then echo $aa 'is an hg checkout, updating' for hgpath in $(HGRCPATH=/dev/null hg paths | sed 's/.* = //g' | sort | uniq ) ; do hg pull --update $hgpath done 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 else update_source_trees fi popd > /dev/null done } alias update-source-trees=update_source_trees 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 } function git_next_unmerged_file() { git status | egrep '(unmerged|both modified)' | head -n 1 | sed 's/.*: //' } alias git-next-unmerged-file=git_next_unmerged_file # 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'!' }