File make-symsets of Package kernel-default

#! /bin/bash

unset LANG ${!LC_*}

# Usage: make-symsets symsets.tar.gz [old-symsets.tar.gz]
#            < symvers.gz
#
# symsets.tar.gz
#   Create this symbol set tarball.
#
# old-symsets.tar.gz
#   Reuse all possible symbol sets from this tarball.

tarball=$1
old_tarball=$2

# Classify all the symbols by the directory they live in
unset ${!class_*}
while read class ignore line; do
    class=class_${class//[^a-zA-Z0-9_]/_}
    eval "$class[\${#$class[@]}]=\"$line\""
    if [ $ignore -gt 0 ]; then
	eval "ignore_$class=1"
    fi
done < <(
    awk '
    BEGIN { FS="\t" ; OFS="\t" }
    { class=$3
      sub(/\/[^/]+$/, "", class)
      ignore=sub(/.*=>/, "", $1)
      print class, ignore, $0
    }
    '
)

tmpdir=$(mktemp -t -d ${0##*/}.XXXXXX)
trap "rm -rf $tmpdir" EXIT

basename=$(basename ${tarball:-.} .tar.gz)

# Save all the new sets, computer and output their hashes
newdir=$tmpdir/new/$basename
mkdir -p $newdir
for class in ${!class_*} ; do
    class=${class#class_}
    eval "printf \"%s\\n\" \"\${class_$class[@]}\"" \
    | sort -k2 \
    > $newdir/tmp
    set -- $(md5sum $newdir/tmp) ; set -- ${1:0:16}
    mv $newdir/tmp $newdir/$class.$1
    #echo "Provides: kernel($class) = $1"
done

shopt -s nullglob

if [ -n "$old_tarball" ]; then
    # Reuse all sets of symbols from the old tarball that are
    # still the same.
    old_basename=$(basename $old_tarball .tar.gz)

    mkdir -p $tmpdir/old
    zcat $old_tarball \
    | tar xf - -C $tmpdir/old
    set -- $tmpdir/old/*
    olddir=$1
    if [ ! -d $olddir ]; then
	echo "$old_tarball does not contain directory $old_basename"
	exit 1
    fi

    for oldset in $olddir/* ; do
	[ -e $newdir/${oldset#$olddir/} ] && continue
	class=${oldset##*/} ; class=${class%.*}
	set -- $newdir/$class.*
	[ $# -eq 1 ] || continue
	newset=$1
	# '*' doesn't occur in either file.
	missing="$(join -t '*' -j 1 -v 1 <(sort "$oldset") <(sort "$newset"))"
	if [ -z "$missing" ]; then
	    keep_oldset[${#keep_oldset[@]}]=$oldset
	    #echo "Provides: kernel($class) = ${oldset##*.} (old)"
	else
	    set -- $(echo "$missing" | awk '{ print $2 "(" $1 ")" }')
	    ignore=ignore_class_$class
	    if [ -n "${!ignore}" ]; then
		ignore="; ignoring"
	    else
		ignore=
		status=1
	    fi
	    echo "No longer provided: kernel($class) = ${oldset##*.} (missing/changed: $@$ignore)" >&2
	fi
    done

    if [ ${#keep_oldset[@]} -gt 0 ]; then
	mv "${keep_oldset[@]}" $newdir/
    fi
else
    echo "No longer provided: previous kernel(...) symbols that may still be" \
	 "compatible" >&2
fi

# Store the generated sets in $tarball
tar cf - -C $tmpdir/new $basename \
| gzip -9 \
> $tarball \
|| exit 1

exit $status

# vim:shiftwidth=4 softtabstop=4
openSUSE Build Service is sponsored by