2008-08-07 10 views
17

Jakie jest najlepsze podejście do pisania haki dla Subversion w systemu Windows? O ile mi wiadomo, mogą być używane tylko pliki wykonywalne. Jaki jest najlepszy wybór?Najlepsza strategia pisać haczyki do dywersji w Windows

  • Plain plików wsadowych (bardzo ograniczony, ale może OK na bardzo prostych rozwiązań)
  • poświęconej skompilowane pliki wykonywalne (młot do zgryzienia pigułce?)
  • niektórych innych hybryd wybór (jak plik wsadowy uruchomiony PowerShell skrypt)

Odpowiedz

6

Właśnie spędziłem kilka dni na zwlekaniu z tym właśnie pytaniem. Dostępne są produkty innych firm i mnóstwo skryptów PERL i Python, ale chciałem czegoś prostego i języka, który znałem, skończyło się na pisaniu haków w aplikacji C#. To bardzo proste:

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

Następnie można powoływać się na ten sprzed popełnienia przez dodanie wstępnie commit.cmd plik do folderu haczyki repo z następującą linię:

[path]\PreCommit.exe %1 %2 

Użytkownik może rozważcie tę przesadę, ale ostatecznie to tylko kilka minut kodowania. Co więcej, masz przewagę w pakiecie językowym .NET, który IMHO jest zdecydowanie lepszy niż alternatywy. Znacznie poszerzę haki i piszę odpowiednie testy przeciwko nim - trochę trudniej to zrobić z plikiem wsadowym DOS!

BTW, kod został zaadaptowany z this post.

1

W zależności od złożoności, każda sytuacja jest inna, jeśli po prostu przenoszę pliki dookoła, napiszę szybki plik wsadowy. Jeśli chcę zrobić coś bardziej skomplikowanego Zwykle po prostu pomijam część skryptową i piszę szybki program C#, który może sobie z tym poradzić.

Powstaje zatem pytanie czy umieścić ten program C# w SVN i mieć go wersjami :)

EDIT: Korzyści z dedykowanej aplikacji C# jest to, że mogę ponownie wykorzystać fragmenty kodu, aby tworzyć nowe haki później w tym proste wyjście logu, które utworzyłem do obsługi rejestrowania haków.

1

Napisałem haki w Python w systemie Windows, ponieważ istnieje wiele przykładów w Internecie (zazwyczaj dla systemu Linux, ale różnice są niewielkie). Używamy również Trac zintegrowanego z SVN i istnieje Trac API dostępny przez Python, który pozwala nam automatycznie tworzyć/modyfikować bilety Trac ze skryptów przechwytujących SVN.

2

Sprawdź CaptainHook, "prosty framework pluginu do pisania haków Subversion przy użyciu .NET".

+0

Upewnij się, że dostać się patch też. Naprawia dwa błędy: –

4

Mamy złożone wymagania, takie jak:

  1. tylko niektórzy użytkownicy mogą tworzyć foldery w częściach drzewa SVN, ale każdy może edytować pliki tam
  2. Niektóre rozszerzenia plików nie mogą zawierać pewien tekst w pliku
  3. Niektóre rozszerzenia plików mogą być przechowywane jedynie w podgrupie katalogów
  4. jak również kilka prostszych, takich jak, musi mieć popełnić komentarz
  5. Regresja dającej się przetestować przez ru Nina nowego haka przeciwko wszystkim poprzednim zatwierdzeniom SVN

# 5 jest dla nas ogromny, nie ma lepszego sposobu, aby się dowiedzieć, że nie zamierzasz przełamać popełnianych postępów, niż móc przesuwać wszystkie wcześniejsze zatwierdzenia przez nowy hak. Zrozumienie, że 1234 było poprawką, a 1234-1 było transakcją i dokonanie odpowiednich zmian argumentów podczas wywoływania svnlook itp. Było najlepszą decyzją, którą podjęliśmy podczas tego procesu.

Dla nas nakrętka była na tyle duża, że ​​w pełni testowalna, testowana regresja, konsola C# miała sens. Mamy pliki konfiguracyjne, które zasilają ograniczenia katalogów, parsujemy istniejący plik httpd_authz, aby uzyskać "uprzywilejowanych" użytkowników itp. Gdybyśmy nie pracowali w systemie Windows z pracą programistyczną .NET, prawdopodobnie napisałbym to wszystko w Pythonie, ale ponieważ inni mogą potrzebować obsługiwać go w przyszłości, poszedłem .NET przez .BAT, .VBS, głupota Powershell.

Osobiście uważam, że Powershell jest wystarczająco różny od .NET, aby być w większości bezużytecznym językiem "skryptowym". Dobrze, jeśli jedyną dostępną opcją produktu cmd jest PS (Exchange, Windows 2k8) itd., Ale jeśli chcesz tylko parsować jakiś tekst lub uzyskać dostęp do zwykłych obiektów .NET, PS dodaje tylko szaloną składnię i głupie Security Iron Zasłona na coś, co może być szybką i łatwą aplikacją .NET.

Powiązane problemy