# 9. Слияние — обновления из Debian и апстрима

Слияние — это одна из сильнейших сторон Bazaar, и мы часто выполняем его в процессе разработки Ubuntu. Слияние может быть выполнено с обновлениями из Debian, из нового выпуска в апстриме и от других разработчиков Ubuntu. Сделать это в Bazaar очень просто, всё основано на команде `bzr merge` [1].

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

    $ bzr status

If that reports anything then you will either have to commit the changes, revert them, or shelve them to come back to later.

## 9.1. Слияние из Debian

Next run `bzr merge` passing the URL of the branch to merge from. For example, to merge from the version of the package in Debian Unstable run [2]:

    $ bzr merge lp:debian/tomboy

This will merge the changes since the last merge point and leave you with changes to review. This may cause some conflicts. You can see everything that the `merge` command did by running:

    $ bzr status
    $ bzr diff

If conflicts are reported then you need to edit those files to make them look how they should, removing the conflict markers. Once you have done this, run:

    $ bzr resolve
    $ bzr conflicts

This will resolve any conflicted files that you fixed, and then tell you what else you have to deal with.

После того, как все конфликты разрешены, и вы внесли все другие необходимые изменения, нужно добавить новую запись в changelog и выполнить фиксацию:

    $ dch -i
    $ bzr commit

как было описано выше.

Однако перед фиксацией всегда желательно проверить все изменения, сделанные в Ubuntu, выполнив:

    $ bzr diff -r tag:0.6.10-5

Эта команда покажет различия между версиями в Debian (0.6.10-5) и Ubuntu (0.6.10-5ubuntu1). Подобным же способом вы можете выполнить сравнение с любыми другими версиями. Чтобы увидеть все доступные версии, выполните:

    $ bzr tags

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

If you are going to build the source package from this merged branch, you would use the `-S` option to the `bd` command. One other thing you’ll want to consider is also using the `--package-merge` option. This will add the appropriate `-v` and `-sa` options to the source package so that all the changelog entries since the last Ubuntu change will be included in your `_source.changes` file. For example:

    $ bzr builddeb -S --package-merge

## 9.2. Слияние с новой версией из апстрима

When upstream releases a new version (or you want to package a snapshot), you have to merge a tarball into your branch.

Это делается командой `bzr merge-upstream`. Если в вашем пакете имеется файл `debian/watch` с правильным содержимым, то из каталога ветки, в которую вы собираетесь слить изменения, просто наберите:

    $ bzr merge-upstream

Команда загрузит тарбол и сольёт его в вашу ветку, автоматически добавив запись в `debian/changelog`. `bzr-builddeb` просматривает файл `debian/watch`, чтобы определить местоположение тарбола из апстрима.

Если у вас отсутствует файл `debian/watch`, то вам нужно вручную указать местоположение тарбола из апстрима и версию:

    $ bzr merge-upstream --version 1.2 http://example.org/releases/foo-1.2.tar.gz

Опция `--version` используется для указания версии апстрима, из которой выполняется слияние, поскольку команда не способна (пока) узнать её самостоятельно.

Последний параметр — это местоположение тарбола, на который выполняется обновление: это может быть путь в локальной файловой системе, http, ftp, sftp или другой URI, как показано в примере. Команда автоматически загрузит тарбол для вас, переименует его соответствующим образом и, если требуется, преобразует в `.gz`.

Команда `merge-upstream` сообщит либо о своём удачном завершении, либо о том, что имеются конфликты. В любом случае у вас будет возможность проверить изменения перед их фиксацией обычным способом.

If you are merging an upstream release into an existing Bazaar branch that has not previously used the UDD layout, `bzr merge-upstream` will fail with an error that the tag for the previous upstream version is not available; the merge can’t be completed without knowing what base version to merge against. To work around this, create a tag in your existing repository for the last upstream version present there; e.g., if the last Ubuntu release was 1.1-0ubuntu3, create the tag upstream-1.1 pointing to the bzr revision you want to use as the tip of the upstream branch.

[1] | Для работы с командой `merge` вам понадобятся более новые версии `bzr` и `bzr-builddeb`. Используйте версии из Ubuntu 12.04 (Precise) или разрабатываемые версии из PPA `bzr`. Точнее говоря, вам понадобится `bzr` версии 2.5 beta 5 или более новой, а также `bzr-builddeb` версии 2.8.1 или более новой. Для старых версий используйте взамен команду `bzr merge-package`.

[2] | To check other available branches of a package in Debian, see package code page. E.g. https://code.launchpad.net/debian/+source/tomboy