|
@@ -46,6 +46,19 @@
|
|
|
# fix some whitespace damage;
|
|
|
# be smarter about stopping when current version is larger than requested;
|
|
|
# Randy Dunlap <rddunlap@osdl.org>, 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 <rddunlap@osdl.org>, 2005-APR-08.
|
|
|
+
|
|
|
+PNAME=patch-kernel
|
|
|
|
|
|
# Set directories from arguments, or use defaults.
|
|
|
sourcedir=${1-/usr/src/linux}
|
|
@@ -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>.
|
|
@@ -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
|
|
@@ -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
|
|
@@ -160,53 +208,57 @@ 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)"
|
|
@@ -214,14 +266,33 @@ do
|
|
|
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
|