Глава 10. Обновление отдельного порта

Содержание
10.1. Использование SVN для создания патчей
10.2. Файлы UPDATING и MOVED

Если вы заметите, что ваш порт устарел по сравнению с последней авторской версией, первым делом вы должны получить самую последнюю версия порта. Вы можете найти их в каталоге ports/ports-current на зеркальных FTP-серверах FreeBSD. Однако если вы работаете с достаточно большим количеством портов, наверное, будет проще использовать CVSup для поддержания всей коллекции портов в актуальном состоянии, как это описано в Руководстве. К тому же это даст возможность отслеживать все зависимости портов.

На следующем шаге необходимо выяснить, нет ожидает ли уже это обновление своей очереди. Для этого у вас есть две возможности. Существует интерфейс к базе данных сообщений о проблемах FreeBSD (PR) (известной также как GNATS) с поисковыми возможностями. Выберите из выпадающего списка ports и введите название порта.

Однако иногда люди забывают поместить название порта в поле Synopsis в точном виде. В таком случае вы можете воспользоваться Системой мониторинга портов FreeBSD (которая известна также как portsmon). В рамках этой системы делается попытка классифицировать PR, касающиеся портов, по имени порта. Для поиска PR, относящихся к определённому порту, используйте механизм Просмотра по одному порту.

Если таких отложенных PR не существует, то на следующем этапе следует послать сообщение электронной почты человеку, поддерживающему порт, который выдаётся по команде make maintainer. Этот человек может уже работать над обновлением, или иметь причину не обновлять порт прямо сейчас (например, из-за проблем со стабильностью функционирования новой версии); вам нет нужды дублировать их работу. Заметьте, что неподдерживаемые порты перечисляются с адресом сопровождающего ports@FreeBSD.org, который является всего лишь адресом общего списка рассылки, так что отправка туда сообщений, скорее всего, в данном случае не поможет.

Если сопровождающий просит вас выполнить обновление, либо сопровождающий отсутствует, то у вас появляется шанс помочь FreeBSD, приготовив обновление самим! Пожалуйста, делайте это с использованием команды diff(1) в основной системе.

Чтобы создать подходящий diff для одного патча, скопируйте файл, который нужно пропатчить, в something.orig, сохраните ваши изменения в something, а затем создайте ваше патч:

% /usr/bin/diff something.orig something > something.diff

В противном случае, вам следует воспользоваться методом svn diff (Разд. 10.1), либо скопировать содержимое порта в отдельный каталог и применить результат рекурсивной команды diff(1) между новым и старым каталогами порта (например, если каталог с модифицированным портом называется superedit, а оригинальный, совпадающий с находящимся в нашем дереве портов, superedit.bak, то сохраните результат выполнения команды diff -ruN superedit.bak superedit). Подойдёт как унифицированный, так и контекстный дифф, однако коммиттеры портов обычно предпочитают унифицированный формат. Отметьте использование опции -N—это одобряемый способ заставить diff корректно работать в случае добавления новых файлов или удаления старых. Перед тем, как посылать нам diff-файл, пожалуйста, проверьте его, чтобы убедиться в значимости всех внесённых изменений. (В частности, убедитесь, что вы очистили рабочие каталоги командой make clean).

Для упрощения повторяющихся операций с файлами заплаток вы можете воспользоваться скриптом /usr/ports/Tools/scripts/patchtool.py. Перед тем, как его запускать, пожалуйста, прочтите /usr/ports/Tools/scripts/README.patchtool.

Если порт никем не поддерживается, а вы активно его используете, пожалуйста, подумайте над тем, чтобы добровольно стать его сопровождающим. Во FreeBSD имеется более 4000 портов без поддержки, и это как раз та область, где всегда нужны добровольцы. (Детальное описание обязанностей сопровождающего можно найти в разделе в Руководстве Разработчика.)

Лучше всего послать нам diff-файл, включив его в посылку по команде send-pr(1) (категория ports). Если вы сопровождаете порт, обязательно поместите текст [maintainer update] в начале строки описания и задайте в поле ``Class'' вашего PR строчку maintainer-update. В противном случае в поле ``Class'' вашего PR должно быть указано change-request. Будьте добры, в сообщении отметьте все добавленные или удалённые файлы, так как они будут непосредственно указаны svn(1) при выполнении операции коммита. Если diff-файл имеет размер, превышающий 20КБ, сожмите его и обработайте утилитой uuencode; в противном случае просто включите его как есть в PR.

Прежде чем пользоваться send-pr(1) вы должны просмотреть раздел о Написании сообщений о проблемах в статье о Сообщениях об ошибках; он содержит гораздо больше информации о том, как писать полезные сообщения о проблемах.

Важно: Если ваше обновление вызвано соображениями информационной безопасности или наличием серьёзных ошибок в имеющемся порте, пожалуйста, оповестите Группа Менеджеров Дерева Портов FreeBSD о необходимости немедленного перепостроения и повторного распространения пакета вашего порта. В противном случае ничего не подозревающие пользователи pkg_add(1) будут продолжать устанавливать старую версию по команде pkg_add -r в течение ещё нескольких недель.

Замечание: Повторяем еще раз - для посылки обновлений существующих портов используйте утилиту diff(1), а не shar(1)! Это поможет понять коммиттерам портов, что именно было изменено.

Теперь, когда вы проделали всё это, вам может понадобиться прочесть о том, как поддерживать актуальное состояние, в Гл. 14.

10.1. Использование SVN для создания патчей

По возможности присылайте исправления в формате svn(1) diff; в таком виде их проще использовать по сравнению с разницей между ``старым и новым'' каталогами. К тому же, вам проще увидеть ваши изменения и обновить их в случае, если что-нибудь изменилось в Коллекции Портов с тех пор, как вы начали работу, пока вы не отправите ваши изменения, либо если коммиттер попросит вас исправить что-то еще.

% cd ~/my_wrkdir (1)
% svn co svn://svn.FreeBSD.org/ports/head/dns/pdnsd (2)
% cd ~/my_wrkdir/pdnsd
(1)
Это может быть где угодно; место, в котором производится построение портов, не привязано к /usr/ports/.
(2)
svn.FreeBSD.org — это общедоступный SVN сервер.

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

% svn add new_file
% svn remove deleted_file

Убедитесь, что вы проверяете порт в соответствии с рекомендуемым порядком проверки, описанным в Разд. 3.4 и Разд. 3.5.

% svn status
% svn update (1)
(1)
Эта команда попытается выполнить слияние различий между вашим патчем и текущим содержимым в SVN; внимательно проверьте полученный вывод. Буква перед названием каждого файла означает тип изменения, сделанного с этим файлом. Для получения полного списка смотрите Табл. 10-1.

Таблица 10-1. Префиксы файлов для SVN update

U Файл обновлен без проблем.
G Файл обновлен без проблем (вы увидите это только при работе с удаленным репозиторием).
M Файл с локальными изменениями, слияние выполнено без конфликтов.
C Файл с локальными изменениями, слияние выполнено с конфликтами.

Если в результате выполнения svn update вы получили C, то это означает, что что-то изменилось в репозитории SVN и svn(1) не смогла выполнить слияние ваших локальных изменений с полученными из репозитория. В любом случае никогда не помешает просмотреть изменения, поскольку svn(1) ничего не знает о том, каким должен быть порт, поэтому эта команда может (и, вероятно, будет) делать слияние тех изменений, которые не имеют смысла.

Последним шагом является создание унифицированного diff(1) для файлов относительно SVN:

% svn diff > ../`basename ${PWD}`.diff

Замечание: Информация о любых удаляемых файлов должна быть явным образом указана в PR, поскольку необходимость в удалении файла для коммиттера может быть неочевидна.

Присылайте свои патчи в соответствии с руководством, описанном в Гл. 10.

По вопросам связанным с системой портов для FreeBSD, пишите по адресу <ports@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите по адресу <doc@FreeBSD.org>.