[Buildroot] [RFC PATCH v3 1/2] apply-patches.sh: script changed to support archives in a proper way

Thomas De Schampheleire patrickdepinguin+buildroot at gmail.com
Mon Jan 9 09:45:51 UTC 2012


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.

>
> -# 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