Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

arkadiusz.wasniewski

Hook scripts w C#

W strukturze katalogów składających się na repozytorium Subversion znajduje się folder o nazwie hooks. Zawiera on skrypty przechwytujące (hook scripts). Skrypty te wywoływane są w momencie zajścia w repozytorium określonego zdarzenia. Może to być np. żądanie zablokowania zasobu czy próba zatwierdzenia zmian. Przypisanie do zdarzenia następuje poprzez nadanie skryptowi odpowiedniej, rozpoznawalnej przez SVN nazwy. Mimo stosowania pojęcia skrypt, mogą to być tak naprawdę dowolne pliki wykonywalne. Nic nie stoi na przeszkodzie, abyśmy wykorzystali w tej roli język C#.

Domyślnie Subversion pozwala na zatwierdzenie zmian w repozytorium bez podania informacji (komunikatu). Najwłaściwszym miejscem do cofnięcia transakcji, która nie posiada wypełnionego logu jest zdarzenie pre-commit wywoływane przed ostatecznym zatwierdzeniem zmian. Tworzymy w związku z tym projekt typu ConsoleApplication, w którym zmieniamy wpierw nagłówek metody Main a następnie wypełniamy kodem:

    static int Main(string[] args)

    {

        string repositoryPath = args[0];

        string transactionName = args[1];

 

        Process process = new Process();

        process.StartInfo.FileName = "svnlook.exe";

        process.StartInfo.Arguments = string.Format("log -t {0} {1}",

            transactionName, repositoryPath);

        process.StartInfo.UseShellExecute = false;

        process.StartInfo.RedirectStandardOutput = true;

        process.StartInfo.CreateNoWindow = true;

        process.Start();

        string output = process.StandardOutput.ReadToEnd();

        process.WaitForExit();

 

        Regex regex = new Regex("[a-zA-Z0-9]");

        if (regex.IsMatch(output))

        {

            return 0;

        }

        else

        {

            Console.Error.WriteLine("Brak opisu poczynionych zmian.");

            return 1;

        }

    }

Subversion dla tego zdarzenia w parametrach wywołania umieszcza informacje o ścieżce dostępu do repozytorium oraz o numerze przeprowadzanej transakcji. Wykorzystujemy te parametry do wywołania programy svnlook, który z parametrem -t przekaże nam strumień będący zawartością wpisanego przez użytkownika komunikatu. Jeśli nie ma żadnych informacji to zwracamy wartość różną od zera oraz wiadomość, którą chcemy wyświetlić zapominalskiemu użytkownikowi. Komunikat dla użytkownika musi być koniecznie przekazany na standardowe wyjście (strumień) błędów.

Aplikacje konsolowe są przez system uruchamiane każdorazowo w oknie. Aby tego uniknąć we właściwościach projektu, na zakładce Application zmieniamy Output type z Console Application na Windows Application.

Opublikowane 12 lutego 2008 16:48 przez arkadiusz.wasniewski
Filed under: ,

Komentarze:

 

Marcin Celej said:

Bardzo ciekawe i przydatne. Wielkie dzięki za informacje.

lutego 12, 2008 19:00
 

Wojciech Gebczyk said:

arek,

Jak masz wiecej tipsow o SVN to smialo publikuj :-)

lutego 13, 2008 13:47
 

yoshi said:

Programy .NETowe możliwe oczywiście jeżeli serwer SVN jest na Windowsie ;)

Dobry "hint" - proszę więcej

lutego 13, 2008 17:14
 

arkadiusz.wasniewski said:

A Mono dla Linuxa? Hę? :-)

lutego 13, 2008 21:15
 

yoshi said:

ok :) z takim programem mono sobie poradzi :P

lutego 14, 2008 08:47
 

mgrzeg said:

Arek, napisz jeszcze, ze ten tekst jest tylko przygrywka do tego, co bedziesz mowil dzis na spotkaniu grupy warszawskiej :)

lutego 14, 2008 09:26
 

arkadiusz.wasniewski said:

Zgadza się. Jest to przygrywka do tego co będę dzisiaj mówił na spotkaniu warszawskiej grupy .NET - http://groups.google.com/group/wg-net

lutego 14, 2008 10:30
 

mgrzeg said:

Sprobujemy to dzis nagrac i gdzies wystawic na swiat.

lutego 14, 2008 12:34
 

arkadiusz.wasniewski said:

Dawno, dawno temu (choć może nie aż tak dawno) popełniłem notkę na temat skryptów przechwytujących (

maja 22, 2009 21:32
Komentarze anonimowe wyłączone
W oparciu o Community Server (Personal Edition), Telligent Systems