Как использовать dpatch

Для полноты картины с пересборкой Debian–пакетов (см. мой предыдущий пост) решил перевести статью об использовании тулзы для менеджмента патчей — dpatch.

Эта статья является переводом поста
Сандро Тоси (Sandro Tosi) “HowTo use dpatch

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

Правильный Путь заключается в создании набора патчей, которые должны применяться к апстримовому коду при создании пакета; это позволит diff.gz содержать только изменения внутри директории debian/, что есть Хорошо.

Популярным инструментом для управления патчами при создании пакетов является dpatch.

  1. Базовые вещи

Прежде всего нужно установить dpatch:

# apt-get install dpatch

и добавить dpatch в поле Build-Depends в файле debian/control. Более того, нужно создать директорию debian/patches: это место, где хранятся патчи.

В этой же директории будет файл debian/patches/00list: он будет содержать список имён патчей и они будут применены в том порядке, в котором упоминаются в этом файле.

  1. Создание патча

Поставленный ранее пакет содержит полезную утилиту — dpatch-edit-patch:

dpatch-edit-patch <имя_патча>

Будет создана копия директории с исходниками пакета, после чего будет запущен дочерний шелл; делайте свои правки и выходите из шелла (Сделать это можно с помощью команды exit. Если хотите покинуть шелл, не сохраняя сделанных правок, выполните exit 230. Прим. переводчика). После этого будет создан патч debian/patches/имя_патча, в который будут записаны все ваши правки.

Не забудьте обновить debian/patches/00list.

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

  1. Конвертирование патча

Этот скрипт (спасибо Чарльзу Плесси (Charles Plessy)) принимает на вход модифицированный и оригинальный файлы, создаёт патч в универсальном формате и затем конвертирует его в формат dpatch’а.

diff -u первоначальные-исходники/файл модифицированные-исходники/файл | \
dpatch patch-template -p "<номер>_<краткое_описание>"   \
"<что делает патч>" > путь/к/debian/patches/<номер>_<краткое_описание>.dpatch

(замените <теги> на подходящие значения).

Обычно патч (по большей части тот, который присылается через систему отслеживания багов) представляет собой файл: для того, чтобы его сконвертировать, замените diff -u … на cat /путь/к/файлу.patch — и всё.

  1. Тестирование патча

Окей, вы только что сотворили патч, но как проверить, что он делает то, что должен? Примените его!

Из распакованного пакета исходного кода (рабочей копии для создания пакета) выполните

dpatch apply-all

а для отмены

dpatch deapply-all

  1. Использование dpatch в debian/rules

Осталось только дописать debian/rules таким образом, чтобы патчи из debian/patches/ применялись в порядке, указанном в debian/patches/00list.

Думаю, самым простым способом будет модифицирование debian/rules следующим образом:

include /usr/share/dpatch/dpatch.make

...
build: build-stamp
build-stamp: patch-stamp
...
build stuff here
...

clean: unpatch
...
clean stuff here
...
...

Но если хотите, можете отдельно добавить цели patch и unpatch, как показано в следующем примере:

build-stamp: patch
...
build stuff here
...

clean: clean1 unpatch
clean1:
...
clean stuff here
...

patch: patch-stamp
patch-stamp:
dpatch apply-all -v
#dpatch call-all -a=pkg-info >patch-stamp

unpatch:
dpatch deapply-all
rm -rf patch-stamp debian/patched

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install patch unpatch \
clean1

В любом случае, советую следовать первому способу, так как он чище и более устойчив к ошибкам.

  1. Восстановление первоначального апстримового кода

Самой первой вещью, которую должен запомнить каждый сопровождающий пакетов Debian, является: НИКОГДА не менять апстримовый код в своём пакете; вместо этого должны использоваться патчи. Даже если вы следуете этому Руководящему Правилу при создании своих пакетов, вы можете столкнуться с изменениями апстримового кода, когда будете усыновлять пакет.

Существует способ сконвертировать такие изменения (сделанные предыдущим сопровождающим пакета) в патч для dpatch:

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

Это немного сложно, но таким образом вы сможете «усыновить» пакет и использовать dpatch, что есть хорошо.

Comments (migrated from Blogger)

On 2010-12-25T06:06:55.765+02:00, virens wrote:

Рацпредложение: примечания редактора можно убирать вот так. Я сегодня этот инновационный метод распробовал: вот как выглядит в постах [см. разделы по печати и сканированию - аббревиатуры выделены].

Можно я немножко к тексту поцепляюсь? :-)

  1. Вот это: Хорошей практикой является добавление в патч сообщения о копирайте длинное предложение хорошо бы разбить на два. Можно ссылочку на гайдлан дебиановский воткнуть.

  2. , а для отмены граммарнаци будет против, но я бы запятую убрал :-)

  3. это чакаутнет деспайт оф май ливинг ин инглиш-спикинг кантри, ай донт лайк сач транслитерайшн ин рашн артиклс 8-)

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

On 2010-12-26T00:13:32.114+02:00, Minoru wrote:

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

длинное предложение хорошо бы разбить на два
Сделано! И правда, стало лучше.

граммарнаци будет против, но я бы запятую убрал
При переводе таких вот участков текста всегда хочется пойти к книжному шкафу, взять какой–нибудь старенький математический (или физический — в смысле, по физике) талмуд и глянуть, как там после формул уточняется значение всяких коеффициентов. Но, увы, эта идея разбивается о суровые реалии: нету ни шкафа, ни талмуда. В общем ок, поправлено.

деспайт оф…
Оно–то так, но ты можешь перевести этот кусок по–человечески? Я, например, совершенно не понял смысл вот этого самого примечания в скобках. Я даже в psto вопрос задал, но там что–то ни к чему подходящему так и не пришли.

On 2010-12-26T23:51:16.778+02:00, Paul Rufous wrote:

Хорошая статья. Жаль что нет перевода последней версии Debian New Maint Guide.

On 2010-12-27T08:23:40.066+02:00, virens wrote:

@Minoru комментирует…
Касательно рацпредложения: выглядит красиво, но на практике чаще мешает
Я так пристроился сплавлять лирику в тексте. Вроде она и есть, а места занимает меньше. Когда писал здоровенный пост про десктоп, я так много чего запихал в подсказки.

>> граммарнаци будет против, но я бы запятую убрал

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

Минору, я ж здесь на то и сижу, весь из себя такой академик в доску :-) Делается это вот так:

Рассмотрим выражение:
a+b=0,
где a - трали вали, b - фигли мигли, справедливое для всех тыры пыры.

Но это в научной литературе. Мы ж не журнал Nature, правильно? Так вот, я лично такие запятые опускаю вовсе. Они только путают: надо ли вводить что-то с запятой или точкой. Пример:

вводим команду /etc/init.d networking restart которая перезапустит…

Граммарнаци в этом месте негодует. В общем правильно он негодует, но без запятой понятнее.

Оно–то так, но ты можешь перевести этот кусок по–человечески?
Сдаётся мне, что это вот что:
(будет произведена проверка )

У нас тут в местных универмагах и сельпо касса так вот называется - Checkout. Там тебе овощи взвесят, и в пакетик сложат, и денюжку возьмут. И рюкзачок твой походный просют открыть - мало ли, чего туда завалилось. Вот это чакаут и есть :-) Проверка.

Я даже в psto вопрос задал, но там…
одни дятлы :-) Извини, не удержался. Ты по всяким подворотням не ходи, они тебя плохому Ингришу научат. Сразу местных австралийцев спрашивай, они тебе сразу всё скажут :-)

On 2010-12-27T12:55:39.586+02:00, Minoru wrote:

С запятыми всё ясно. Будем опускать, а то и правда — одна только путаница.

> (будет произведена проверка)
Да будет так :)

> Сразу местных австралийцев спрашивай, они тебе сразу всё скажут :-)
Хех. Замётано ;)

Drop me a line! (wonder where’s the comments form?)