[Buildroot] [RFC PATCH v3 1/2] apply-patches.sh: script changed to support archives in a proper way
Ludovic Desroches
ludovic.desroches at atmel.com
Tue Jan 10 10:31:22 UTC 2012
On Mon, Jan 09, 2012 at 10:45:51AM +0100, Thomas De Schampheleire wrote:
> On Fri, Jan 6, 2012 at 1:47 PM, <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>
> >
> > Conflicts:
> >
> > support/scripts/apply-patches.sh
> > ---
> > support/scripts/apply-patches.sh | 159 +++++++++++++++++++++++++-------------
> > 1 files changed, 105 insertions(+), 54 deletions(-)
> >
> > diff --git a/support/scripts/apply-patches.sh b/support/scripts/apply-patches.sh
> > index 1aef47e..0492e01 100755
> > --- a/support/scripts/apply-patches.sh
> > +++ b/support/scripts/apply-patches.sh
> > @@ -1,66 +1,117 @@
> > -#! /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
>
> I wonder why you removed the original copyright. I'd say you should
> keep it, possibly together with a description of the changes and your
> name.
> Although it may not be the convention of adding explicit copyrights to
> scripts in buildroot, removing an existing one seems wrong IMO.
>
I removed it because I see it as a new script. The major part of the script
has changed, I mainly kept the switch case but with some changes too.
Anyway it's not a problem for me to keep this copyright if needed.
> >
> > -# 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 [ ! -e "${1}" ] ; then
> > +# echo "${1} is not a file"
> > +# exit 1
> > +#fi
> >
> > -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"; ;;
> > +*\.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 -g0 -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
> > +
> > +# parse patch list, extract archives, apply patches
> > +for i in $patchlist ; do
> > + # for remote files, directory is buildroot dl dir
> > + #if echo $i | grep -q -E "^http://|^ftp://" ; then
> > + # patchdir=$patchdir
> > + #else
> > + # patchdir=$(dirname $i)
> > + #fi
> > + patch_path="${patchdir}/${i}"
> > + # 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 $i | grep -q -E "tar\.bz$|tar\.bz2$|tbz$|tbz2$|tar\.gz$|tgz$" ; then
> > + mkdir "${patchesdir}"
> > + # extract archive
> > + if echo $i | 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
> > + #echo ${patchesdir}
> > + #find ${patchesdir} | sort
> > + 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
> > + # we can have regex into patch name as package*.patch.arm that's
> > + # why using ls
> > + for p in $(ls -d ${patch_path} 2> /dev/null) ; do
> > + apply_patch "${p}" || exit 1
> > + done
> > + fi
> > done
> >
> > -# Check for rejects...
> > -if [ "`find $targetdir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then
> > +# check for rejects...
> > +if [ "`find ${builddir}/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then
> > echo "Aborting. Reject files found."
> > exit 1
> > fi
> >
> > -# 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 {} \;
> > +
> > --
> > 1.7.5.4
> >
> > _______________________________________________
> > buildroot mailing list
> > buildroot at busybox.net
> > http://lists.busybox.net/mailman/listinfo/buildroot
>
More information about the buildroot
mailing list