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

169

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'aucun hook pré-revprop-change n'existe 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?

Manu
la source
16
maintenant ce lien est le deuxième, juste après un lien vers cette question :)
ULysses
Le lien about mène à SVNBook 1.0 TRÈS obsolète. La version actuelle est 1.7 et 1.8 (tous les soirs): svnbook.red-bean.com/en/1.8
bahrep

Réponses:

52

Fondamentalement, c'est un script qui est lancé avant que la propriété non versionnée 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 distribution 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).

PW.
la source
2
Toutes les instructions se trouvent dans le script de modèle de hook. Si vous avez besoin du hook pour un svnsyncmiroir, le script par défaut devra être modifié, car il n'autorise que les modifications de svn: log. Svnsync change plus que cela, donc je mets simplement un exit 0là-dedans pour autoriser tous les changements de propriété (car c'est un miroir pour moi seulement).
Matt Connolly
... puis enregistrez-le pre-revprop-changedans le même répertoire et rendez-le exécutable pour l'utilisateur du serveur Web (sous Linux).
Mateng
209

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

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

Copiez le code ci-dessous dans un fichier texte, nommez-le pre-revprop-change.batet enregistrez-le dans le \hookssous - répertoire 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
patmortech
la source
37
Pourrait avoir lié à la version là stackoverflow.com/questions/6155/… . J'ai écrit ce hook et l'ai posté sur le forum SVN il y a quelque temps. Je suppose que j'aurais dû mettre quelques crédits dans les commentaires de crochet.
Philibert Perusse
1
J'utilise ce script avec VisualSVN 2.0.8 et TortoiseSVN 1.6.11 et cela fonctionne bien.
Mark Biek
27
Vous pouvez modifier les hooks 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". Vous y verrez les différents types de crochets disponibles. Sélectionnez le bon, cliquez sur "Modifier" et collez-y le code ci-dessus. J'espère que cela aide les utilisateurs de VisualSVN!
Chuck Le Butt
A travaillé pour moi en désactivant la ligne: si / je ne suis pas "% action%" == "M" goto ERROR_ACTION. Sinon, il n'arrêtait pas de dire que seules les modifications étaient autorisées.
Nathan
6
La méthode rapide et sale pour Windows consiste à créer un fichier vide appelé hooks \ pre-revprop-change.bat
Ben Claar
18

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

  • localisez le fichier pre-revprop-change.tmpldans le hooksrépertoire de votre référentiel
  • copiez le fichier dans le même répertoire, en le renommant pre-revprop-change
  • donner 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 0pour le type de modifications que vous souhaitez autoriser.
Alois Heimer
la source
C'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, en tant que pointeur vers le bon endroit pour regarder ... ce qui manquait à certaines autres réponses, ou pour donner des réponses spécifiques à Windows. Alors merci pour ça.
lindes
1
Je suis presque sûr que dans ma version Ubuntu Linux, copier et donner la permission était suffisant. Mais je ne sais plus avec certitude. J'ai modifié la réponse en conséquence. Merci.
Alois Heimer le
Eh bien, je suis certain que cela n'a pas fonctionné pour moi tel quel lorsque je l'ai essayé il y a 2 jours et que j'ai ajouté ce commentaire. Avec l'édition, cependant, cette réponse fonctionne pour moi.
lindes
11

Voici le lien vers la question de débordement de pile avec de nombreux hooks courants Types courants de hooks Subversion , y compris la source d'origine du pre-revprop-changehook pour Windows posté ici.

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

Philibert Perusse
la source
7

Merci #patmortech

Et j'ai 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
Yasin
la source
4

Le nom du script hook n'est pas si effrayant si vous parvenez à le déchiffrer: c'est un hook de changement de propriété avant révision . En bref, le but du pre-revprop-changescript hook 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 e-mail 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-locket svn:mime-type) qui peuvent être définies sur des fichiers et des répertoires,
  • propriétés non versionnées (révision) (par exemple svn:loget 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 accès en lecture / écriture à un référentiel. D'autre part, les propriétés non versionnées n'ont pas d'historique et servent principalement à des fins de maintenance. Par exemple, si vous validez une révision, elle obtient immédiatement l' svn:dateheure UTC de votre validation, svn:authorvotre nom d'utilisateur et svn:logvotre message de journal de validation (si vous en avez spécifié un).

Comme je l'ai déjà spécifié, le but du pre-revprop-changescript hook est de 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 révision, donc 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 pre-revprop-changehook.

Le crochet simple peut contenir une seule ligne: exit 0. Il permettra à tout utilisateur authentifié de modifier toute propriété de révision et il ne doit pas être utilisé dans un environnement réel. Sous Windows, vous pouvez utiliser un script de commandes ou un script basé sur PowerShell pour implémenter une logique dans le pre-revprop-changehook.

Ce script PowerShell permet svn:loguniquement de modifier la propriété 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
bahrep
la source
2

Pour les utilisateurs de PC: L'extension .bat ne fonctionnait pas pour moi lorsqu'elle était utilisée sur Windows Server maching. J'ai utilisé VisualSvn comme Django Reinhardt l'a suggéré, et il a créé un hook avec une extension .cmd.

noti
la source
0
  1. Accédez au répertoire SVN repo dans le sous-dossier "hooks", par exemple "D: \ SVN \ hooks \"
  2. créer le fichier vide "pre-revprop-change.bat" ici
  3. dans le fichier, écrivez "exit 0" (sans "") et enregistrez-le
  4. prendre plaisir :)

(Cette solution a sûrement des inconvénients, car rien n'est vérifié / interdit. Mais pour mon cas - un dépôt local que je n'utilise que moi - cela semble fonctionner.)

Janis
la source