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

Содержание

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

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

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 версия-редакция, а затем добавьте комментарии с помощью текстового редактора [83].

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

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

  • Повторите всё из Раздел 6.1, «Полная (пере)сборка» и Глава 7, Проверка пакета на наличие ошибок.

  • После проверки правильности, измените в changelog имя выпуска с UNRELEASED на значение целевого дистрибутива unstable (или даже на experimental). [84]

  • Закачайте пакет, следуя Глава 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 в каталоге с новым исходным кодом [85]. Конечно, потребуется сделать несколько очевидных рутинных операций.

  • Скопируйте авторский исходный код в файл foo_новая-версия.orig.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.22, «Файл watch», то можете пропустить команду wget. Просто запустите uscan(1) в каталоге foo-старая-версия вместо команды uupdate. Она автомагически найдёт обновления исходного кода, скачает его и запустит команду uupdate [86].

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

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

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

  • Если по какой-то причине требуется пересоздать удалённые шаблоны файлов, вы можете ещё раз запустить 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 [88].

  • Если в пакете используется другая система заплат, например, 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).

Проверьте DEP - Debian Enhancement Proposals и учтите ПРИНЯТЫЕ предложения.

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

9.5. Преобразование в UTF-8

Если авторские документы поставляются в старых кодировках, лучше преобразовать их в UTF-8.

  • Для перекодирования простых файлов используйте iconv(1).

    iconv -f latin1 -t utf8 foo_in.txt > foo_out.txt
    
  • Для перекодирования файлов HTML в простой текст в кодировке UTF-8 используйте w3m(1). Выполнение данной операции должно проводиться при включённой локали UTF-8.

    LC_ALL=C.UTF-8 w3m -o display_charset=UTF-8 \
            -cols 70 -dump -no-graph -T text/html \
            < foo_in.html > foo_out.txt
    

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

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

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

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

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

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

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



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

[84] Если для выполнения изменения вы используете команду dch -r, то убедитесь, что записали файл changelog именно редактором.

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

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

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

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