web-dev-qa-db-fra.com

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

162
Manu

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

51
PW.

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

Pour que Linux permette l'édition d'un commentaire de journal,

  • localiser 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 pre-revprop-change
  • donnez l'autorisation d'exécution au fichier (pour l'utilisateur du serveur, par exemple www-data)

Edité: (merci à 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.
15
Alois Heimer

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.

11
Philibert Perusse

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

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:

  • propriétés versionnées (par exemple svn:needs-lock et svn:mime-type) pouvant être configurés sur des fichiers et des répertoires,
  • propriétés non révisées (révision) (par exemple, 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
4
bahrep

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.

2
noti