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

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

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.

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

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

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

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

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

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

- Upload the package as in Глава 9, Отправка пакета. The difference is that this time, the original source archive won't be included, as it hasn't been changed and it already exists in the Debian archive.

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.

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

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

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

Если пакет ``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, Отправка пакета.

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

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

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

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

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

  - локальная копия `/usr/share/doc/cdbs/cdbs-doc.pdf.gz`

  - The Common Debian Build System (CDBS), FOSDEM 2009

- Если у вас есть пакет исходного кода формата `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, «Новый авторский выпуск».

## 8.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=en_US.UTF-8 w3m -o display_charset=UTF-8 \
              -cols 70 -dump -no-graph -T text/html \
              < foo_in.html > foo_out.txt

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

Here are a few reminders for updating packages:

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

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

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

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

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

[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.

Глава 7. Проверка пакета на наличие ошибок |  | Глава 9. Отправка пакета