# 5. Демонстрация: исправление ошибки в Ubuntu

Хотя техника исправления ошибки одинакова для любых ошибок, каждая ошибка всё же в чём то отличается от других. Данный пример исправления конкретной ошибки может помочь вам понять, что обычно следует принять во внимание.

Примечание

Во время написания данной статьи эта ошибка ещё не была исправлена. Возможно, у тому времени, когда вы будете читать статью, ошибку уже исправят. Считайте это просто примером и постарайте адаптировать его к конкретной проблеме, с которой вы столкнётесь.

## 5.1. Подтверждение проблемы

Предположим, в описании пакета `bumprace` отсутствует информация о его домашней странице. В качестве первого шага, следует проверить, не исправлена ли уже эта ошибка. Сделать это просто: посмотрите в Центре приложений или запустите:

    apt-cache show bumprace

Вывод команды должен быть примерно следующим:

    Package: bumprace
    Priority: optional
    Section: universe/games
    Installed-Size: 136
    Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
    Original-Maintainer: Christian T. Steigies <cts@debian.org>
    Architecture: amd64
    Version: 1.5.4-1
    Depends: bumprace-data, libc6 (>= 2.4), libsdl-image1.2 (>= 1.2.10),
             libsdl-mixer1.2, libsdl1.2debian (>= 1.2.10-1)
    Filename: pool/universe/b/bumprace/bumprace_1.5.4-1_amd64.deb
    Size: 38122
    MD5sum: 48c943863b4207930d4a2228cedc4a5b
    SHA1: 73bad0892be471bbc471c7a99d0b72f0d0a4babc
    SHA256: 64ef9a45b75651f57dc76aff5b05dd7069db0c942b479c8ab09494e762ae69fc
    Description-en: 1 or 2 players race through a multi-level maze
     In BumpRacer, 1 player or 2 players (team or competitive) choose among 4
     vehicles and race through a multi-level maze. The players must acquire
     bonuses and avoid traps and enemy fire in a race against the clock.
     For more info, see the homepage at http://www.linux-games.com/bumprace/
    Description-md5: 3225199d614fba85ba2bc66d5578ff15
    Bugs: https://bugs.launchpad.net/ubuntu/+filebug
    Origin: Ubuntu

В качестве контрпримера можно привести `gedit`, где домашняя страница указана:

    $ apt-cache show gedit | grep ^Homepage
    Homepage: http://www.gnome.org/projects/gedit/
    $

В некоторых случаях вы можете столкнуться с тем, что проблема, решение которой вы ищете, уже кем-то устранена. Чтобы избежать напрасной траты времени и труда, имеет смысл проделать кое-какую детективную работу.

## 5.2. Изучение ситуации с ошибкой

Сначала нужно проверить, не существует ли уже сообщения об этой ошибке в Ubuntu. Возможно, кто-то уже работает над её исправлением, или мы можем как-то внести свой вклад в решение этой проблемы. Для Ubuntu мы взглянем на https://bugs.launchpad.net/ubuntu/+source/bumprace и увидим, что открытого отчёта о нашей ошибке там нет.

Примечание

Для Ubuntu URL `https://bugs.launchpad.net/ubuntu/+source/<пакет>` всегда приводит на страницу ошибок в указанном пакете исходного кода.

В Debian, который является основным источником пакетов Ubuntu мы взглянем на http://bugs.debian.org/src:bumprace и также не найдём там сообщения о нашей ошибке.

Примечание

Для Debian URL `http://bugs.debian.org/src:<пакет>` всегда приводит на страницу ошибок в указанном пакете исходного кода.

Ошибка, над которой мы работаем, необычна в том смысле, что она касается только пакетирования `bumprace`. Если бы это была ошибка в исходном коде, полезно было бы также проверить систему отслеживания ошибок апстрима. К сожалению, эта процедура часто различается для каждого отдельного пакета, но всегда можно воспользоваться поиском в интернете, и в большинстве случаев вы обнаружите, что она окажется не такой уж сложной.

## 5.3. Предложение помощи

Если вы обнаружили открытую ошибку, которая ещё никому не назначена, и вы готовы взяться за её устранение, следует написать комментарий с вашим решением. Включите в него как можно больше информации: При каких обстоятельствах появляется ошибка? Как вы её исправили? Тестировали ли вы свой способ устранения ошибки?

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

Будет замечательно, если вы можете предложить свою помощь, и она, несомненно, будет с готовностью принята.

## 5.4. Исправление ошибки

В данном конкретном примере недостаточно просто найти веб-сайт `bumprace` и определить адрес его домашней страницы. Нужно убедиться, что сайт работает, и он не является просто каталогом различных программ. http://www.linux-games.com/bumprace/ выглядит подходящим местом.

Чтобы взяться за ошибку в пакете исходного кода, нам понадобится этот исходный код, и мы легко можем получить его, набрав:

    bzr branch ubuntu:bumprace

Если вы прочитали обзор каталога Debian, то помните, вероятно, что домашняя страница указывается в первой части `debian/control`, в секции, начинающейся с `Source:`.

Так что теперь мы должны выполнить команду:

    cd bumprace

и отредактировать `debian/control`, добавив `Homepage: http://www.linux-games.com/bumprace/`. В конце первой секции должно быть подходящее место для этого. После внесения изменений сохраните файл.

Если теперь вы выполните:

    bzr diff

вы должны увидеть что-то вроде этого:

    === modified file 'debian/control'
    --- debian/control      2012-05-14 23:38:14 +0000
    +++ debian/control      2012-09-03 15:45:30 +0000
    @@ -12,6 +12,7 @@
                    libtool,
                    zlib1g-dev
     Standards-Version: 3.9.3
    +Homepage: http://www.linux-games.com/bumprace/

     Package: bumprace
     Architecture: any

Синтаксис diff очень прост для понимания. `+` указывает строку, которая была добавлена. В нашем случае она была добавлена непосредственно перед второй секцией, начинающейся с `Package`, которая указывает на готовый двоичный пакет.

## 5.5. Документирование исправления

Важно пояснить своим коллегам - разработчикам, что именно вы сделали. Если вы наберёте:

    dch -i

это запустит редактор, с шаблоном записи в changelog, которую вам остаётся лишь дозаполнить. В нашем случае должно подойти что-то наподобие `debian/control: Added project's homepage.` Затем сохраните файл. Чтобы ещё раз проверить, что всё работает, наберите:

    bzr diff debian/changelog

и вы увидите что-то вроде этого:

    === modified file 'debian/changelog'
    --- debian/changelog    2012-05-14 23:38:14 +0000
    +++ debian/changelog    2012-09-03 15:53:52 +0000
    @@ -1,3 +1,9 @@
    +bumprace (1.5.4-1ubuntu1) UNRELEASED; urgency=low
    +
    +  * debian/control: Added project's homepage.
    +
    + -- Peggy Sue <peggy.sue@example.com>  Mon, 03 Sep 2012 17:53:12 +0200
    +
     bumprace (1.5.4-1) unstable; urgency=low

       * new upstream version, sound and music have been removed (closes: #613344)

Несколько дополнительных соображений:

> - Если у вас есть ссылка на ошибку на Launchpad, которую исправляет ваше изменение, добавьте (`LP: #<номер ошибки>`) в запись changelog, например: `(LP: #123456)`.

> - Если вы хотите, чтобы ваше исправление было включено в Debian, синтаксис для ошибки в Debian будет `(Closes: #<номер ошибки>)`, например: `(Closes: #123456)`.

> - Если это ссылка на сообщение об ошибке в апстриме или в Debian, или на обсуждение в почтовой рассылке, также укажите её.

> - Старайтесь делать перенос строк после 80 символов.

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

> - Укажите, как и где вы исправили ошибку.

## 5.6. Тестирование исправления

Чтобы проверить исправление, вам понадобится настроить свою среду разработки, затем собрать пакет, установить его и проверить, что проблема устранена. В нашем случае это будут следующие действия:

    bzr bd -- -S
    pbuilder-dist <current Ubuntu release> build ../bumprace_*.dsc
    dpkg -I ~/pbuilder/*_result/bumprace_*.deb

Первой командой мы создаём пакет исходного кода из ветки, затем собираем его с помощью `pbuilder`, после чего проверяем, правильно ли добавлено поле домашней страницы в получившемся пакете.

Примечание

В большинстве случаев вам придётся действительно установить пакет, чтобы проверить правильность его работы. Наш случай намного проще. Если сборка завершилась успешно, готовые двоичные пакеты можно будет найти в `~/pbuilder/<выпуск>_result`. Установите их с помощью `sudo dpkg -i <пакет>.deb` или двойного щелчка на них в файловом менеджере.

После того, как мы убедились, что проблема решена, следующим шагом будет поделиться своим решением со всем миром.

## 5.7. Применение исправления

Важно попытаться продвинуть ваше исправление как можно дальше в upstream. Это позволит любому взять исходный код в том виде, в каком он представлен в upstream, и не применять к нему никаких дополнительных модификаций.

В нашем случае мы установили, что ошибка относится только к пакетам Ubuntu и Debian. Так как Ubuntu основана на Debian, мы должны отправить исправление в Debian. После того, как в Debian появится исправленный пакет, он попадёт также и в Ubuntu. Наша ошибка не критична, поэтому можно так сделать. Если же важно применить исправление как можно скорее, то необходимо отправить исправление в несколько баг-трекеров (если оно затрагивает соотвествующие проекты).

Чтобы отправить патч в Debian, просто наберите:

    submittodebian

Эта команда проведёт вас через несколько шагов, необходимых для оформления отчёта об ошибке и отправки его в правильное место. Обязательно просмотрите ваши изменения, чтобы убедиться, что там нет ничего постороннего.

Коммуникация имеет очень большое значение, поэтому при добавлении описания предоставьте хорошее и дружественное объяснение.

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

Примечание

Если проблема наблюдается только в Ubuntu, вы можете воспользоваться инструкцией по поиску спонсора.

## 5.8. Дополнительные замечания

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

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