#! /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