Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1922163c authored by Randy.Dunlap's avatar Randy.Dunlap Committed by Linus Torvalds
Browse files

[PATCH] patch-kernel: support non-incremental 2.6.x.y 'stable' patches



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: default avatarRandy Dunlap <rddunlap@osdl.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 64f562c6
Loading
Loading
Loading
Loading
+101 −30
Original line number Original line Diff line number Diff line
@@ -46,6 +46,19 @@
# fix some whitespace damage;
# fix some whitespace damage;
# be smarter about stopping when current version is larger than requested;
# be smarter about stopping when current version is larger than requested;
#	Randy Dunlap <rddunlap@osdl.org>, 2004-AUG-18.
#	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.
# Set directories from arguments, or use defaults.
sourcedir=${1-/usr/src/linux}
sourcedir=${1-/usr/src/linux}
@@ -54,7 +67,7 @@ stopvers=${3-default}


if [ "$1" == -h -o "$1" == --help -o ! -r "$sourcedir/Makefile" ]; then
if [ "$1" == -h -o "$1" == --help -o ! -r "$sourcedir/Makefile" ]; then
cat << USAGE
cat << USAGE
usage: patch-kernel [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
usage: $PNAME [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
  source directory defaults to /usr/src/linux,
  source directory defaults to /usr/src/linux,
  patch directory defaults to the current directory,
  patch directory defaults to the current directory,
  stopversion defaults to <all in patchdir>.
  stopversion defaults to <all in patchdir>.
@@ -72,6 +85,19 @@ do
	esac;
	esac;
done
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
# Find a file, first parameter is basename of file
# it tries many compression mechanisms and sets variables to say how to get it
# it tries many compression mechanisms and sets variables to say how to get it
@@ -133,6 +159,28 @@ applyPatch () {
  return 0;
  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
# set current VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION
TMPFILE=`mktemp .tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; }
TMPFILE=`mktemp .tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; }
grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE
grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE
@@ -160,68 +208,91 @@ then
		EXTRAVER=$EXTRAVERSION
		EXTRAVER=$EXTRAVERSION
	fi
	fi
	EXTRAVER=${EXTRAVER%%[[:punct:]]*}
	EXTRAVER=${EXTRAVER%%[[:punct:]]*}
	#echo "patch-kernel: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER"
	#echo "$PNAME: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER"
fi
fi


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


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

if [ x$EXTRAVER != "x" ]; then
if [ x$EXTRAVER != "x" ]; then
	CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER"
	CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER"
else
else
	CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
	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
    if [ $stopvers == $CURRENTFULLVERSION ]; then
        echo "Stopping at $CURRENTFULLVERSION base as requested."
        echo "Stopping at $CURRENTFULLVERSION base as requested."
        break
        break
    fi
    fi


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


	patch=patch-$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
    # 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
    # Apply the patch and check all is OK
    applyPatch $patch || break
    applyPatch $patch || break

	continue 2
done
done

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

    if [ $((SUBLEVEL)) -gt $((STOPSUBLEVEL)) ]; then
	echo "Stopping since sublevel ($SUBLEVEL) is beyond stop-sublevel ($STOPSUBLEVEL)"
	exit 1
fi
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
	patch=patch-$FULLVERSION


	# See if the file exists and find extension
	# 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
	# Apply the patch and check all is OK
	applyPatch $patch || break
	applyPatch $patch || break
	#echo "#___extraver all done"
	break
done
done
#echo "base all done"
fi


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