Патчи для пакетов¶
Sometimes, Ubuntu package maintainers have to change the upstream source code in order to make it work properly on Ubuntu. Examples include, patches to upstream that haven’t yet made it into a released version, or changes to the upstream’s build system needed only for building it on Ubuntu. We could change the upstream source code directly, but doing this makes it more difficult to remove the patches later when upstream has incorporated them, or extract the change to submit to the upstream project. Instead, we keep these changes as separate patches, in the form of diff files.
Существуют различные способы работы с патчами для пакетов Debian. К счастью, мы остановимся на одной системе, Quilt, которая сейчас используется большинством пакетов.
Давайте рассмотрим в качестве примера пакет kamoso в Natty:
$ bzr branch ubuntu:natty/kamoso
Патчи хранятся в debian/patches. Для этого пакета имеется один патч kubuntu_01_fix_qmax_on_armel.diff для исправления ошибки компиляции на платформе ARM. Этому патчу присвоено имя, описывающее, что он делает, номер патча по порядку (чтобы избежать путаницы, если два патча имеют одинаковое имя) и, в данном случае, команда Kubuntu добавила свой собственный префикс, чтобы показать, что патч исходит от них, а не от Debian.
Порядок применения патчей хранится в debian/patches/series.
Патчи с помощью Quilt¶
Перед работой с Quilt нужно указать этой системе, где искать патчи. Добавьте в ~/.bashrc следующее:
export QUILT_PATCHES=debian/patches
And source the file to apply the new export:
$ . ~/.bashrc
By default all patches are applied already to UDD checkouts or downloaded packages. You can check this with:
$ 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
Добавление нового патча¶
Для добавления нового патча нужно указать 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 важен: если вы забудете его сделать, файлы не попадут в патч.
The change will now be in debian/patches/kubuntu_02_program_description.diff and the series file will have had the new patch added to it. You should add the new file to the packaging:
$ 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 keeps its metadata in the .pc/ directory, so currently you need to add that to the packaging too. This should be improved in future.
Как правило, следует проявлять осторожность при добавлении патчей к программам, если они исходят не из апстрима. Часто имеется веская причина, по которой изменения ещё не были сделаны. В рассмотренном выше примере изменяется строка в пользовательском интерфейсе, так что это может поломать все переводы. Если сомневаетесь, спросите автора из апстрима перед тем, как добавить патч.
Обновление до новых версий из апстрима¶
При обновлении до новой версии из апстрима патчи часто оказываются устаревшими. Может понадобиться обновить их для соответствия новому исходному коду или вообще удалить.
You should start by ensuring no patches are applied. Unfortunately a commit is needed before you can merge in the new upstream (this is bug 815854):
$ quilt pop -a
$ bzr commit -m "remove patches"
Затем выполните обновление на новую версию:
$ 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
It is a good idea to run refresh, this will update the patch relative to the changed upstream source:
$ quilt refresh
Refreshed patch kubuntu_02_program_description.diff
Затем выполните фиксацию, как обычно:
$ bzr commit -m "new upstream version"
Создание пакета с использованием Quilt¶
Modern packages use Quilt by default, it is built into the packaging format. Check in debian/source/format to ensure it says 3.0 (quilt).
Для более старых пакетов, использующих формат 1.0, необходимо использовать Quilt явно, обычно с помощью включения make-фала в debian/rules.
Другие системы управления патчами¶
Other patch systems used by packages include dpatch and cdbs simple-patchsys, these work similarly to Quilt by keeping patches in debian/patches but have different commands to apply, un-apply or create patches. You can find out which patch system is used by a package by using the what-patch command (from the ubuntu-dev-tools package). You can use edit-patch, shown in previous chapters, as a reliable way to work with all systems.
In even older packages changes will be included directly to sources and kept in the diff.gz source file. This makes it hard to upgrade to new upstream versions or differentiate between patches and is best avoided.
Do not change a package’s patch system without discussing it with the Debian maintainer or relevant Ubuntu team. If there is no existing patch system then feel free to add Quilt.