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

## 4.1. Вступление

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

Как вы можете видеть на картинке выше, в процессе исправления ошибок в Ubuntu нет никаких сюрпризов: вы находите проблему, получаете код, исправляете его, тестируете, отправляете на Launchpad и просите, чтобы его проверили и объединили с основным кодом. В этом руководстве мы пройдем через все необходимые шаги, один за другим.

## 4.2. Поиск проблемы

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

Harvest хранит различные списки TODO, касающиеся разработки Ubuntu. Это списки ошибок, которые были уже исправлены в апстриме или в Debian, списки небольших ошибок (мы называем их «bitesize») и так далее. Просмотрите их и найдите ошибку, исправлением которой вы хотите заняться.

## 4.3. Выяснение того, что нужно исправить

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

Предположим, вы обнаружили ошибку в Tomboy, приложении для создания заметок на рабочем столе. Приложение Tomboy можно запустить, выполнив `/usr/bin/tomboy` в командной строке. Чтобы найти двоичный пакет, содержащий это приложение, используйте следующую команду:

    $ apt-file find /usr/bin/tomboy

Команда выведет следующую информацию:

    tomboy: /usr/bin/tomboy

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

    $ apt-cache showsrc tomboy | grep ^Package:
    Package: tomboy
    $ apt-cache showsrc python-vigra | grep ^Package:
    Package: libvigraimpex

Команда `apt-cache` установлена в Ubuntu по умолчанию.

## 4.4. Получение кода

Когда вы знаете, над каким пакетом исходного кода работать, вы можете загрузить копию этого пакета, и заняться отладкой. При распределённой разработке Ubuntu это делается при помощи клонирования bzr-репозитория этого пакета. Launchpad поддерживает Bazaar-ветки для всех пакетов в Ubuntu.

Как только вы получили локальную копию исходного кода, вы можете исследовать ошибку, исправить её, и отправить своё исправление на Launchpad, в виде Bazaar-ветки. Как только вы станете достаточно уверены в своём исправлении, вы можете отправить заявку на слияние, то есть попросить других разработчиков просмотреть и одобрить ваше изменение. В случае согласия с вашими изменениями они загрузят ваши изменения в репозиторий. От вашего изменения получать пользу все — в том числе и вы, чьё имя будет стоять в списке изменений. Вы теперь на пути становления разработчиком Ubuntu!

Мы опишем специфику загрузки кода, отправки изменений, и создания заявки на просмотр в следующимх разделах.

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

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

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

- Система отслеживания ошибок апстрима (и Debian) — открытые и закрытые ошибки,

- История версий в апстриме (или в новой версии) может содержать сведения об исправлении ошибки,

- отчёты об ошибках и новые версии пакетов в Debian и других дистрибутивах.

Теперь можно создать патч, содержащий исправление ошибки. Команда `edit-patch` — самый простой способ добавить патч к пакету. Выполните:

    $ edit-patch 99-new-patch

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

    $ patch -p1 < ../bugfix.patch

После редактирования файла наберите `exit` или нажмите `control-d`, чтобы выйти из временной командной оболочки. Новый патч будет добавлен в `debian/patches`.

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

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

    $ bzr builddeb -- -S -us -uc
    $ pbuilder-dist <release> build ../<package>_<version>.dsc

Это создаст пакет исходного кода из содержимого ветки (`-us -uc` просто позволяет пропустить этап подписывания пакета исходного кода), а `pbuilder-dist` соберёт пакет из исходного кода для любого выбранного вами `релиза`.

После успешного завершения сборки установите пакет из `~/pbuilder/<release>_result/` (с помощью `sudo dpkg -i <пакет>_<версия>.deb`). Затем проверьте, удалось ли устранить ошибку.

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

Очень важно документировать свои изменения в достаточной степени, чтобы разработчикам впоследствии не пришлось гадать, какими были основания и предпосылки сделанных вами изменений. Каждый пакет исходного кода Debian и Ubuntu включает в себя файл `debian/changelog`, в котором отслеживаются вносимые в пакет изменения.

Самый простой способ обновить его — это выполнить:

    $ dch -i

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

    specialpackage (1.2-3ubuntu4) trusty; urgency=low

      * debian/control: updated description to include frobnicator (LP: #123456)

     -- Emma Adams <emma.adams@isp.com>  Sat, 17 Jul 2010 02:53:39 +0200

Команда `dch` должна заполнить первую и последнюю строку этой записи в файле changelog. Первая строка содержит имя пакета исходного кода, номер его версии, в какой релиз Ubuntu он загружен, срочность (почти всегда низкая — ‘low’). Последняя строка всегда содержит имя, адрес электронной почты и метку времени изменения (в формате RFC 5322).

Теперь давайте сфокусируемся на том, что должно содержаться в самой записи файла changelog. Очень важно задокументировать:

> 1. где сделано изменение

> 2. что было изменено

> 3. где происходило обсуждение этого изменения

В нашем (довольно редком) примере последнему пункту соответствует `(LP: #123456)`, то есть сслыка на ошибку на Launchpad с номером 123456. Отчёты об ошибках, темы списков рассылки или спецификации обычно являются хорошими источниками информации для обоснования изменений. В качестве дополнительного приза, если вы используете нотацию `LP: #<номер>` для ошибок на Launchpad, то ошибка автоматически получит статус закрытой при отправке пакета в Ubuntu.

### 4.6.2. Закрепление изменения

Написав и сохранив запись в changelog, мы можем просто запустить:

    debcommit

и изменение будет залито (локально) с вашей записью changelog в качестве сообщения коммита.

Для Launchpad-репозитория, в который отправлять ваши изменения, используйте cледующее имя:

    lp:~<yourlpid>/ubuntu/<release>/<package>/<branchname>

Это может быть, например:

    lp:~emmaadams/ubuntu/trusty/specialpackage/fix-for-123456

Так что, если вы просто выполните:

    bzr push lp:~emmaadams/ubuntu/trusty/specialpackage/fix-for-123456
    bzr lp-propose

всё должно быть готово. Команда push выполнит отправку на Launchpad, а вторая команда откроет страницу удалённой ветки на Launchpad в вашем браузере. Найдите там ссылку «(+) Propose for merging» и щёлкните на ней, чтобы кто-нибудь проверил изменение и включил его в Ubuntu.

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

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