Mercurial > dotfiles
view .shell.d/50.vcs_functions.sh @ 179:ebbbf3567a0e
zsh prompt: detabify
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Wed, 13 Jan 2010 10:34:12 -0600 |
parents | 040ac89ffe1e |
children | efa2bfc73d2d |
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 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() { 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 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 } 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 | grep unmerged | 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'!' }