Qu’est-ce qu’un hook pre-revprop-change dans SVN et comment le créer?

Je voulais éditer un commentaire de journal dans le navigateur de référentiel et reçu un message d’erreur indiquant qu’il n’existe aucun hook pré-revprop-change pour le référentiel. En plus d’avoir un nom effrayant, qu’est-ce qu’un hook pré-revprop-change, et comment le créer?

Fondamentalement, 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 sur votre référentiel.

Il existe des modèles dans la dissortingbution 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, à activer).

Pour Windows, voici un lien vers un exemple de fichier de commandes qui n’autorise que les modifications du message de journal (pas les autres propriétés):

http://ayria.livejournal.com/33438.html

Copiez essentiellement le code ci-dessous dans un fichier texte et nommez-le pre-revprop-change.bat et 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 

Voici le lien vers la question de débordement de la stack avec de nombreux hooks communs Types communs de crochets Subversion , y compris la source originale du pre-revprop-change pour Windows croisé ici.

Vous devriez vous y référer car ils peuvent s’améliorer avec le temps.

Pour Linux autoriser l’édition d’un commentaire de journal,

  • localisez le fichier pre-revprop-change.tmpl dans le répertoire hooks de votre référentiel
  • copier le fichier dans le même répertoire, en le renommant en pre-revprop-change
  • donner une autorisation d’exécution au fichier (pour l’utilisateur du serveur, par exemple, www-data )

Édité: (merci à lindes)

  • Après cela, vous devrez peut-être modifier le script pour renvoyer une valeur de sortie égale à 0 pour le type de modifications à autoriser.

Merci #patmortech

Et j’ai ajouté votre code “seul le même utilisateur peut changer 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 gérez le déchiffrement, le nom du script de hook n’est pas si effrayant: il s’agit d’ un hook de changement de propriété avant la révision . En bref, le script de hook pre-revprop-change pour but de contrôler les modifications des propriétés (version) sans version et d’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:

  • des 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,
  • les propriétés non révisées (révision) (par exemple svn:log et svn:date ) définies sur les révisions du référentiel.

Les propriétés versionnées ont un historique et peuvent être manipulées par des utilisateurs ordinaires disposant d’un access en lecture / écriture à un référentiel. En revanche, les propriétés sans version n’ont aucun historique et servent principalement à des fins de maintenance. Par exemple, si vous validez une révision, elle reçoit 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 validation (si vous en avez spécifié).

Comme je l’ai déjà indiqué, le script de hook pre-revprop-change pour but de contrôler les modifications des propriétés de révision. Vous ne voulez pas que tous ceux qui ont access à un référentiel puissent modifier toutes les propriétés de révision. Par conséquent, la modification des propriétés de révision est interdite par défaut. Pour permettre aux utilisateurs de modifier les propriétés, vous devez créer pre-revprop-change .

Le hook le plus simple ne peut contenir qu’une seule ligne: exit 0 . Cela permettra à tout utilisateur authentifié de modifier une propriété de révision et il ne devrait pas être utilisé dans un environnement réel. Sous Windows, vous pouvez utiliser un script de commandes ou un script PowerShell pour implémenter une logique dans le 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 {$_.sortingm() -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 la 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 Windows Server. J’ai utilisé VisualSvn comme l’a suggéré Django Reinhardt, et il a créé un hook avec une extension .cmd.