Frage

Ich habe ein Python-Projekt unter SVN, und ich will die Versionsnummer angezeigt wird, wenn es ausgeführt wird. Gibt es eine Möglichkeit, dies zu tun (wie automatisch ein kurzes Skript läuft auf begehen, die eine Versionsdatei aktualisieren konnten, oder eine SVN-Repository in Python abfragt?)

War es hilfreich?

Lösung

Ich bin über die Python Besonderheiten nicht sicher, aber wenn die Zeichenfolge $ Revision $ in Ihre Datei irgendwo setzen, und Sie haben enable-auto-props = true in Ihrem SVN Config, wird es um so etwas wie $ Revision erhält neu geschrieben : 144 $. Sie könnten dann analysieren diese in Ihrem Skript.

Es gibt eine Reihe Immobilien Schlüsselwörter können Sie auf diese Weise verwenden.

Das wird kein Overhead, z.B. die SVN-Repo-Abfrage, da die Zeichenfolge auf begehen oder zu aktualisieren hartcodiert in der Datei ist.

Ich bin mir nicht sicher, wie Sie dies in Python analysieren würden, aber in PHP würde ich tun:

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

Andere Tipps

ähnlich, aber ein wenig mehr pythonic als die PHP-Antwort; setzen Sie dies in Ihrem Modul __init__.py:

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

und stellen Sie sicher, dass Sie die Revision Eigenschaft hinzufügen:

svn propset svn:keywords Revision __init__.py

Oder Sie können wie folgt tun:

import re,subprocess

svn_info = subprocess.check_output("svn info")

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

druckt "Revision: 2874" in meinem Projekt

Oder wie folgt:

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

druckt "2874" in meinem Projekt

Die Datei hooks/pre-commit in Ihrem Repository ist ein Skript oder Programm, das ausgeführt wird, bevor ein erfolgreicher begehen. macht dies einfach ein Skript, das die Dateien mit der richtigen Versionsnummer aktualisiert, wie es begangen wird (die Versionsnummer wird an das Skript übergibt, wie es laufen wird). Hier ist ein Tutorial mit einem Beispiel für das Schreiben eines pre-commit Haken: http: // wordaligned.org/articles/a-subversion-pre-commit-hook

Es gibt einen Code-Schnipsel in Django, dass Sie dies tun können, würde ich es empfehlen suchen. http://code.djangoproject.com/browser/django/ trunk / django / utils / version.py

Schauen Sie sich pysvn . es Erweiterungen in Python für Subversion Runtime-Funktionalität verfügbar macht.

Ich tue dies, indem man einfach ein kleines Skript ausgeführt wird, wenn mein Projekt zu bauen. Das Skript ruft nur svn info in Kombination mit sed die nackten Revisionsdaten, um aus und spritzt diese Zahl in die revision.txt Datei.

Die Hudson-Build-Server macht es noch einfacher, da sie die SVN-Revisionsnummer als Umgebungsvariable richtig setzen, bevor Sie Ihren Build-Skripte aufgerufen wird.

Ich finde, das, wenn es ausgeführt wird Abschnitt etwas zweideutig - wenn es ausgeführt wird, von wo aus? Von einer SVN-Kasse oder aus dem freigegebenen Code? Alle Lösungen arbeiten auf Injektion die SVN-Version irgendwie in die Python-Quelle oder irgendwo im Repository in einer separaten Version Datei.

Die Version Datei wird auf frisch Auscheckvorgänge geändert, so sauber Kassen vor der Verteilung durchgeführt werden müssen. Also meine Frage, wo das Programm gerade läuft bleibt.

Das funktioniert für mich in Python:

Erfahren Sie alle svn info:

svn_info = subprocess.check_output('svn info').decode("utf-8") 
print(svn_info)

Haben Sie Ihre Suche und abspalten die Nummer:

revisionNum = re.search("Revision:\s\d+", svn_info)
print(revisionNum.group().split(":")[1])

Sie können dies programmatisch tun, indem Sie die Ausgabe von 'svn info --xml' zu einem XML-Element-Analyse:

def get_svn_rev(dir: Union[str, Path]) -> str:
    """Get the svn revision of the given directory"""
    dir = str(dir)
    svn_info_cmd = ['svn', 'info', '--xml', dir]
    print(' '.join(svn_info_cmd))
    svn_info_process = subprocess.run(svn_info_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if svn_info_process.returncode:
        eprint(svn_info_process.stderr.decode().strip())
        raise subprocess.CalledProcessError(returncode=svn_info_process.returncode, cmd=svn_info_cmd,
                                            output=svn_info_process.stdout,
                                            stderr=svn_info_process.stderr)
    else:
        info = ElementTree.fromstring(svn_info_process.stdout.decode().strip())
        entry = info.find('entry')
        revision = entry.get('revision')

    return revision
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top