Marek Wywiał

python software developer

automatyzacja pracy z svn - svnauto

by Marek Wywiał
  |   Source
    More posts about:  
  • tools

Svnauto jest wrapperem konsolowej komendy 'svn', który automatyzuje i standaryzuje wykonywanie rozgałęzień (branches) i złączeń (merge).

SC jest skryptem napisanym w języku Ruby i jest dostępny poprzez RubyGems:


gem install svnauto --include-dependencies

Hmm, ale czemu to nie działa?

Skrypt sc bazuje na komunikatach zwracanych przez komendę svn w języku angielskim, więc nie będzie działać poprawnie w innych lokalizacjach. Można to rozwiązać np. tak:


mv /usr/bin/sc /usr/bin/sc.orig

stworzyć nowy plik /usr/bin/sc:


#!/bin/bash

LC_ALL=C

/usr/bin/sc.orig $*

i nadać mu prawa do wykonywania (w przypadku systemów Linux):


chmod 755 /usr/bin/sc

Podstawy na początek

Standardowa praca z SC wygląda mniej więcej tak:

Konfigurujemy dostęp do naszego repozytorium (SC obsługuje ich wiele)

  sc config --add

Tworzymy nowy projekt (zostaniemy zapytani o repozytorium, którego chcemy użyc)

  sc create my-new-project

W naszym repozytorium zostanie dodany katalog my-new-project wraz ze strukturą:

 myproject:
  |
  +--trunk
  |   |
  |   +--project-files
  |
  +--branches
  |   |
  |   +--rel
  |   +--bug
  |   +--exp
  |
  +--tags
      |
      +--rel
      +--bug
      +--exp

Do katalogu ze zródłami lokalnymi (domyślnie ~/src, ale możemy to zmienić podczas konfigurowania repozytorium w SC) zostanie wyciągnięty trunk naszego nowego projektu do katalogu ~/src/nazwa_repozytorium/my-new-project-trunk.

W przypadku kolejnych pobrań projektu (np, na inną maszynę, dla innego użytkownika) wywołujemy komendę:

 sc checkout my-new-project

i dostaniemy domyślnie źródła trunk'a do lokalnej kopii. Używając opcji w linii komend (-r, -b, -e) możemy pobrać odpowiednio wybrany release, bug lub eksperymentalną gałąź.

Tu sobie pracujemy normalnie jak to z SVN'em bywa, add, commit, update.

Kolejne wydania

Aby wydać kolejną wersję naszego projektu wydajemy komendę:

 sc release 1.0.0

Nasz trunk zostanie skopiowany do branches/rel/1.0 i tags/rel/1.0 oraz do ~src/nazwarepozytorium/my-new-project-rel-1.0 zostanie wyciągnięty ten release.

Praca z błędami

Jeżeli znajdziemy błąd, wydajemy komendę:

 sc bug 1

gdzie 1 to numer błędu (przydzielony np przez trac'a). W naszym repozytorium zostanie założony katalog branches/bug/1 i oczywiście trafi do nas jego lokalna kopia ~/src/nazwarepozytorium/my-new-project-bug-1.

Po naprawieniu błędu zamykamy go (i zatwierdzeniu zmian przez 'commit' oczywiście):

 sc bug --close 1

Zostaniemy zapytani czy zrobić merge naszej poprawki do release 1.0, a następnie czy chcemy też tą poprawkę zmergować do trunk'u, gdzie najczęściej na wszystko się potulnie zgadzamy.

Wersje eksperymentalne

Tworząc nowy eksperymentane rozgałęzienie kodu wydajemy komendę:

 sc exp new_feature

Podczas pracy z taką gałęzią przyda nam się możliwość złączenia zmian z trunk'a do nas:

 sc expt --up new_feature

oraz na zakończenie prac (lub w miarę potrzeb) złączenie gałęzi eksperymentalnej z trunkiem:

 sc exp --down new_feature

Co ja z tego mam

Dzięki svnauto możemy zapomnieć o podawaniu pełnej ścieżki do repozytorium (jest skonfigurowana na początku pracu), więc przeglądanie projektu umożliwia nam prosta komenda

 sc list my-new-project

Dodatkowo mamy porządek w naszym repozytorium. Nawet jeżeli będziemy potrzebowali złączyć kilka rozgałęzień w jeden niestandardowy projekt z różnymi poprawkami, łatwo nam jest odnaleźć wszystkie potrzebne nam gałęzie i pojedynczo połączyć.

Praca nad poprawkami i nowymi wersjami jest prosta dzięki automatycznemu łączeniu odpowiednich gałęzi. Oczywiście nie uwolni nas to od rozwiązywania konfliktów, ale operacje, które wykonujemy już prawie automatycznie (prawie robi różnicę, np literówki, błąd w nazwie gałęzi) są robione naprawdę automatycznie.

Dzięki temu możemy się skupić na pracy nad projektem, zamiast nad prowadzeniem repozytorium do projektu.

Comments powered by Disqus
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/IT dx s: a C+++$ U>$ P+ L++$ !E-(+) W++$ N+ !o K--? !w !O !M !V PS PE !Y PGP !t !5 X++ R tv+ b+++ DI D G e+++(++++) h--- r y+++
------END GEEK CODE BLOCK------