subversion-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Martin J. Stumpf" <>
Subject Re: Copying hooks automatically upon repository creation
Date Mon, 04 Oct 2010 19:21:43 GMT
  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.



# 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.


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 $?
         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 $?
         files=$(find ${REPOS}/${PROJECT} -type f)
         for f in $files; do
                 chmod 660 $f || return $?

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

shift $(($OPTIND - 1))

if [ $# -lt 1 ]; then

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
                         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
                         echo "Failed to create project repository: ${REPOS}/${PROJECT}"
                 if set_permissions; then
                         echo ""
                         echo "Permissions on the project repository: ${REPOS}/${PROJECT}
were changed."
                         echo ""
                         echo "Failed to change permissions on    project repository: ${REPOS}/${PROJECT}"

View raw message