% diff -u something.orig something > something.diff
Глава 11. Обновление отдельного порта
Этот перевод может быть устаревшим. Для того, чтобы помочь с переводом, пожалуйста, обратитесь к Сервер переводов FreeBSD.
Содержание
Когда порт не является самой последней версией, доступной от авторов, обновите локальную рабочую копию /usr/ports. Возможно, порт уже был обновлён до новой версии.
При работе с большим количеством портов, вероятно, будет проще использовать Git для поддержания всей коллекции портов в актуальном состоянии, как описано в Использование коллекции портов. Это также позволит отслеживать все зависимости портов.
Следующий шаг — проверить, есть ли уже ожидающее обновление. Для этого есть два варианта. Доступен поиск в Сообщения о проблемах (PR) или база данных ошибок FreeBSD. Выберите Ports & Packages
в меню множественного выбора Product
и введите название порта в поле Summary
.
Если таких отложенных PR не существует, то на следующем этапе следует послать сообщение электронной почты человеку, поддерживающему порт, который выдаётся по команде make maintainer
. Этот человек может уже работать над обновлением, или иметь причину не обновлять порт прямо сейчас (например, из-за проблем со стабильностью функционирования новой версии); вам нет нужды дублировать их работу. Заметьте, что неподдерживаемые порты перечисляются с адресом сопровождающего ports@FreeBSD.org
, который является всего лишь адресом общего списка рассылки, так что отправка туда сообщений, скорее всего, в данном случае не поможет.
Если сопровождающий просит вас выполнить обновление, либо сопровождающий отсутствует, то у вас появляется шанс помочь FreeBSD, приготовив обновление самим! Пожалуйста, делайте это с использованием команды diff(1) в основной системе.
Чтобы создать подходящий diff
для одного патча, скопируйте файл, который нужно пропатчить, в something.orig, сохраните ваши изменения в something, а затем создайте ваше патч:
В противном случае используйте метод git diff
(Использование Git для создания патчей) или скопируйте содержимое порта в совершенно другой каталог и используйте результат рекурсивного вывода diff(1) для новых и старых каталогов портов (например, если изменённый каталог порта называется superedit, а исходный находится в нашем дереве как superedit.bak, сохраните результат выполнения diff -ruN superedit.bak superedit
). Подойдёт как унифицированный, так и контекстный diff, но коммиттеры портов обычно предпочитают унифицированные diff. Обратите внимание на использование опции -N
— это общепринятый способ заставить diff корректно обрабатывать случаи добавления новых файлов или удаления старых. Перед отправкой diff, пожалуйста, проверьте вывод, чтобы убедиться, что все изменения имеют смысл. (В частности, не забудьте сначала очистить рабочие каталоги с помощью make clean
).
Если некоторые файлы были добавлены, скопированы, перемещены или удалены, добавьте эту информацию в отчёт о проблеме, чтобы коммиттер, принимающий патч, знал, какие команды git(1) нужно выполнить. |
Для упрощения стандартных операций с файлами исправлений используйте make makepatch
, как описано в Применение партчей. Существуют и другие инструменты, например /usr/ports/Tools/scripts/patchtool.py. Перед его использованием прочтите /usr/ports/Tools/scripts/README.patchtool.
Если порт никем не поддерживается, а вы активно его используете, пожалуйста, подумайте над тем, чтобы добровольно стать его сопровождающим. Во FreeBSD имеется более 4000 портов без поддержки, и это как раз та область, где всегда нужны добровольцы. (Детальное описание обязанностей сопровождающего можно найти в разделе Руководства Разработчика.)
Для отправки diff используйте форму отправки багов (продукт Ports & Packages
, компонент Individual Port(s)
). Всегда указывайте категорию с именем порта, за которой следует двоеточие и краткое описание проблемы. Примеры: категория/имя_порта: добавить опцию FOO
; категория/имя_порта: Обновление до X.Y
. Упоминайте в сообщении все добавленные или удалённые файлы, так как они должны быть явно указаны в git(1) при выполнении коммита. Не сжимайте и не кодируйте diff.
Прежде чем отправить сообщение об ошибке, ознакомьтесь с разделом Написание отчета о проблеме в статье "Отчеты о проблемах". В нем содержится гораздо больше информации о том, как составлять полезные отчеты о проблемах.
Если обновление вызвано соображениями информационной безопасности или наличием серьёзных ошибок в имеющемся порте, пожалуйста, оповестите Группа Менеджеров Дерева Портов FreeBSD <portmgr@FreeBSD.org> о необходимости немедленного перепостроения и повторного распространения пакета данного порта. В противном случае ничего не подозревающие пользователи |
Пожалуйста, используйте diff(1) или |
Теперь, когда вы проделали всё это, прочитайте о том, как поддерживать актуальное состояние, в Актуализация.
11.1. Использование Git для создания патчей
Когда это возможно, пожалуйста, предоставляйте патч или diff с помощью git(1). Их проще обрабатывать, чем различия между «новым и старым» каталогом. Так легче увидеть, что изменилось, и обновить diff, если что-то было изменено в Коллекции портов с момента начала работы над ней, или если коммиттер просит что-то исправить. Кроме того, патч, созданный с помощью git-format-patch(1) или git-diff(1), можно легко применить с помощью git-am(1) или git-apply(1), что сэкономит время коммиттера. Наконец, git-патч, созданный git-format-patch(1), включает информацию об авторе и сообщения коммитов. Они будут записаны в лог репозитория, и это рекомендуемый способ отправки ваших изменений.
% git clone https://git.FreeBSD.org/ports.git ~/my_wrkdir (1) (2)
% cd ~/my_wrkdir
1 | Это может быть где угодно; место, в котором производится построение портов, не привязано к /usr/ports/. |
2 | git.FreeBSD.org — это публичный Git-сервер FreeBSD. Подробнее см. в таблице URL-репозиториев FreeBSD Git. |
Находясь в каталоге порта, внесите необходимые изменения. Если требуется добавить, переместить или удалить файл, используйте git
для отслеживания этих изменений:
% git add new_file
% git mv old_name new_name
% git rm deleted_file
Убедитесь, что проверили порт, используя контрольный список в Тестирование порта и Проверка порта с помощью portlint
.
Также обновите ссылку на контрольную сумму в distinfo с помощью make makesum
.
Прежде чем создавать патч, загрузите последнюю версию репозитория и перебазируйте изменения поверх неё. Внимательно следите за выводом и следуйте ему. Если какие-либо файлы не удалось перебазировать, это означает, что исходные файлы изменились во время вашего редактирования, и конфликты необходимо разрешить вручную.
% git fetch origin main
% git rebase origin/main
Проверьте изменения, подготовленные для исправления:
% git status
% git diff --staged
Последний шаг — создать унифицированный diff или патч изменений:
Для создания патча с помощью git-format-patch(1):
% git checkout -b my_branch
% git commit
% git format-patch main
Это создаст файл исправления с именем вида 0001-foo.patch
. Это предпочтительный способ, так как он включает идентификацию автора, а также удобнее, когда вы делаете серию изменений, которые не должны объединяться вместе.
Или для создания унифицированного diff с помощью git-diff(1):
% git diff --staged > ../`make -VPKGNAME`.diff
Это создаст файл с различиями с именем вида foo-1.2.3.diff
. Здесь foo
заменяется на первую строку сообщения коммита, то есть на тему сообщения коммита.
После создания патча вы можете переключиться на основную ветку для начала других разработок.
% git checkout main
После принятия и слияния патча вы можете удалить локальную ветку разработки, если хотите:
% git branch -D my_branch
Если файлы были добавлены, перемещены или удалены, укажите использованные команды git(1) |
Отправьте исправление, следуя рекомендациям по отправке отчетов о проблемах.
11.2. UPDATING и MOVED
11.2.1. /usr/ports/UPDATING
Если обновление порта требует специальных действий, таких как изменение конфигурационных файлов или запуск определённой программы, это должно быть задокументировано в данном файле. Формат записи в этом файле следующий:
YYYYMMDD: AFFECTS: users of portcategory/portname AUTHOR: Your name <Your email address> Special instructions
При включении точных инструкций для portmaster, portupgrade и/или pkg, убедитесь в правильности экранирования в shell. Например, не используйте:
Как показано, команда будет работать только с bourne-оболочками. Вместо этого используйте форму, приведённую ниже, которая будет работать как с bourne-оболочкой, так и с c-оболочкой:
|
Рекомендуется, чтобы строка AFFECTS содержала glob-выражение, соответствующее всем портам, затронутым записью, чтобы автоматизированные инструменты могли максимально легко её обработать. Если обновление касается всех существующих версий BIND 9, содержимое |
11.2.2. /usr/ports/MOVED
Этот файл используется для перечисления перемещённых или удалённых портов. Каждая строка в файле состоит из названия порта, места, куда порт был перемещён, даты и причины. Если порт был удалён, раздел с указанием места перемещения может быть оставлен пустым. Каждый раздел должен быть отделён символом |
(вертикальная черта), например:
old name|new name (blank for deleted)|date of move|reason
Дата должна быть введена в формате ГГГГ-ММ-ДД
. Новые записи добавляются в конец списка, чтобы сохранить его в хронологическом порядке, при этом самая старая запись находится в начале списка.
Если порт был удален, но затем восстановлен, удалите строку в этом файле, которая указывает, что он был удален.
Если порт был переименован, а затем переименован обратно в исходное имя, добавьте новую запись с промежуточным именем для старого имени и удалите старую запись, чтобы не создавать цикл.
Любые изменения должны быть проверены с помощью Если используется каталог портов, отличный от /usr/ports, следует указать:
|
Изменено: 18 сентября 2025 г. by Vladlen Popolitov