2009-12-01 3 views
6

Ich habe eine Schiene Website. Ich möchte beim Neustart von Mongrel die aktuelle svn-Version in public/version.txt schreiben, damit ich sie dann in einen Kommentar im Seitenkopf einfügen kann.Schreibe aktuelle SVN-Version in Textdatei

Das Problem ist die aktuelle lokale Version von Svn bekommen - ich bin ein wenig verwirrt.

Wenn ich zum Beispiel svn update auf einer Datei, die seit einiger Zeit nicht aktualisiert wurde, bekomme ich "At Revision 4571.". Jedoch, wenn ich Svn Info mache, bekomme ich

Pfad:.
URL: http://my.url/trunk
Repository Root: http://my.url/lesson_planner
Repository UUID: #########
Revision: 4570
Knoten Art: Verzeichnis
Spielplan: normal
letzten Änderung Autor: max
zuletzt geändert Rev: 4570
letztes Änderung Datum: 2009-11-30 17.14.52 0.000 (Mo 30 Nov 2009)

Hinweis sagt diese Revision 4570, 1 niedriger als der vorherige Befehl.

Kann mir jemand klar sagen und mir zeigen, wie man einfach die aktuelle Versionsnummer bekommt?

Dank, max

+0

Ich hatte schon immer einen Traum, in dem die Build-Nummer meiner Anwendung mit der SVN-Revision übereinstimmen würde. Ich bin gespannt, wie das funktioniert. –

+0

Siehe: http://stackoverflow.com/questions/1449935/getting-svn-revision-number-into-a-program-automatically –

Antwort

6

Subversion kommt mit einem Befehl für genau dies: SVNVERSION.EXE.

Nutzung: svnversion [Optionen] [WC_PATH [TRAIL_URL]]

Produce eine kompakte 'Versionsnummer' für die Arbeitskopie Pfad WC_PATH. TRAIL_URL ist der nachgestellte Teil der URL, die verwendet wird, um zu bestimmen, ob WC_PATH selbst gewechselt wird (Erkennung der Schalter in WC_PATH verlässt sich nicht auf TRAIL_URL) . Die Versionsnummer wird auf Standardausgabe geschrieben. Zum Beispiel:

$ svnversion . /repos/svn/trunk 
4168 

Die Versionsnummer wird eine einzelne Zahl, wenn die Arbeits Kopie einzelne Revision ist, unmodifizierte, nicht eingeschaltet und mit einer URL, die das TRAIL_URL Argument übereinstimmt. Wenn die Arbeits Kopie ungewöhnlich ist, wird die Versionsnummer komplexer sein:

4123: 4168 gemischte Revision der Arbeitskopie
4168M modifizierte Arbeitskopie
4123S Arbeits geschaltet Kopie
4123: 4168MS gemischte Revision, geändert geschaltet Arbeits Kopieren

Wenn in einem Verzeichnis, das keine Arbeitskopie ist, ein exportierter Ordner aufgerufen wird, wird das Programm 'exportiert' ausgeben.

Wenn ohne Argumente aufgerufen wird WC_PATH wird das aktuelle Verzeichnis sein.

Gültige Optionen: -n [--no-Newline]: nicht abschließende Zeilenvorschub ausgeben -c [--committed]: zuletzt eher geändert als aktuelle Version -h [--help]: Anzeige dieses Hilfe - Version: Versionsinformation anzeigen

+0

Ich wollte diese Informationen am Anfang meiner Ausgabedateien schreiben, und das funktioniert perfekt. Vielen Dank. – ryanjdillon

2

Wenn Sie nur neueste Version des Repository drucken möchten, können Sie so etwas wie folgt verwenden:

svn info <repository_url> -rHEAD | grep '^Revision: ' | awk '{print $2}' 

Sie Capistrano für die Bereitstellung verwenden können, es REVISION Datei erstellt, die Sie können nach public/version.txt kopieren

+0

Wenn Sie eine URL zu svn ohne Revision über -r oder PEG Revisionen (@. ..) Du fragst immer nach HEAD, also kannst Du in Deinem Beispiel das -rHEAD lassen. –

1

Es scheint, dass Sie svn info für das Verzeichnis, aber svn update für eine bestimmte Datei ausführen. Wenn Sie das Verzeichnis zur Revision 4571 aktualisieren, sollten svn info drucken:

Pfad:.

URL: http://my.url/trunk

Repository Root: http://my.url/lesson%5Fplanner

Repository UUID: #########

Revision: 4571

[...]

Letzte Änderung Rev: 4571

Beachten Sie, dass die "letzte geänderte Version" nicht unbedingt mit der neuesten Version des Repositorys übereinstimmt.

+0

ah - ok das macht Sinn, danke. –

4

Ich verwende das folgende Shell-Skript-Snippet, um eine Header-Datei svnversion.h zu erstellen, die einige konstante Zeichenfolgen definiert, die ich in kompiliertem Code verwende.

#!/bin/sh -e 

svnversion() { 
    svnrevision=`LC_ALL=C svn info | awk '/^Revision:/ {print $2}'` 
    svndate=`LC_ALL=C svn info | awk '/^Last Changed Date:/ {print $4,$5}'` 

    now=`date` 

    cat <<EOF > svnversion.h 

// Do not edit! This file was autogenerated 
//  by $0 
//  on $now 
// 
// svnrevision and svndate are as reported by svn at that point in time, 
// compiledate and compiletime are being filled gcc at compilation 

#include <stdlib.h> 

static const char* svnrevision = "$svnrevision"; 
static const char* svndate = "$svndate"; 
static const char* compiletime = __TIME__; 
static const char* compiledate = __DATE__; 

EOF 
} 

test -f svnversion.h || svnversion 

Dies setzt voraus, dass Sie die erstellte Header-Datei entfernen würde den Bau von ein frisches auslösen: Sie sollten zu etwas sehr ähnlich der Lage sein.

0

Danke an alle, die capistrano und svninfo vorgeschlagen haben.

Wir verwenden tatsächlich capistrano, und es macht tatsächlich diese REVISION-Datei, die ich glaube, sah ich vorher, aber nicht darauf geachtet. Wie dem auch sei, dies ist nicht ganz das, was ich brauche, da es nur beim Deploy aktualisiert wird, während wir manchmal ein paar Dateien schleichen und dann neu starten, anstatt eine vollständige Deploy zu machen.

Ich habe meine eigene Datei mit svninfo, grep und awk gemacht, wie viele Leute hier vorgeschlagen haben, und es öffentlich machen. Dies wird beim Start von Mongrel erstellt, der Teil des Bereitstellungsprozesses ist und der Neustartprozess also beide Male ausgeführt wird.

danke allen!

Verwandte Themen