Friday, August 22, 2008

Получение номера ревизии SVN в bash

В одном из проектов потребовалось написать небольшую утилиту для 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 они все удаляются. Если будете пользоваться - будьте осторожны, не потрите полезные файлы ;)