All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rusty Russell <rusty@rustcorp.com.au>
To: Matt Mackall <mpm@selenic.com>
Cc: linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [ANNOUNCE] kpatchup 0.02 kernel patching script
Date: Thu, 04 Mar 2004 12:40:36 +1100	[thread overview]
Message-ID: <1078364436.849.0.camel@bach> (raw)
In-Reply-To: <20040303022444.GA3883@waste.org>

[-- Attachment #1: Type: text/plain, Size: 433 bytes --]

On Wed, 2004-03-03 at 13:24, Matt Mackall wrote: 
> This is the first release of kpatchup, a script for managing switching
> between kernel releases via patches with some smarts:

Hi Matt!

Please find below my grab_kernel, latest-kernel-version and lkvercmp
scripts, in case they are useful for you to merge.  Kinda
rough, like any unexposed code...

Rusty


-- 
Anyone who quotes me in their signature is an idiot -- Rusty Russell

[-- Attachment #2: lkvercmp --]
[-- Type: text/x-sh, Size: 2645 bytes --]

#! /bin/sh
# Compare multiple kernel versions

# Return more recent of two kernel versions.
if [ $# -eq 0 ]; then
    echo Usage: $0 kernelversion kernelversion ... >&2
    echo Returns greatest of the versions. >&2
    exit 1
fi

unknown()
{
    # Does a -dj kernel come before a -ac kernel?  Or a Linus kernel?
    # Undefined.
    echo Can\'t compare extension \'"$1"\'. >&2
    exit 1
}

firstpart()
{
    echo $1 | sed 's/[-.].*//'
}

lastpart()
{
    echo $1 | sed 's/.*[-.]//'
}

trimlastpart()
{
    echo $1 | sed 's/[-.][^-.]*$//'
}

trimfirstpart()
{
    echo $1 | sed 's/^[^-.]*[-.]//'
}

letters()
{
    echo $1 | tr -d '[0-9]'
}

numbers()
{
    echo $1 | tr -dc '[0-9]'
}

if [ $# -eq 1 ]; then
    echo "$1"
    exit 0
fi

if [ $# -gt 2 ]; then
    FIRST=$1
    shift
    set -- $FIRST $($0 "$@")
fi

VER1=$1
VER2=$2

# Vanity kernels (at end): handle 2.6.3-mm2 vs 2.6.3-rc1-mm3 by comparing
# base first.
TAIL1=$(lastpart $VER1)
TAIL2=$(lastpart $VER2)
if [ x"$(letters $TAIL1)" = x"$(letters $TAIL2)" ]; then
    case "$TAIL1" in
    bk*|rc*|pre*) : ;;
    *)
	BASE1=$(trimlastpart $VER1)
	BASE2=$(trimlastpart $VER2)
	if [ x"$BASE1" = x"$BASE2" ]; then
	    if [ $(numbers $TAIL1) -gt $(numbers $TAIL2) ]; then
		echo $1
	    else
		echo $2
	    fi
	else
	    if [ x$(lkvercmp $BASE1 $BASE2) = x$BASE1 ]; then
		echo $1
	    else
		echo $2
	    fi
	fi
	exit
	;;
   esac
fi

while true; do
    PART1=$(firstpart $VER1)
    PART2=$(firstpart $VER2)
    VER1=$(trimfirstpart $VER1)
    VER2=$(trimfirstpart $VER2)

    PART1LETTERS=$(letters $PART1)
    PART2LETTERS=$(letters $PART2)
    PART1NUMBERS=$(numbers $PART1)
    PART2NUMBERS=$(numbers $PART2)

    if [ "$PART1LETTERS" = "$PART2LETTERS" ]; then
	if [ "$PART1NUMBERS" = "$PART2NUMBERS" ]; then
	    continue;
	else
	    if [ "$PART1NUMBERS" -gt "$PART2NUMBERS" ]; then
		echo $1; exit
	    else
		echo $2; exit
	    fi
        fi
    fi

    case x"$PART1LETTERS" in
    xbk)
        # bk snapshots come after (ie. 2.6.1-bk1 is > 2.6.1).
	# So this always wins.
	case x"$PART2LETTERS" in
	x|xrc|xpre) echo $1; exit;;
	esac
	unknown $PART2LETTERS;;
    x)
	# Final beats everything except bk.
	case x"$PART2LETTERS" in
	xbk) echo $2; exit;;
	xrc|xpre) echo $1; exit;;
	esac
	unknown $PART2LETTERS;;
    xrc)
	# Only a final or bk can win.
	case x"$PART2LETTERS" in
        x|xbk) echo $2; exit;;
	xpre) echo $1; exit;;
        esac
	unknown $PART2LETTERS;;
    xpre)
        # Final, bk or rc can win.
	case x"$PART2LETTERS" in
        x|xbk|xrc) echo $2; exit;;
	xpre) echo $1; exit;;
        esac
	unknown $PART2LETTERS;;
    *)
	unknown $PART1LETTERS;;
    esac
done

[-- Attachment #3: latest-kernel-version --]
[-- Type: text/x-sh, Size: 1632 bytes --]

#! /bin/sh -e
# Latest kernel version of this vintage.

KERNELDIR=~/devel/kernel

# Return the latest kernel versions.
get_kernel_vers()
{
#     if [ x"$GK_KERNS" = x ]; then
# 	GK_KERNS=$(finger @finger.kernel.org | tail +2 | cut -s -d: -f2- | sed 's/[ 	]*//')
#     fi
    if [ x"$GK_KERNS" = x ]; then
	GK_KERNS=$(lynx -width=500 -dump http://www.kernel.org/kdist/finger_banner | tail +2 | cut -s -d: -f2- | sed 's/[ 	]*//')
    fi
    if [ x"$GK_KERNS" = x ]; then
	echo Failed to get kernel list from kernel.org >&2
	exit 1
    fi
    # Vanity are there too: only take recognized patches.
    # Ignore 2.4-bk versions: I don't know where they're coming from 8(
    echo "$GK_KERNS" # | egrep -- "$1|-rc|-bk|-pre|^[0-9]*\.[0-9]*\.[0-9]*\$" | grep -v '2\.4\.[0-9]*-bk[0-9]*'
}


PROBE=0
if [ x"$1" = x--probe ]; then
    PROBE=1
    shift
fi

case "$1" in --*)
    echo "Usage: $0 [--probe] [kernel-base-version]" >&2
    echo "Returns the latest version on the system, or with --probe," >&2
    echo "returns the latest version on network." >&2
    exit 1
    ;;
esac

if [ $# -eq 0 ]; then set .; fi

if [ $PROBE = 1 ]; then
    CANDIDATES=$(get_kernel_vers)
else
    CANDIDATES=$(cd $KERNELDIR && ls -d linux-* | fgrep -v '.tmp' | grep -v -- '-ppc' | sed 's/^linux-//')
fi

for w; do
    case "$w" in
	# By default, ignore any vanity kernels.
	.) FILTER="^[0-9.]*(-rc[0-9]*|-bk[0-9]*|-pre[0-9]*)*\$";;
	# eg -mm.
	-*) FILTER="^[0-9.]*(-rc[0-9]*|-bk[0-9]*|-pre[0-9]*)*$w[0-9]*\$";;
	# eg. 2.4
	*) FILTER="^$w[0-9.]*(-rc[0-9]*|-bk[0-9]*|-pre[0-9]*)*\$";;
    esac

    lkvercmp $(echo "$CANDIDATES" | egrep -- "$FILTER")
done



[-- Attachment #4: grab-kernel --]
[-- Type: text/x-sh, Size: 5453 bytes --]

#! /bin/sh -e
# Script to grab a given kernel version (stolen from Virtual Anton).

barf()
{
    echo "$@" >&2
    exit 1
}

PATCHDIR=~/devel/kernel/kernel-patches
MIRRORS="rsync://kernel::kernel http://kernel.linux.pacific.net.au/linux/kernel/ rsync://master.kernel.org:/pub/linux/kernel"
#MIRRORS="rsync.planetmirror.com::ftp.kernel.org/pub/linux/kernel master.kernel.org:/pub/linux/kernel"

# Takes destination directory, and filename, tries each mirror.
get_file()
{
    get_file_dir=$1
    get_file_name=$2

    # Patch there already?
    if [ -f "$get_file_dir"/"$(basename "$get_file_name")" ]; then
	echo " Already have patch..."
	return 0
    fi

    for get_file_server in $MIRRORS; do
	echo Trying $get_file_server...
	case $get_file_server in
	rsync://*) get_file_s=`echo $get_file_server | cut -c9-`;
		  rsync $get_file_s/$get_file_name $get_file_dir && return 0
		  ;;
	http://*) get_file_s=`echo $get_file_server | cut -c8-`;
		wget -O $get_file_dir/`basename $get_file_name` $get_file_s/$get_file_name && return 0
		# Leaves a zero-len file on failure 8(
		rm -f $get_file_dir/`basename $get_file_name`
		;;
	esac
    done
    return 1
}

if [ $# -ne 2 ]; then
    echo Usage: $0 version kerneldir >&2
    exit 1
fi

VERSION=$1
KDIR=$2

if [ -d $KDIR/linux-$VERSION ]; then exit 0; fi
MAJOR=`echo $VERSION | cut -d. -f1-2`

# Given vanity kernel name, major version, and previous version, produce pathname
vanity_source()
{
    case "$1" in
    *-ac*)
	echo people/alan/linux-$2/$3/patch-$1.bz2;;
    *-dj*)
	echo people/davej/patches/$2/$3/patch-$1.bz2;;
    *-mm*)
	echo people/akpm/patches/$2/$3/$1/$1.bz2;;
    *)
	barf "Unknown kernel series $1";;
    esac
}

# Given base name, new name and patch, do patch application.
apply_patch()
{
    rm -rf $KDIR/.linux-$2
    cp -al $KDIR/linux-$1 $KDIR/.linux-$2 ||
	    barf "Couldn't clone $1 dir"
    bunzip2 -t $3 || barf "Corrupt patch $3"
    bzcat $3 | patch -s -d $KDIR/.linux-$2 -p1 ||
	    barf "Problem patching new kernel $2"
    mv $KDIR/.linux-$2 $KDIR/linux-$2
}

echo Grabbing $VERSION
case "$VERSION" in
    # Bitkeeper snapshot
    *-bk*)
	if [ -d $KDIR/linux-$VERSION ]; then exit 0; fi

	PREVIOUS=`echo "$VERSION" | sed 's/-bk.*//'`
	$0 "$PREVIOUS" $KDIR || barf "Couldn't get $PREVIOUS to build $VERSION"

	# Grab patch
	get_file $PATCHDIR v$MAJOR/snapshots/patch-$VERSION.bz2  || barf "Couldn't get v$MAJOR/snapshots/patch-$VERSION.bz2"
	apply_patch $PREVIOUS $VERSION $PATCHDIR/patch-$VERSION.bz2
	;;

    # Various vanity patches
    *-mm[0-9]*|*-ac[0-9]*|*-dj[0-9]*)
	# First make sure we have base tree
	BASE_KERNEL=`echo "$VERSION" | sed -e 's/-[a-z][a-z][0-9]*$//'`
	$0 "$BASE_KERNEL" $KDIR	||
	    barf "Couldn't get $BASE_KERNEL to build $VERSION"
	VANITY=`vanity_source $VERSION $MAJOR $BASE_KERNEL`
	get_file $PATCHDIR $VANITY ||
		barf "Couldn't fetch $VANITY"

	apply_patch $BASE_KERNEL $VERSION $PATCHDIR/`basename $VANITY`
	;;

    # *-pre*: This refers to the Linus or Marcelo pre-patches.
    *-pre*|*-rc*)
	# Linus or Marcelo pre-patch.
	if [ -d $KDIR/linux-$VERSION ]; then exit 0; fi

	PREVIOUS=`echo "$VERSION" | sed 's/-\(pre\|rc\).*//'`
	LAST_VER=`echo "$PREVIOUS" | cut -d. -f3`
	PREVIOUS=`echo "$PREVIOUS" | cut -d. -f1,2`.`expr $LAST_VER - 1 || true`
	$0 "$PREVIOUS" $KDIR || barf "Couldn't get $PREVIOUS to build $VERSION"

	# Grab patch
	get_file $PATCHDIR v$MAJOR/testing/patch-$VERSION.bz2 ||
	    get_file $PATCHDIR v$MAJOR/testing/old/patch-$VERSION.bz2 ||
	    barf "Couldn't get v$MAJOR/testing/patch-$VERSION.bz2"
	apply_patch $PREVIOUS $VERSION $PATCHDIR/patch-$VERSION.bz2
	;;

    # Linus 2.6.0 test patch.
    2.6.0-test*)
	VER=`echo "$VERSION" | sed 's/.*test//'`
	PREVIOUS=2.6.0-test`expr $VER - 1 || true`

	if [ $PREVIOUS = 2.6.0-test0 ]; then
	    PREVIOUS=2.5.75
	fi

	$0 "$PREVIOUS" $KDIR || barf "Couldn't get $PREVIOUS to build $VERSION"

	# Grab patch
	get_file $PATCHDIR v$MAJOR/patch-$VERSION.bz2 ||
	    get_file $PATCHDIR v$MAJOR/old/patch-$VERSION.bz2 ||
	    barf "Couldn't get v$MAJOR/patch-$VERSION.bz2"
	apply_patch $PREVIOUS $VERSION $PATCHDIR/patch-$VERSION.bz2
	;;

    2.6.0)
	PREVIOUS=2.6.0-test11

	$0 "$PREVIOUS" $KDIR || barf "Couldn't get $PREVIOUS to build $VERSION"

	# Grab patch
	get_file $PATCHDIR v$MAJOR/patch-$VERSION.bz2 ||
	    get_file $PATCHDIR v$MAJOR/old/patch-$VERSION.bz2 ||
	    barf "Couldn't get v$MAJOR/patch-$VERSION.bz2"
	apply_patch $PREVIOUS $VERSION $PATCHDIR/patch-$VERSION.bz2
	;;

    # *.0: This refers to the base of the Linus kernels, fetched whole.
    *.0)
	# Linus' root of all trees.
	get_file $PATCHDIR v$MAJOR/linux-$VERSION.tar.bz2 || barf "Couldn't get  v$MAJOR/linux-$VERSION.tar.bz2"
	bzcat $PATCHDIR/linux-$VERSION.tar.bz2 | (cd $KDIR && tar xf -) ||
	    barf "Problem unpacking linux-$VERSION.tar.bz2"
	mv $KDIR/linux $KDIR/linux-$VERSION
	;;

    #   [1-9].*.*: This refers to the any other Linus kernel.
    [1-9].*.*[0-9])
	# Linus standard ?
	if [ -d $KDIR/linux-$VERSION ]; then exit 0; fi

	LAST_VER=`echo "$VERSION" | cut -d. -f3`
	PREVIOUS=`echo "$VERSION" | cut -d. -f1,2`.`expr $LAST_VER - 1 || true`
	$0 "$PREVIOUS" $KDIR || barf "Couldn't get $PREVIOUS to build $VERSION"

	# Grab patch
	get_file $PATCHDIR v$MAJOR/patch-$VERSION.bz2 || barf "Couldn't get v$MAJOR/patch-$VERSION.bz2"
	trap "rm -rf $KDIR/.linux-$VERSION" 0
	apply_patch $PREVIOUS $VERSION $PATCHDIR/patch-$VERSION.bz2
	;;
    *)
	barf "Unknown kernel version $VERSION"
	;;
esac

  parent reply	other threads:[~2004-03-04  1:41 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-03-03  2:24 [ANNOUNCE] kpatchup 0.02 kernel patching script Matt Mackall
2004-03-03  5:51 ` Zwane Mwaikambo
2004-03-04  1:40 ` Rusty Russell [this message]
2004-03-04 17:22 ` Dave Hansen
2004-03-04 18:35   ` Matt Mackall
2004-03-04 18:50     ` Dave Hansen
2004-03-04 19:09       ` Matt Mackall
2004-03-04 19:14         ` Dave Hansen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1078364436.849.0.camel@bach \
    --to=rusty@rustcorp.com.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mpm@selenic.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.