[В ЧаВо] Как создать файл патча

При использовании developer-friendly дистрибутива (в том числе Gentoo) рано или поздно выясняется недостаточность патчей, созданных кем-то где-то.
В ситуации, когда известны необходимые изменения, но нет патча:

Делай раз:
Фиксация исходной точки (дистрибутив, нуждающийся в наложении патча)

tar zxf source.tgz
cp -r source source.orig

Делай два:
Внение необходимых исправлений в дистрибутив

cd source
vim …

И делай три — промышление собственно патча:

cd ..
diff -Naur source.orig source > my-patch.patch

Подробности на русском: http://www.cpqlinux.com/patch.html

И на всякий случай пару слов о наложении патчей.
Начиная с EAPI=5 в portage появилась функция epatch_user().
За подробностями к офф. Вике уже в HandBook: https://wiki.gentoo.org/wiki/Handbook:AMD64/Portage/Advanced#Applying_non-standard_patches
Вкратце: для наложения патча достаточно просто в предварительно созданный каталог /etc/portage/patches/${CATEGORY}/${PN} (в качестве имени пакета также можно использовать ${P} или ${PF}) положить файл (или файлы) патчей. И пересобрать пакет.

Но даже если ебилд не поддерживает epatch_user() (EAPI < 5), задача сохраняет свойство решаемости.
Для этого используется другая фича: per-package bashrc. Претендующее на достаточность описание — http://megabaks.blogspot.co.uk/2012/10/portage.html
Вкратце: в каталоге /etc/portage/env/ создаётся файл /etc/portage/env/${CATEGORY}/${PN} примерно следующего содержания:

pre_src_prepare ()  {
	EPATCH_SOURCE="/etc/portage/patches.rc/${CATEGORY}/${PN}/" \
	EPATCH_SUFFIX="patch" \
    	EPATCH_FORCE="yes" epatch
}

После чего, как нетрудно догадаться, создаётся каталог /etc/portage/patches.rc/${CATEGORY}/${PN}/ (имя patches.rc выбрано из соображений отсутствия коллизии с стандартным путём epatch_user()), в который кладутся файл(ы) патча(ей). После чего пакет очевидным образом пересобирается.
В результате получаем profit в форме наложения практически пользовательских патчей в ебилде, данную фичу не поддерживающем.

ЗЫ: Описанное работает в sys-apps/portage-2.2.8-r1.

А мне нравится вариант с git:

Фиксация исходной точки:

tar -zxf source.tgz
cd source
git init .
git add .
git commit -m "Initial commit"

Внение необходимых исправлений в дистрибутив:

vim …

Собственно патч:

git diff > my-patch.patch

С git всё это удобно проделывать прямо в /var/tmp/portage/…, добиваясь, например, через ebuild … compile отсутствия ошибок при сборке пакета, без лишних копирований исходного кода.

1. Скобки надо закрывать2.

1. Скобки надо закрывать
2. Для одного патча достаточно pre_src_prepare () { epatch wherever/my.patch }
3. Рекомендованный -Naur часто недостаточен, особенно если редактор производит обрезку пробелов в конце, переформатирование tab/whitespace. Поэтому можно уверенно рекомендовать -Z, --ignore-trailing-space (ignore white space at line end), а также в большинстве случаев и -E, --ignore-tab-expansion (ignore changes due to tab expansion).

P.S. а почему именно vim? :D

.

Beelzebubbie написал(а):
1. Скобки надо закрывать

Да, спасибо.

Beelzebubbie написал(а):
2. Для одного патча достаточно pre_src_prepare () { epatch wherever/my.patch }

Можно.
Но в ситуации, когда одного патча внезапно оказывается недостаточно вариант с «положить недостающий патч в каталог» проще.
А ещё лично мне не очень нравится жёсткая завязка на имя файла патча.

Beelzebubbie написал(а):
3. Рекомендованный -Naur часто недостаточен, особенно если редактор производит обрезку пробелов в конце, переформатирование tab/whitespace. Поэтому можно уверенно рекомендовать -Z, --ignore-trailing-space (ignore white space at line end), а также в большинстве случаев и -E, --ignore-tab-expansion (ignore changes due to tab expansion).

Возможная ситуация.
Но не помешало бы конкретики: предлагаемые варианты дополняют приведённую строку опций? Или заменяют? Полностью альбо частично (в последнем случае: что именно)?

Beelzebubbie написал(а):
P.S. а почему именно vim? :D

Потому что стандарт! ☺
Но лично тебе разрешаю использовать sys-apps/ed.

:wq
--
Live free or die

Возможная ситуация. Но не

Цитата:
Возможная ситуация.
Но не помешало бы конкретики: предлагаемые варианты дополняют приведённую строку опций? Или заменяют? Полностью альбо частично (в последнем случае: что именно)?

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

Цитата:
Потому что стандарт!

Дай догадаюсь… Это стандарт тов. Кропоткина? :D

/

В тырпрайсе предлагают следующий вариант:
openldap-slapd-conf.patch :

Updates initial slapd configuration.

diff -uNPrp openldap-2.4.23.old/servers/slapd/slapd.conf openldap-2.4.23.new/servers/slapd/slapd.conf
--- openldap-2.4.23.old/servers/slapd/slapd.conf	2007-02-13 21:22:22.000000000 +0100
+++ openldap-2.4.23.new/servers/slapd/slapd.conf	2010-11-22 17:39:02.334511902 +0100
…

:wq
--
Live free or die

Начиная с EAPI=5 в portage

Начиная с EAPI=5 в portage появилась функция epatch_user().

Вы всё врёти. epatch_user был с волосатых времен, только раньше в eutils.eclass

и его надо было специально в

и его надо было специально в ебилде вызывать, для использования.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".