Эта статья является переводом поста
Сандро Тоси (Sandro Tosi) “HowTo use dpatch
”
Важным правилом, которому должен следовать каждый сопровождающий пакета, заключается в том, чтобы не допускать изменения апстримового кода (upstream — это разработчики программы, из которой потом создаётся пакет. Прим. переводчика).
Правильный Путь заключается в создании набора патчей, которые должны применяться к апстримовому коду при создании пакета; это позволит diff.gz содержать только изменения внутри директории debian/, что есть Хорошо.
Популярным инструментом для управления патчами при создании пакетов является dpatch.
0. Базовые вещи
Прежде всего нужно установить
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
.Хорошей практикой является добавление в патч сообщения о копирайте. При этом можно использовать примерно такой подход: тривиальные патчи объявляются общественным достоянием, а более сложные лицензируются под той же лицензией, что и программа.
2. Конвертирование патча
Этот скрипт (спасибо Чарльзу Плесси (Charles Plessy)) принимает на вход модифицированный и оригинальный файлы, создаёт патч в универсальном формате и затем конвертирует его в формат dpatch'а.
diff -u первоначальные-исходники/файл модифицированные-исходники/файл | \
dpatch patch-template -p "<номер>_<краткое_описание>" \
"<что делает патч>" > путь/к/debian/patches/<номер>_<краткое_описание>.dpatch
(замените <теги> на подходящие значения).
Обычно патч (по большей части тот, который присылается через систему отслеживания багов) представляет собой файл: для того, чтобы его сконвертировать, замените
diff -u ...
на cat /путь/к/файлу.patch
— и всё.3. Тестирование патча
Окей, вы только что сотворили патч, но как проверить, что он делает то, что должен? Примените его!
Из распакованного пакета исходного кода (рабочей копии для создания пакета) выполните
dpatch apply-all
а для отмены
dpatch deapply-all
4. Использование 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
В любом случае, советую следовать первому способу, так как он чище и более устойчив к ошибкам.
5. Восстановление первоначального апстримового кода
Самой первой вещью, которую должен запомнить каждый сопровождающий пакетов Debian, является: НИКОГДА не менять апстримовый код в своём пакете; вместо этого должны использоваться патчи. Даже если вы следуете этому Руководящему Правилу при создании своих пакетов, вы можете столкнуться с изменениями апстримового кода, когда будете усыновлять пакет.
Существует способ сконвертировать такие изменения (сделанные предыдущим сопровождающим пакета) в патч для
dpatch
:- используя
apt-get source <пакет>
или какую–либо другую команду, получите пакет исходников; будем считать, что он будет распакован в директорию с именем <пакет-версия> — перейдите в неё (заметим, что исходный файл будет в родительской директории) - измените
debian/rules
так, как показано в предыдущей секции этой статьи - используйте
dpatch-convert-diffgz
: эта утилита берёт .diff.gz, извлекает изменения, выполненные над апстримовым кодом, и конвертирует их в файл dpatch, который будет применяться во время сборки пакета
- скачиваете пакет с исходными кодами с зеркала репозитория Debian
- распаковываете его во временную директорию <tempdir> (или позвольте
apt-get source
сделать это для вас) - импортируйте в репозиторий SVN (будет произведена проверка рабочей директории — <workdir>)
- переходите в <tempdir> и меняете
debian/rules
(после чего выполняете то же самое в <workdir>) - выполняете
dpatch-convert-diffgz 01 restore_pristine_code
(можете выбирать любое имя); будут созданы файлыdebian/patches/01_restore_pristine_code.dpatch
иdebian/patches/00list
- перемещаете оба вышеупомянутых файла в <workdir> и добавляете их в репозиторий
- возвращаете назад апстримовый код, модифицированный предыдущим сопровождающим; это может означать копирование файлов руками (
cp -p ....
) из распакованного апстримового тарболла, либо выполнениеfakeroot debian/rules patch ; fakeroot debian/rules unpatch
(действенность последнего способа не гарантируется)
dpatch
, что есть хорошо.
Копируете статью — поставьте ссылку!
5 комментариев:
Рацпредложение: примечания редактора можно убирать вот так. Я сегодня этот инновационный метод распробовал: вот как выглядит в постах [см. разделы по печати и сканированию - аббревиатуры выделены].
Можно я немножко к тексту поцепляюсь? :-)
1. Вот это: Хорошей практикой является добавление в патч сообщения о копирайте длинное предложение хорошо бы разбить на два. Можно ссылочку на гайдлан дебиановский воткнуть.
2. , а для отмены граммарнаци будет против, но я бы запятую убрал :-)
3. это чакаутнет деспайт оф май ливинг ин инглиш-спикинг кантри, ай донт лайк сач транслитерайшн ин рашн артиклс 8-)
В остальном пост классный. Я был бы рад увидеть микс из этого и предыдущего постов у себя на блоге в качестве гостевого (не сейчас, но через некоторое время).
Касательно рацпредложения: выглядит красиво, но на практике чаще мешает, чем помогает. При чтении я предпочитаю устроится поудобней на стуле и просто время от времени нажимать пробел, перелистывая страницы. Двигания мышкой в попытках посмотреть, что там за примечание прилепил этот зараза перевозчик мешает, как мне кажется.
длинное предложение хорошо бы разбить на два
Сделано! И правда, стало лучше.
граммарнаци будет против, но я бы запятую убрал
При переводе таких вот участков текста всегда хочется пойти к книжному шкафу, взять какой–нибудь старенький математический (или физический — в смысле, по физике) талмуд и глянуть, как там после формул уточняется значение всяких коеффициентов. Но, увы, эта идея разбивается о суровые реалии: нету ни шкафа, ни талмуда. В общем ок, поправлено.
деспайт оф…
Оно–то так, но ты можешь перевести этот кусок по–человечески? Я, например, совершенно не понял смысл вот этого самого примечания в скобках. Я даже в psto вопрос задал, но там что–то ни к чему подходящему так и не пришли.
Хорошая статья. Жаль что нет перевода последней версии Debian New Maint Guide.
@Minoru комментирует...
Касательно рацпредложения: выглядит красиво, но на практике чаще мешает
Я так пристроился сплавлять лирику в тексте. Вроде она и есть, а места занимает меньше. Когда писал здоровенный пост про десктоп, я так много чего запихал в подсказки.
>> граммарнаци будет против, но я бы запятую убрал
При переводе таких вот участков текста всегда хочется пойти к книжному шкафу, взять какой–нибудь старенький математический (или физический — в смысле, по физике) талмуд и глянуть
Минору, я ж здесь на то и сижу, весь из себя такой академик в доску :-) Делается это вот так:
Рассмотрим выражение:
a+b=0,
где a - трали вали, b - фигли мигли, справедливое для всех тыры пыры.
Но это в научной литературе. Мы ж не журнал Nature, правильно? Так вот, я лично такие запятые опускаю вовсе. Они только путают: надо ли вводить что-то с запятой или точкой. Пример:
вводим команду /etc/init.d networking restart которая перезапустит...
Граммарнаци в этом месте негодует. В общем правильно он негодует, но без запятой понятнее.
Оно–то так, но ты можешь перевести этот кусок по–человечески?
Сдаётся мне, что это вот что:
(будет произведена проверка )
У нас тут в местных универмагах и сельпо касса так вот называется - Checkout. Там тебе овощи взвесят, и в пакетик сложат, и денюжку возьмут. И рюкзачок твой походный просют открыть - мало ли, чего туда завалилось. Вот это чакаут и есть :-) Проверка.
Я даже в psto вопрос задал, но там...
одни дятлы :-) Извини, не удержался. Ты по всяким подворотням не ходи, они тебя плохому Ингришу научат. Сразу местных австралийцев спрашивай, они тебе сразу всё скажут :-)
С запятыми всё ясно. Будем опускать, а то и правда — одна только путаница.
> (будет произведена проверка)
Да будет так :)
> Сразу местных австралийцев спрашивай, они тебе сразу всё скажут :-)
Хех. Замётано ;)
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.