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 @@ | |||
| 46 | # fix some whitespace damage; | 46 | # fix some whitespace damage; |
| 47 | # be smarter about stopping when current version is larger than requested; | 47 | # be smarter about stopping when current version is larger than requested; |
| 48 | # Randy Dunlap <rddunlap@osdl.org>, 2004-AUG-18. | 48 | # Randy Dunlap <rddunlap@osdl.org>, 2004-AUG-18. |
| 49 | # | ||
| 50 | # Add better support for (non-incremental) 2.6.x.y patches; | ||
| 51 | # If an ending version number if not specified, the script automatically | ||
| 52 | # increments the SUBLEVEL (x in 2.6.x.y) until no more patch files are found; | ||
| 53 | # however, EXTRAVERSION (y in 2.6.x.y) is never automatically incremented | ||
| 54 | # but must be specified fully. | ||
| 55 | # | ||
| 56 | # patch-kernel does not normally support reverse patching, but does so when | ||
| 57 | # applying EXTRAVERSION (x.y) patches, so that moving from 2.6.11.y to 2.6.11.z | ||
| 58 | # is easy and handled by the script (reverse 2.6.11.y and apply 2.6.11.z). | ||
| 59 | # Randy Dunlap <rddunlap@osdl.org>, 2005-APR-08. | ||
| 60 | |||
| 61 | PNAME=patch-kernel | ||
| 49 | 62 | ||
| 50 | # Set directories from arguments, or use defaults. | 63 | # Set directories from arguments, or use defaults. |
| 51 | sourcedir=${1-/usr/src/linux} | 64 | sourcedir=${1-/usr/src/linux} |
| @@ -54,7 +67,7 @@ stopvers=${3-default} | |||
| 54 | 67 | ||
| 55 | if [ "$1" == -h -o "$1" == --help -o ! -r "$sourcedir/Makefile" ]; then | 68 | if [ "$1" == -h -o "$1" == --help -o ! -r "$sourcedir/Makefile" ]; then |
| 56 | cat << USAGE | 69 | cat << USAGE |
| 57 | usage: patch-kernel [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ] | 70 | usage: $PNAME [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ] |
| 58 | source directory defaults to /usr/src/linux, | 71 | source directory defaults to /usr/src/linux, |
| 59 | patch directory defaults to the current directory, | 72 | patch directory defaults to the current directory, |
| 60 | stopversion defaults to <all in patchdir>. | 73 | stopversion defaults to <all in patchdir>. |
| @@ -73,6 +86,19 @@ do | |||
| 73 | done | 86 | done |
| 74 | 87 | ||
| 75 | # --------------------------------------------------------------------------- | 88 | # --------------------------------------------------------------------------- |
| 89 | # arg1 is filename | ||
| 90 | noFile () { | ||
| 91 | echo "cannot find patch file: ${patch}" | ||
| 92 | exit 1 | ||
| 93 | } | ||
| 94 | |||
| 95 | # --------------------------------------------------------------------------- | ||
| 96 | backwards () { | ||
| 97 | echo "$PNAME does not support reverse patching" | ||
| 98 | exit 1 | ||
| 99 | } | ||
| 100 | |||
| 101 | # --------------------------------------------------------------------------- | ||
| 76 | # Find a file, first parameter is basename of file | 102 | # Find a file, first parameter is basename of file |
| 77 | # it tries many compression mechanisms and sets variables to say how to get it | 103 | # it tries many compression mechanisms and sets variables to say how to get it |
| 78 | findFile () { | 104 | findFile () { |
| @@ -133,6 +159,28 @@ applyPatch () { | |||
| 133 | return 0; | 159 | return 0; |
| 134 | } | 160 | } |
| 135 | 161 | ||
| 162 | # --------------------------------------------------------------------------- | ||
| 163 | # arg1 is patch filename | ||
| 164 | reversePatch () { | ||
| 165 | echo -n "Reversing $1 (${name}) ... " | ||
| 166 | if $uncomp ${patchdir}/"$1"${ext} | patch -p1 -Rs -N -E -d $sourcedir | ||
| 167 | then | ||
| 168 | echo "done." | ||
| 169 | else | ||
| 170 | echo "failed. Clean it up." | ||
| 171 | exit 1 | ||
| 172 | fi | ||
| 173 | if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] | ||
| 174 | then | ||
| 175 | echo "Aborting. Reject files found." | ||
| 176 | return 1 | ||
| 177 | fi | ||
| 178 | # Remove backup files | ||
| 179 | find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \; | ||
| 180 | |||
| 181 | return 0 | ||
| 182 | } | ||
| 183 | |||
| 136 | # set current VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION | 184 | # set current VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION |
| 137 | TMPFILE=`mktemp .tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; } | 185 | TMPFILE=`mktemp .tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; } |
| 138 | grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE | 186 | grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE |
| @@ -160,53 +208,57 @@ then | |||
| 160 | EXTRAVER=$EXTRAVERSION | 208 | EXTRAVER=$EXTRAVERSION |
| 161 | fi | 209 | fi |
| 162 | EXTRAVER=${EXTRAVER%%[[:punct:]]*} | 210 | EXTRAVER=${EXTRAVER%%[[:punct:]]*} |
| 163 | #echo "patch-kernel: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER" | 211 | #echo "$PNAME: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER" |
| 164 | fi | 212 | fi |
| 165 | 213 | ||
| 166 | #echo "stopvers=$stopvers" | 214 | #echo "stopvers=$stopvers" |
| 167 | if [ $stopvers != "default" ]; then | 215 | if [ $stopvers != "default" ]; then |
| 168 | STOPSUBLEVEL=`echo $stopvers | cut -d. -f3` | 216 | STOPSUBLEVEL=`echo $stopvers | cut -d. -f3` |
| 169 | STOPEXTRA=`echo $stopvers | cut -d. -f4` | 217 | STOPEXTRA=`echo $stopvers | cut -d. -f4` |
| 170 | #echo "STOPSUBLEVEL=$STOPSUBLEVEL, STOPEXTRA=$STOPEXTRA" | 218 | #echo "#___STOPSUBLEVEL=/$STOPSUBLEVEL/, STOPEXTRA=/$STOPEXTRA/" |
| 171 | else | 219 | else |
| 172 | STOPSUBLEVEL=9999 | 220 | STOPSUBLEVEL=9999 |
| 173 | STOPEXTRA=9999 | 221 | STOPEXTRA=9999 |
| 174 | fi | 222 | fi |
| 175 | 223 | ||
| 176 | while : # incrementing SUBLEVEL (s in v.p.s) | 224 | # This all assumes a 2.6.x[.y] kernel tree. |
| 177 | do | 225 | # Don't allow backwards/reverse patching. |
| 178 | if [ x$EXTRAVER != "x" ]; then | 226 | if [ $STOPSUBLEVEL -lt $SUBLEVEL ]; then |
| 227 | backwards | ||
| 228 | fi | ||
| 229 | |||
| 230 | if [ x$EXTRAVER != "x" ]; then | ||
| 179 | CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER" | 231 | CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER" |
| 180 | else | 232 | else |
| 181 | CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" | 233 | CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" |
| 182 | fi | 234 | fi |
| 235 | |||
| 236 | if [ x$EXTRAVER != "x" ]; then | ||
| 237 | echo "backing up to: $VERSION.$PATCHLEVEL.$SUBLEVEL" | ||
| 238 | patch="patch-${CURRENTFULLVERSION}" | ||
| 239 | findFile $patchdir/${patch} || noFile ${patch} | ||
| 240 | reversePatch ${patch} || exit 1 | ||
| 241 | fi | ||
| 183 | 242 | ||
| 243 | # now current is 2.6.x, with no EXTRA applied, | ||
| 244 | # so update to target SUBLEVEL (2.6.SUBLEVEL) | ||
| 245 | # and then to target EXTRAVER (2.6.SUB.EXTRAVER) if requested. | ||
| 246 | # If not ending sublevel is specified, it is incremented until | ||
| 247 | # no further sublevels are found. | ||
| 248 | |||
| 249 | if [ $STOPSUBLEVEL -gt $SUBLEVEL ]; then | ||
| 250 | while : # incrementing SUBLEVEL (s in v.p.s) | ||
| 251 | do | ||
| 252 | CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" | ||
| 253 | EXTRAVER= | ||
| 184 | if [ $stopvers == $CURRENTFULLVERSION ]; then | 254 | if [ $stopvers == $CURRENTFULLVERSION ]; then |
| 185 | echo "Stopping at $CURRENTFULLVERSION base as requested." | 255 | echo "Stopping at $CURRENTFULLVERSION base as requested." |
| 186 | break | 256 | break |
| 187 | fi | 257 | fi |
| 188 | 258 | ||
| 189 | while : # incrementing EXTRAVER (x in v.p.s.x) | ||
| 190 | do | ||
| 191 | EXTRAVER=$((EXTRAVER + 1)) | ||
| 192 | FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER" | ||
| 193 | #echo "... trying $FULLVERSION ..." | ||
| 194 | |||
| 195 | patch=patch-$FULLVERSION | ||
| 196 | |||
| 197 | # See if the file exists and find extension | ||
| 198 | findFile $patchdir/${patch} || break | ||
| 199 | |||
| 200 | # Apply the patch and check all is OK | ||
| 201 | applyPatch $patch || break | ||
| 202 | |||
| 203 | continue 2 | ||
| 204 | done | ||
| 205 | |||
| 206 | EXTRAVER= | ||
| 207 | SUBLEVEL=$((SUBLEVEL + 1)) | 259 | SUBLEVEL=$((SUBLEVEL + 1)) |
| 208 | FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" | 260 | FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" |
| 209 | #echo "___ trying $FULLVERSION ___" | 261 | #echo "#___ trying $FULLVERSION ___" |
| 210 | 262 | ||
| 211 | if [ $((SUBLEVEL)) -gt $((STOPSUBLEVEL)) ]; then | 263 | if [ $((SUBLEVEL)) -gt $((STOPSUBLEVEL)) ]; then |
| 212 | echo "Stopping since sublevel ($SUBLEVEL) is beyond stop-sublevel ($STOPSUBLEVEL)" | 264 | echo "Stopping since sublevel ($SUBLEVEL) is beyond stop-sublevel ($STOPSUBLEVEL)" |
| @@ -214,14 +266,33 @@ do | |||
| 214 | fi | 266 | fi |
| 215 | 267 | ||
| 216 | patch=patch-$FULLVERSION | 268 | patch=patch-$FULLVERSION |
| 217 | |||
| 218 | # See if the file exists and find extension | 269 | # See if the file exists and find extension |
| 219 | findFile $patchdir/${patch} || break | 270 | findFile $patchdir/${patch} || noFile ${patch} |
| 220 | 271 | ||
| 221 | # Apply the patch and check all is OK | 272 | # Apply the patch and check all is OK |
| 222 | applyPatch $patch || break | 273 | applyPatch $patch || break |
| 223 | done | 274 | done |
| 224 | #echo "base all done" | 275 | #echo "#___sublevel all done" |
| 276 | fi | ||
| 277 | |||
| 278 | # There is no incremental searching for extraversion... | ||
| 279 | if [ "$STOPEXTRA" != "" ]; then | ||
| 280 | while : # just to allow break | ||
| 281 | do | ||
| 282 | # apply STOPEXTRA directly (not incrementally) (x in v.p.s.x) | ||
| 283 | FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$STOPEXTRA" | ||
| 284 | #echo "#... trying $FULLVERSION ..." | ||
| 285 | patch=patch-$FULLVERSION | ||
| 286 | |||
| 287 | # See if the file exists and find extension | ||
| 288 | findFile $patchdir/${patch} || noFile ${patch} | ||
| 289 | |||
| 290 | # Apply the patch and check all is OK | ||
| 291 | applyPatch $patch || break | ||
| 292 | #echo "#___extraver all done" | ||
| 293 | break | ||
| 294 | done | ||
| 295 | fi | ||
| 225 | 296 | ||
| 226 | if [ x$gotac != x ]; then | 297 | if [ x$gotac != x ]; then |
| 227 | # Out great user wants the -ac patches | 298 | # Out great user wants the -ac patches |
