view .shell.d/50.vcs_functions.sh @ 184:efa2bfc73d2d

update-source-trees: recurse to find all VCS working copies
author Augie Fackler <durin42@gmail.com>
date Tue, 26 Jan 2010 11:48:39 -0600
parents 040ac89ffe1e
children e1a49db5c6ff
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() {
    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 | 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'!'
}