[Buildroot] [RFC PATCH v2 1/1] kernel-patch.sh: script changed to support archives in a proper way
Ludovic Desroches
ludovic.desroches at atmel.com
Wed Jun 29 13:21:43 UTC 2011
Hello Michael,
Thanks for your feedback.
On 6/29/2011 12:42 PM, Michael S. Zick wrote:
> On Wed June 29 2011, ludovic.desroches at atmel.com wrote:
>> From: Ludovic Desroches<ludovic.desroches at atmel.com>
>>
>> The previous script doesn't support patching order with archives since
>> it didn't extract archives but simply decompressed file and piped the
>> result to the patch command.
>> This new script extracts archives in a temporary folder and then applies
>> patches.
>>
>> Signed-off-by: Ludovic Desroches<ludovic.desroches at atmel.com>
>> ---
>> toolchain/patch-kernel.sh | 154 +++++++++++++++++++++++++++++----------------
>> 1 files changed, 100 insertions(+), 54 deletions(-)
>>
>> diff --git a/toolchain/patch-kernel.sh b/toolchain/patch-kernel.sh
>> index 76cb9f7..408a9a7 100755
>> --- a/toolchain/patch-kernel.sh
>> +++ b/toolchain/patch-kernel.sh
>> @@ -1,66 +1,112 @@
>> -#! /bin/bash
>> -# A little script I whipped up to make it easy to
>> -# patch source trees and have sane error handling
>> -# -Erik
>> -#
>> -# (c) 2002 Erik Andersen<andersen at codepoet.org>
>> +#!/bin/bash
>>
>> -# Set directories from arguments, or use defaults.
>> -targetdir=${1-.}
>> -patchdir=${2-../kernel-patches}
>> -shift 2
>> -patchpattern=${@-*}
>> +# function apply_patch patch_file
>> +# this function no more deal with directory case since it is managed
>> +# in an upper layer
>> +function apply_patch {
>> +apply="patch -p1 -E -d"
>>
>> -if [ ! -d "${targetdir}" ] ; then
>> - echo "Aborting. '${targetdir}' is not a directory."
>> - exit 1
>> +case "${1}" in
>> +*\.tar\.gz|*\.tgz|*\.tar\.bz|*\.tar\.bz2|*\.tbz|*\.tbz2)
>> + echo "Error with ${1}";
>> + echo "Archives into a directory or another archive is not supported";
>> + return 1;
>> + ;;
>> +*\.gz)
>> + type="gzip"; uncomp="gunzip -dc"; ;;
>> +*\.bz)
>> + type="bzip"; uncomp="bunzip -dc"; ;;
>> +*\.bz2)
>> + type="bzip2"; uncomp="bunzip2 -dc"; ;;
>> +*\.zip)
>> + type="zip"; uncomp="unzip -d"; ;;
>> +*\.Z)
>> + type="compress"; uncomp="uncompress -c"; ;;
>> +*\.diff*)
>> + type="diff"; uncomp="cat"; ;;
>> +# '*' at the end is needed for patch.arm for example
>> +*\.patch*)
>> + type="patch"; uncomp="cat"; ;;
>> +*)
>> + echo "Unsupported format file for ${1}, skip it";
>> + return 0;
>> + ;;
>> +esac
>> +
>> +echo ""
>> +echo "Applying ${1} using ${type}: "
>> +echo ${1} | cat>> ${builddir}/.applied_patches_list
>> +${uncomp} ${1} | ${apply} ${builddir}
>> +if [ $? != 0 ] ; then
>> + echo "Patch failed! Please fix ${1}!"
>> + return 1
>> fi
>> +}
>> +
>> +# entry point
>> +builddir=${1}
>> +patchdir=${2}
>> +shift 2
>> +patchlist=${@}
>> +patchesdir="${builddir}/../$(basename $builddir)-patches"
>> +
>> +# check directories
>> if [ ! -d "${patchdir}" ] ; then
>> - echo "Aborting. '${patchdir}' is not a directory."
>> - exit 1
>> + echo "Aborting: ${patchdir} is not a directory."
>> + exit 1
>> fi
>> -
>> -for i in `cd ${patchdir}; ls -d ${patchpattern} 2> /dev/null` ; do
>> - apply="patch -p1 -E -d"
>> - uncomp_parm=""
>> - if [ -d "${patchdir}/$i" ] ; then
>> - type="directory overlay"
>> - uncomp="tar cf - --exclude=.svn --no-anchored -C"
>> - uncomp_parm="."
>> - apply="tar xvf - -C"
>> - else case "$i" in
>> - *.gz)
>> - type="gzip"; uncomp="gunzip -dc"; ;;
>> - *.bz)
>> - type="bzip"; uncomp="bunzip -dc"; ;;
>> - *.bz2)
>> - type="bzip2"; uncomp="bunzip2 -dc"; ;;
>> - *.zip)
>> - type="zip"; uncomp="unzip -d"; ;;
>> - *.Z)
>> - type="compress"; uncomp="uncompress -c"; ;;
>> - *.tgz)
>> - type="tar gzip"; uncomp="gunzip -dc"; apply="tar xvf - -C"; ;;
>> - *.tar)
>> - type="tar"; uncomp="cat"; apply="tar xvf - -C"; ;;
>> - *)
>> - type="plaintext"; uncomp="cat"; ;;
>> - esac fi
>> - echo ""
>> - echo "Applying ${i} using ${type}: "
>> - echo ${i} | cat>> ${targetdir}/.applied_patches_list
>> - ${uncomp} ${patchdir}/${i} ${uncomp_parm} | ${apply} ${targetdir}
>> - if [ $? != 0 ] ; then
>> - echo "Patch failed! Please fix $i!"
>> +if [ ! -d "${builddir}" ] ; then
>> + echo "Aborting: ${builddir} is not a directory."
>> exit 1
>> - fi
>> +fi
>> +
>> +# go to the patch directory because $patchlist is interpreted when doing
>> +# for i in $patchlist
>> +pushd ${patchdir}
>> +index=0
>> +for i in $patchlist ; do
>> + patchlist_interpreted[${index}]="$i"
>> + index=`expr ${index} + 1`
>> + echo patchlist_interpreted[${index}]=$i
>> done
>> +popd
>>
>> -# Check for rejects...
>> -if [ "`find $targetdir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then
>> +for index in "${!patchlist_interpreted[@]}" ; do
>> + file="${patchlist_interpreted[${index}]}"
>> + patch_path="${patchdir}/${file}"
>> + # three cases: directory, archive, file patch (compressed or not)
>> + # directory
>> + if [ -d "${patch_path}" ] ; then
>> + for p in $(ls ${patch_path}) ; do
>> + apply_patch "${patch_path}/${p}" || exit 1
>> + done
>> + # archive
>> + elif echo $file | grep -q -E "tar\.bz$|tar\.bz2$|tbz$|tbz2$|tar\.gz$|tgz$" ; then
>> + mkdir "${patchesdir}"
>> + # extract archive
>> + if echo $file | grep -q -E "tar\.bz$|tar\.bz2$|tbz$|tbz2$" ; then
>> + tar_options="-xjf"
>> + else
>> + tar_options="-xzf"
>> + fi
>> + tar -C ${patchesdir} --strip-components=1 ${tar_options} ${patch_path}
>> + # apply patches from the archive
>> + for p in $(find ${patchesdir} | sort) ; do
>> + apply_patch "${p}" || { rm -rf "${patchesdir}" ; exit 1; }
>> + done
>> + rm -rf "${patchesdir}"
>> + # file which is not an archive
>> + else
>> + apply_patch "${patch_path}" || exit 1
>> + fi
>> +done
>> +
>> +# check for rejects...
>> +if [ "`find ${builddir}/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then
>> echo "Aborting. Reject files found."
>> exit 1
>> fi
>>
> It appears on a quick reading that you leave any reject files on the
> file system after an attempt to apply patches.
>
> That seems reasonable, presuming that you expect human intervention
> to resolve the rejects before continuing.
>
> But what if the second or subsequent attempt to run the patch application,
> and there are rejects still on the file system from a prior attempt?
> I.E: The previous human intervention did not include deleting the earlier
> reject files.
In fact, it was done likte this into the previous script so I was not
focused on this but you are right: even if the patches are applied
without errors the filesystem build will be aborted.
>
> Wouldn't it make sense to be sure the file system is clean of any reject
> files __before__ attempting to run the patch application?
> I.E: Only checking afterward does not tell you success/fail of most
> recent attempt because the rejects might have pre-existed the patch attempt.
>
> Mike
I agree, I keep in mind your suggestion for v3 version.
>> -# Remove backup files
>> -find $targetdir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
>> +# remove backup files
>> +find ${builddir}/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
>> +
>
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
Regards,
Ludovic
More information about the buildroot
mailing list