update - svn pre-commit hook example




Meilleure stratégie pour écrire des hooks pour subversion dans Windows (4)

Quelle est la meilleure approche pour écrire des hooks pour Subversion sous Windows ? Pour autant que je sache, seuls les fichiers exécutables peuvent être utilisés. Alors, quel est le meilleur choix?

  • Fichiers batch simples (très limités mais peut-être OK pour des solutions très simples)
  • Applications exécutables compilées dédiées (marteau de fond pour casser une coquille de noix?)
  • Un autre choix hybride (comme un fichier batch exécutant un script Powershell)

Selon la complexité, chaque situation est différente. Si je ne fais que déplacer des fichiers, je vais écrire un fichier batch rapide. Si je veux faire quelque chose de plus complexe, normalement, sautez simplement la partie script et écrivez un programme c # rapide qui peut le gérer.

La question est alors de mettre ce programme c # dans svn et de l'avoir versionné :)

edit: Les avantages d'une application c # dédiée sont que je peux réutiliser des fragments de code pour créer de nouveaux hooks plus tard, y compris une sortie de journal simple que j'ai créée pour gérer la journalisation du hook.


J'ai écrit des hooks en Python sur Windows car il y a beaucoup d'exemples sur le net (généralement pour Linux mais les différences sont minimes). Nous utilisons également Trac intégré avec SVN et une API Trac accessible via Python qui nous permet de créer / modifier automatiquement des tickets Trac à partir de scripts hook SVN.


Nous avons des exigences complexes comme:

  1. Seuls certains utilisateurs peuvent créer des dossiers dans certaines parties de l'arborescence SVN, mais tout le monde peut y modifier les fichiers
  2. Certaines extensions de fichiers ne peuvent pas contenir certains textes dans le fichier
  3. Certaines extensions de fichiers ne peuvent être stockées que dans un sous-ensemble de répertoires
  4. Ainsi que plusieurs plus simples comme, Doit avoir un commentaire de validation
  5. Régression testable en exécutant un nouveau hook sur toutes les validations SVN précédentes

# 5 est énorme pour nous, il n'y a pas de meilleure façon de savoir que vous n'allez pas casser les commits en avant que de pouvoir pousser tous les commits précédents à travers votre nouveau crochet. Faire le crochet comprendre que 1234 était une révision et 1234-1 était une transaction et en faisant les changements d'argument appropriés en appelant svnlook, etc. était la meilleure décision que nous avons prise pendant le processus.

Pour nous, l'écrou est devenu assez grand pour être testable à l'unité, la régression testable, C # console exe fait le plus de sens. Nous avons des fichiers de configuration qui alimentent les restrictions d'annuaire, analysent le fichier httpd_authz existant pour obtenir des utilisateurs "privilégiés", etc. Si nous n'avions pas fonctionné sur Windows avec un travail de développement .NET, j'aurais probablement tout écrit en Python, mais puisque d'autres pourraient avoir besoin de le soutenir à l'avenir, je suis allé .NET sur .BAT, .VBS, Powershell sottise.

Personnellement, je pense que Powershell est assez différent de .NET pour être inutile en tant que langage de «scripting». C'est bien si le seul support de ligne cmd pour un produit vient via PS (Exchange, Windows 2k8), etc. mais si tout ce que vous voulez faire est d'analyser du texte ou d'accéder aux objets .NET classiques PS ajoute juste une syntaxe folle et stupide Rideau à ce qui pourrait être une petite application .NET rapide et facile.


Je viens de passer plusieurs jours à tergiverser à propos de cette question. Il y a des produits de tiers disponibles et beaucoup de scripts PERL et Python mais je voulais quelque chose de simple et une langue que je connaissais donc fini par écrire des crochets dans une application console C #. C'est très simple:

public void Main(string[] args)
{
  string repositories = args[0];
  string transaction = args[1];

  var processStartInfo = new ProcessStartInfo
                           {
                             FileName = "svnlook.exe",
                             UseShellExecute = false,
                             CreateNoWindow = true,
                             RedirectStandardOutput = true,
                             RedirectStandardError = true,
                             Arguments = String.Format("log -t \"{0}\" \"{1}\"", transaction, repositories)
                           };

  var p = Process.Start(processStartInfo);
  var s = p.StandardOutput.ReadToEnd();
  p.WaitForExit();

  if (s == string.Empty)
  {
    Console.Error.WriteLine("Message must be provided");
    Environment.Exit(1);
  }

  Environment.Exit(0);
}

Vous pouvez ensuite invoquer ceci sur pre commit en ajoutant un fichier pre-commit.cmd au dossier hooks du repo avec la ligne suivante:

[path]\PreCommit.exe %1 %2

Vous pouvez considérer cette surexploitation mais, finalement, ce n'est que quelques minutes de codage. Qui plus est, vous obtenez l'avantage de la suite linguistique .NET qui est à mon avis de loin préférable aux alternatives. Je vais étendre mes hooks de manière significative et écrire les tests appropriés contre eux aussi - un peu difficile à faire avec un fichier batch DOS!

BTW, le code a été adapté de ce post .





svn-hooks