Meilleure stratégie pour écrire des hooks pour Subversion sous Windows [fermé]

StackOverflow https://stackoverflow.com/questions/5134

  •  08-06-2019
  •  | 
  •  

Question

Quelle est la meilleure approche pour écrire crochets pour Subversion dans les fenêtres?À ma connaissance, 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 (un marteau pour casser une coquille ?)
  • Un autre choix hybride (comme un fichier batch exécutant un script Powershell)
Était-ce utile?

La solution

Je viens de passer plusieurs jours à tergiverser sur exactement cette question.Il existe des produits tiers disponibles et de nombreux scripts PERL et Python, mais je voulais quelque chose de simple et un langage que je connaissais, j'ai donc fini par écrire des hooks 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 l'invoquer lors du pré-commit en ajoutant un fichier pre-commit.cmd au dossier hooks du dépôt avec la ligne suivante :

[path]\PreCommit.exe %1 %2

Vous pouvez considérer cela comme excessif, mais en fin de compte, cela ne représente que quelques minutes de codage.De plus, vous bénéficiez de l'avantage de la suite de langage .NET qui, à mon humble avis, est de loin préférable aux alternatives.Je vais étendre considérablement mes hooks et écrire également des tests appropriés contre eux – un peu difficile à faire avec un fichier batch DOS !

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

Autres conseils

Nous avons des exigences complexes telles que :

  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. Ainsi que plusieurs plus simples comme, Doit avoir un commentaire de validation
  5. Régression testable en exécutant un nouveau hook sur tous les commits SVN précédents

Le numéro 5 est énorme pour nous, il n'y a pas de meilleur moyen de savoir que vous n'allez pas rompre les commits à l'avenir que de pouvoir pousser tous les commits précédents via votre nouveau hook.Faire comprendre au hook que 1234 était une révision et 1234-1 était une transaction et apporter les modifications d'argument appropriées lors de l'appel de svnlook, etc.a été la meilleure décision que nous ayons prise au cours du processus.

Pour nous, l'écrou est devenu suffisamment gros pour qu'un exe de console C# entièrement testable par unité et testable par régression ait le plus de sens.Nous avons des fichiers de configuration qui alimentent les restrictions de répertoire, analysent le fichier httpd_authz existant pour obtenir des utilisateurs « privilégiés », etc.Si nous n'avions pas fonctionné sous Windows avec une équipe de développement .NET, j'aurais probablement tout écrit en Python, mais comme d'autres pourraient avoir besoin de le prendre en charge à l'avenir, j'ai opté pour .NET sur .BAT, .VBS, la bêtise Powershell.

Personnellement, je pense que Powershell est suffisamment différent de .NET pour être pratiquement inutile en tant que langage de « script ».C'est bien si la seule prise en charge de la ligne cmd pour un produit provient via PS (Exchange, Windows 2k8), etc.mais si tout ce que vous voulez faire est d'analyser du texte ou d'accéder à des objets .NET classiques, PS ajoute simplement une syntaxe folle et un stupide rideau de fer de sécurité à ce qui pourrait être une petite application .NET rapide et facile.

Vérifier Capitaine Crochet, "un framework de plugin simple pour écrire des hooks Subversion à l'aide de .NET".

En fonction de la complexité, chaque situation est différente. Si je déplace simplement des fichiers, j'écrirai un fichier batch rapide.Si je veux faire quelque chose de plus complexe, je saute normalement la partie script et j'écris un programme C# rapide qui peut le gérer.

La question est alors de savoir si vous mettez ce programme C# dans svn et le faites-le versionner :)

modifier: L'avantage d'une application C# dédiée est que je peux réutiliser des fragments de code pour créer de nouveaux hooks ultérieurement, y compris une simple sortie de journal que j'ai créée pour gérer la journalisation des hooks.

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

Si vous avez un exécutable php à l'aide d'une simple classe php, vous pouvez écrire un script hook en php comme indiqué ici http://www.devhands.com/2010/01/subversion-hook-php-framework-in/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top