2008-08-07 37 views
17

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

  • fichiers batch lisses (très limités, mais peut-être OK pour des solutions très simples)
  • applications exécutables compilés dédiés (marteau de forgeron pour casser un mot?)
  • Certains autres choix hybrides (comme un fichier de commandes en cours d'exécution d'un Powershell script)

Répondre

6

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#. Il est très direct:

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 alors invoquer ce sur la pré engager en ajoutant un fichier pré-commit.cmd dans le dossier hooks du repo avec la ligne suivante:

[path]\PreCommit.exe %1 %2 

Vous pouvez Considérez cela exagéré mais finalement c'est seulement quelques minutes de codage. De plus, vous bénéficiez de l'avantage de la suite linguistique .NET, qui est 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! Par défaut, le code a été adapté de this post.

1

En fonction de 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 vous mettre ce programme C# dans svn et l'ont versionné :)

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

1

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

2

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

+0

Marque se assurer aussi le fichier de patch. Il corrige 2 bugs –

4

Nous avons des exigences complexes comme:

  1. Seuls certains utilisateurs peuvent créer des dossiers dans certaines parties de l'arbre SVN, mais tout le monde peut éditer les fichiers, il
  2. extensions de fichiers Certains ne peuvent pas contenir certains textes dans le fichier
  3. Certaines extensions de fichiers ne peuvent être stockés dans un sous-ensemble des répertoires
  4. ainsi que plusieurs plus simples comme, doit avoir un commit commentaire
  5. régression testable par ru nning nouveau crochet contre tous SVN précédent engage

# 5 est énorme pour nous, il n'y a pas de meilleure façon de savoir que vous n'êtes pas va pause engage aller de l'avant que d'être en mesure de pousser tous les précédents engage par 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 "script". 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.