Qu'est-ce qu'un hook pre-revprop-change dans SVN et comment le créer?
Question
Je voulais éditer un commentaire de journal dans le navigateur de référentiel et j'ai reçu un message d'erreur indiquant qu'aucun hook pre-revprop-change n'existait pour le référentiel. En plus d'avoir un nom effrayant, qu'est-ce qu'un crochet pre-revprop-change et comment le créer?
La solution
En gros, c'est un script qui est lancé avant que la propriété non versionnée ne soit modifiée sur le référentiel, afin que vous puissiez gérer plus précisément ce qui se passe dans votre référentiel.
Il existe des modèles dans le distributeur SVN pour différents hooks, situés dans le sous-répertoire / hooks (* .tmpl que vous devez modifier et renommer en fonction de votre système d'exploitation, pour l'activer).
Autres conseils
Pour Windows, voici un lien vers un exemple de fichier de commandes qui autorise uniquement les modifications du message de journal (pas d'autres propriétés):
http://ayria.livejournal.com/33438.html
Copiez le code ci-dessous dans un fichier texte et nommez-le pre-revprop-change.bat
, puis enregistrez-le dans le sous-répertoire \ hooks
de votre référentiel.
@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5
:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME
:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION
:: Make sure that the new svn:log message is not empty.
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if "%bIsEmpty%" == "true" goto ERROR_EMPTY
goto :eof
:ERROR_EMPTY
echo Empty svn:log messages are not allowed. >&2
goto ERROR_EXIT
:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT
:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT
:ERROR_EXIT
exit /b 1
Pour que Linux puisse autoriser l'édition d'un commentaire de journal,
- localisez le fichier
pre-revprop-change.tmpl
dans le répertoirehooks
de votre référentiel - copiez le fichier dans le même répertoire en le renommant
pre-revprop-change
- accordez une autorisation d'exécution au fichier (pour l'utilisateur du serveur, par exemple
www-data ??code>)
Édité: (grâce aux lindes)
- après cela, vous devrez peut-être modifier le script pour renvoyer une valeur de sortie de
0
pour le type de modifications que vous souhaitez autoriser.
Voici le lien vers la question de débordement de pile contenant de nombreux points communs Types courants crochets Subversion , y compris la source originale du crochet pre-revprop-change
pour Windows, affiché ici.
Vous devriez vous y référer car ils pourraient être améliorés avec le temps.
Merci #patmortech
Et j'ai ajouté votre code selon lequel "seul le même utilisateur peut modifier son code".
:: Only allow editing of the same user.
for /f "tokens=*" %%a in (
'"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %revision% %repository%') do (
set orgAuthor=%%a
)
if /I not "%userName%" == "%orgAuthor%" goto ERROR_SAME_USER
Si vous parvenez à le déchiffrer, le nom du script de raccordement ne vous fait pas trop peur: il s'agit du crochet de changement de propriété de pré-révision . En bref, l'objectif de Le script hook pre-revprop-change
consiste à contrôler les modifications des propriétés non versionnées (révision) et à envoyer des notifications (par exemple, pour envoyer un courrier électronique lorsque la propriété de révision est modifiée).
Il existe 2 types de propriétés dans Subversion:
- propriétés versionnées (par exemple
svn: needs-lock
etsvn: mime-type
) pouvant être définies sur des fichiers et des répertoires, - propriétés non versionnées (révision) (par exemple,
svn: log
etsvn: date
) définies dans le référentiel révisions .
Les propriétés versionnées ont un historique et peuvent être manipulées par des utilisateurs ordinaires disposant d'un accès en lecture / écriture à un référentiel. D'un autre côté, les propriétés non versionnées n'ont pas d'historique et servent principalement à la maintenance. Par exemple, si vous validez une révision, elle obtient immédiatement svn: date
avec l'heure UTC de votre validation, svn: author
avec votre nom d'utilisateur et svn: log
avec votre message de journal de validation (si vous en avez spécifié).
Comme je l’ai déjà indiqué, le script de raccordement pre-revprop-change
est destiné à contrôler les modifications des propriétés de révision. Vous ne voulez pas que toutes les personnes ayant accès à un référentiel puissent modifier toutes les propriétés de la révision, la modification de ces propriétés est donc interdite par défaut. Pour permettre aux utilisateurs de modifier les propriétés, vous devez créer le hook pre-revprop-change
.
Le hook le plus simple ne peut contenir qu'une seule ligne: exit 0
. Cela permettra à tout utilisateur authentifié de changer n'importe quelle propriété de révision et ne devrait pas être utilisé dans un environnement réel. Sous Windows, vous pouvez utiliser un script batch ou un script basé sur PowerShell pour implémenter une logique dans le hook pre-revprop-change
.
Ce script PowerShell permet de modifier uniquement la propriété svn: log
et refuse les messages de journal vides.
# Store hook arguments into variables with mnemonic names
$repos = $args[0]
$rev = $args[1]
$user = $args[2]
$propname = $args[3]
$action = $args[4]
# Only allow changes to svn:log. The author, date and other revision
# properties cannot be changed
if ($propname -ne "svn:log")
{
[Console]::Error.WriteLine("Only changes to 'svn:log' revision properties are allowed.")
exit 1
}
# Only allow modifications to svn:log (no addition/overwrite or deletion)
if ($action -ne "M")
{
[Console]::Error.WriteLine("Only modifications to 'svn:log' revision properties are allowed.")
exit 2
}
# Read from the standard input while the first non-white-space characters
$datalines = ($input | where { Si vous parvenez à le déchiffrer, le nom du script de raccordement ne vous fait pas trop peur: il s'agit du crochet de changement de propriété de pré-révision . En bref, l'objectif de Le script hook pre-revprop-change
consiste à contrôler les modifications des propriétés non versionnées (révision) et à envoyer des notifications (par exemple, pour envoyer un courrier électronique lorsque la propriété de révision est modifiée).
Il existe 2 types de propriétés dans Subversion:
- propriétés versionnées (par exemple
svn: needs-lock
et svn: mime-type
) pouvant être définies sur des fichiers et des répertoires,
- propriétés non versionnées (révision) (par exemple,
svn: log
et svn: date
) définies dans le référentiel révisions .
Les propriétés versionnées ont un historique et peuvent être manipulées par des utilisateurs ordinaires disposant d'un accès en lecture / écriture à un référentiel. D'un autre côté, les propriétés non versionnées n'ont pas d'historique et servent principalement à la maintenance. Par exemple, si vous validez une révision, elle obtient immédiatement svn: date
avec l'heure UTC de votre validation, svn: author
avec votre nom d'utilisateur et svn: log
avec votre message de journal de validation (si vous en avez spécifié).
Comme je l’ai déjà indiqué, le script de raccordement pre-revprop-change
est destiné à contrôler les modifications des propriétés de révision. Vous ne voulez pas que toutes les personnes ayant accès à un référentiel puissent modifier toutes les propriétés de la révision, la modification de ces propriétés est donc interdite par défaut. Pour permettre aux utilisateurs de modifier les propriétés, vous devez créer le hook pre-revprop-change
.
Le hook le plus simple ne peut contenir qu'une seule ligne: exit 0
. Cela permettra à tout utilisateur authentifié de changer n'importe quelle propriété de révision et ne devrait pas être utilisé dans un environnement réel. Sous Windows, vous pouvez utiliser un script batch ou un script basé sur PowerShell pour implémenter une logique dans le hook pre-revprop-change
.
Ce script PowerShell permet de modifier uniquement la propriété svn: log
et refuse les messages de journal vides.
IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )
exit 1
goto :eof
:label1
exit 0
Ce script de lot autorise uniquement les " svnmgr " utilisateur pour modifier les propriétés de révision:
<*>.trim() -ne ""})
if ($datalines.length -lt 25)
{
# Log message is empty. Show the error.
[Console]::Error.WriteLine("Empty 'svn:log' properties are not allowed.")
exit 3
}
exit 0
Ce script de lot autorise uniquement les " svnmgr " utilisateur pour modifier les propriétés de révision:
<*>Pour les utilisateurs de PC: L'extension .bat ne fonctionnait pas pour moi lorsqu'elle était utilisée sur un serveur Windows Server. J'ai utilisé VisualSvn comme l'avait suggéré Django Reinhardt, qui a créé un hook avec une extension .cmd.