2008-08-07 10 views
17

¿Cuál es el mejor enfoque para escribir ganchos para Subversion en de Windows? Por lo que sé, solo se pueden usar archivos ejecutables. Entonces, ¿cuál es la mejor opción?mejor estrategia para escribir ganchos para la subversión en Windows

  • archivos por lotes simple (muy limitadas, pero tal vez OK para soluciones muy simples)
  • aplicaciones ejecutables compilados Dedicado (martillo para romper una cáscara de nuez?)
  • Algunos otra opción híbrida (como un archivo por lotes se ejecuta un Powershell script)

Respuesta

6

Acabo de pasar varios días posponiendo exactamente esta pregunta. Hay productos de terceros disponibles y muchas secuencias de comandos PERL y Python, pero quería algo simple y un lenguaje con el que estaba familiarizado, así que terminé escribiendo anzuelos en una aplicación de consola C#. Es muy sencillo:

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); 
} 

Luego, puede invocar esta en pre comprometerse mediante la adición de un archivo de pre-commit.cmd a la carpeta de los ganchos de la cesión temporal con la siguiente línea:

[path]\PreCommit.exe %1 %2 

Usted puede considere esta exageración, pero en última instancia son solo unos minutos de codificación. Además, obtiene la ventaja de la suite de idiomas .NET, que en mi humilde opinión es preferible a las alternativas. Expandiré significativamente mis anzuelos y también escribiré pruebas apropiadas contra ellos, ¡algo difícil de hacer con un archivo por lotes de DOS!

Por cierto, el código ha sido adaptado de this post.

1

Dependiendo de la complejidad, cada situación es diferente. Si solo estoy moviendo archivos, escribiré un archivo de lote rápido. Si quiero hacer algo más complejo, normalmente salteo la parte de scripting y escribo un programa rápido de C# que puede manejarlo.

La pregunta entonces es qué poner ese programa en C# en el SVN y lo han versionado :)

edición: Los beneficios de una aplicación dedicada C# es que puedo volver a utilizar fragmentos de código para crear nuevos ganchos más tarde, incluyendo una salida de registro simple que creé para manejar el registro de gancho.

1

He escrito ganchos en Python en Windows ya que hay muchos ejemplos en la red (generalmente para Linux pero las diferencias son pequeñas). También usamos Trac integrado con SVN y hay una API de Trac accesible a través de Python que nos permite crear/modificar automáticamente tickets de Trac a partir de scripts de gancho SVN.

2

Compruebe CaptainHook, "un marco de plugin simple para escribir ganchos de Subversion usando .NET".

+0

Asegúrese de que obtener el archivo de revisión también. Corrige 2x errores –

4

, Tenemos que requisitos complejos como:

  1. Sólo ciertos usuarios pueden crear carpetas en las partes del árbol SVN, pero todos pueden editar archivos allí
  2. Ciertas extensiones de archivo no pueden contener cierto texto en el archivo
  3. ciertas extensiones de archivo sólo se pueden almacenar en un subconjunto de directorios
  4. así como varios otros más sencillos como, debe tener un comentario cometer
  5. regresión comprobable por ru nning nuevo gancho contra todos los commit previos de SVN

# 5 es enorme para nosotros, no hay mejor manera de saber que no vas a romper compromisos para avanzar que poder enviar todas las confirmaciones anteriores a través de tu nuevo gancho. Hacer que el gancho comprenda que 1234 fue una revisión y 1234-1 fue una transacción y hacer los cambios de argumento apropiados al llamar a svnlook, etc. fue la mejor decisión que tomamos durante el proceso.

Para nosotros, la tuerca fue lo suficientemente grande como para que una consola totalmente comprobable, de regresión comprobable, la consola C# tuviera más sentido. Tenemos archivos de configuración que alimentan las restricciones del directorio, analizan el archivo httpd_authz existente para obtener usuarios "privilegiados", etc. Si no hubiéramos estado ejecutando en Windows con una fuerza de trabajo de desarrollo .NET, probablemente lo hubiera escrito todo en Python, pero ya que otros podrían necesitar apoyarlo en el futuro. Fui .NET sobre .BAT, .VBS, Powershell.

Personalmente, creo que Powershell es lo suficientemente diferente de .NET como para ser inútil en su mayoría como lenguaje de "scripting". Es bueno si la única línea de soporte cmd para un producto viene a través de PS (Exchange, Windows 2k8), etc., pero si todo lo que quiere hacer es analizar texto o acceder a los objetos .NET normales, PS solo agrega una sintaxis loca y estúpida Security Iron Cortina a lo que podría ser una pequeña y rápida aplicación .NET.

Cuestiones relacionadas