<<< Headline | Index | http | bash | basics | x11 | net | vpn | humor | sles | cXX | php | db | perl | soft | unsorted | hw | ppp | tips | linux | fbsd | mail
[Timeline] [View Photos] [rtfm] [Search] [Index by Title] [Index by Date]
fbsd => patch-tips: == post:fbsd/posts/patch-tips

Применение патчей

Ниже описан контекстный патч:
[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