You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@subversion.apache.org by Tech Geek <te...@gmail.com> on 2010/10/04 17:51:58 UTC

Copying hooks automatically upon repository creation

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?

Re: Copying hooks automatically upon repository creation

Posted by Tech Geek <te...@gmail.com>.
Thank you all for sharing the information. Really appreciate it.

Re: Copying hooks automatically upon repository creation

Posted by "Martin J. Stumpf" <mj...@jhu.edu>.
 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


Re: Copying hooks automatically upon repository creation

Posted by Tino Schwarze <su...@tisc.de>.
On Mon, Oct 04, 2010 at 05:16:42PM -0700, Tech Geek wrote:

> > sudo -u "$USER" ln -s ../../conf "$REPO" || exit $?
> > sudo -u "$USER" ln -s ../../hooks "$REPO" || exit $?
> >
> I just realized that the above two commands will fail, if the repositories
> are on a SMB/CIFS mounted share on the Linux system, with the following
> message:
> ln: creating symbolic link conf: Operation not supported
> 
> How do we get around in this situation?

We've gone another route: Create a "meta repository" which contains the
hook scripts (and possibly conf/ directory), then after repository
creation do
mv hooks org.hooks
svn co file://var/lib/svn/meta-repo/hooks
mv conf org.conf
svn co file://var/lib/svn/meta-repo/conf

Easier updating later and no symlinks. :-)

HTH,

Tino.

-- 
"What we nourish flourishes." - "Was wir nähren erblüht."

www.tisc.de

Re: Copying hooks automatically upon repository creation

Posted by Tino Schwarze <su...@tisc.de>.
On Mon, Oct 04, 2010 at 05:16:42PM -0700, Tech Geek wrote:

> > sudo -u "$USER" ln -s ../../conf "$REPO" || exit $?
> > sudo -u "$USER" ln -s ../../hooks "$REPO" || exit $?
> >
> I just realized that the above two commands will fail, if the repositories
> are on a SMB/CIFS mounted share on the Linux system, with the following
> message:
> ln: creating symbolic link conf: Operation not supported
> 
> How do we get around in this situation?

We've gone another route: Create a "meta repository" which contains the
hook scripts (and possibly conf/ directory), then after repository
creation do
mv hooks org.hooks
svn co file://var/lib/svn/meta-repo/hooks
mv conf org.conf
svn co file://var/lib/svn/meta-repo/conf

Easier updating later and no symlinks. :-)

HTH,

Tino.

-- 
"What we nourish flourishes." - "Was wir nähren erblüht."

www.tisc.de

Re: Copying hooks automatically upon repository creation

Posted by Tech Geek <te...@gmail.com>.
Ryan,


> sudo -u "$USER" ln -s ../../conf "$REPO" || exit $?
> sudo -u "$USER" ln -s ../../hooks "$REPO" || exit $?
>
I just realized that the above two commands will fail, if the repositories
are on a SMB/CIFS mounted share on the Linux system, with the following
message:
ln: creating symbolic link conf: Operation not supported

How do we get around in this situation?

Re: Copying hooks automatically upon repository creation

Posted by Ryan Schmidt <su...@ryandesign.com>.
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 $?



Re: Copying hooks automatically upon repository creation

Posted by Andy Levy <an...@gmail.com>.
On Mon, Oct 4, 2010 at 13:51, Tech Geek <te...@gmail.com> 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?
>

Write a script to automate your repository creation process, and
include copying hooks in that script.