2008-10-13 2 views
157

Je voulais modifier un commentaire de journal dans le navigateur du référentiel et j'ai reçu un message d'erreur indiquant qu'il n'y avait pas de hook de pré-modification-revprop pour le référentiel. En plus d'avoir un nom effrayant, qu'est-ce qu'un hook pre-revprop-change, et comment le créer?Qu'est-ce qu'un hook pre-revprop-change dans SVN, et comment le créer?

+15

maintenant ce lien est le deuxième, juste après un lien vers cette question :) – ULysses

+0

Le lien au sujet de mène à SVNBook 1.0 VERY obsolète. L'actuel est 1.7 et 1.8 (tous les soirs): http://svnbook.red-bean.com/fr/1.8/ – bahrep

Répondre

51

Fondamentalement, il s'agit d'un script lancé avant la modification de la propriété non versionnée dans 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 la distribution SVN pour différents hooks, situés dans le sous-répertoire/hooks (* .tmpl que vous devez modifier et renommer selon votre système d'exploitation, pour l'activer).

+2

Toutes les instructions sont dans le script de modèle de crochet. Si vous avez besoin du hook pour un miroir 'svnsync', alors le script par défaut devra être changé, car il ne permet que les modifications de svn: log. Svnsync change plus que cela, donc je mets simplement un 'exit 0' dedans pour permettre tous les changements de propriétés (puisque c'est un miroir pour moi seulement). –

+0

... puis enregistrez-le en tant que 'pre-revprop-change' dans le même répertoire et rendez-le exécutable pour l'utilisateur du serveur web (sous Linux). – Mateng

196

Pour Windows, voici un lien vers un fichier batch exemple qui permet que des modifications au message du journal (pas d'autres propriétés):

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

copie Fondamentalement 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 
+37

Pourrait avoir lié à la version là http://stackoverflow.com/questions/6155/common-types-of-subversion-hooks/68850#68850. J'ai écrit ce crochet et l'ai posté sur le forum SVN il y a un moment. Je suppose que j'aurais dû mettre des crédits dans les commentaires. –

+1

J'utilise ce script avec VisualSVN 2.0.8 et TortoiseSVN 1.6.11 et ça marche bien. –

+26

Vous pouvez modifier les crochets dans VisualSVN en cliquant avec le bouton droit sur le nom de votre référentiel dans VisualSVN Server et en sélectionnant "Propriétés ...". Vous verrez un onglet "Hooks". Là, vous verrez les différents types de crochets disponibles. Sélectionnez le bon, cliquez sur "Modifier" et collez le code ci-dessus. J'espère que cela aidera les utilisateurs de VisualSVN! –

11

Voici le lien vers la question de débordement de pile avec de nombreux crochets communs Common Types of Subversion Hooks, y compris la source originale du crochet pre-revprop-change pour Windows permuté ici.

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

1

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 suggéré par Django Reinhardt, et cela a créé un hook avec une extension .cmd.

6

Merci #patmortech

Et j'ajouté votre code qui « 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 
+0

Merci pour le bloc de script a travaillé pour moi. – Deepak

3

Le nom du script crochet n'est pas si effrayant si vous parvenez déchiffrer: il est propriété avant de révision crochet de changement. En résumé, le but du script hook pre-revprop-change est de contrôler les modifications des propriétés non versionnées (révision) 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: propriétés

  • propriétés versionnés (par exemple svn:needs-lock et svn:mime-type) qui peuvent être mis sur les fichiers et répertoires,
  • unversioned (révision) (par exemple svn:log et svn:date) qui sont définies 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 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 validation, svn:author avec votre nom d'utilisateur et svn:log avec votre message de validation (si vous l'avez spécifié).

Comme je l'ai déjà spécifié, le but du script hook pre-revprop-change est de contrôler les changements de propriétés de révision. Vous ne souhaitez pas que tous les utilisateurs ayant accès à 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 un crochet pre-revprop-change.

Le crochet le plus simple ne peut contenir qu'une seule ligne: exit 0. Il permettra à tout utilisateur authentifié de modifier 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 de traitement par lots ou un script basé sur PowerShell pour implémenter une logique au sein du hook pre-revprop-change.

Ce script PowerShell permet de modifier la propriété svn:log uniquement et de refuser 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 "svnmgr" utilisateur 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 
6

Pour Linux pour permettre 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, le renommer en pre-revprop-change
  • donne l'autorisation d'exécution au fichier (pour l'utilisateur du serveur, par ex. www-data)

Modifié: (grâce à lindes)

  • après que vous pourriez avoir à modifier le script pour renvoyer une valeur de sortie de 0 pour le genre de modifications que vous souhaitez autoriser .
+0

Ceci est insuffisant ... il faut encore modifier les valeurs de sortie de manière appropriée. Mais je l'ai trouvé utile de toute façon, comme un pointeur vers le bon endroit pour regarder ... que d'autres réponses manquaient, ou donnant des réponses spécifiques à Windows. Donc merci pour ça. – lindes

+0

Je suis assez sûr, dans ma version Ubuntu Linux copier et donner la permission était assez. Mais je ne sais plus avec certitude. J'ai édité la réponse en conséquence. Merci. –

+0

Eh bien, je suis certain que cela n'a pas fonctionné pour moi tel qu'il est quand je l'ai essayé il y a 2 jours, et j'ai ajouté ce commentaire. Avec le montage, cependant, cette réponse fonctionne pour moi. – lindes

Questions connexes