We have multiple project developments going on simulteanously and always had issues while merging the code to live. Issues were like code getting overwritten, full fucntionality loss. Hence I have written this script for auto merging of the code which has gone live to the development branch. This is done to eliminate the possibilities of above issues. I have used svnmerge.py utility which is available at http://www.orcaware.com/svn/wiki/Svnmerge.py#Downloads. I hope this script will be helpful for you
svnautomerge.sh
#!/bin/sh ############################################################ # ScriptName: svnautomerge.sh # Date Created: 24/07/2008 # Date Implemented: # Version: 1.1 # Author: Mohan Cheema [mohan at mohancheema dot net] # Purpose: # This Script is written to auto merge the repositories which are in development state. # So that the changes that have already gone live doesn't get missed and the # Development branch are always in sync with live code. # Copyright (c) 2008 Mohan Cheema <http://www.mohancheema.net> # This script is licensed under GNU GPL version 2.0 or above # This script is part of Mohan Cheema shell script collection # Visit http://www.mohancheema.net/ for more information. ############################################################ SVNEXE="/usr/bin/svn" SVNREP="/path/to/checkout/repo" SVNURL="http://subverion.ip.addr.ess/repos" SVNUSER="svnadmin" SVNPASS="password" SVNM="/path/to/svnmerge.py" LOGFILE="/var/log/svnsync.log" LOGDATE=`date +"%d/%m/%Y %Z %H:%M:%S"` PROGNAME=$(basename $0) LOGFUN() { echo "$LOGDATE - $1" >> $LOGFILE } initializeANSI() { esc="E" blackf="${esc}[30m"; redf="${esc}[31m"; greenf="${esc}[32m" yellowf="${esc}[33m" bluef="${esc}[34m"; purplef="${esc}[35m" cyanf="${esc}[36m"; whitef="${esc}[37m" blackb="${esc}[40m"; redb="${esc}[41m"; greenb="${esc}[42m" yellowb="${esc}[43m" blueb="${esc}[44m"; purpleb="${esc}[45m" cyanb="${esc}[46m"; whiteb="${esc}[47m" boldon="${esc}[1m"; boldoff="${esc}[22m" italicson="${esc}[3m"; italicsoff="${esc}[23m" ulon="${esc}[4m"; uloff="${esc}[24m" invon="${esc}[7m"; invoff="${esc}[27m" reset="${esc}[0m" } initializeANSI USAGE() { echo -e "${redf}Usage: $PROGNAME -c [Options] -r [RepositoryName/<branch|trunk|tags>] [-u <Repository URL>]${reset}" echo -e "${yellowf}Example for Checkout : $PROGNAME -c co -r TestRepo/tags/buddyrelease/28072008/" echo -e "Example for Commit : $PROGNAME -c ci -r TestRepo/tags/buddyrelease/28072008/" echo -e "Example for List : $PROGNAME -c ls -r TestRepo/tags/buddyrelease/28072008/" echo -e "Example for Update : $PROGNAME -c co -r TestRepo/tags/buddyrelease/28072008/${reset}" echo -e "${boldon}Options Available for -c:${reset}" echo -e "t${boldon}${italicson}ls - List Repository" echo -e "tco - Checkout Repository" echo -e "tci - Commit Repository" echo -e "tup - Update Repository" echo -e "tmg - Merge Repository${reset}" echo } if [ $# -le 1 ] then USAGE LOGFUN "NO ARGUMENTS PASSED!!!" exit fi while getopts dc:r:u: OPTIONS do case ${OPTIONS} in c) SVNARG=${OPTARG};; r) REPOARG=${OPTARG};; u) URLARG=${OPTARG};; *) USAGE exit 2;; esac done if [ "$REPOARG" == "" ] || [ "$SVNARG" == "" ] then echo "-c and -r are Mandatory " echo -e "tExample for Checkout : $PROGNAME -c co -r TestRepo/tags/buddyrelease/28072008/" echo -e "tExample for Commit : $PROGNAME -c ci -r TestRepo/tags/buddyrelease/28072008/" echo -e "tExample for List : $PROGNAME -c ls -r TestRepo/tags/buddyrelease/28072008/" echo -e "tExample for Update : $PROGNAME -c co -r TestRepo/tags/buddyrelease/28072008/" exit 3 fi if [ "$SVNARG" == "ls" ] then $SVNEXE $SVNARG $SVNURL/$REPOARG/ exit fi if [ "$SVNARG" == "co" ] then cd $SVNREP if ! test -d $REPOARG then /bin/mkdir -p $REPOARG fi $SVNEXE $SVNARG $SVNURL/$REPOARG/ $SVNREP/$REPOARG --username $SVNUSER --password $SVNPASS cd $SVNREP/$REPOARG $SVNM init -f /tmp/initmessage.txt $SVNEXE ci -m "Need to Commit after initialising auto merging." $SVNREP/$REPOARG --username $SVNUSER --password $SVNPASS $SVNEXE up . exit fi if [ "$SVNARG" == "ci" ] then $SVNEXE $SVNARG -m "" $SVNREP/$REPOARG --username $SVNUSER --password $SVNPASS exit fi if [ "$SVNARG" == "up" ] then $SVNEXE $SVNARG $SVNREP/$REPOARG --username $SVNUSER --password $SVNPASS exit fi if [ "$SVNARG" == "mg" ] then CONT=0 CONT2=0 if [ ! -d "$SVNREP/$REPOARG" ] then $SVNEXE co $SVNURL/$REPOARG/ $SVNREP/$REPOARG --username $SVNUSER --password $SVNPASS cd $SVNREP/$REPOARG $SVNM init -f /tmp/initmessage.txt $SVNEXE ci -m "Need to Commit after initialising auto merging." $SVNREP/$REPOARG --username $SVNUSER --password $SVNPASS $SVNEXE up . fi cd $SVNREP/$REPOARG echo "Updating Repo $SVNREP/$REPOARG...." $SVNEXE --username $SVNUSER --password $SVNPASS up . $SVNM --username $SVNUSER --password $SVNPASS merge -f /tmp/CommitMessage.txt CONT=`find . -name "*.merge-*.r*" |wc -l` CONT2=`find . -name "*.working"|wc -l` if [ $CONT -gt 0 ] && [ $CONT2 -gt 0 ] then $SVNEXE revert $SVNREP/$REPOARG LOGFUN "There is conflict in $SVNREP/$REPOARG. Please Resolve this manually with the help of developer(s)." /bin/rm -f /tmp/CommitMessage.txt else LOGFUN "No Conflicts found Merging $REPOARG" echo "Merging..." if [ -f /tmp/CommitMessage.txt ] then echo "Commiting..." $SVNEXE ci -F /tmp/CommitMessage.txt $SVNREP/$REPOARG --username $SVNUSER --password $SVNPASS /bin/rm -f /tmp/CommitMessage.txt else echo "Nothing to merge...." LOGFUN "Nothing to merge for $REPOARG" fi fi exit fi
Automating
Once my above script was ready only task remaining was to automate it. I have written this shell script which does that it is been added to crontab to run at specific intervals.
repomerge.sh
#!/bin/sh ############################################################ # ScriptName: repomerge.sh # Date Created: 24/07/2008 # Date Implemented: # Version: 1.1 # Author: Mohan Cheema [mohan at mohancheema dot net] # Copyright (c) 2008 Mohan Cheema <http://www.mohancheema.net> # This script is licensed under GNU GPL version 2.0 or above # This script is part of Mohan Cheema shell script collection # Visit http://www.mohancheema.net/ for more information. ############################################################ SYNCSCRIPT="/path/to/svnautomerge.sh" $SYNCSCRIPT -c mg -r project1/branch/developmentBranch1 $SYNCSCRIPT -c mg -r project1/branch/developmentBranch2 $SYNCSCRIPT -c mg -r project2/branch/developmentBranch1