2009-09-20 16 views
17

Mam projekt Pythona pod SVN, i chcę wyświetlić numer wersji, gdy jest uruchamiany. Czy jest jakiś sposób robienia tego (np. Automatyczne uruchamianie krótkiego skryptu przy zatwierdzaniu, które może zaktualizować plik wersji lub zapytanie do repozytorium SVN w Pythonie?)Uzyskiwanie numeru wersji SVN do programu automatycznie

Odpowiedz

25

Nie jestem pewien co do specyfiki Pythona, ale jeśli wstawię ciąg $ Rewizja $ do twojego pliku i jeśli posiadasz opcję enable-auto-props = true w konfiguracji SVN, to zostanie przepisane na coś podobnego do $ Wersja: 144 $. Możesz następnie przeanalizować to w swoim scenariuszu.

Istnieją a number of property keywords you can use in this way.

Nie będzie to miało żadnego narzutu, np. sprawdzanie repozytorium SVN, ponieważ ciąg znaków jest zakodowany na stałe w pliku przy zatwierdzaniu lub aktualizacji.

Nie jestem pewien, jak chcesz przeanalizować to w Pythonie, ale w PHP zrobiłbym:

$revString = '$Revision: 144$'; 
if(preg_match('/: ([0-9]+)\$/', $revString, $matches) { 
    echo 'Revision is ' . $matches[1]; 
} 
+0

To jest właściwa odpowiedź! Pamiętaj też, aby ustawić właściwość "keywords = Revision" dla każdego pliku, który chcesz to zrobić. –

+0

Drew - Myślę, że jeśli ustawiono opcję enable-auto-props = true, to wszystkie domyślne słowa kluczowe są ustawione? –

+3

+1 To niesamowite! W moim przypadku jest jednak jakiś sposób, aby SVN edytować numer wersji, jeśli jest to inny plik, który został zmieniony w tej wersji? Na przykład, jeśli mam słowo kluczowe numer rewizji w wersji.py, ale nie zmienię wersji.py w wersji nnn, to go nie zaktualizuje, prawda? Jeśli nie, czy istnieje sposób na wykorzystanie tej metody w ten sposób? – Smashery

4

Plik hooks/pre-commit w twoim repozytorium to skrypt lub program, który zostać wykonane przed pomyślnym zatwierdzeniem. Po prostu utwórz skrypt, który aktualizuje twój plik o prawidłowym numerze wersji podczas zatwierdzania (numer rewizji jest przekazywany do skryptu podczas jego uruchamiania). Oto samouczek z przykładem pisania haka przed zatwierdzeniem: http://wordaligned.org/articles/a-subversion-pre-commit-hook

+2

Ała. Zezwalanie na modyfikowanie plików przed zatwierdzeniem jest generalnie złym pomysłem. Wersja w repo będzie różnić się od wersji w kopii roboczej, co może prowadzić do pewnych nieporozumień. Musi on powrócić do wcześniejszej wersji pliku, a następnie uzyskać nową, prawdopodobnie powodując pewien konflikt, ponieważ svn zapisał oryginalną wersję w bazie tekstowej kopii roboczej. – sunny256

+0

Zgadzam się, że jest to niebezpieczne i zazwyczaj nie jest pożądanym zachowaniem, ale jeśli odpowiednio się ograniczysz, to nie widzę problemu. Na przykład, jeśli posiadasz plik "svn_version.txt", który zawiera tylko bieżący numer wersji, byłby całkowicie bezpieczny; Twoja lokalna kopia zawsze miałaby wersję, którą wypisałeś, a repozytorium zawsze będzie miało najnowszą wersję (często taką samą jak twoja kopia robocza). –

3

Zapoznaj się z pysvn. eksponuje rozszerzenia w Pythonie dla środowiska wykonawczego Subversion.

+1

+1 dla pysvn, ale najlepiej unikać łączenia z "tym" –

4

W Django jest fragment kodu, który pozwala ci to zrobić, polecam na niego spojrzeć. http://code.djangoproject.com/browser/django/trunk/django/utils/version.py

+0

Ta funkcja działa tylko wtedy, gdy uruchamiasz się z poziomu subversion. Jeśli tego chce OP, wówczas problem rozwiązany. Podejrzewam jednak, że może chcieć, aby skrypt zawarł w sobie lub plik konfiguracyjny lub coś w swojej wersji subwersji, nawet jeśli skrypt nie jest już podwersją, w którym to przypadku ten link nie będzie użyteczny. –

+0

Tak, to jest świetna opcja awaryjna, ale posiadanie numeru wersji również pod kontrolą źródła byłoby lepsze. Dzięki! +1 – Smashery

3

Robię to po prostu uruchamiając mały skrypt podczas budowania mojego projektu. Skrypt po prostu wywołuje svn info w połączeniu z sed, by wydobyć nagie dane rewizji i wstrzyknąć tę liczbę do pliku revision.txt.

Serwer kompilacji Hudson jeszcze bardziej ułatwia ustawienie numeru wersji SVN jako zmiennej środowiskowej tuż przed wywołaniem skryptów Build.

+0

Robimy to również, działa ładnie – orip

1

Uważam, że jeśli zostanie uruchomiona sekcja lekko dwuznaczne - gdy jest prowadzony skąd? Z kasy SVN lub z wydanego kodu? Wszystkie rozwiązania działają na wstrzykiwaniu wersji SVN w jakiś sposób do źródła Pythona lub gdzieś w repozytorium w osobnym pliku wersji.

Plik wersji został zmieniony przy świeżych kasach, więc czyste wypłaty muszą zostać wykonane przed dystrybucją. Moje pytanie o to, gdzie program jest uruchamiany, pozostaje.

13

Podobny do, ale trochę bardziej pytoniczny niż odpowiedź PHP; umieścić to w swoim modułu __init__.py:

__version__ = filter(str.isdigit, "$Revision: 13 $") 

i upewnij się dodać właściwość aktualizacji:

svn propset svn:keywords Revision __init__.py 
+1

lub '' .join (c dla c w "$ LastChangedRevision: 1546 $" jeśli c.isdigit()) jeśli nie lubisz filtra. –

7

Albo można zrobić tak:

import re,subprocess 

svn_info = subprocess.check_output("svn info") 

print (re.search(ur"Revision:\s\d+", svn_info)).group() 

drukuje "Revision: 2874" w moim projekcie

Lub jak poniżej:

print (subprocess.check_output("svnversion")).split(":")[0] 

drukuje "2874" w moim projekcie

+0

Działa tylko z kopią roboczą. – bahrep

+0

Nie tylko z kopią roboczą. Możesz najpierw pobrać zdalny adres URL svn z "svn info", np. Wykonać "svn info", a następnie pobrać parametr "URL" z danych wyjściowych i wykonać ten sam kod, ale używając "svn info value_of_URL_param" Tak więc zaktualizowany kod to: re import, podproces svn_info = subprocess.check_output ("info svn https: //svn.you_remote_repo_url") print (re.search (ur "Revision: \ s \ d +", svn_info)). group() –

Powiązane problemy