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

3 comments:

  1. Че-то как-то неправильно.
    Извлеч версию можно одной командой, какие-то извращения со сплитом.

    Да и временные файлы вообще не понятно зачем. :)

    REV=`svn info | grep Revision | sed -e 's/Revision: //'`

    ну а там просто юзать $(REV)...

    ReplyDelete
  2. > Че-то как-то неправильно.

    Правильно.

    > REV=`svn info | grep Revision | sed -e 's/Revision: //'`

    Но с sed смотрится лучше, спасибо :)

    ReplyDelete
  3. еще лучше так:

    Q_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 ...

    ReplyDelete