SVN узнать номер ревизии програмно

lili197602

Хочется, чтобы в выдаваемых результатах сохранялась информация о том, которая ревизия программы из репозитория была запущена. Есть ли способ достать эту информацию программно? Пользуюсь Tortoise SVN.

katrin2201

http://www.google.ru/search?q=svn:keywords
LastChangedRevision

lili197602

Спасибо, но если я правильно понял, то это немножко не то.
Идея такая, что есть программа в репозитории. Она выдает как результат некие файлы. Хочеться чтоб в этих файлах было написано при помощи какой ревизии программы они записаны. Сами файлы результатов под систему контроля версий не попадают.

VitMix

В программе написать что-то типа:

version = "$LastChangedRevision$";
write (file, version);

lili197602

О, круто! Спасибо, вроде дошло.

pitrik2

хе
интересная штука
а мы делаем так: скрипт который компиляет (ant или msbuild) вытаскивает версию посредством svnversion и подставляет ее в нужные места

katrin2201

тоже вариант
возможно даже более правильный
просто гемора чуть больше - не у всех это дело скриптом автоматизировано
в моем случае кстати надо учитывать, что выдается последняя ревизия где менялся _текущий_ файл, что тоже немножко не то, так как обычно хочется знать последнюю ревизию всего проекта. Вот это уже только скриптом, как ты написал.

lili197602

А еще в Тортойзе есть оказывается специальная утилита для этого:
SubWCRev

katrin2201

то что доктор прописал
хотя вообще странно что она ходит по всем файлам, насколько я помню, достаточно посмотреть svnversion на корневую папку
//проверил - недостаточно

lili197602

Чего-то у меня все равно недопонимание.
Я хочу такой функциональности:
Собираю экзешник, приношу его куда-нибудь и по его исполнению вижу с помощью какой ревизии я его собрал.
Варианты с шаблонами подразумевают, что перед сборкой будет запущен некий скрипт, который на место ключевых слов подставит значения. Вот этот этап мне не нужен :) . Я не хочу для каждой новой версии запускать этот скрипт. Тем более что к самой программе он никакого отношения не имеет.
upd. Наверное не правильно выразился. При начале компиляции все переменные задаваемые шаблонами должны быть определены. Это подразумевает, что перед этим я вызвал скрипт, который подставил вместо шаблона значения. Сама программа, получается не сможет определить свою версию без внешнего скрипта?

pitrik2

Сама программа, получается не сможет определить свою версию без внешнего скрипта?
а как ты себе это представляешь?
у тебя есть сурцы - свновская папка
ты их компиляешь в экзешник
в этот экзешник никакую инфу об свн не кладешь
относишь экзешник на другую машину и запускаешь
и вот должна показаться версия
как экзешник о ней узнает? угадает?
я делаю так:
когда я пишу прогу я могу уделаться этих экзешников, это мои проблемы, никакой версии там не будет, она мне не нужна
когда написал настолько, что готов эту прогу передать на другой комп - я фактически выпускаю релиз
для этого я помечаю все сурцы тагом, варинаты навания тагов: 25.06.2008, 0.9Beta5, 0.9.1.14, 4523
4523 - это номер билда например
после того как пометил тагом - я запускаю скрипт, например .bat файл, который билдит мою прогу
этот скрипт на вход получает таг, выкачивает по этому тагу все сурцы, собирает их, при сборке подставляет номер версии (или сам таг)
и в езультате выдает мне экзешник в который версия будт зашита
теперь когда мне скажут что моя прога такой то версии не работает, я достану по этому тагу сурцы и буду в них копаться
если это уже было исправлено то я увижу что в этой версии этого еще не было исправлено

kruzer25

У тебя получается дублирование сущностей. Всё, что тебе надо, даёт и номер ревизии - а ты ещё какие-то таги придумываешь.
у тебя есть сурцы - свновская папка
ты их компиляешь в экзешник
в этот экзешник никакую инфу об свн не кладешь
Насколько я понимаю, он хочет, чтобы на стадии компиляции в экзешник клалась эта информация.

pitrik2

Насколько я понимаю, он хочет, чтобы на стадии компиляции в экзешник клалась эта информация.
ну дык мы ему про то и говорим

Realist

Скрипт вызывается не перед компиляцией, а как один из этапов компиляции

lili197602

Все равно не понимаю :(
В конечном счете я хочу, чтоб одна из переменных в программе содержала информацию о версии.
То что я вижу сейчас выглядит так:
Есть переменная с шаблоном:
char version = "$Version$"
Если я перед компиляцией и запуском программы не запустил скрипт, который на место шаблона подставил бы номер версии, то при печати я увижу $Version$.
Ведь в папке с программой хранится информация SVN'а. Я бы хотел что-то вроде функции которая вернула бы мне номер версии.
О, еще есть вариант с файлом содержащим шаблоны, который создается программой и на который потом натравливается скрипт.

pitrik2

Ведь в папке с программой хранится информация SVN'а. Я бы хотел что-то вроде функции которая вернула бы мне номер версии.
допустим такую функцию написали
компиляем программу, полученный экзешник переносим на друго компьютер и запускаем твою программу
теперь в папке ее запуска svn-инфы нету, откуда функция должна версию брать?

Realist

Э-э-э
Функция на языке C (ну или на чем ты там пишешь? которая вернет номер версии, пошарясь по папкам? Это бред полный. Скомпилированная программа работает на другой машине, на которой от SVN ничего нет. Вообще забудь про время запуска программы. Ее запустят твои клиенты на Луне.
Еще раз, где-то в программе есть строчка
char version = "$Version$",
которая в момент компиляции заменяется на номер ревизии.
Надеюсь, что компилируешь ты не командой gcc *.cpp -o a.out, а у тебя все-таки есть некоторый сценарий сборки. Вот в этот самый сценарий и надо вставить соответствующие команды, которые подставят номер ревизии в текст программы.
Дальше зависит от того, какой у тебя язык программирования и система сборки. Скажем, для C/C++ удобно использовать макрос REVISION:
 
printf("Ревизия SVN: %s", REVISION);

А определять этот макрос через параметры командной строки компилятора
  
g++ main.cpp -DREVISION="123"

А параметры командной строки определяются в сценарии сборки.
Для SCons это все выглядит примерно так:
  
revision = os.popen('svnversion . || echo nosvn').read.strip
env.Append(CPPDEFINES=['REVISION=\\\"'+str(revision)+'\\\"'])

pitrik2

вот тебе вариант
как лучше сделать не знаю

// file version.cpp
char* version = "$Version$";

// file prepare-next-release.bat
set SVN_VERSION = `svnversion`
replace $Version$ by SVN_VERSION in path_to_project/version.cpp

каждый раз когда ты собираешься "отдавать" прогу вовне
ты запускашь этот скрипт, он тебе подставляет новую версию и ты потом компиляешь прогу и отдаешь
если скрипт не запускать - прога будет отдаваться со "старой" версией

lili197602

Да, неправильно я написал.
Я имел ввиду, что в собранном экзешнике должна уже сидеть информация о версии. Собирается программа всегда из папки которая находится под SVN'ом.
Если как-то автоматически можно вызывать скрипт расставляющий на место шаблонов номер версии, то тоже сойдет (насколько я понимаю, это и предлагается сделать). Если кто знает как это сделать в 2005-ой студии, расскажите, пожалуйста.

agaaaa

Project properties -> Pre build events

lili197602

О, круто, работает! :D
Спасибо.
Оставить комментарий
Имя или ник:
Комментарий: