forked from metomi/fcm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
post-revprop-change-bg
executable file
·111 lines (102 loc) · 3.83 KB
/
post-revprop-change-bg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/bin/bash
#-------------------------------------------------------------------------------
# (C) British Crown Copyright 2006-16 Met Office.
#
# This file is part of FCM, tools for managing and building source code.
#
# FCM is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# FCM is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with FCM. If not, see <http://www.gnu.org/licenses/>.
#-------------------------------------------------------------------------------
# NAME
# post-revprop-change-bg
#
# SYNOPSIS
# post-revprop-change-bg REPOS REV PROP_AUTHOR PROP_NAME ACTION
#
# ARGUMENTS
# REPOS - the path to the Subversion repository
# REV - the revision relevant for the property
# PROP_AUTHOR - the author of this property change
# PROP_NAME - the name of the property, should only be "svn:log"
# ACTION - the action of the property change, should only be "M"
#
# DESCRIPTION
# This script performs the post-revprop-change tasks of a Subversion
# repository in the background.
#
# The script does the following:
# 1. Write diff between old and new property.
# 2. Update corresponding Trac environment, if relevant.
# 3. E-mails the host user account on error.
# 4. E-mails the changeset author if property author is not changeset author.
#
# ENVIRONMENT VARIABLES
# FCM_SVN_HOOK_TRAC_ROOT_DIR
# The root directories of Trac environments. Update corresponding Trac
# environment if specified.
# FCM_SVN_HOOK_REPOS_SUFFIX
# A suffix that should be removed from the basename of REPOS to get the
# name of the Trac environment. (Default is "".)
#-------------------------------------------------------------------------------
set -eu
. "$(dirname $0)/trac_hook"
REPOS=$1
REV=$2
PROP_AUTHOR=$3
PROP_NAME=$4
ACTION=$5
export PATH=${PATH:-'/usr/local/bin:/bin:/usr/bin'}:$(dirname $0)
THIS=$(basename $0)
USER=${USER:-$(whoami)}
LOG_TMP=$(mktemp "$REPOS/log/$THIS.log.XXXXXXXXXX")
NAME=$(basename "$REPOS")
main() {
local RET_CODE=0
local NOW=$(date -u +%FT%H:%M:%SZ)
echo "$NOW+ $ACTION $PROP_NAME @$REV by $PROP_AUTHOR"
# Diff old/new in log
local OLD_FILE=$(mktemp "$REPOS/log/$THIS.$REV.XXXXXXXXXX.old")
cat >"$OLD_FILE"
local DIFF_FILE=$(mktemp "$REPOS/log/$THIS.$REV.XXXXXXXXXX.diff")
{
echo "$NOW+ $ACTION $PROP_NAME @$REV by $PROP_AUTHOR"
printf '=%.0s' {1..72}
echo
} >"$DIFF_FILE"
svnlook pg -r "$REV" --revprop "$REPOS" "$PROP_NAME" \
| diff -u --label="old-value" --label="new-value" "$OLD_FILE" - \
| tee -a "$DIFF_FILE"
# Email to changeset author if not the same as property change author
REV_AUTHOR=$(svnlook author -r "$REV" "$REPOS")
if [[ "$REV_AUTHOR" != "$PROP_AUTHOR" ]]; then
SUBJECT="-s$(basename $REPOS)@$REV [$ACTION $PROP_NAME] by $PROP_AUTHOR"
FROM=
if [[ -n ${FCM_SVN_HOOK_NOTIFICATION_FROM:-} ]]; then
FROM="-r${FCM_SVN_HOOK_NOTIFICATION_FROM:-}"
fi
ADDRS=$(fcm-user-to-email "$REV_AUTHOR" "$PROP_AUTHOR" 2>'/dev/null')
mail "$FROM" "$SUBJECT" "$ADDRS" <"$DIFF_FILE" || true
fi
rm -f "$OLD_FILE" "$DIFF_FILE"
# Resync Trac
trac_hook "$REPOS" "$REV" modified || RET_CODE=$?
echo "RET_CODE=$RET_CODE"
return $RET_CODE
}
if ! main 1>$LOG_TMP 2>&1 && [[ -n ${FCM_SVN_HOOK_ADMIN_EMAIL:-} ]]; then
mail -s "[ERROR $THIS] $NAME" "$FCM_SVN_HOOK_ADMIN_EMAIL" <"$LOG_TMP" \
|| true
fi
cat "$LOG_TMP"
rm -f "$LOG_TMP"
exit