Meilleure stratégie pour écrire des hooks pour subversion dans Windows

Quelle est la meilleure approche pour écrire des hooks pour Subversion dans 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)
  • Des applications exécutables compilées dédiées (un marteau pour casser une coquille de noix?)
  • Un autre choix hybride (comme un fichier batch exécutant un script Powershell)
0

6 Réponses

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: The benefits of a dedicated C# application is that I can reuse code fragments to create new hooks later, including a simple log output I created to handle hook logging.

0
ajouté

Je viens juste 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 surpuissance, mais finalement, ce n'est que quelques minutes de codage. Quoi de plus, vous obtenez l'avantage de la suite linguistique .NET, qui est de loin préférable à mes alternatives. Je vais étendre mes crochets de manière significative et écrire des tests appropriés contre eux aussi bien? peu difficile à faire avec un fichier batch DOS!

BTW, le code a été adapté de cet article .

0
ajouté

Cochez CaptainHook , "un cadre de plugin simple pour écrire des hooks Subversion en utilisant .NET".

0
ajouté
Assurez-vous d'obtenir le fichier de correctif aussi. Il corrige 2 bugs
ajouté l'auteur Greg Woods, source

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

0
ajouté

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 des 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. Aussi bien que plusieurs plus simples comme, Doit avoir un commentaire de validation
  5. Régression testable en exécutant un nouveau hook sur toutes les précédentes validations SVN

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

0
ajouté

If you have a PHP executable with a help of simple PHP class you may write hook script in PHP like it is shown here http://www.devhands.com/2010/01/subversion-hook-php-framework-in/

0
ajouté
Cela ne fonctionne pas sur Windows, vous devez avoir un fichier batch ou exe qui lance le script PHP.
ajouté l'auteur Joeri Sebrechts, source