14.10 Конфигурационные файлы для поддержки команды commit contents

Подраздел


14.10 Конфигурационные файлы для поддержки команды commit

Параметр -i в файле modules может быть использован, чтобы запустить определ©нную программу в момент обновления хранилища по команде commit. Конфигурационные файлы, рассматриваемые в данном разделе, обеспечивают более гибкие способы для запуска программ, когда что-то обновляется в хранилище по команде commit.

Имеется три вида программ, которые могут быть запущены по команде commit. Эти программы определяются в конфигурационных файлах в хранилище в каталоге $CVSROOT/CVSROOT и описываются ниже. Нижеследующая таблица описывает имена конфигурационных файлов и назначение соответствующих программ.

commitinfo
- в этом файле может быть указана программа, которая ответственна за проверку того, что команда commit разрешена. Если программа завершится с ненулевым кодом завершения, то операция commit будет отвергнута.

verifymsg
- здесь может быть указана специальная программа, которая используется, чтобы обработать сообщение для протокола и, возможно, проверить, что сообщение содержит необходимые поля. Это наиболее интересно в комбинации с файлом rcsinfo, который может содержать шаблон для сообщения в протокол.

editinfo
- в файле может быть определена программа, которая вызывается, чтобы отредактировать сообщение для протокола.

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

Конфигурационные файлы commitinfo, loginfo, rcsinfo, verifymsg, а также другие имеют общий формат. Каждая строка содержит следующее:

  • Регулярное выражение. Синтаксис регулярного выражения тот же, что используется в GNU Emacs.

  • Разделитель полей - один или более пробелов и/или знаков табуляции (TAB).

  • Шаблон имени файла или команды.

Пустые строки игнорируются. Строки начинающиеся с символа # (реш©тка) рассматриваются как комментарий. Длинные строки НЕ могут быть разбиты на две строки.

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

14.10.1 Файл commitinfo

Файл commitinfo определяет программы, которые будут вызваны, когда система CVS готовится выполнить операцию commit. Эти программы используются для проверки, что добавляемые, удаляемые или модифицируемые файлы действительно готовы для планируемых операций. Такая проверка могла бы заключаться в том, что внес©нные изменения соответствуют стандартам, принятым в вашей организации.

Каждая строка файла commitinfo состоит из регулярного выражения и шаблона команды. Шаблон состоит из имени программы (скрипта) и любого количества параметров. Полный путь к текущему хранилищу добавляется к шаблону, за которым следуют имена любых файлов, над которыми выполняется операцию commit.

Будет использована первая строка файла commitinfo, в которой встретилось регулярное выражение, соответствующее имени каталога в хранилище. Если команда возвращает ненулевой код завершения, то операция прекращается.

Если имя хранилища не соответствует никакой строке файла commitinfo, то будет выполнена команда из строки DEFAULT, если таковая есть.

Все появления имени ALL в регулярных выражениях в файле commitinfo будут использованы после соответствующего регулярного выражения или после DEFAULT.

Замечание. Когда CVS использует удал©нное хранилище, то будет использован файл commitinfo на серверной стороне, а не на стороне клиента.

14.10.2 Файл verifymsg

Раз вы ввели сообщение для протокола, то вы можете обработать данное сообщение, чтобы выделить специфическое содержание, например, номер ошибки. Используйте файл verifymsg, чтобы определить имя программы (скрипта), которая будет вызываться для анализа сообщения.

Файл verifymsg наиболее полезен вместе с файлом rcsinfo, который может задавать шаблон (формат) сообщения.

Каждая строка в файле verifymsg состоит из регулярного выражения и шаблона команды. Шаблон должен включать имя программы (скрипта) и может включать любое число аргументов. Полный путь к текущему файлу, содержащему шаблон сообщения, добавляется к шаблону.

Следует отметить, что ключевое слово ALL не поддерживается. Если найдено два регулярных выражения соответствующих каталогу, то используется первое из найденных.

Если имя хранилища не соответствует никакой строке файла verifymsg, то будет выполнена команда из строки DEFAULT, если таковая есть.

Если код завершения ненулевой, то выполнение команды commit прекращается.

Заметим, что проверочная программа (скрипт) не может изменить сообщение для протокола, а может лишь принять или отвергнуть его. Ниже следует пример использования файла verifymsg совместно с файлом rcsinfo, а также с шаблоном сообщения и проверочным скриптом.

Мы начн©м с шаблона сообщения. Здесь мы хотели бы установить стандарт сообщения, чтобы в первой строке был номер ошибки (BugID). Остаток сообщения может содержать произвольный текст.

Предположим, шаблон сообщения находится в файле /usr/cvssupport/welcome.template.


cat /usr/cvssupport/welcome.template

BugId:

При этом скрипт /usr/cvssupport/bugid.verify используется для обработки сообщения:

 #!/bin/sh

 #

 #  Имя файла bugid.verify 

 #

 # Проверить, что сообщение для протокола содержит номер

 # ошибки в правильном формате в первой строке сообщения.

 #

 if head -1 < $1 | grep '^BugId:[ ]*[0-9][0-9]*$' > /dev/null; 

 then

  exit 0

 else

  echo "No BugId found."

  exit 1

 fi

Файл verifymsg содержит строку:


  ^welcome  /usr/cvssupport/bugid.verify

Файл rcsinfo содержит строку:


  ^welcome  /usr/cvssupport/welcome.template

14.10.3 Файл loginfo

Файл loginfo используется для определения, куда должна посылаться протокольная информация о cvs commit. Первая часть строки является регулярным выражением, сличаемое с именем каталога, в котором производятся изменения (относительно $CVSROOT). Если соответствие найдено, тогда остаток строки есть программа (скрипт) типа фильтр, которая должна читать протокольное сообщение на устройстве стандартного ввода.

Если имя хранилища не соответствует никакой строке файла loginfo, то будет выполнена команда из строки DEFAULT, если таковая есть.

Все появления имени ALL появляющиеся как регулярные выражения используются в дополнение к ранее найденным соответствиям или к DEFAULT.

Принимается во внимание первое найденное регулярное выражение.

Пользователь может определить форматную строку как часть фильтра. Строка состоит из знака % (процент), за которым может следовать:

  • пробел;

  • одиночный символ формата;

  • или группа символов формата, которая окружена фигурными скобками.

Символами формата могут быть:

s
имя файла;
V
старый номер версии (до внесения в хранилища, до commit);
v
новый номер версии (после внесения в хранилище, после commit).

Все другие символы, которые появляются в форматной строке, замещаются пустой строкой.

Например, некоторые правильные форматные строки:
% , %s , %s , %{sVv} .

Выводом будут строки токенов, раздел©нные пробелами. Первым токеном является имя хранилища. Остаток токенов будет раздел©нный запятыми список компонентов, запрошенный форматной строкой. Например, если /u/src/master есть хранилище, а SPMquotдва файла (Makefile и ChangeLog) были изменены, то вывод мог бы быть таким:


/u/src/master ChangeLog,1.1,1.2 Makefile,1.3,1.4

Если в вышепривед©нном примере форматная строка будет иметь вид SPMquot

Замечание. Когда CVS обращается к удал©нному хранилище, то принимается во внимание файл loginfo на удал©нном сервере, на котором располагается хранилище, а не на клиентской стороне.

Рассмотрим пример. Привед©нный ниже файл loginfo вместе с маленьким скриптом добавляет все сообщения в протокол $CVSROOT/CVSROOT/commitlog к файлу /usr/adm/cvsroot-log. Любые изменения в программе prog1 сообщаются электронной почтой пользователю shevel.

Содержимое файла loginfo:


ALL /usr/local/bin/cvs-log $CVSROOT/CVSROOT/commitlog $USER

^CVSROOT /usr/local/bin/cvs-log /usr/adm/cvsroot-log

^prog1 Mail -s %s shevel

Содержание скрипта /usr/local/bin/cvs-log:


#!/bin/sh

(echo "------------------------------------------------------";

 echo -n $2" ";

 date;

 echo;

 cat) >> $1

14.10.4 Поддержка свежей рабочей копии

Часто оказывается очень желательным поддерживать дерево рабочих каталогов так, чтобы оно содержало наиболее свежие версии файлов в хранилище. Например, часть разработчиков могла бы пожелать использовать наиболее свежие исходники без необходимости постоянно следить за этим самому. Другой пример. Допустим вы обслуживаете WWW сервер и содержите страницы в хранилище CVS. Тогда было бы весьма удобно, чтобы любое изменение в хранилище сразу становилось доступно вашему WWW серверу.

Хороший способ выполнять вс© то, о ч©м мы говорили, - это использовать в файле loginfo команду cvs update. Использовать команду cvs update прямо как записано будет затруднительно из-за того, что CVS блокирует доступ к хранилищу на время изменения файлов хранилища. Поэтому команда cvs update должна выполняться в фоновом режиме. Ниже следует пример, в котором вс© должно быть записано в одной строке:


^cyclic-pages (date; cat; (sleep 2; cd /www/docs/CSD;

cvs -q update -d) &) >> $CVSROOT/CVSROOT/updatelog 2>&1

Эта последовательность выполнится, когда будут изменяться файлы, имена которых начинаются с cyclic-pages, т.е. будет обновлено дерево /www/docs/CSD (выполнена команда update).

14.10.5 Файл rcsinfo

Файл rcsinfo может быть использован, чтобы определить форму для редактирования, когда формируется сообщение, которое будет записано в протокол операции commit. Файл rcsinfo строится в соответствии с синтаксисом, похожим на тот, что используется в файлах verifymsg, commitinfo и loginfo. Однако, в противоположность другим файлам, вторая часть строки после регулярного выражения является не командой, а абсолютным именем файла, в котором хранится шаблон сообщения.

Если имена в хранилище не соответствуют никакому регулярному выражению в этом файле, то используется строка с именем DEFAULT, если она имеется.

Все появления имени ALL как регулярного выражения используются в дополнение к другим строкам.

Шаблон сообщения будет использоваться как сообщение по умолчанию. Если вы укажете cvs commit -m message или cvs commit -f file, то сообщения, которые вы указали в команде, заменят ваш шаблон.

Когда CVS получает доступ к удал©нному хранилищу, содержание файла rcsinfo во время первоначального формирования рабочего каталога (выполняется checkout) будет определять шаблон, который там не изменится. Если вы редактируете файл rcsinfo или его шаблоны, то вам возможно понадобится выполнить команду checkout в новом рабочем каталоге.


contents Обновлено: 16.03.2015