Глава 9. Обновление пакета

Содержание

9.1. Новая редакция Debian
9.2. Изучение нового авторского выпуска
9.3. Новый авторский выпуск
9.4. Обновление стиля пакетирования
9.5. Замечания по обновлению пакетов

Вскоре после выпуска пакета, вам понадобится его обновить.

9.1. Новая редакция Debian

Предположим, что в вашем пакете нашли ошибку (номер #654321), и описываемую там проблему вы можете решить. Для того, чтобы создать новую редакцию пакета, нужно:

  • Если исправление должно быть записано в виде новой заплаты, сделайте следующее:

    • запустите dquilt new название-ошибки.patch для присвоения имени заплате;

    • запустите dquilt add файл-с-ошибкой для объявления файла, который должен быть изменён;

    • исправьте ошибку в пакете исходного кода;

    • запустите dquilt refresh для записи исправления в файл название-ошибки.patch;

    • запустите dquilt header -e для добавления её описания;

  • Если для исправления требуется обновление существующей заплаты, сделайте следующее:

    • запустите dquilt pop foo.patch для того, чтобы откатить наложенную заплату foo.patch;

    • исправьте проблему в старой заплате foo.patch;

    • запустите dquilt refresh для обновления заплаты foo.patch;

    • запустите dquilt header -e для обновления её описания;

    • запустите while dquilt push; do dquilt refresh; done для применения всех заплат при удалении шероховатостей;

  • Добавьте новую редакцию в начало файла Debian changelog, например, с помощью dch -i или вручную с помощью dch -v версия-редакция, а затем добавьте комментарии с помощью текстового редактора [81].

  • Включите краткое описание ошибки и её решение в список изменений (changelog), сопроводив текстом Closes: #654321. Это позволит автомагически закрыть сообщение об ошибке с помощью программного обеспечения обслуживания архива в тот момент, когда ваш пакет будет принят в архив Debian.

  • Повторите то, что делали выше, для исправления других ошибок, обновляя файл Debian changelog с помощью dch по мере надобности.

  • Повторите операции из Раздел 6.1, «Полная (пере)сборка», Глава 7, Проверка пакета на наличие ошибок и Глава 8, Отправка пакета с той разницей, что на этот раз не будет включён оригинальный архив исходного кода, поскольку он не изменён и уже присутствует в архиве Debian.

Стоит упомянуть одну хитрость на случай, когда вы делаете локальный пакет для эксперимента с пакетированием и не отправляете эту версию в официальный архив, например, 1.0.1-1. Для плавного обновления рекомендуется создать запись в changelog со строкой версии вида 1.0.1-1~rc1. Вы можете не перегружать changelog записями о локальных изменениях, объединяя их в одну для официального пакета. Об упорядочивании версий строк смотрите Раздел 2.6, «Имя и версия пакета».

9.2. Изучение нового авторского выпуска

При подготовке пакетов нового авторского выпуска для архива Debian, вы должны сперва проверить новый авторский выпуск.

Начните с чтения файлов changelog, NEWS и всей остальной документации, которая может поставляться с новой версией.

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

$ diff -urN foo-старая-версия foo-новая-версия

На изменения в некоторых автоматически сгенерированных файлах Autotools, таких как missing, aclocal.m4, config.guess, config.h.in, config.sub, configure, depcomp, install-sh, ltmain.sh и Makefile.in, можно не обращать внимания. Вы можете удалить их перед запуском diff для проверки исходного кода.

9.3. Новый авторский выпуск

Если пакет foo правильно собран в новом формате 3.0 (native) или 3.0 (quilt), то для подготовки пакета новой версии программы достаточно переместить старый каталог debian в новый исходный код. Это можно сделать запуском tar xvzf /путь/к/foo_старая-версия.debian.tar.gz в каталоге с новым исходным кодом [82]. Конечно, потребуется сделать несколько очевидных рутинных операций.

  • Скопируйте авторский исходный код в файл foo_новая-версия.tar.gz.

  • Обновите файл Debian changelog с помощью dch -v новая-версия-1.

    • Добавьте пометку New upstream release.

    • Лаконично опишите изменения в новом авторском выпуске, которые исправляют найденные ошибки, и закройте эти ошибки, добавляя Closes: #номер_ошибки.

    • Лаконично опишите изменения в новом авторском выпуске, сделанные сопровождающим, которые исправляют найденные ошибки, и закройте эти ошибки, добавляя Closes: #номер_ошибки.

  • запустите while dquilt push; do qduilt refresh; done для применения всех заплат при удалении шероховатостей.

Если наложение/слияние произошло с ошибками, изучите ситуацию (сведения есть в файлах .rej).

  • Если применяемая заплата к исходному коду была интегрирована в авторский исходный код, то

    • выполните dquilt delete для её удаления.

  • Если применяемая заплата к исходному коду конфликтует с новыми изменениями в авторском исходном коде, то

    • выполните dquilt push -f для наложения старых заплат с отбрасыванием конфликтующих baz.rej.

    • Исправьте файл baz ручным копированием нужных строки из baz.rej.

    • запустите dquilt refresh для обновления заплаты.

  • Продолжайте, как обычно, командой while dquilt push; do dquilt refresh; done.

Это может быть автоматизировано с помощью команды uupdate(1):

$ apt-get source foo
...
dpkg-source: info: extracting foo in foo-старая-версия
dpkg-source: info: unpacking foo_старая-версия.orig.tar.gz
dpkg-source: info: applying foo_старая-версия-1.debian.tar.gz
$ ls -F
foo-старая-версия/
foo_старая-версия-1.debian.tar.gz
foo_старая-версия-1.dsc
foo_старая-версия.orig.tar.gz
$ wget http://example.org/foo/foo-новая-версия.tar.gz
$ cd foo-старая-версия
$ uupdate -v новая-версия ../foo-новая-версия.tar.gz
$ cd ../foo-новая-версия
$ while dquilt push; do dquilt refresh; done
$ dch
... описание проведённых изменений

Если вы настроили файл debian/watch по описанию из Раздел 5.20, «Файл watch», то можете пропустить команду wget. Просто запустите uscan(1) в каталоге foo-старая-версия вместо команды uupdate. Она автомагически найдёт обновления исходного кода, скачает его и запустит команду uupdate [83].

Вы можете выпустить этот обновлённый исходный код, повторив то, что делали в Раздел 6.1, «Полная (пере)сборка», Глава 7, Проверка пакета на наличие ошибок и Глава 8, Отправка пакета.

9.4. Обновление стиля пакетирования

При обновлении пакета обновлять стиль пакетирования необязательно. Но сделав это, вы сможете полностью использовать возможности современной системы debhelper и формата исходного кода 3.0 [84].

  • Если по какой-то причине требуется пересоздать удалённые шаблоны файлов, вы можете ещё раз запустить dh_make с параметром --addmissing в том же дереве исходного кода пакета Debian, а затем отредактировать их должным образом.

  • Если в пакете файл debian/rules не переписан с использованием команды dh из пакета debhelper v7, то сделайте это. Обновите файл debian/control соответствующим образом.

  • Если вы хотите переписать файл rules с использованием dh, в котором сейчас используется механизм включения Makefile из Common Debian Build System (cdbs), то для понимания его переменных настройки DEB_* смотрите следующие документы:

  • Если у вас есть пакет исходного кода формата 1.0 без файла foo.diff.gz, вы можете обновить его до нового формата исходного кода 3.0 (native), создав файл debian/source/format с содержимым 3.0 (native). Остальные файлы debian/* могут быть просто скопированы.

  • Если у вас есть пакет с исходным кодом формата 1.0 с файлом foo.diff.gz, вы можете обновить его до нового формата исходного кода 3.0 (quilt), создав файл debian/source/format с содержимым 3.0 (quilt). Остальные файлы debian/* могут быть просто скопированы. Если нужно, импортируйте файл big.diff, полученный командой filterdiff -z -x '*/debian/*' foo.diff.gz > big.diff, в вашу систему quilt [85].

  • Если в пакете используется другая система заплат, например, dpatch, dbs или cdbs с параметром -p0, -p1 или -p2, перейдите на quilt, используя deb3, как описано в http://bugs.debian.org/581186.

  • Если пакет был собран командой dh с параметром --with quilt или командами dh_quilt_patch и dh_quilt_unpatch, уберите их и перейдите на использование нового формата пакетов исходного кода 3.0 (native).

Также вам нужно выполнить остальные задачи, описанные в Раздел 9.3, «Новый авторский выпуск».

9.5. Замечания по обновлению пакетов

Вот несколько замечаний по обновлению пакетов:

  • Не удаляйте старые записи из changelog (на первый взгляд это очевидно, но были случаи случайного набора dch вместо dch -i).

  • Существующие изменения Debian должны быть пересмотрены; выбросьте инструментарий, который включил автор (в той или иной форме) и не забудьте оставить инструментарий, который не был включён автором, пока не появится убедительной причины этого не делать.

  • Если в систему для сборки были внесены изменения (к счастью, вы узнаете об этом при изучении авторских изменений), то при необходимости обновите сборочные зависимости в файлах debian/rules и debian/control.

  • Проверьте систему отслеживания ошибок (BTS) на случай, если кто-нибудь предоставил заплаты для исправления незакрытых ошибок.

  • Проверьте содержимое файла .changes и убедитесь, что вы выполняете отправку в правильный дистрибутив, закрываемые ошибки перечислены в поле Closes, поля Maintainer и Changed-By совпадают, файл подписан GPG и т. д.



[81] Дату в нужном формате можно получить с помощью команды LANG=C date -R.

[82] Если пакет foo собран в старом формате 1.0, то вместо этого можно запустить zcat /путь/к/foo_старая-версия.diff.gz|patch -p1 в каталоге с новым исходным кодом.

[83] Если команда uscan скачает обновлённый исходный код, но не запустит команду uupdate, исправьте файл debian/watch таким образом, чтобы упоминание debian uupdate было в конце URL.

[84] Не стоит беспокоиться или спорить, если ваш поручитель или другие сопровождающие возражают против обновления существующего стиля пакетирования. Есть более важные вещи.

[85] Вы можете разделить файл big.diff на много маленьких приращиваемых заплат с помощью команды splitdiff.