damit die SVN Revision bei jedem Update automatisch auch im Code
upgedated wird (Die Revision wird auf einem User interface angezeigt).
Ich muss aber den tag "$Revision:$" verwenden, damit hier immer die
Version upgedated wird (im Beispiel oben wurde beim letzten Update die
Nummer 214 eingefügt).
Ich will aber nun nur den String 214 anzeigen, nicht den gesamten mit
"$...$". Wie kann ich das aus einer Konstanten extrahieren?
Hallo,
du musst SVNREVISION einem Chararray zuweisen und dann den Teil kopieren
den du brauchst. Mit deiner Zeile oben und nur an dieser Stelle wird der
String in deinem Programm nicht enthalten sein.
Vielleicht kann man auch mit dem Preprozessor schon den relevanten Teil
rausscheiden, da kenne ich mich aber nicht aus.
Sascha
// Die letzen beiden Zeichen abschneiden (ende-Markierung setzen)
12
svnversion[sizeof(svnversion)-2]='\0';
13
14
// Auf die Nummer hinter dem Anfang der Zeichenkette zeigen
15
char*zeiger=svnversion+11;
16
17
// Nummer ausgeben
18
puts(zeiger);
19
20
return0;
21
}
Ausgabe:
1
214
Achtung: sizeof() funktioniert hier nur deswegen, weil die Größe des
Arrays schon zur Compile-Zeit feststeht, da SVNVERSION eine bekannte
Länge hat (die ändert sich nach dem Compilieren nicht mehr).
Wenn du das mit einem String machen willst, dessen Länge erst zur
Laufzeit bekannt wird, musst du stattdessen strlen() benutzen. strlen()
ist langsamer.
Werz schrieb:> char FWVersion[30] = "SVN \0"
\0 brauchst du nicht, wird automatisch eingefügt am Ende.
[30] auch unnötig, überlass es dem Compiler:
char FWVersion[] = "SVN "
Ansonsten: für sowas gibt's die Funktionen strncpy.
Danke fürs Feedback!
Komischerweise funktioniert nun das automatische Update der Version
nicht mehr... D.h. die Zeile bleibt gleich:
1
#define SVNVERSION "$Revision: 215 $"
bleibt gleich, auch wenn ich ein neues SVN Update mache. Vorher hat es
noch funktioniert :(
Kennt sich jemand damit aus? Woran könnte das liegen?
Danke
Werz schrieb:> ich verwende folgende Konstante:> #define SVNVERSION "$Revision: 214 $"
Damit definiert du eine Textersetzung, die der Preprozessor ausführt,
mehr nicht.
Werz schrieb:> jetzt funktioniert es damit:char SVNVersion[] = "$Revision: 220 $";
Zeig mal bitte den Code und vergleiche mit dem Vorschlag von
Peter D. schrieb:> #define SVNVERSION_NO "214"> #define SVNVERSION "$Revision: " SVNVERSION_NO " $"
Codezeile siehe oben, damit funktioniert es auch...
Allerdings gibt es noch ein Problem:
Ich habe in EINEM SVN repository mehrere Projekte, weil das
Gesamtprojekt aus mehreren Teilprojekten besteht. Wenn ich nun in dem
Projekt, in dem die Codestelle:
1
charSVNVersion[]="$Revision: 220 $";
steht, etwas ändere, dann einen SVN Commit mache, dann wird die Revision
auch korrekt upgedated.
Wenn ich aber in einem anderen projekt dieses Repositories etwas ändere,
das commite (dann wird die "HEAD Version" erhöht, die Version des
ursprünglichen Projekts, indem die o.a. Codestelle steht, aber nicht),
dann bleibt die Version gleich.
Gibt es irgendeine Möglichkeit, die "HEAD Version" abzudaten?
Danke :)
Update, mein letzter Eintrag ist nicht ganz korrekt:
Mit dem Schlüsselwort "Revision" wird nur die letzte Version DIESES
Files angezeigt, in dem das Schlüsselwort steht. Wenn ich aber in einem
anderen File des Projektes etwas ändere, dann ändert sich die HEAD
Revision, nicht aber die Version dieses Files.
Ich würde aber gerne immer die Head Revision automatisch anzeigen, weil
dies auch dem letzten SW Stand des Projektes entspricht, der SW Stand,
der dem User angezeigt wird, soll ja schließlich auch der sein, der dem
Gesamtprojekt entspricht.
Ich habe danach gegooglet und kann einfach nicht glauben, dass es dafür
keine Lösung gibt, das muss doch ein häufiger Anwendungsfall sein, dass
die SW Version des Gesamtprojektes immer upgedated und angezeigt wird?!
Weiß jemand ob und wie das funktioniert?
DANKE!!!
In Java Projekten benutzt man dazu ein Plugin für den Maven Build
Prozessor. Er fragt die Revisionsnummer des Projektes beim Source
Repository ab und ersetzt dann in irgendeiner Datei einen entsprechenden
Platzhalter.
Ich denke, so etwas in der Art wirst du wohl auch brauchen.
In C bietet es sich an, keine Platzhalter zu benutzen, sondern sie als
gcc Parameter (-D) anzugeben. Im Quelltext kannst du solche Definitionen
dann genau so benutzen, als seien sie mit #define definiert worden:
Danke für Eure Beiträge.
Ich finde es echt komisch, dass dies nicht von SVN unterstützt wird,
sollte doch eine Standardanwendung sein, die viele benötigen...
Werz schrieb:> Ich finde es echt komisch, dass dies nicht von SVN unterstützt wirdWalter T. schrieb:> subwcrev
Man schreibt eine Template-Header-Datei, lässt bei jedem Build subwcrew
drüberlaufen und hat immer den aktuellen Revisionsstring inkl.
Markierung von Veränderungen gegenüber dem Stand des Repos. Was will man
mehr?
Ja, es gibt aber folgendes Problem:
Angenommen es gibt ein Softwareupdate, dass zu einer SVN Version 300
führt (Commit bereits ausgeführt, sonst gäbe es ja die Version 300 gar
nicht). Im Header mit der Svn Revision steht aber in diesem Moment nicht
die 300, weil dieses Update mit einem Batch File oder wie oben
beschrieben ja erst mit (vor) dem nächsten Build passieren kann (nach
dem SVN Commit, damit es auch tatsächlich die letzte Version ist). Wenn
es also danach diese Änderung der Version im Header gibt, muss es wieder
committed werden, was wiederum zu einer neuen Revision führt...
Werz schrieb:> Ja, es gibt aber folgendes Problem
Ja ist blöd, aber ist halt so. Alle anderen mir bekannten Source
Repositories verhalten sich ebenso. Deswegen schreibe ich die
Revisionsnummer auch gar nicht in den Quelltext, sondern in eine
Textdatei, die der Lieferung beigelegt wird.
Werz schrieb:> Angenommen es gibt ein Softwareupdate, dass zu einer SVN Version 300> führt (Commit bereits ausgeführt, sonst gäbe es ja die Version 300 gar> nicht). Im Header mit der Svn Revision steht aber in diesem Moment nicht> die 300,
SubWCRev löst das Problem.
Im Repository steht nur ein Template, das eigentliche .h File wird von
SubWCrev via Make (oder anderen Build Tools) erst beim Bauen erzeugt und
nie comitted - am Besten man trägt es in die "ignored" Liste ein.
Beispiel Template (svnversion.h.template):