La mejor estrategia para escribir ganchos para subversión en Windows [cerrado]

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

  •  08-06-2019
  •  | 
  •  

Pregunta

¿Cuál es la mejor manera de escribir? manos para Subversión en ventanas?Hasta donde yo sé, sólo se pueden utilizar archivos ejecutables.Entonces, ¿cuál es la mejor opción?

  • Archivos por lotes simples (muy limitados pero quizás correctos para soluciones muy simples)
  • Aplicaciones ejecutables compiladas dedicadas (¿un mazo para resumir?)
  • Alguna otra opción híbrida (como un archivo por lotes que ejecuta un script de Powershell)
¿Fue útil?

Solución

Acabo de pasar varios días postergando exactamente esta pregunta.Hay productos de terceros disponibles y muchos scripts PERL y Python, pero quería algo simple y un lenguaje con el que estuviera familiarizado, así que terminé escribiendo enlaces 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 esto en la confirmación previa agregando un archivo pre-commit.cmd a la carpeta de ganchos del repositorio con la siguiente línea:

[path]\PreCommit.exe %1 %2

Puede que consideres que esto es excesivo, pero en última instancia son solo unos minutos de codificación.Es más, obtienes la ventaja del conjunto de lenguajes .NET que, en mi humilde opinión, es mucho más preferible que las alternativas.Ampliaré significativamente mis enlaces y también escribiré pruebas apropiadas para ellos. ¡Es un poco difícil hacer esto con un archivo por lotes de DOS!

Por cierto, el código ha sido adaptado de esta publicación.

Otros consejos

Tenemos requisitos complejos como:

  1. Sólo ciertos usuarios pueden crear carpetas en 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 archivos solo se pueden almacenar en un subconjunto de directorios
  4. Además de varios más simples como Debe tener un comentario de confirmación.
  5. Regresión comprobable ejecutando un nuevo gancho contra todas las confirmaciones SVN anteriores

El número 5 es enorme para nosotros, no hay mejor manera de saber que no romperás los compromisos en el futuro que poder impulsar todos los compromisos anteriores a través de tu nuevo gancho.Hacer que el gancho entienda que 1234 era una revisión y 1234-1 era una transacción y realizar los cambios de argumento apropiados al llamar a svnlook, etc.Fue la mejor decisión que tomamos durante el proceso.

Para nosotros, la tuerca se volvió lo suficientemente grande como para que un exe de consola C# totalmente comprobable por unidad y comprobable por regresión 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 Windows con una fuerza laboral de desarrollo de .NET, probablemente lo habría escrito todo en Python, pero como es posible que otros necesiten admitirlo en el futuro, opté por .NET en lugar de .BAT, .VBS y Powershell.

Personalmente, creo que Powershell es lo suficientemente diferente de .NET como para ser prácticamente inútil como lenguaje de "scripting".Es bueno si la única línea cmd compatible con 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 objetos .NET normales, PS simplemente agrega una sintaxis loca y una estúpida Cortina de Hierro de Seguridad a lo que podría ser una pequeña aplicación .NET rápida y fácil.

Controlar Capitán Garfio, "un marco de complemento simple para escribir ganchos de Subversion usando .NET".

Dependiendo de la complejidad, cada situación es diferente. Si simplemente estoy moviendo archivos, escribiré un archivo por lotes rápido.Si quiero hacer algo más complejo, normalmente me saltearé la parte del scripting y escribiré un programa rápido en C# que pueda manejarlo.

La pregunta entonces es: ¿pones ese programa C# en svn y lo versionas? :)

editar: Los beneficios de una aplicación C# dedicada es que puedo reutilizar fragmentos de código para crear nuevos enlaces más adelante, incluida una salida de registro simple que creé para manejar el registro de enlaces.

He escrito ganchos en Pitón en Windows ya que hay muchos ejemplos en la red (normalmente para Linux pero las diferencias son pequeñas).También usamos Trac Está 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 desde scripts de enlace SVN.

Si tiene un ejecutable php con la ayuda de una clase php simple, puede escribir un script de enlace en php como se muestra aquí. http://www.devhands.com/2010/01/subversion-hook-php-framework-in/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top