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

Содержание

8.1. Новая редакция Debian
8.2. Изучение нового авторского выпуска
8.3. Новый авторский выпуск
8.4. Обновление стиля пакетирования
8.5. Преобразование в UTF-8
8.6. Замечания по обновлению пакетов

The rewrite of this tutorial document with updated contents and more practical examples is available as Guide for Debian Maintainers. Please use this new tutorial as the primary tutorial document.

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

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

One tricky case can occur when you make a local package, to experiment with the packaging before uploading the normal version to the official archive, e.g., 1.0.1-1. For smoother upgrades, it is a good idea to create a changelog entry with a version string such as 1.0.1-1~rc1. You may unclutter changelog by consolidating such local change entries into a single entry for the official package. See Раздел 2.6, «Имя и версия пакета» for the order of version strings.

When preparing packages of a new upstream release for the Debian archive, you must check the new upstream release first.

Начните с чтения файлов 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 для проверки исходного кода.

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

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

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

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

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

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

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

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

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

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

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

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

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

Here are a few reminders for updating packages:



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

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

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

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

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

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