49 votes

Comment demander des messages de commit dans le serveur VisualSVN ?

Nous avons VisualSVN Server configuré comme notre serveur Subversion sur Windows, et nous utilisons Ankhsvn + TortoiseSVN comme clients sur nos stations de travail.

Comment configurer le serveur pour exiger que les messages commit ne soient pas vides ?

65voto

sylvanaar Points 5300

Je suis heureux que vous ayez posé cette question. C'est notre hook pre-commit script écrit en commun. Windows Batch . Il refuse le commit si le message du log est inférieur à 6 caractères. Il suffit de mettre le pre-commit.bat dans votre répertoire de crochets.

pre-commit.bat

setlocal enabledelayedexpansion

set REPOS=%1
set TXN=%2

set SVNLOOK="%VISUALSVN_SERVER%\bin\svnlook.exe"

SET M=

REM Concatenate all the lines in the commit message
FOR /F "usebackq delims==" %%g IN (`%SVNLOOK% log -t %TXN% %REPOS%`) DO SET M=!M!%%g

REM Make sure M is defined
SET M=0%M%

REM Here the 6 is the length we require
IF NOT "%M:~6,1%"=="" goto NORMAL_EXIT

:ERROR_TOO_SHORT
echo "Commit note must be at least 6 letters" >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1

REM All checks passed, so allow the commit.
:NORMAL_EXIT
exit 0

2 votes

J'ai une petite amélioration qui est utile dans la version 64bit de Windows 2008 : au lieu d'utiliser " C:\Program Fichiers \Vis... Utilisez des variables d'environnement Windows comme "%PROGRAMFILES%". \Vis.... "

4 votes

C'est une bonne pratique d'utiliser la variable d'environnement VISUALSVN_SERVER pour découvrir l'emplacement de svnlook. I.e. : set SVNLOOK="%VISUALSVN_SERVER%". \bin\svnlook.exe "

3 votes

@sylvanaar Nous utilisons ce hook depuis un certain temps (merci beaucoup !) mais après la mise à jour vers VisualSVN Server 2.5 et la mise à jour de notre référentiel, il a cessé de fonctionner. Commit bloqué par le hook pre-commit (code de sortie 1) avec la sortie : svnlook : E205000 : Essayez 'svnlook help' pour plus d'informations svnlook : E205000 : Too many arguments given Une idée ? Je pense que cela a à voir avec les espaces dans le chemin d'accès de svnlook mais je n'ai pas réussi à le résoudre.

37voto

Jason Jackson Points 11563

Le serveur VisualSVN 3.9 fournit les éléments suivants VisualSVNServerHooks.exe check-logmessage hook pre-commit qui vous aide à rejeter les commits avec des messages de log vides ou courts. Voir l'article KB140 : Validation des messages du journal de livraison dans VisualSVN Server pour les instructions.

Outre les fonctions intégrées VisualSVNServerHooks.exe Le serveur VisualSVN et le SVN en général utilisent un fichier de type nombre de crochets pour accomplir des tâches comme celle-ci.

  • start-commit - exécuté avant le début de la transaction de validation, peut être utilisé pour effectuer une vérification spéciale des autorisations.
  • pre-commit - s'exécute à la fin de la transaction, mais avant la validation. Souvent utilisé pour valider des choses telles qu'un message de journal de longueur non nulle.
  • post-commit - s'exécute après que la transaction ait été validée. Elle peut être utilisée pour envoyer des courriels ou sauvegarder un dépôt.
  • pre-revprop-change - s'exécute avant un changement de propriété de la révision. Peut être utilisé pour vérifier les permissions.
  • post-revprop-change - s'exécute après un changement de propriété de la révision. Peut être utilisé pour envoyer par courriel ou sauvegarder ces changements.

Vous devez utiliser le pre-commit crochet. Vous pouvez l'écrire vous-même dans à peu près n'importe quel langage supporté par votre plateforme, mais il existe un certain nombre de scripts sur le web. En tapant sur Google "svn precommit hook to require comment", j'en ai trouvé deux qui semblaient convenir :

2 votes

Quel est le code pour exiger x chars sur les commentaires pre-commit ?

0 votes

Vous devrez décider de la langue que vous souhaitez utiliser si vous écrivez votre propre accroche. Je me contenterais de trouver une accroche pré-rédigée pour répondre à vos besoins et d'essayer de la trouver dans une langue avec laquelle vous êtes à l'aise. Vous devrez peut-être modifier le code, ce qui ne devrait pas être trop difficile dans ce cas.

0 votes

L'écriture du script est le problème. Moi aussi, je n'arrive pas à trouver par magie un script qui dise à SVN de forcer les commentaires. J'ai aussi lutté avec cela. J'utilise Tortoise et le serveur Visual SVN. Ce n'est pas si facile quand vous n'avez aucun indice même en regardant les hooks existants.

17voto

Olaf Kock Points 18072

Les réponses techniques à votre question ont déjà été données. J'aimerais ajouter la réponse sociale, qui est : "En établissant des normes de messages d'engagement avec votre équipe et en les amenant à convenir (ou à accepter) des raisons pour lesquelles il faut expressif commettre des messages"

J'ai vu tellement de messages de livraison qui disaient "patch", "typo", "fix" ou similaire que j'en ai perdu le compte.

Vraiment - faites comprendre à tout le monde pourquoi vous en avez besoin.

Voici quelques exemples de raisons :

  • Changenotes générées (en fait, cela ferait un bel outil automatique pour faire respecter les bons messages si je sais qu'ils seront (avec mon nom) visibles publiquement, ne serait-ce que pour l'équipe).
  • Problèmes de licence : Vous pourriez avoir besoin de connaître l'origine du code plus tard, par exemple si vous voulez changer la licence de votre code (Certaines organisations ont même des normes pour le formatage des messages de commit - bien, vous pourriez automatiser la vérification pour cela, mais vous n'obtiendriez pas nécessairement buena messages d'engagement avec ceci)
  • Interopérabilité avec d'autres outils Par exemple, les systèmes de suivi des bogues et de gestion des problèmes qui s'interfacent avec votre système de gestion des versions et extraient des informations des messages de validation.

J'espère que cela vous aidera, en plus des réponses techniques sur les hooks precommit.

3 votes

J'ai travaillé pour une organisation qui allait même jusqu'à annuler systématiquement les commits sans messages de commit acceptables, surtout à l'approche de la publication.

6voto

bahrep Points 8212

Voici un échantillon en deux parties Batch + PowerShell hook pre-commit qui refuse de commiter un message de journal de moins de 25 caractères.

Mettez les deux pre-commit.bat y pre-commit.ps1 dans votre dépôt hooks dossier, par exemple C:\Repositories\repository\hooks\

pre-commit.ps1

# Store hook arguments into variables with mnemonic names
$repos    = $args[0]
$txn      = $args[1]

# Build path to svnlook.exe
$svnlook = "$env:VISUALSVN_SERVER\bin\svnlook.exe"

# Get the commit log message
$log = (&"$svnlook" log -t $txn $repos)

# Check the log message contains non-empty string
$datalines = ($log | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
  # Log message is empty. Show the error.
  [Console]::Error.WriteLine("Commit with empty log message is prohibited.")
  exit 3
}

exit 0

pre-commit.bat

@echo off
set PWSH=%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
%PWSH% -command $input ^| %1\hooks\pre-commit.ps1 %1 %2
if errorlevel 1 exit %errorlevel%

Note 1 : pre-commit.bat est le seul qui peut être appelé par VisualSVN et ensuite pre-commit.ps1 est celui qui est appelé par pre-commit.bat .

Note 2 : pre-commit.bat peut également être nommé pre-commit.cmd .

Note 3 : Si vous rencontrez des problèmes d'encodage avec certains caractères accentués et que l'option [Console]::Error.WriteLine puis ajoutez par exemple chcp 1252 sur pre-commit.bat la ligne suivante @echo off .

2 votes

Pour une raison quelconque $dataline est devenu un tableau de chaînes de caractères, plutôt qu'une ligne. J'ai donc changé cette ligne en $datalines = ($log | where {$_.trim() -ne ""}) -join "``n"

0 votes

Oui, -join "``n" est nécessaire, sinon elle échoue avec des messages de livraison de plusieurs lignes. Je ne peux pas expliquer pourquoi, je ne connais pas PS.

4voto

Ansgar Points 811

Ce que VisualSVN vous propose de saisir en tant que hooks sont des "scripts de commande Windows NT", qui sont en fait des fichiers batch.

Écrire if-then-else dans des fichiers batch est très laid et probablement très difficile à déboguer.

Il ressemblera à ce qui suit (recherchez pre-commit.bat) (non testé) :

SVNLOOK.exe log -t "%2" "%1" | grep.exe "[a-zA-Z0-9]" > nul || GOTO ERROR
GOTO OK
:ERROR
ECHO "Please enter comment and then retry commit!"
exit 1
:OK
exit 0 

Vous avez besoin d'un grep.exe sur le chemin, %1 est le chemin vers ce référentiel, %2 le nom de la txn sur le point d'être commité. Jetez également un coup d'œil au fichier pre-commit.tmpl dans le répertoire hooks de votre référentiel.

1 votes

Vous devez envoyer un écho à stderr afin de renvoyer le message au client - utilisez : ECHO "mauvais garçon" 1>&2

0 votes

Désolé, je ne suis pas un gourou des commandes NT script et je n'ai pas le temps d'en pirater une et de me taper la tête pour l'apprendre. Une chance que vous puissiez nous dire comment vérifier la longueur des commentaires ici ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X