diff options
Diffstat (limited to 'scripts/patch-kernel')
| -rwxr-xr-x | scripts/patch-kernel | 131 | 
1 files changed, 101 insertions, 30 deletions
| diff --git a/scripts/patch-kernel b/scripts/patch-kernel index 43af01075612..f2d47ca9c8fa 100755 --- a/scripts/patch-kernel +++ b/scripts/patch-kernel @@ -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>. @@ -73,6 +86,19 @@ do  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  findFile () { @@ -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 | 
