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'il n'y avait pas de hook pre-revprop-change 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?
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).
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
Fondamentalement, copiez le code ci-dessous dans un fichier texte et nommez-le pre-revprop-change.bat
et enregistrez-le dans le \hooks
sous-répertoire pour 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 permette l'édition d'un commentaire de journal,
pre-revprop-change.tmpl
dans le répertoire hooks
de votre référentielpre-revprop-change
www-data
)Edité: (merci à Lindes)
0
pour le type de modifications que vous souhaitez autoriser.Voici le lien vers la question de débordement de pile avec de nombreux crochets communs types courants de crochets Subversion , y compris la source originale du pre-revprop-change
crochet pour Windows croisé 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
Le nom du script de hook n'est pas si effrayant si vous gérez le déchiffrer: c'est hook de changement de propriété de pré-révision . En bref, le but de pre-revprop-change
Le script de hook sert à 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:
svn:needs-lock
et svn:mime-type
) pouvant être configurés sur des fichiers et des répertoires,svn:log
et svn:date
) qui sont définis sur 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 commit, 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à précisé, le but de pre-revprop-change
Le script de hook sert à 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 pre-revprop-change
crochet.
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 pre-revprop-change
crochet.
Ce script PowerShell permet de changer svn:log
propriété uniquement 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 {$_.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 batch permet uniquement à l'utilisateur "svnmgr" de modifier les propriétés de révision:
IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )
exit 1
goto :eof
:label1
exit 0
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 Django) Reinhardt a suggéré, et cela a créé un crochet avec une extension .cmd.