Ubuntu logo

Packaging Guide

8. Патчи для пакетов

Иногда разработчикам пакета Ubuntu надо изменить исходный код апстрима, чтобы заставить его работать в Ubuntu должным образом. Примеры включают патчи для апстримов, которые еще не попали в версию релиза, либо изменения к системам билдов апстрима, необходимые только для их сборки на Ubuntu. Мы будем менять исходный код апстрима напрямую, но такой метод делает более сложным дальнейшее удаление патчей, когда апстрим уже применил их, также усложняя извлечение изменений для их отправки в проект апстрима. Вместо этого, мы будем хранить эти изменения как отдельные патчи в форме diff файлов.

Существуют различные способы работы с патчами для пакетов Debian. К счастью, мы остановимся на одной системе, Quilt, которая сейчас используется большинством пакетов.

Давайте возьмём в качестве примера пакет kamoso в Trusty:

$ bzr branch ubuntu:trusty/kamoso

Патчи хранятся в debian/patches. Для этого пакета имеется один патч kubuntu_01_fix_qmax_on_armel.diff для исправления ошибки компиляции на платформе ARM. Этому патчу присвоено имя, описывающее, что он делает, номер патча по порядку (чтобы избежать путаницы, если два патча имеют одинаковое имя) и, в данном случае, команда Kubuntu добавила свой собственный префикс, чтобы показать, что патч исходит от них, а не от Debian.

Порядок применения патчей хранится в debian/patches/series.

8.1. Патчи с помощью Quilt

Перед работой с Quilt нужно указать этой системе, где искать патчи. Добавьте в ~/.bashrc следующее:

export QUILT_PATCHES=debian/patches

И источник файла для применения нового экспорта:

$ . ~/.bashrc

По умолчанию все патчи применяются уже с UDD извлечений или загружаемых пакетов. Вы можете проверить это с помощью:

$ quilt applied
kubuntu_01_fix_qmax_on_armel.diff

Если вы хотите удалить патч, нужно выполнить pop:

$ quilt pop
Removing patch kubuntu_01_fix_qmax_on_armel.diff
Restoring src/kamoso.cpp

No patches applied

А чтобы применить патч, используйте push:

$ quilt push
Applying patch kubuntu_01_fix_qmax_on_armel.diff
patching file src/kamoso.cpp

Now at patch kubuntu_01_fix_qmax_on_armel.diff

8.2. Добавление нового патча

Для добавления нового патча нужно указать Quilt создать новый патч, сообщить ему, какие файлы этот патч должен изменить, отредактировать файлы, а затем обновить патч:

$ quilt new kubuntu_02_program_description.diff
Patch kubuntu_02_program_description.diff is now on top
$ quilt add src/main.cpp
File src/main.cpp added to patch kubuntu_02_program_description.diff
$ sed -i "s,Webcam picture retriever,Webcam snapshot program,"
src/main.cpp
$ quilt refresh
Refreshed patch kubuntu_02_program_description.diff

Шаг quilt add важен: если вы забудете его сделать, файлы не попадут в патч.

Теперь изменения будут в debian/patches/kubuntu_02_program_description.diff, а в файл series будет добавлена информация о новом патче. Вы должны добавить новый файл в исходные файлы для пакета:

$ bzr add debian/patches/kubuntu_02_program_description.diff
$ bzr add .pc/*
$ dch -i "Add patch kubuntu_02_program_description.diff to improve the program description"
$ bzr commit

Quilt содержит свои мета-данные в директории .pc/, поэтому сейчас вам нужно добавить в пакет и её. Это должно быть улучшено в будущем.

Как правило, следует проявлять осторожность при добавлении патчей к программам, если они исходят не из апстрима. Часто имеется веская причина, по которой изменения ещё не были сделаны. В рассмотренном выше примере изменяется строка в пользовательском интерфейсе, так что это может поломать все переводы. Если сомневаетесь, спросите автора из апстрима перед тем, как добавить патч.

8.3. Заголовки патчей

Мы рекомендуем добавлять к каждому патчу заголовки DEP-3, помещая их в самом верху файла патча. Вот некоторые заголовки, которые можно использовать:

Description:

Описание того, что делает патч. Имеет формат, аналогичный полю Description в debian/control: первая строка содержит краткое описание, начинающееся со строчной буквы, остальные строки содержат более длинное описание с пробелом в качестве отступа.

Author:

Кто написал патч (например, “Jane Doe <packager@example.com>”).

Origin:

Откуда пришёл этот патч (например, “upstream”), если заголовок Author отсутствует.

Bug-Ubuntu:

Ссылка на информацию об ошибке на Launchpad, предпочтительно, в краткой форме (наподобие https://bugs.launchpad.net/bugs/XXXXXXX). Если также имеются отчёты об ошибках в апстриме или системах отслеживания ошибок Debian, добавьте заголовки Bug или Bug-Debian.

Forwarded:

Был ли патч передан в апстрим. Значения: “yes”, “no” или “not-needed”.

Last-Update:

Дата последней ревизии (в форме “ГГГГ-ММ-ДД”).

8.4. Обновление до новых версий из апстрима

Чтобы выполнить обновление до последней версии, вы можете использовать команду bzr merge-upstream:

$ bzr merge-upstream --version 2.0.2 https://launchpad.net/ubuntu/+archive/primary/+files/kamoso_2.0.2.orig.tar.bz2

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

$ quilt push
Applying patch kubuntu_01_fix_qmax_on_armel.diff
patching file src/kamoso.cpp
Hunk #1 FAILED at 398.
1 out of 1 hunk FAILED -- rejects in file src/kamoso.cpp
Patch kubuntu_01_fix_qmax_on_armel.diff can be reverse-applied

Если для патча указано it can be reverse-applied, значит патч уже был применён апстримом, так что мы можем удалить этот патч:

$ quilt delete kubuntu_01_fix_qmax_on_armel
Removed patch kubuntu_01_fix_qmax_on_armel.diff

Затем продолжайте:

$ quilt push
Applied kubuntu_02_program_description.diff

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

$ quilt refresh
Refreshed patch kubuntu_02_program_description.diff

Затем выполните фиксацию, как обычно:

$ bzr commit -m "new upstream version"

8.5. Создание пакета с использованием Quilt

Современные пакеты используют Quilt по умолчанию, это встроено в формат исходных файлов пакета. Проверьте, что в debian/source/format указано 3.0 (quilt).

Для более старых пакетов, использующих формат 1.0, необходимо использовать Quilt явно, обычно с помощью включения make-фала в debian/rules.

8.6. Конфигурирование Quilt

Вы можете воспользоваться файлом ~/.quiltrc для конфигурирования quilt. Вот несколько опций, которые могут быть полезны при использовании quilt с пакетами Debian:

# Set the patches directory
QUILT_PATCHES="debian/patches"
# Remove all useless formatting from the patches
QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
# The same for quilt diff command, and use colored output
QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"

8.7. Другие системы управления патчами

Другие системы патчинга, используемые в пакетах, включают dpatch и cdbs simple-patchsys, принцип работы которых похож на Quilt - патчи хранятся в debian/patches, но для их применения, отмены или создания требуются другие команды. Вы можете узнать какая система патчинга используется в пакете при помощи команды what-patch``(в пакете ``ubuntu-dev-tools). Вы можете использовать edit-patch, показанный в предыдущих главах, в качестве надежного способа для работы со всеми системами.

В более старых пакетах изменения будут включены напрямую в источники и храниться в исходном файле diff.gz. Это делает сложнее процесс обновления до новых версий апстрима или различия между патчами - лучше избегать.

Не изменяйте систему патчей, не обсудив это с сопровождающим Debian или имеющей отношение к делу командой Ubuntu. Если существующей системы патчей нет, можете добавить Quilt.