On 10/4/2010 2:42 PM, Ryan Schmidt wrote:
On Oct 4, 2010, at 12:51, Tech Geek wrote:

We use one repository per project. All repository lives in /var/lib/svn/.

Also we use the hooks post-commit and pre-commit for every repository. Right 
now we have to manually copy these two hooks whenever a new repository is 
created.
For example:
cd /var/lib/svn/
cp /path-to-my-hooks/* projectA/hooks
cp /path-to-my-hooks/* projectB/hooks
cp /path-to-my-hooks/* projectC/hooks

Is there any way to automate this process?
As Andy said, you can write a script that creates the repository and then copies the 
scripts, then make sure you call that script instead of calling "svnadmin 
create" directly whenever you want a new repo. My version of this script creates the 
repository as the Apache user and symlinks in my common hooks and conf directories. I 
symlink instead of copying because I want all my repositories to always have the same 
hooks and conf files, and I want changes I make in them to be reflected in existing 
repositories. Here's my script:


#!/bin/bash

REPO="/path/to/subversion/repositories/$1"
USER="www"

if [ -e "$REPO" ]; then
        echo "Repository \"$1\" already exists." 1>&2
        exit 1
fi

sudo -u "$USER" svnadmin create "$REPO" || exit $?
sudo -u "$USER" rm -rf "$REPO"/{conf,hooks} || exit $?
sudo -u "$USER" ln -s ../../conf "$REPO" || exit $?
sudo -u "$USER" ln -s ../../hooks "$REPO" || exit $?



I also use a bash script replacement for svnadmin create and use a common hooks 
directory.
This script will set the file permissions and make the hook symlinks even for a 
repository that was created by the svnadmin create command. We use one 
project/one repo and this makes repo creation a snap.

HTH,

-Martin

#!/bin/bash
#
# svncreate - Create an svn repository and set it up with the correct 
permissions
#                               The -n switch is used to change the permissions 
of an existing
#                               repository in the event that we did not create 
it.
#
# $Id: svncreate 60 2009-11-19 21:00:02Z mjs $
#

# Defaults

REPOS=/mip/svn # This is the parent path to the project repositories.
HOOKS=/mip/svn/.hooks # The pre, post commit hook scripts.
TYPE=fsfs # The type of the repo, bdb or fsfs.

NOCREATE=

function usage()
{
        echo "Usage: svncreate [-n] [-r REPOPATH] <repo name> [repo name] ..."
        echo "Where: -n means don't create the repo, just change permissions and add 
hooks."
        echo "Where: -r REPOPATH specifies the repository parent path. 
(Default=/mip/svn)"
}

function set_permissions()
{
        if [ $EUID -eq 0 ];then
                        chown -R root ${REPOS}/${PROJECT} || return $?
        fi
        mkdir ${REPOS}/${PROJECT}/dav
        chgrp -R svn ${REPOS}/${PROJECT} || return $?
        chmod 6770 ${REPOS}/${PROJECT} || return $?
        dirs=$(find ${REPOS}/${PROJECT} -type d)
        for d in $dirs; do
                chmod 6770 $d || return $?
        done
        files=$(find ${REPOS}/${PROJECT} -type f)
        for f in $files; do
                chmod 660 $f || return $?
        done
}

function setup_hooks()
{
        ln -s ${HOOKS}/pre-commit ${REPOS}/${PROJECT}/hooks 2>/dev/null
        ln -s ${HOOKS}/post-commit ${REPOS}/${PROJECT}/hooks 2>/dev/null
        ln -s ${HOOKS}/pre-revprop-change ${REPOS}/${PROJECT}/hooks 2>/dev/null
}

# Get the command line args

while getopts "nr:" opt; do
        case $opt in
                n)NOCREATE=1;;
                r)REPOS="$OPTARG";;
                \?)usage;exit;;
        esac
done

shift $(($OPTIND - 1))

if [ $# -lt 1 ]; then
        usage
        exit
fi

for PROJECT in "$@"; do
# We need write access to the REPOS directory
        [ -d "$REPOS" -a -w "$REPOS" ] || { echo "No write permission to 
$REPOS"; exit; }

        if [ -z $NOCREATE ]; then
                if      svnadmin create --fs-type ${TYPE} ${REPOS}/${PROJECT} 
&& set_permissions; then
                        setup_hooks
                        echo ""
                        echo "The Project repository: ${REPOS}/${PROJECT} was 
created."
                        echo ""
                        echo "Use svn import -m "Initial Import" 
https://svnserver/<path to repo> /path/to/files to populate it."
                        echo ""
                        echo "Note: If you browse the repo and don't like what you 
imported"
                        echo "then just rm -rf the project ${REPOS}/${PROJECT} and 
start over."
                else
                        echo "Failed to create project repository: 
${REPOS}/${PROJECT}"
                        break
                fi
        else
                if set_permissions; then
                        setup_hooks
                        echo ""
                        echo "Permissions on the project repository: 
${REPOS}/${PROJECT} were changed."
                        echo ""
                else
                        echo "Failed to change permissions on    project repository: 
${REPOS}/${PROJECT}"
                        break
                fi
        fi
done


Reply via email to