Skip to content

Commit

Permalink
[PATCH] patch-kernel: support non-incremental 2.6.x.y 'stable' patches
Browse files Browse the repository at this point in the history
Add better support for (non-incremental) 2.6.x.y patches; If an ending
version number if not specified, the script automatically increments the
SUBLEVEL (x in 2.6.x.y) until no more patch files are found; however,
EXTRAVERSION (y in 2.6.x.y) is never automatically incremented but must be
specified fully.

patch-kernel does not normally support reverse patching, but does so when
applying EXTRAVERSION (x.y) patches, so that moving from 2.6.11.y to
2.6.11.z is easy and handled by the script (reverse 2.6.11.y and apply
2.6.11.z).

Signed-off-by: Randy Dunlap <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Randy.Dunlap authored and Linus Torvalds committed May 5, 2005
1 parent 64f562c commit 1922163
Showing 1 changed file with 101 additions and 30 deletions.
131 changes: 101 additions & 30 deletions scripts/patch-kernel
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,19 @@
# fix some whitespace damage;
# be smarter about stopping when current version is larger than requested;
# Randy Dunlap <[email protected]>, 2004-AUG-18.
#
# Add better support for (non-incremental) 2.6.x.y patches;
# If an ending version number if not specified, the script automatically
# increments the SUBLEVEL (x in 2.6.x.y) until no more patch files are found;
# however, EXTRAVERSION (y in 2.6.x.y) is never automatically incremented
# but must be specified fully.
#
# patch-kernel does not normally support reverse patching, but does so when
# applying EXTRAVERSION (x.y) patches, so that moving from 2.6.11.y to 2.6.11.z
# is easy and handled by the script (reverse 2.6.11.y and apply 2.6.11.z).
# Randy Dunlap <[email protected]>, 2005-APR-08.

PNAME=patch-kernel

# Set directories from arguments, or use defaults.
sourcedir=${1-/usr/src/linux}
Expand All @@ -54,7 +67,7 @@ stopvers=${3-default}

if [ "$1" == -h -o "$1" == --help -o ! -r "$sourcedir/Makefile" ]; then
cat << USAGE
usage: patch-kernel [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
usage: $PNAME [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
source directory defaults to /usr/src/linux,
patch directory defaults to the current directory,
stopversion defaults to <all in patchdir>.
Expand All @@ -72,6 +85,19 @@ do
esac;
done

# ---------------------------------------------------------------------------
# arg1 is filename
noFile () {
echo "cannot find patch file: ${patch}"
exit 1
}

# ---------------------------------------------------------------------------
backwards () {
echo "$PNAME does not support reverse patching"
exit 1
}

# ---------------------------------------------------------------------------
# Find a file, first parameter is basename of file
# it tries many compression mechanisms and sets variables to say how to get it
Expand Down Expand Up @@ -133,6 +159,28 @@ applyPatch () {
return 0;
}

# ---------------------------------------------------------------------------
# arg1 is patch filename
reversePatch () {
echo -n "Reversing $1 (${name}) ... "
if $uncomp ${patchdir}/"$1"${ext} | patch -p1 -Rs -N -E -d $sourcedir
then
echo "done."
else
echo "failed. Clean it up."
exit 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, EXTRAVERSION
TMPFILE=`mktemp .tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; }
grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE
Expand Down Expand Up @@ -160,68 +208,91 @@ then
EXTRAVER=$EXTRAVERSION
fi
EXTRAVER=${EXTRAVER%%[[:punct:]]*}
#echo "patch-kernel: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER"
#echo "$PNAME: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER"
fi

#echo "stopvers=$stopvers"
if [ $stopvers != "default" ]; then
STOPSUBLEVEL=`echo $stopvers | cut -d. -f3`
STOPEXTRA=`echo $stopvers | cut -d. -f4`
#echo "STOPSUBLEVEL=$STOPSUBLEVEL, STOPEXTRA=$STOPEXTRA"
#echo "#___STOPSUBLEVEL=/$STOPSUBLEVEL/, STOPEXTRA=/$STOPEXTRA/"
else
STOPSUBLEVEL=9999
STOPEXTRA=9999
fi

while : # incrementing SUBLEVEL (s in v.p.s)
do
if [ x$EXTRAVER != "x" ]; then
# This all assumes a 2.6.x[.y] kernel tree.
# Don't allow backwards/reverse patching.
if [ $STOPSUBLEVEL -lt $SUBLEVEL ]; then
backwards
fi

if [ x$EXTRAVER != "x" ]; then
CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER"
else
else
CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
fi
fi

if [ x$EXTRAVER != "x" ]; then
echo "backing up to: $VERSION.$PATCHLEVEL.$SUBLEVEL"
patch="patch-${CURRENTFULLVERSION}"
findFile $patchdir/${patch} || noFile ${patch}
reversePatch ${patch} || exit 1
fi

# now current is 2.6.x, with no EXTRA applied,
# so update to target SUBLEVEL (2.6.SUBLEVEL)
# and then to target EXTRAVER (2.6.SUB.EXTRAVER) if requested.
# If not ending sublevel is specified, it is incremented until
# no further sublevels are found.

if [ $STOPSUBLEVEL -gt $SUBLEVEL ]; then
while : # incrementing SUBLEVEL (s in v.p.s)
do
CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
EXTRAVER=
if [ $stopvers == $CURRENTFULLVERSION ]; then
echo "Stopping at $CURRENTFULLVERSION base as requested."
break
fi

while : # incrementing EXTRAVER (x in v.p.s.x)
do
EXTRAVER=$((EXTRAVER + 1))
FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER"
#echo "... trying $FULLVERSION ..."

patch=patch-$FULLVERSION

# See if the file exists and find extension
findFile $patchdir/${patch} || break

# Apply the patch and check all is OK
applyPatch $patch || break

continue 2
done

EXTRAVER=
SUBLEVEL=$((SUBLEVEL + 1))
FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
#echo "___ trying $FULLVERSION ___"
#echo "#___ trying $FULLVERSION ___"

if [ $((SUBLEVEL)) -gt $((STOPSUBLEVEL)) ]; then
echo "Stopping since sublevel ($SUBLEVEL) is beyond stop-sublevel ($STOPSUBLEVEL)"
exit 1
fi

patch=patch-$FULLVERSION

# See if the file exists and find extension
findFile $patchdir/${patch} || break
findFile $patchdir/${patch} || noFile ${patch}

# Apply the patch and check all is OK
applyPatch $patch || break
done
#echo "base all done"
#echo "#___sublevel all done"
fi

# There is no incremental searching for extraversion...
if [ "$STOPEXTRA" != "" ]; then
while : # just to allow break
do
# apply STOPEXTRA directly (not incrementally) (x in v.p.s.x)
FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$STOPEXTRA"
#echo "#... trying $FULLVERSION ..."
patch=patch-$FULLVERSION

# See if the file exists and find extension
findFile $patchdir/${patch} || noFile ${patch}

# Apply the patch and check all is OK
applyPatch $patch || break
#echo "#___extraver all done"
break
done
fi

if [ x$gotac != x ]; then
# Out great user wants the -ac patches
Expand Down

0 comments on commit 1922163

Please sign in to comment.