Aktueller Subversion-Revisionsbefehl

75

Gibt es einen Subversion-Befehl, um die aktuelle Versionsnummer anzuzeigen?

Nachdem svn checkoutich ein Skript starten möchte und die Revisionsnummer in einer Variablen benötige. Es wäre toll, wenn es einen Befehl wie gäbe svn info get_revision_number.

creativz
quelle

Antworten:

117

Neuere Versionen von svn unterstützen das --show-itemArgument:

svn info --show-item revision

Verwenden Sie für die Versionsnummer Ihrer lokalen Arbeitskopie:

svn info --show-item last-changed-revision

Sie können os.system()eine Befehlszeile wie folgt ausführen:

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

Ich mache das in meinen nächtlichen Build-Skripten.

Auch auf einigen Plattformen gibt es einen svnversionBefehl, aber ich glaube, ich hatte einen Grund, ihn nicht zu verwenden. Ahh, richtig. Sie können die Versionsnummer nicht von einem Remote-Repository abrufen, um sie mit der lokalen mit svnversion zu vergleichen.

BastiBen
quelle
4
Beachten Sie, dass es eine war cmd.exeTag in der ursprünglichen Frage, was bedeutet , das OP in Windows ist, wo Sie nicht verwenden können grepund awk.
Iamamac
1
os.system teilt Ihnen nur den Exit-Code mit, bietet jedoch keine Möglichkeit, die Ausgabe abzurufen. Stattdessen ist das Ausführen svn info(z. B. mit dem Unterprozessmodul), das Lesen der Ausgabe und das Ausführen der grep / awk-Schritte direkt in Python ( if "Revision" in line: return line.split()[1]) in der Regel einfacher und einfacher als der Versuch, Bash-Befehle in Python zu schreiben.
4
loswerden von grep:svn info | awk '/Revision/ { print $2; }'
nur jemand
4
Wenn Sie awk trotzdem aufrufen, können Sie den grep-Teil überspringen:svn info | awk '/^Revision:/ {print $2;}'
ndim
1
Wenn Ihr System Gebietsschemas verwendet, sollten Sie vorher "LANG = C" hinzufügen, wie folgt:LANG=C svn info | grep "Revision" | awk '{print $2}'
Florent
24

Es gibt auch einen bequemeren (für einige) svnversionBefehl.

Die Ausgabe kann eine einzelne Revisionsnummer oder ähnliches sein (von -h):

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

Ich verwende dieses Python-Code-Snippet, um Revisionsinformationen zu extrahieren:

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
Saulius Žemaitaitis
quelle
5
  1. Zunächst hat der SVN-Status die Revisionsnummer, die Sie von dort aus lesen können.

  2. Außerdem kann jede Datei, die Sie in SVN speichern, die $Rev$Versionsnummer in sich selbst speichern. Fügen Sie das Schlüsselwort zu Ihrer Datei hinzu und führen Sie propset aus:svn propset svn:keywords "Revision" file

  3. Schließlich befindet sich die Revisionsnummer auch in der .svn/entriesDatei, vierte Zeile

Jedes Mal, wenn Sie diese Datei auschecken, hat sie die Revision für sich.

Kornel Kisielewicz
quelle
Ist es für Punkt 3 vernünftig zu erwarten, dass die Revisionsnummer immer in der 4. Zeile steht? Wenn dies eine vernünftige Erwartung ist, scheint dies der einfachste Weg zu sein, dies in nahezu jeder Umgebung zu tun.
Grimus
Ja, zumindest in einem vernünftigen Subversion-Versionsbereich. Wenn sie das Format in einer zukünftigen Version ändern (möglich, aber nicht wahrscheinlich bald), müssten Sie sich anpassen.
Kornel Kisielewicz
Ich habe mich ein wenig damit befasst und Folgendes festgestellt: svnbook.red-bean.com/de/1.4/svn.developer.insidewc.html Es hört sich so an, als würde sich das Format von Zeit zu Zeit ändern. Ich bin mir sicher, dass das Lesen der Eintragsdatei für die meisten Dinge gut funktioniert, aber Sie müssen sicherstellen, dass Sie Ihren Code beibehalten, wenn sich die Eintragsdatei ändert.
Grimus
Hoppla, ich habe Ihren Kommentar nicht gesehen, bevor ich ihn gepostet habe, aber ich denke, wir sind uns trotzdem einig.
Grimus
Versucht am svn, version 1.11.0 (r1845130) compiled Oct 31 2018, 12:40:42 on x86_64-unknown-cygwin: .svn/entriesenthält nur eine ganze Zahl.
Badams
4

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

RSuser
quelle
Beachten Sie, dass RetroShare einige Sicherheitsprobleme haben kann. Specialmeaning.blogspot.com/2016/09/…
Sergei
2

svn infoIch glaube, das ist was du willst.

Wenn Sie nur die Überarbeitung wollten, könnten Sie vielleicht etwas tun wie:

svn info | grep "Revision:"
Dave Markle
quelle
2

Verwenden Sie Folgendes, um die XML-Ausgabe von Subversion zu nutzen:

# 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')

Beachten Sie auch, dass der <commit revision=...>Eintrag je nachdem, wofür Sie dies benötigen, möglicherweise mehr das ist, wonach Sie suchen. Dies ergibt die "Last Changed Rev", die sich erst ändert, wenn sich der Code im aktuellen Baum tatsächlich ändert, im Gegensatz zu "Revision" (was oben angegeben ist), die sich jedes Mal ändert, wenn sich etwas im Repository ändert (sogar Verzweigungen). und du machst ein "svn up", was nicht dasselbe ist oder oft so nützlich.

Peter Hansen
quelle
Svn bitten, XML auszugeben und dann zu analysieren? Ist es als Witz gedacht?
Julien Guertault
1
@JulienGuertault, nein, wird die XML - Ausgabe bedeutet für programmatische Verwendung , während der Nicht-XML nicht ist. Das Parsen der menschlichen Ausgabe birgt das Risiko, dass sich das Format in Zukunft ändert und Ihr Code beschädigt wird. Je nach Kontext ist möglicherweise jedes Mal benutzerdefinierte Arbeit erforderlich, wenn Sie ähnliche Aufgaben ausführen müssen. Wenn Sie den XML-Ansatz verwenden, können Sie im Laufe der Zeit Aufwand für die Infrastruktur sparen. Kein Scherz, aber ich würde auch nicht sagen, dass es auf jeden Fall falsch ist, es anders zu machen . Nur persönliche Vorlieben. Ich habe beides in unterschiedlichen Inhalten gemacht.
Peter Hansen
Die Analyse der Maschine gegen die menschliche Ausgabe ist ein gültiger Punkt (der in Ihrer Antwort hervorgehoben werden sollte). Aber warum nicht einfach benutzen svnversion? Es hat eine dokumentierte kompakte Ausgabe und benötigt nichts so Komplexes, um es zu analysieren.
Julien Guertault
@frgtn hat svnversion für seine Antwort oben angegeben, aber wie bereits erwähnt, bietet die Verwendung der Ausgabeoptionen --xml für die verschiedenen svn-Unterbefehle eine einheitliche Möglichkeit, mit einer Vielzahl von Anforderungen umzugehen. Mit svnversion benötigen Sie möglicherweise noch einen weiteren benutzerdefinierten Parser, z. B. um mit einem angehängten "M" umzugehen, wenn Sie dies nicht möchten. Bitte betrachten Sie meine Antwort als eine von vielen möglichen Alternativen, die vom OP nicht akzeptiert werden, aber möglicherweise für Nachzügler nützlich sind, die von einer Suche hierher kommen.
Peter Hansen
Danke für die zusätzliche Erklärung.
Julien Guertault
2

Ich habe gerade die Antwort von @ badcat in einer modifizierten Version verwendet und Folgendes verwendet subprocess.check_output():

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

Ich glaube, Sie können pysvn auch installieren und verwenden, wenn Sie Python als Schnittstelle zu svn verwenden möchten.

Mönch
quelle
1

Niemand erwähnt die Windows-Welt SubWCRev , die bei richtiger Verwendung die benötigten Daten automatisch an den benötigten Stellen ersetzen kann, wenn das Skript SubWCRev in Form aufruftSubWCRev WC_PATH TPL-FILE READY-FILE

Beispiel meines Post-Commit-Hooks (Teil von)

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

wo mein Builder.tpl ist

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

Als Ergebnis habe ich jedes Mal eine Bat-Datei mit dem variablen Teil - Name des Verzeichnisses -, der den Metadaten von Working Copy entspricht

Fauler Dachs
quelle
0

Ich denke, ich muss svn info machen und dann die Nummer mit einer String-Manipulation aus "Revision: xxxxxx" abrufen. Es wäre einfach schön, wenn es einen Befehl gäbe, der nur die Nummer zurückgibt :)

creativz
quelle
0

Andernfalls können Sie in der alten Version den folgenden Befehl verwenden, wenn '--show-item' nicht erkannt wird:

svn log -r HEAD | grep -o -E "^r[0-9]{1,}" | sed 's/r//g'

Ich hoffe es hilft.

Sant Erwann
quelle