summaryrefslogtreecommitdiff
path: root/update-kernel
diff options
context:
space:
mode:
Diffstat (limited to 'update-kernel')
-rwxr-xr-xupdate-kernel120
1 files changed, 120 insertions, 0 deletions
diff --git a/update-kernel b/update-kernel
new file mode 100755
index 0000000..a57d04e
--- /dev/null
+++ b/update-kernel
@@ -0,0 +1,120 @@
+#!/bin/sh -euf
+
+script=update-kernel
+set -euf
+
+# -----------------------------------------------------
+# BASIC STUFF
+
+is_yes()
+{
+ case ${1-} in
+ [Yy][Ee][Ss]|[Yy]|[Tt][Rr][Uu][Ee])
+ return 0
+ ;;
+ *)
+ return 1
+ ;;
+ esac
+}
+
+empty()
+{
+ case ${@:+1} in
+ '')
+ return 0
+ ;;
+ *)
+ return 1
+ ;;
+ esac
+}
+
+warn()
+{
+ echo "$script: $@" >&2
+}
+
+fail()
+{
+ echo "$script: $@" >&2
+ exit 1
+}
+
+# ------------------------------------------------------------
+# Main action
+
+usage()
+{
+ echo "usage: $script [-v] [-s server] [-B branch]" >&2
+ exit 2
+}
+
+supfile=/usr/src/cvsupfile-sys
+server="cvsup2.FreeBSD.org"
+version=`uname -r | sed -En 's/^([.0-9]+).*/\1/p'`
+branch="RELENG_`echo $version | tr '.' '_'`"
+csup="csup -L0"
+patch="patch -s"
+
+while getopts "B:s:v" arg; do
+ case $arg in
+ B)
+ branch="$OPTARG"
+ ;;
+ s)
+ server="$OPTARG"
+ ;;
+ v)
+ patch="patch"
+ csup="csup -L2"
+ ;;
+ *)
+ usage
+ ;;
+ esac
+done
+
+shift `expr $OPTIND - 1`
+if [ $# -ne 0 ]; then
+ usage
+fi
+
+if empty $version; then
+ fail "couldn't determine OS version"
+fi
+
+if empty $branch; then
+ fail "couldn't determine cvsup branch"
+fi
+
+base=`dirname $0`
+base=`realpath $base`
+patchdir=$base/kernel-$version
+
+if [ ! -d $patchdir ]; then
+ fail "patches directory does not exist: $patchdir"
+fi
+
+cat > $supfile << EOF
+*default host=$server
+*default base=/usr
+*default prefix=/usr
+*default release=cvs
+*default tag=$branch
+*default delete use-rel-suffix
+
+src-sys
+EOF
+
+# Only allow up to 10 files to be deleted
+$csup -d 10 $supfile
+
+# Allow globbing from here on out
+set +f
+
+for file in $patchdir/*; do
+ if [ -f "$file" ]; then
+ $patch -d /usr/src -t -p0 < $file
+ fi
+done