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