diff options
| author | Linus Torvalds <torvalds@athlon.transmeta.com> | 2002-02-04 20:32:43 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@athlon.transmeta.com> | 2002-02-04 20:32:43 -0800 |
| commit | a8a2069f432c5597bdf9c83ab3045b9ef32ab5e3 (patch) | |
| tree | 06d1047415e70b9a6cbd0567ae1202433530dd46 /scripts/patch-kernel | |
| parent | 5db5272c0a5cd37e5a697e4750fbc4ce6317b7dc (diff) | |
v2.4.14.1 -> v2.4.14.2
- Ivan Kokshaysky: fix alpha dec_and_lock with modules, for alpha config entry
- Kai Germaschewski: ISDN updates
- Jeff Garzik: network driver updates, sysv fs update
- Kai Mäkisara: SCSI tape update
- Alan Cox: large drivers merge
- Nikita Danilov: reiserfs procfs information
- Andrew Morton: ext3 merge
- Christoph Hellwig: vxfs livelock fix
- Trond Myklebust: NFS updates
- Jens Axboe: cpqarray + cciss dequeue fix
- Tim Waugh: parport_serial base_baud setting
- Matthew Dharm: usb-storage Freecom driver fixes
- Dave McCracken: wait4() thread group race fix
Diffstat (limited to 'scripts/patch-kernel')
| -rwxr-xr-x | scripts/patch-kernel | 201 |
1 files changed, 150 insertions, 51 deletions
diff --git a/scripts/patch-kernel b/scripts/patch-kernel index 328c01b080a0..edc3d1ec4000 100755 --- a/scripts/patch-kernel +++ b/scripts/patch-kernel @@ -1,8 +1,22 @@ #! /bin/sh # Script to apply kernel patches. -# usage: patch-kernel [ sourcedir [ patchdir [ stopversion ] ] ] +# usage: patch-kernel [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ] # The source directory defaults to /usr/src/linux, and the patch # directory defaults to the current directory. +# e.g. +# scripts/patch-kernel . .. +# Update the kernel tree in the current directory using patches in the +# directory above to the latest Linus kernel +# scripts/patch-kernel . .. -ac +# Get the latest Linux kernel and patch it with the latest ac patch +# scripts/patch-kernel . .. 2.4.9 +# Gets standard kernel 2.4.9 +# scripts/patch-kernel . .. 2.4.9 -ac +# Gets 2.4.9 with latest ac patches +# scripts/patch-kernel . .. 2.4.9 -ac11 +# Gets 2.4.9 with ac patch ac11 +# Note: It uses the patches relative to the Linus kernels, not the +# ac to ac relative patches # # It determines the current kernel version from the top-level Makefile. # It then looks for patches for the next sublevel in the patch directory. @@ -21,74 +35,159 @@ # Put the full version number (i.e. 2.3.31) as the last parameter # Dave Gilbert <linux@treblig.org>, 11th December 1999. +# Fixed previous patch so that if we are already at the correct version +# not to patch up. +# +# Added -ac option, use -ac or -ac9 (say) to stop at a particular version +# Dave Gilbert <linux@treblig.org>, 29th September 2001. + # Set directories from arguments, or use defaults. sourcedir=${1-/usr/src/linux} patchdir=${2-.} stopvers=${3-imnotaversion} -# set current VERSION, PATCHLEVEL, SUBLEVEL -eval `sed -n 's/^\([A-Z]*\) = \([0-9]*\)$/\1=\2/p' $sourcedir/Makefile` +# See if we have any -ac options +for PARM in $* +do + case $PARM in + -ac*) + gotac=$PARM; + + esac; +done + +# --------------------------------------------------------------------------- +# Find a file, first parameter is basename of file +# it tries many compression mechanisms and sets variables to say how to get it +function findFile { + filebase=$1; + + if [ -r ${filebase}.gz ]; then + ext=".gz" + name="gzip" + uncomp="gunzip -dc" + elif [ -r ${filebase}.bz ]; then + ext=".bz" + name="bzip" + uncomp="bunzip -dc" + elif [ -r ${filebase}.bz2 ]; then + ext=".bz2" + name="bzip2" + uncomp="bunzip2 -dc" + elif [ -r ${filebase}.zip ]; then + ext=".zip" + name="zip" + uncomp="unzip -d" + elif [ -r ${filebase}.Z ]; then + ext=".Z" + name="uncompress" + uncomp="uncompress -c" + elif [ -r ${filebase} ]; then + ext="" + name="plaintext" + uncomp="cat" + else + return 1; + fi + + return 0; +} + +# --------------------------------------------------------------------------- +# Apply a patch and check it goes in cleanly +# First param is patch name (e.g. patch-2.4.9-ac5) - without path or extension + +function applyPatch { + echo -n "Applying $1 (${name})... " + if $uncomp ${patchdir}/$1${ext} | patch -p1 -s -N -E -d $sourcedir + then + echo "done." + else + echo "failed. Clean up yourself." + return 1; + fi + if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] + then + echo "Aborting. Reject files found." + return 1; + fi + # Remove backup files + find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \; + + return 0; +} + +# set current VERSION, PATCHLEVEL, SUBLEVEL, EXTERVERSION +eval `sed -n -e 's/^\([A-Z]*\) = \([0-9]*\)$/\1=\2/p' -e 's/^\([A-Z]*\) = \(-[-a-z0-9]*\)$/\1=\2/p' $sourcedir/Makefile` if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ] then echo "unable to determine current kernel version" >&2 exit 1 fi -echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL" +echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION}" + +if [ x$EXTRAVERSION != "x" ] +then + echo "I'm sorry but patch-kernel can't work with a kernel source tree that is not a base version" + exit 1; +fi while : do + CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" + if [ $stopvers = $CURRENTFULLVERSION ] + then + echo "Stoping at $CURRENTFULLVERSION base as requested." + break + fi + SUBLEVEL=`expr $SUBLEVEL + 1` FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" patch=patch-$FULLVERSION - if [ -r $patchdir/${patch}.gz ]; then - ext=".gz" - name="gzip" - uncomp="gunzip -dc" - elif [ -r $patchdir/${patch}.bz ]; then - ext=".bz" - name="bzip" - uncomp="bunzip -dc" - elif [ -r $patchdir/${patch}.bz2 ]; then - ext=".bz2" - name="bzip2" - uncomp="bunzip2 -dc" - elif [ -r $patchdir/${patch}.zip ]; then - ext=".zip" - name="zip" - uncomp="unzip -d" - elif [ -r $patchdir/${patch}.Z ]; then - ext=".Z" - name="uncompress" - uncomp="uncompress -c" - elif [ -r $patchdir/${patch} ]; then - ext="" - name="plaintext" - uncomp="cat" - else - break - fi - echo -n "Applying ${patch} (${name})... " - if $uncomp ${patchdir}/${patch}${ext} | patch -p1 -s -N -E -d $sourcedir - then - echo "done." - else - echo "failed. Clean up yourself." - break - fi - if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] - then - echo "Aborting. Reject files found." - break - fi - # Remove backup files - find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \; + # See if the file exists and find extension + findFile $patchdir/${patch} || break - if [ $stopvers = $FULLVERSION ] - then - echo "Stoping at $FULLVERSION as requested. Enjoy." - break - fi + # Apply the patch and check all is OK + applyPatch $patch || break done + +if [ x$gotac != x ]; then + # Out great user wants the -ac patches + # They could have done -ac (get latest) or -acxx where xx=version they want + if [ $gotac == "-ac" ] + then + # They want the latest version + HIGHESTPATCH=0 + for PATCHNAMES in $patchdir/patch-${CURRENTFULLVERSION}-ac*\.* + do + ACVALUE=`echo $PATCHNAMES | sed -e 's/^.*patch-[0-9.]*-ac\([0-9]*\).*/\1/'` + # Check it is actually a recognised patch type + findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${ACVALUE} || break + + if [ $ACVALUE -gt $HIGHESTPATCH ] + then + HIGHESTPATCH=$ACVALUE + fi + done + + if [ $HIGHESTPATCH -ne 0 ] + then + findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH} || break + applyPatch patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH} + else + echo "No ac patches found" + fi + else + # They want an exact version + findFile $patchdir/patch-${CURRENTFULLVERSION}${gotac} || { + echo "Sorry, I couldn't find the $gotac patch for $CURRENTFULLVERSION. Hohum." + exit 1 + } + applyPatch patch-${CURRENTFULLVERSION}${gotac} + fi +fi + + |
