В одном из проектов потребовалось написать небольшую утилиту для CUPS, которая бы получала детали задания печати.
Утилита очень простая (была написана за день-два) и чтобы не настраивать для нее отдельную сборку на сервере было принято решение сборку делать на машине разработчика и комитить бинарник в SVN.
Но чтобы следить за тем, свежая ли сборка лежит в SVN, в название бинарника решили включить номер ревизии SVN, из которой он был собран.
Ну и собственно встал вопрос, как в bash получить номер ревизии SVN? Можно вот так:
01: # This package file compiles the c file from the source
02: # and also appends to it's name the number of revision
03:
04: # You should execute this script with the additional parameters:
05: # build job_id cups_host cups_port
06:
07: svn info|grep Revision > rev_input
08: split -b 10 rev_input rev_
09: gcc -o bin/cups-job-details.`cat rev_ab` cpp/cups-job-details.c -lcups
10: echo '$0'.`cat rev_ab` -query '$1' '$2' '$3' > bin/cups-job-details
11: chmod 744 bin/cups-job-details
12: rm rev_*
Чтобы вызывать полученный бинарник программно, нужно знать его имя файла, а так как оно может меняться взавимости от номера ревизии, мы решили создавать рядом файл с постоянным именем
cups-job-details
и в него записывать команду, которая вызывает нужную утилиту (строка №10).P.S.
Как можно заметить вся работа выполняется через временные файлы с заданным префиксом
rev_
(естественно, префикс можно поменять) и в строке 12 они все удаляются. Если будете пользоваться - будьте осторожны, не потрите полезные файлы ;)
Че-то как-то неправильно.
ReplyDeleteИзвлеч версию можно одной командой, какие-то извращения со сплитом.
Да и временные файлы вообще не понятно зачем. :)
REV=`svn info | grep Revision | sed -e 's/Revision: //'`
ну а там просто юзать $(REV)...
> Че-то как-то неправильно.
ReplyDeleteПравильно.
> REV=`svn info | grep Revision | sed -e 's/Revision: //'`
Но с sed смотрится лучше, спасибо :)
еще лучше так:
ReplyDeleteQ_URL=`svn info | awk '/URL/{print $2}'`
REV_LOCAL=`svn info | awk '/Revision/{print $2}'`
REV_SERVER=`svn info $Q_URL | awk '/Revision/{print $2}'`
if [ $REV_LOCAL -eq $REV_SERVER ]; then
echo "You have the most recent revision ($REV_LOCAL)"
exit 0
fi
# do update ...