#!/bin/bash

TOP="$(readlink -ev .)"

. shell-error
. gear-sh-functions

print_version()
{
	cat <<EOF
$PROG version $PROG_VERSION

Copyright (C) 2009 Anton Protopopov <aspsk@altlinux.org>
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
EOF
	exit
}

show_help()
{
	cat <<EOF
$PROG - update kernel-modules-* packages

Usage: $PROG [options] [-k <flavour>...] [<module>...]

Options:
  -d, --distribution=NAME     distribution branch name (alt-linux-X.Y);
  -k, --kernel=FLAVOUR[=V-R]  kernel flavour and version-release;
  -o, --old-version           do not obtain version from repo;
  -V, --version               print program version and exit;
  -h, --help                  show this text and exit.

EOF
	exit
}

TEMP=`getopt -n "$PROG" -o d:,k:,o,V,h -l distribution:,kernel:,old-version,version,help -- "$@"` ||
	show_help
eval set -- "$TEMP"

opt_kernels=
opt_old_version=
opt_distribution=sisyphus
while true; do
	case "$1" in
		--)
			shift; break
			;;
		-d|--distribution)
			shift; opt_distribution="$1"
			;;
		-k|--kernel)
			shift; opt_kernels="$opt_kernels $1"
			;;
		-o|--old-version)
			opt_old_version=yes
			;;
		-V|--version)
			print_version
			;;
		-h|--help)
			show_help
			;;
		*) fatal "Unrecognized option: $1"
			;;
	esac
	shift
done

# obtain a list of flavours if it isn't given
if [ -z "$opt_kernels" ]; then
	opt_kernels="$(egrep -v '^($|#)' kernel/subflavours | tr '\n' '\ ')" ||
	fatal "can't determine a set of flavours"
fi

# generate a list of '-k <flavour>=<version>-<release>' values
kernels=
for flavour in $opt_kernels; do
	if [ -z "${flavour##*=*}" ]; then
		[ -n "${flavour##*=*=*}" ] ||
			fatal "Invalid kernel flavour \"$flavour\""
		[ -z "${flavour##*=*-*}" ] ||
			fatal "Invalid kernel version-release in \"$flavour\""
		kernels="$kernels -k $flavour"
		continue
	fi

	if [ -z "$opt_old_version" ]; then
		branch_spec=
		if [ "${opt_distribution}" != "${opt_distribution##alt-linux-}" ]; then
			branch_spec=".M${opt_distribution##alt-linux-}"
			branch_spec=".${branch_spec//./}"
		fi
		specfile="$(GIT_DIR=kernel/.git git ls-tree "kernel-image-$flavour$branch_spec" |
			sed -ne 's/^[^[:space:]]\+[[:space:]]\+blob[[:space:]]\+[^[:space:]]\+[[:space:]]\+\([^/[:space:]]\+\.spec\)$/\1/p')"
		[ `printf %s "$specfile" | wc -l` -le 0 ] ||
			fatal "too many specfiles found"
		[ -n "$specfile" ] ||
			fatal "no specfiles found"

		GIT_DIR=kernel/.git git cat-file blob "kernel-image-$flavour$branch_spec:$specfile" >"$TOP/tmp/specfile" ||
			fatal "can't copy specfile"

		get_NVR_from_spec "$TOP/tmp/specfile"
		kernel_version="$spec_version"
		kernel_release="$spec_release"

		kernels="$kernels -k $flavour=$kernel_version-$kernel_release"
	else
		kernels="$kernels -k $flavour"
	fi
done

buildmodules --rpmbuild --commit --tag --no-build -d "${opt_distribution}" $kernels $*
