tutorial tortoise repositorio español entrar desvincular crear carpeta svn hook svn-hooks

repositorio - tortoise svn server



La mejor estrategia para escribir ganchos para la subversión en Windows (6)

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

  • Archivos simples por lotes (muy limitados pero quizás aceptables para soluciones muy simples)
  • Aplicaciones ejecutables compiladas dedicadas (mazo para romper una cáscara de nuez?)
  • Alguna otra opción híbrida (como un archivo de proceso por lotes que ejecuta un script de Powershell)

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 es si pones ese programa c # en svn y lo tienes versionado :)

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


He escrito anzuelos 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 los tickets de Trac desde los scripts de gancho de SVN.


Consulte CaptainHook , "un marco de complemento simple para escribir enlaces de Subversion usando .NET".


Tenemos requisitos complejos como:

  1. Solo 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 algunos más simples como, debe tener un comentario de compromiso
  5. Regresión comprobable ejecutando un nuevo enlace contra todos los commit anteriores de SVN

# 5 es enorme para nosotros, no hay mejor manera de saber que no vas a romper compromisos para avanzar que para poder impulsar 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 un exe de consola C # totalmente comprobable y comprobable por regresión tenga 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.


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 directo:

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

A continuación, puede invocar esto en la confirmación previa agregando un archivo pre-commit.cmd a la carpeta hooks del repositorio con la siguiente línea:

[path]/PreCommit.exe %1 %2

Puede considerar 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 esta publicación .