shellsvndeploymentexportsvn-checkout

svn checkout to deploy via shell


I have the following problem. I need to organize automatic upload to deploy server from svn repository, but with some feautures. There is how I wrote it:

# $1 - project; $2 - version (optional)
#   rm -rf $projectDir
if [ "$2" == '' ]; then
    svn export $trunk $projectDir --force >> $log
    version=`svn info $trunk | grep Revision | awk '{print$2}'`
    svn copy $trunk $tags/$version -m "created while uploading last version of $1"
    echo "New stable version #$version of $1 is created
    Uploading to last version is completed successfully"
else
    version=$2
    svn export $tags/$version/ $projectDir --force >> $log
    echo "Revert to version #$version is completed successfully"
fi

echo $version > $projectDir/version

chown -R $1:$1 $projectDir

But svn export doesn't delete deleted via svn files, so I need to clean directory before export every time. It's not good. Before this, I work with checkout for deploy like this:

svn co $trunk >> $log
cp -ruf trunk/* $projectDir
svn info $trunk | grep Revision > $projectDir/version
chown -R $project:$project $projectDir
echo "uploading finished"

This work very well and very very faster (it changes only changed files) than the export, but:

  1. without automatic tag creating;
  2. without opportunity for nice reverting.

In my last script co doesn't work, because it trying to checkout in one directory from different repository directories (trunk/some tag), which isn't real.

So, question:

  1. Can I relocate project before checkout?
  2. Can I find the diff with co version and existing version before export?
  3. What can I do with diff result? (remove unneeded files after export?)

Thanks in advance.


Solution

  • For the basis for the solution was taken following code:

    It's simpler and fully solves the problem as for me.

    if [ "$2" == '' ]; then
        version=`svn info ${trunk} | grep Revision | awk '{print$2}'`
        if [ `cat ${projectWWW}/version` == "${version}" ]; then
            resultMessage="Project is up to date"
        else
            svn co ${trunk} ${projectRoot}/co >> ${log}
            cp -ruf ${projectRoot}/co/ ${projectRoot}/releases/${version}
            chown -R $1:$1 ${projectRoot}/releases/${version}
            resultMessage="New stable version #$version of $1 is created
            Uploading to last version is completed successfully"
       fi
    else
        version=$2
        resultMessage="Revert to version #$version is completed successfully"
    fi
    
    ln -s ${projectRoot}/releases/${version} ${projectWWW}
    echo ${version} > ${projectWWW}/version
    echo ${resultMessage} >> ${log}