Domanda

Qual è l'approccio migliore per scrivere ganci per Sovversione In finestre?Per quanto ne so, è possibile utilizzare solo file eseguibili.Allora qual è la scelta migliore?

  • File batch semplici (molto limitati ma forse OK per soluzioni molto semplici)
  • Applicazioni eseguibili compilate dedicate (mazza per rompere un guscio di noce?)
  • Qualche altra scelta ibrida (come un file batch che esegue uno script Powershell)
È stato utile?

Soluzione

Ho appena passato diversi giorni a procrastinare proprio su questa domanda.Sono disponibili prodotti di terze parti e molti script PERL e Python, ma volevo qualcosa di semplice e un linguaggio con cui avevo familiarità, quindi ho finito per scrivere solo hook in un'app console C#.È molto semplice:

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

Puoi quindi invocarlo sul pre commit aggiungendo un file pre-commit.cmd alla cartella hooks del repository con la seguente riga:

[path]\PreCommit.exe %1 %2

Potresti considerarlo eccessivo, ma alla fine sono solo pochi minuti di codifica.Inoltre, ottieni il vantaggio della suite linguistica .NET che IMHO è di gran lunga preferibile alle alternative.Espanderò i miei hook in modo significativo e scriverò anche test appropriati contro di essi: è un po' difficile farlo con un file batch DOS!

A proposito, il codice è stato adattato da questo post.

Altri suggerimenti

Abbiamo requisiti complessi come:

  1. Solo alcuni utenti possono creare cartelle in parti dell'albero SVN, ma tutti possono modificare i file lì
  2. Alcune estensioni di file non possono contenere determinato testo nel file
  3. Alcune estensioni di file possono essere archiviate solo in un sottoinsieme di directory
  4. Oltre a molti altri più semplici come, Deve avere un commento di commit
  5. Regressione testabile eseguendo un nuovo hook rispetto a tutti i precedenti commit SVN

Il punto 5 è enorme per noi, non c'è modo migliore per sapere che non interromperai i commit andando avanti piuttosto che essere in grado di spingere tutti i commit precedenti attraverso il tuo nuovo hook.Far capire all'hook che 1234 era una revisione e 1234-1 era una transazione e apportare le modifiche appropriate all'argomento quando si chiama svnlook, ecc.è stata la decisione migliore che abbiamo preso durante il processo.

Per noi il problema è diventato abbastanza grande da rendere più sensato un file eseguibile per console C# completamente testabile dall'unità e testabile con la regressione.Abbiamo file di configurazione che alimentano le restrizioni della directory, analizzano il file httpd_authz esistente per ottenere utenti "privilegiati", ecc.Se non avessimo utilizzato Windows con una forza lavoro di sviluppo .NET, probabilmente avrei scritto tutto in Python, ma poiché altri potrebbero aver bisogno di supportarlo in futuro, sono passato a .NET su .BAT, .VBS, stupidità di Powershell.

Personalmente penso che Powershell sia abbastanza diverso da .NET da essere per lo più inutile come linguaggio di "scripting".Va bene se l'unico supporto della riga cmd per un prodotto arriva tramite PS (Exchange, Windows 2k8), ecc.ma se tutto ciò che vuoi fare è analizzare del testo o accedere a normali oggetti .NET, PS aggiunge semplicemente una sintassi folle e una stupida cortina di ferro di sicurezza a quella che potrebbe essere una piccola app .NET facile e veloce.

Controllo Capitan Uncino, "un semplice framework di plugin per scrivere hook Subversion utilizzando .NET".

A seconda della complessità, ogni situazione è diversa. Se sto semplicemente spostando i file, scriverò un file batch veloce.Se voglio fare qualcosa di più complesso normalmente salterò semplicemente la parte di scripting e scriverò un veloce programma C# in grado di gestirlo.

La domanda quindi è: metti quel programma C# in svn e ne hai la versione :)

modificare: Il vantaggio di un'applicazione c# dedicata è che posso riutilizzare frammenti di codice per creare nuovi hook in un secondo momento, incluso un semplice output di log che ho creato per gestire la registrazione degli hook.

Ho scritto degli hook Pitone su Windows poiché ci sono molti esempi in rete (di solito per Linux ma le differenze sono piccole).Usiamo anche Trac integrato con SVN ed è presente un'API Trac accessibile tramite Python che ci consente di creare/modificare automaticamente i ticket Trac dagli script hook SVN.

Se hai un eseguibile php con l'aiuto di una semplice classe php puoi scrivere uno script hook in php come mostrato qui http://www.devhands.com/2010/01/subversion-hook-php-framework-in/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top