2010-01-02 19 views
44

Czy istnieje polecenie Subversion, aby wyświetlić bieżący numer wersji?Komenda aktualnej wersji Subversion

Po svn checkout chcę uruchomić skrypt i potrzebuję numeru wersji w zmiennej. Byłoby świetnie, gdyby było polecenie takie jak svn info get_revision_number.

+8

z najnowszych SVN 'svn informacji --show-poz revision' pokaże tylko numer wersji źródła w bieżącym katalogu. – GreatAndPowerfulOz

+1

Aby uzyskać numer wersji lokalnej kopii roboczej, użyj 'svn info --show-item last-changed-revision'' – domih

Odpowiedz

72

Można użyć os.system() wykonanie wiersza polecenia tak:

svn info | grep "Revision" | awk '{print $2}' 

to zrobić w moich nocnych kompilacji skryptów.

Również na niektórych platformach jest polecenie svnversion, ale myślę, że miałem powód, aby go nie używać. Ahh, racja. Nie można uzyskać numeru wersji ze zdalnego repozytorium, aby porównać go z lokalnym za pomocą svnversion.

+1

Zauważ, że w pierwotnym pytaniu był znacznik 'cmd.exe', co oznacza, że ​​OP jest w systemie Windows, gdzie nie można używać' grep' i 'awk'. – iamamac

+1

os.system mówi tylko kod wyjścia, nie zapewnia sposobu na wyjście. Zamiast tego, wykonanie 'svn info' (np. Z modułem podprocesu), odczytanie wyniku i wykonanie kroków grep/awk bezpośrednio w Pythonie (' if "Revision" in line: return line.split() [1] ') to zwykle zarówno prostsze, jak i łatwiejsze niż próby napisania poleceń w języku Python. –

+0

Iamamac: istnieje cygwin i niezależne porty (plus SfU i jakikolwiek MSFT nazywa to teraz), ale twój punkt, że nie jest tak powszechnie dostępny, jest właściwy. –

2

svn info, Wierzę, że jest to, co chcesz.

Jeśli tylko chciał rewizji, może można zrobić coś takiego:

svn info | grep "Revision:" 
22

Istnieje również bardziej wygodne (dla niektórych) polecenie svnversion.

Wyjście może być pojedynczy numer rewizji lub coś takiego (z -h):

4123:4168  mixed revision working copy 
    4168M   modified working copy 
    4123S   switched working copy 
    4123:4168MS mixed revision, modified, switched working copy 

Używam tego kodu Pythona fragment wydobyć informacje Aktualizacja:

import re 
import subprocess 

p = subprocess.Popen(["svnversion"], stdout = subprocess.PIPE, 
    stderr = subprocess.PIPE) 
p.wait() 
m = re.match(r'(|\d+M?S?):?(\d+)(M?)S?', p.stdout.read()) 
rev = int(m.group(2)) 
if m.group(3) == 'M': 
    rev += 1 
4
  1. Pierwszy Wszystkie svn status ma numer wersji, możesz go odczytać stamtąd.

  2. Ponadto, każdy plik, który można przechowywać w SVN można zapisać numer poprawki w sobie - dodanie słowa kluczowego $Rev$ do plików i wykonywania propset: svn propset svn:keywords "Revision" file

  3. Wreszcie, numer wersji jest również w pliku .svn/entries , czwarta linia:

Teraz za każdym razem, gdy pobierzesz ten plik, będzie on posiadał wersję samą w sobie.

+0

W przypadku pozycji 3, czy można oczekiwać, że numer wersji będzie zawsze w czwartej linii? Jeśli jest to uzasadnione oczekiwanie, wydaje się, że jest to najłatwiejszy sposób na prawie każde środowisko. – grimus

+0

Tak, przynajmniej w rozsądnym zakresie wersji subwersji. Jeśli zmienią format w jakiejś przyszłej wersji (możliwe, ale raczej mało prawdopodobne), to musisz się dostosować. –

+0

Sprawdziłem to nieco i znalazłem to: http://svnbook.red-bean.com/en/1.4/svn.developer.insidewc.html Wygląda na to, że format może się zmieniać od czasu do czasu . Jestem pewien, że dla większości rzeczy czytanie pliku wpisów będzie działało dobrze, ale musisz zachować kod, jeśli plik wpisów się zmieni. – grimus

0

Chyba muszę zrobić svn informacji i następnie pobrać numer z manipulacją smyczkowego z „Revision: xxxxxx” To byłoby po prostu miło, gdyby nie było polecenie, które zwraca tylko liczba :)

2

użyj coś jak poniżej, korzystając z wyjścia XML wywrotowej:

# parse rev from popen "svn info --xml" 
dom = xml.dom.minidom.parse(os.popen('svn info --xml')) 
entry = dom.getElementsByTagName('entry')[0] 
revision = entry.getAttribute('revision') 

Należy również zauważyć, że w zależności od tego, czego potrzebują tego, wpis <commit revision=...> może być więcej, co szukasz. To daje "Last Changed Rev", która nie zmieni się, dopóki kod w bieżącym drzewie faktycznie się nie zmieni, w przeciwieństwie do "Revision" (co powyżej daje), który zmieni się za każdym razem, gdy cokolwiek zmieni się w repozytorium (nawet gałęzie) i robisz "svn up", co nie jest tym samym, ani często tak przydatne.

+0

Pytasz svn, czy wyprowadzasz XML, a następnie analizujesz go? Czy to ma być żart? –

+1

@JulienGuertault, nie, dane wyjściowe XML * mają * zastosowanie programistyczne, podczas gdy nie-XML nie jest. Analizowanie danych dotyczących ludzi ryzykuje zmianę formatu w przyszłości i złamanie kodu, a w zależności od kontekstu może wymagać niestandardowej pracy za każdym razem, gdy trzeba robić podobne rzeczy. Jeśli zastosujesz podejście XML, możesz z czasem zaoszczędzić na infrastrukturze. Bez żartów, ale nie powiedziałbym, że robienie tego w inny sposób jest w jakikolwiek sposób * źle *. Tylko osobiste preferencje.Zrobiłem obie, w różnych treściach. –

+0

Parsowanie danych dotyczących maszyny i człowieka jest ważnym punktem (wartym podkreślenia w odpowiedzi). Ale dlaczego nie po prostu użyć 'svnversion'? Ma udokumentowane kompaktowe wyjście i nie wymaga czegoś tak złożonego, aby go przetworzyć. –

1

Nikt wzmianka dla Windows świata SubWCRev, które są stosowane prawidłowo, może zastąpić niezbędnych danych do potrzebnych miejsc automagicznie, jeśli wezwanie skrypt SubWCRev w formie SubWCRev WC_PATH TPL-FILE READY-FILE

próbki mojego post-commit (część)

SubWCRev.exe CustomLocations Builder.tpl z:\Builder.bat 
... 
call z:\Builder.bat 

gdzie mój Builder.tpl jest

svn.exe export trunk z:\trunk$WCDATE=%Y%m%d$-r$WCREV$ 

w wyniku, mam za każdym razem plik BAT zmiennej części - Nam e Dyrektywę - co odpowiada metadanych Working Copy

2

Wystarczy stosować @ odpowiedź badcat w wersji zmodyfikowanej, stosując subprocess.check_output():

import subprocess 
revision = subprocess.check_output("svn info | awk '/^Revision:/ {print $2}'", shell=True).strip() 

Wierzę, można również zainstalować i używać pysvn jeśli chcesz użyj Pythona do interfejsu z svn.

3

REV = svn info svn://svn.code.sf.net/p/retroshare/code/trunk | grep 'Revision:' | cut -d\ -f2

+0

Należy pamiętać, że funkcja RetroShare może mieć pewne problemy z bezpieczeństwem http://specialmeaning.blogspot.com/2016/09/retroshare-scandal-of-free-communication.html – Sergei

Powiązane problemy