вторник, 8 февраля 2011 г.

Триггеры perforce

Наша разработка ведется очень демократично. Мы пишем под FreeBSD (исторически и лицензионно сложилось), используем кодировку koi8-r (тоже исторически сложилось, FreeBSD не очень то дружит с UTF-8 и по сей день).

Но в то же время мы не навязываем разработчикам никаких условий... Каждый работает так, как ему комфортнее. Жить под FreeBSD - я не пожелаю и врагу (ну вы уже знаете, как я ее не люблю :) ). Наши разработчики пользуются своими любимыми редакторами, сидят в своих любимых системах с разными локалями и интерпретациями концов строк.

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

В perforce используются типы файлов, с помощью которых можно задавать отчасти кодировку, расстановку тегов и формат файлов. Тип unicode, в частности, позволяет каждому клиенту предоставлять текст в той кодировке, которую тот использует. Что крайне неудобно, если хочется везде иметь koi8-r.

Поэтому список типов файлов волевым решением был жестко ограничен следующими типами: binary, text, symlink. Для воплощения этого в perforce используются триггеры.
#!/bin/sh
REV=$1
lsfiles()
{
p4 files //depot/...@=$1 | grep -v '(binary' | \
grep -v '(text' | grep -v '(symlink' | \
grep -v 'delete change'
}

if [ `lsfiles $REV | wc -l` != 0 ]; then
echo "Using forbidden filetypes"
lsfiles $REV
exit 1
fi
Надо сказать что действия с репозиторием в триггере ограничены. Например доступ к ревизии осуществляется исключительно по номеру @=<номер ревизии>, ибо это pending changelist.

Указанный выше фильтр допускает применение модификаторов, как-то text+k, text+ko, text+kox, но и тут собака порылась... В мануале написано:
The following type aliases exist for backwards compatibility:
xtext text +x
То есть ты, зараза такая должна отображать их по новому!!! а ты, зараза такая, вместо этого, при указании text+x радостно пишешь - xtext... Пришлось добавить дополнительный grep на этот случай.
grep -v 'text)'
Теперь осталось включить триггер..
$ p4 triggers
Triggers:
forbidden change-content //depot/... "prohibited-file-types %change%"
После чего ни один коммит содержащий unicode, UTF16 или еще какую непонятную фигню не пройдет.

В этом триггере возможно использование change-submit, для указанной ревизии список файлов должен быть уже на сервере. Но я как-то в процессе экспериментов остановился на change-content, пусть пока так стоит.

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

Наверное подойдет что-то типа того:
iconv -f utf-8 -t koi8-r && die