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.