[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

RE: Help with post-commit script

From: Andrew Reedick <Andrew.Reedick_at_cbeyond.net>
Date: Mon, 2 Dec 2013 16:07:52 -0600

> -----Original Message-----
> From: Alfred von Campe [mailto:alfred_at_von-campe.com]
> Sent: Monday, December 02, 2013 3:44 PM
> To: users_at_subversion.apache.org
> Subject: Help with post-commit script
>
> I need to implement a post-commit hook that does the following in a "standard" Subversion repository (with trunk, branches, and tags at the top level):
>
> 1. Checks for existence of a certain property in the top-level directory of the trunk or branch
> 2. If property exists, check if any files listed in said property's value has been modified
> 3. Send an email with all diffs from step 2 to the recipients listed in another property
>
> What makes it tricky is that in all steps above I need to be able to handle trunk as well as any branches. In addition, since it is possible to submit to both trunk and/or one or more branches in the same commit, and the property > may exist in one but not the other, I need to walk through all files affected in the commit. I think this means I cannot use just svnlook and will have to parse the output of svn log. My questions are:
>
> 1. Is parsing the output of svn log the best approach?
> 2. If not, what is a better approach?
> 3. I would prefer to write this in bash or perl, but would appreciate any examples in other languages before I go re-inventing the wheel.
>
> Thanks,
> Alfred
>
> P.S. Please CC me as I am not on the list.

1. Probably not.
2. Ssee below
3. See below

Pseudocode. You'll need to fill in the gaps, i.e. the ellipses. And you'll probably want to delete the temp files with a trap (google on: bash delete temp dir)

#!/bin/bash

set -o pipefail

REPOS_PATH=$1
REV=$2 # or is it the other way around?

RECIPIENT_LIST=$(svnlook propget ... my:email_list_prop)
if [[ -z "$RECIPIENT_LIST" ]]
then
        exit 0
fi

CHANGED_LIST=$(mktemp ...)
FILES_TO_REPORT_ON=$(mktemp ...)

svnlook changed ... > $CHANGED_LIST || exit 1
cat $CHANGED_LIST | sed 's/^....//g' | perl -ne 'print "$1$2\n" if /^(trunk)\/|^(branches\/[^\/]*)\//' | sort -u | xargs -n 1 -i svnlook propget $REPOS_PATH my:filelist_prop "{}" > $FILES_TO_REPORT_ON || exit 1

cat $CHANGED_LIST | while read i
do
        grep -q "$i" "$FILES_TO_REPORT_ON"
        if [[ $? -eq 0 ]]
        then
                sendmail -s " $i was touched in an impure manner" $RECIPIENT_LIST < svnlook diff -r ...
        fi
done

Also, do NOT have any blank links in the "my:filelist_prop". Or does that only apply when using 'grep -v'?
Received on 2013-12-02 23:09:47 CET

This is an archived mail posted to the Subversion Users mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.