|
Применение патчей
Ниже описан контекстный патч:
[rechosen@localhost ~]$ diff -c originalfile updatedfile
[root@svc13 /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vendor]# diff -c Makefile /home/john/builder/p5-Vendor/Makefile > /home/john/builder
/p5-Vendor/patch.Makefile
[root@svc13 /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vendor]# cat /home/john/builder/p5-Vendor/patch.Makefile
*** Makefile Mon Dec 28 13:22:56 2009
--- /home/john/builder/p5-Vendor/Makefile Mon Dec 28 13:44:12 2009
***************
*** 23,32 ****
USE_BZIP2= YES
USE_PERL5= yes
PLIST_SUB+= VENDOR_PERL="x99/lib/perl5/${PERL_VERSION}" VENDOR_DIR="x99"
CONFIGURE_SCRIPT?= Makefile.PL
! CONFIGURE_ARGS+= PREFIX="${PREFIX}" \
INSTALLDIRS="vendor" \
VENDORPREFIX="${PREFIX}/x99" \
INSTALLVENDORARCH="${VENDOR_PERL}/${PERL_ARCH}" \
--- 23,33 ----
USE_BZIP2= YES
USE_PERL5= yes
+ VENDOR_PERL= ${PREFIX}/x99/lib/perl5/${PERL_VERSION}
PLIST_SUB+= VENDOR_PERL="x99/lib/perl5/${PERL_VERSION}" VENDOR_DIR="x99"
CONFIGURE_SCRIPT?= Makefile.PL
! CONFIGURE_ARGS+= PREFIX="${PREFIX}/x99" \
INSTALLDIRS="vendor" \
VENDORPREFIX="${PREFIX}/x99" \
INSTALLVENDORARCH="${VENDOR_PERL}/${PERL_ARCH}" \
[root@svc13 /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vendor]#
[root@svc13 /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vendor]# patch -i /home/john/builder/p5-Vendor/patch.Makefile -o Makefile
Hmm... Looks like a new-style context diff to me...
The text leading up to this was:
--------------------------
|*** Makefile Mon Dec 28 13:22:56 2009
|--- /home/john/builder/p5-Vendor/Makefile Mon Dec 28 13:44:12 2009
--------------------------
Patching file Makefile using Plan A...
Hunk #1 succeeded at 23.
done
Как вы видите, здесь включено имя файла. Это значит, что нам не придется набирать его во время применения патча. Далее идет дата и время последнего изменения файла. строка с 15 "*" показывает начало изменений. Они показывают, что надо сделать со следующим блоком текста. Два номера 1 - это номера строк (здесь тоже может быть сразу несколько строк), а "!" означает, что строки надо заменить. Строка с "!" перед тремя "-" должна быть заменена второй строкой с "!", которая идет после трех "-"(конечно сам ! не будет включен; это синтаксис контекстного формата). Как вы можете видеть, здесь нет знаков "c", "a" и "d".Действие, которое нужно сделать, определяется символом в начале строки. "!" означает замену. Другие символы - "+", "-" и " " (пробел). "+" означает добавление, "-" означает удаление, а " " означает ничего не делать: патч использует его чтобы убедиться, что он изменяет правильную часть файла. Применять этот патч легче: при тех же условиях, что и для предыдущего патча (записываем вывод команды diff в файл, затем копируем патч и оригинал в одно и то же место), надо выполнить следующую команду: [rechosen@localhost ~]$ patch -i patchfile.patch -o updatedfile
Есть еще один формат вывода различий командой diff: унифицированный формат. Он более компактен, так как содержит уменьшенные контекстные строки. Однако он поддерживается только GNU diff и patch. Если вы его используете, вы должны быть уверены, что у пользователей, для которых патч предназначен, GNU patch. Linux допускает использование этого формата. Унифицированный формат похож на контекстный, но это не одно и тоже. Патч в унифицированном формате можно создать так: [rechosen@localhost ~]$ diff -u originaldirectory/ updateddirectory/
[root@svc13 /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random]# diff -u /home/john/builder/p5-Vega-Algorithm-Random/ /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random/ > /home/john/patch
[root@svc13 /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random]# cat /home/john/patch
diff -u /home/john/builder/p5-Vega-Algorithm-Random/Makefile /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random/Makefile
--- /home/john/builder/p5-Vega-Algorithm-Random/Makefile 2009-12-28 14:56:44.000000000 +0300
+++ /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random/Makefile 2009-12-28 14:55:38.000000000 +0300
@@ -18,11 +18,9 @@
COMMENT= Perl module Vega-Algorithm-Random
BUILD_DEPENDS= \
- foundation-perl>=0.04:${PORTSDIR}/x99/foundation-perl \
${SITE_PERL}/${PERL_ARCH}/Time/HiRes.pm:${PORTSDIR}/devel/p5-Time-HiRes \
${SITE_PERL}/${PERL_ARCH}/Digest/MD5.pm:${PORTSDIR}/security/p5-Digest-MD5
RUN_DEPENDS= \
- foundation-perl>=0.04:${PORTSDIR}/x99/foundation-perl \
${SITE_PERL}/${PERL_ARCH}/Time/HiRes.pm:${PORTSDIR}/devel/p5-Time-HiRes \
${SITE_PERL}/${PERL_ARCH}/Digest/MD5.pm:${PORTSDIR}/security/p5-Digest-MD5
Only in /home/john/builder/p5-Vega-Algorithm-Random/: Makefile.orig
Common subdirectories: /home/john/builder/p5-Vega-Algorithm-Random/files and /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random/files
[root@svc13 /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random]#
[root@svc13 /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random]#
[root@svc13 /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random]# patch -i /home/john/patch Hmm... Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -u /home/john/builder/p5-Vega-Algorithm-Random/Makefile /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random/Makefile
|--- /home/john/builder/p5-Vega-Algorithm-Random/Makefile 2009-12-28 14:56:44.000000000 +0300
|+++ /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-Vega-Algorithm-Random/Makefile 2009-12-28 14:55:38.000000000 +0300
--------------------------
Patching file Makefile using Plan A...
Reversed (or previously applied) patch detected! Assume -R? [y] y
Hunk #1 succeeded at 18.
Hmm... Ignoring the trailing garbage.
done
Можно делать так:
patch -d /home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-GDSL-Foundation/ -i /home/john/patch.p5-GDSL-Foundation
тогда патч будет наложен на updatedcatalog=/home/tinderbox/portstrees/RB-amd64-7.2009-11-16/ports/x99/p5-GDSL-Foundation/
В дополнение к этому можно порекомендовать следующие скрипты для создания патчей Применение патчей для нескольких файлов:
cat ~john/patch.sh
#!/usr/local/bin/bash
PROJECT=RB-amd64-7.2009-11-16
UPDATE_DIR=/home/tinderbox/portstrees/$PROJECT/ports/x99
FROM_DIR=/home/john
patches=$(ls /home/john/|grep patch|grep -v patch.sh|sed 's/patch.//g')
for port in ${patches[@]}
do
echo $port
patch -R -d $UPDATE_DIR/$port/ -i $FROM_DIR/patch.$port
done
Генерация патча для определенного порта:
cat ~john/gen_patch.sh #!/usr/local/bin/bash PROJECT=RB-amd64-7.2009-11-16 UPDATE_DIR=/home/tinderbox/portstrees/$PROJECT/ports/x99 FROM_DIR=/home/john port=$1 if [ -z "$port" ];then echo no port selected exit; fi if [ -f $FROM_DIR/patch.$port ]; then echo "$FROM_DIR/patch.$port already exists ..." diff -u $FROM_DIR/builder/$port/Makefile $UPDATE_DIR/$port/Makefile exit; else diff -u $FROM_DIR/builder/$port/Makefile $UPDATE_DIR/$port/Makefile > $FROM_DIR/patch.$port fi for port in $port do patch -R -d $UPDATE_DIR/$port/ -i $FROM_DIR/patch.$port done
fbsd/posts/patch-tips -- Last updated 2010-06-03 Thursday 17:46:54 Edit
© copyright 2010
Design by: lev