Michal Marek d816a0
#!/bin/bash
Michal Marek 888e15
#
Michal Marek 888e15
# Building kernels with osc made easy
Michal Marek 888e15
Michal Marek 888e15
die()
Michal Marek 888e15
{
cea072
	echo -e "$@" >&2
Michal Marek 888e15
	exit 1
Michal Marek 888e15
}
Michal Marek 888e15
Michal Marek 888e15
usage()
Michal Marek 888e15
{
Michal Marek d816a0
	die \
Joao 113491
"Usage: $0 [build] [--ibs | --obs] [--enable-debug | --debug | --disable-debug] [--do-checks | --no-checks] [--ignore-kabi] [--klp-symbols] [<osc_args>] [<specfile>]\n
Joao 113491
       $0 upload [ --ibs | --obs ] [--enable-debug | --debug | --disable-debug] [--do-checks | --no-checks] [--ignore-kabi] [--klp-symbols] project [<specfile> | directory]"
Michal Marek 888e15
}
Michal Marek 888e15
Michal Marek d816a0
osc()
Michal Marek d816a0
{
Michal Marek d816a0
	echo "osc" $API "$@"
Michal Marek d816a0
	command osc $API "$@"
Michal Marek d816a0
}
Michal Marek 888e15
Michal Marek d816a0
_osc()
Michal Marek d816a0
{
Michal Marek d816a0
	command osc $API "$@"
Michal Marek d816a0
}
Michal Marek 888e15
Michal Marek 888e15
try_spec()
Michal Marek 888e15
{
Michal Marek 888e15
	local spec=$1
Michal Marek 888e15
Michal Marek 888e15
	if test -e "$spec"; then
Michal Marek 888e15
		echo "$spec"
Michal Marek 888e15
		return 0
Michal Marek d816a0
	elif test -e "kernel-source$VARIANT/$spec"; then
Michal Marek d816a0
		echo "$_"
Michal Marek 888e15
		return 0
Michal Marek 888e15
	else
Michal Marek 888e15
		return 1
Michal Marek 888e15
	fi
Michal Marek 888e15
}
Michal Marek 888e15
Michal Marek 888e15
find_spec()
Michal Marek 888e15
{
Michal Marek 01f66c
	local spec machine=$(uname -m)
Michal Marek 888e15
Michal Marek 01f66c
	case "$machine" in
Michal Marek 01f66c
	i?86 | x86_64)
Michal Marek 01f66c
		if try_spec kernel-smp.spec; then
Michal Marek 01f66c
			return 0
Michal Marek 01f66c
		fi
Michal Marek 01f66c
	esac
Michal Marek 01f66c
	case "$machine" in
Michal Marek 888e15
	i?86)
Michal Marek 888e15
		if try_spec kernel-pae.spec; then
Michal Marek 888e15
			return 0
Michal Marek 888e15
		fi
Michal Marek 888e15
	esac
Michal Marek 888e15
	if try_spec kernel-default.spec; then
Michal Marek 888e15
		return 0
Michal Marek 888e15
	fi
Michal Marek c152f9
	if test -n "$VARIANT" && try_spec "kernel$VARIANT.spec"; then
Michal Marek c152f9
		return 0
Michal Marek c152f9
	fi
Michal Marek 631feb
	if test -n "$VANILLA_ONLY"; then
Michal Marek 631feb
		if try_spec kernel-vanilla.spec; then
Michal Marek 631feb
			return 0
Michal Marek 631feb
		fi
Michal Marek 631feb
	fi
Michal Marek 888e15
	echo "Unable to find a specfile to build" >&2
Michal Marek 888e15
	return 1
Michal Marek 888e15
}
Michal Marek 888e15
Michal Marek 7689b0
check_dir_commit()
Michal Marek 7689b0
{
Michal Marek 7689b0
	local dir=$1 git_commit dir_commit
Michal Marek 7689b0
Michal Marek ab3a92
	git_commit=$(git rev-parse HEAD 2>/dev/null) || return
Michal Marek 7689b0
	dir_commit=$(sed -n 's/GIT Revision: //p' "$dir"/*source-timestamp)
Michal Marek 7689b0
	if test "$git_commit" != "$dir_commit"; then
Michal Marek 7689b0
		echo "$dir (${dir_commit:0:7}) does not match your current HEAD (${git_commit:0:7})" >&2
Michal Marek 7689b0
		echo "Maybe you forgot to run scripts/tar-up.sh?" >&2
Michal Marek 7689b0
	fi
Michal Marek 7689b0
}
Michal Marek 7689b0
Michal Marek cd070b
get_branch()
Michal Marek d816a0
{
Tony Jones 14421c
	local res version sp githead
Tony Jones 14421c
Tony Jones 14421c
	githead=$(git rev-parse --git-dir)/HEAD
Tony Jones 14421c
Tony Jones 14421c
	if ! test -r "$githead"; then
Tony Jones 14421c
		echo "Warning: Could not find a git HEAD" >&2
Tony Jones 14421c
		exit
Tony Jones 14421c
	fi
Michal Marek d816a0
Michal Marek cd070b
	# First, try the local branch name
Tony Jones 14421c
	res=$(sed -ne 'y|/|:|; s|^ref: refs:heads:||p' $githead 2>/dev/null)
Michal Marek cd070b
	if test -n "$res"; then
Michal Marek cd070b
		if project_exists "$kotd_namespace:$res"; then
Michal Marek cd070b
			echo "$res"
Michal Marek cd070b
			return
Michal Marek cd070b
		fi
Michal Marek cd070b
		echo "Warning: $kotd_namespace:$res not found at $WEBCLIENT, trying harder" >&2
Michal Marek cd070b
		res=
Michal Marek cd070b
	else
Michal Marek cd070b
		echo "Warning: Could not determine your git branch" >&2
Michal Marek cd070b
	fi
Michal Marek cd070b
	# For SLE branches, try IBS_PROJECT
Michal Marek cd070b
	case "$IBS_PROJECT" in
Michal Marek cd070b
	SUSE:SLE-*)
Michal Marek cd070b
		# SUSE:SLE-10-SP4:Update -> 10-SP4:Update
Michal Marek cd070b
		version=${IBS_PROJECT#SUSE:SLE-}
Michal Marek cd070b
		# 10-SP4:Update -> 4:Update
Michal Marek cd070b
		sp=${version#*-SP}
Michal Marek cd070b
		if test "$sp" != "$version"; then
Michal Marek cd070b
			# 4:Update -> 4
Michal Marek cd070b
			sp=${sp%%:*}
Michal Marek cd070b
		else
Michal Marek cd070b
			sp=
Michal Marek cd070b
		fi
Michal Marek cd070b
		# 10-SP4:Update -> 10
Michal Marek 8b2112
		# 12:GA -> 12
Michal Marek 8b2112
		version=${version%%[-:]*}
Michal Marek cd070b
		if test "$version" -ge 11; then
Michal Marek cd070b
			res="SLE$version"
Michal Marek cd070b
		else
Michal Marek cd070b
			res="SLES$version"
Michal Marek cd070b
		fi
Michal Marek cd070b
		if test -n "$sp"; then
Michal Marek cd070b
			res="$res-SP$sp"
Michal Marek cd070b
		fi
Michal Marek cd070b
		if project_exists "$kotd_namespace:$res"; then
Michal Marek cd070b
			echo "$res"
Michal Marek cd070b
			return
Michal Marek cd070b
		fi
Michal Marek cd070b
		echo "Branch $kotd_namespace:$res not found at $WEBCLIENT" >&2
Michal Marek cd070b
		exit 1
Michal Marek cd070b
	esac
Michal Marek cd070b
	case "$OBS_PROJECT" in
Michal Marek cd070b
	openSUSE:Factory*)
Michal Marek cd070b
		if $internal; then
Michal Marek cd070b
			res=master
Michal Marek cd070b
		else
Michal Marek cd070b
			res=HEAD
Michal Marek cd070b
		fi
Michal Marek cd070b
		;;
Michal Marek cd070b
	openSUSE:*)
Michal Marek cd070b
		version=${OBS_PROJECT#openSUSE:}
Michal Marek cd070b
		version=${version%%:*}
Michal Marek cd070b
		res="openSUSE-$version"
Michal Marek cd070b
		;;
Michal Marek cd070b
	esac
Michal Marek cd070b
	if test -n "$res"; then
Michal Marek cd070b
		if project_exists "$kotd_namespace:$res"; then
Michal Marek cd070b
			echo "$res"
Michal Marek cd070b
			return
Michal Marek cd070b
		fi
Michal Marek cd070b
		echo "Branch $kotd_namespace:$res not found at $WEBCLIENT" >&2
Michal Marek cd070b
	else
Michal Marek cd070b
		echo "Could not determine the official name of this branch" >&2
Michal Marek d816a0
	fi
Michal Marek cd070b
	exit 1
Michal Marek d816a0
}
Michal Marek 888e15
Michal Marek cd070b
setup_api()
Michal Marek d816a0
{
Michal Marek cd070b
	local wanted=$1 internal=false kotd_namespace branch
Michal Marek d816a0
Michal Marek cd070b
	if test "$wanted" = "--ibs"; then
Michal Marek cd070b
		internal=true
Michal Marek cd070b
	elif test -z "$wanted"; then
Michal Marek cd070b
		if test -z "$OBS_PROJECT"; then
Michal Marek cd070b
			echo "Using the IBS"
Michal Marek cd070b
			internal=true
Michal Marek cd070b
		fi
Michal Marek cd070b
	fi
Michal Marek cd070b
	if $internal; then
Michal Marek cd070b
		API="-A https://api.suse.de"
Michal Marek cd070b
		WEBCLIENT="https://build.suse.de"
Michal Marek cd070b
		kotd_namespace="Devel:Kernel"
Michal Marek cd070b
	else
Michal Marek cd070b
		API="-A https://api.opensuse.org"
Michal Marek cd070b
		WEBCLIENT="https://build.opensuse.org"
Michal Marek cd070b
		kotd_namespace="Kernel"
Michal Marek cd070b
	fi
Michal Marek a96f6d
	if ! osc $API api /about >/dev/null 
Michal Marek a96f6d
		echo "osc is not configured, run \`osc $API ls' first" >&2
Michal Marek a96f6d
		exit 1
Michal Marek a96f6d
	fi
Michal Marek d0307b
	branch=$(get_branch)
Michal Marek d0307b
	if test -n "$branch"; then
Michal Marek d0307b
		# We try to build against Kernel:foo in case the kernel build
Michal Marek d0307b
		# requires some extra packages not yet available in the 
Michal Marek d0307b
		# official project
Michal Marek d0307b
		PROJECT="$kotd_namespace:$branch"
Michal Marek d0307b
	else
Michal Marek d0307b
		# ... but we fall back to openSUSE:X.Y or SUSE:SLE-XY
Michal Marek d0307b
		if $internal; then
Michal Marek d0307b
			PROJECT=$IBS_PROJECT
Michal Marek d0307b
		else
Michal Marek d0307b
			PROJECT=$OBS_PROJECT
Michal Marek d0307b
		fi
Michal Marek d0307b
		echo "Building against $PROJECT directly as a fallback"
Michal Marek d0307b
	fi
Michal Marek d816a0
}
Michal Marek d816a0
Michal Marek d816a0
project_exists()
Michal Marek d816a0
{
Michal Marek d816a0
	local project=$1
Michal Marek d816a0
Michal Marek 3572b0
	_osc meta prj "$project" &>/dev/null
Michal Marek d816a0
}
Michal Marek d816a0
Michal Marek d816a0
Michal Marek d816a0
#### build ####
Michal Marek d816a0
Michal Marek d816a0
do_build()
Michal Marek d816a0
{
Joao 113491
	local osc_args=() debuginfo=false checks=false kabi=true klps=false api
Michal Marek ef7318
Michal Marek ef7318
	while test $# -gt 0; do
Michal Marek ef7318
		case "$1" in
Michal Marek ebc995
		--enable-debug* | --debug*)
Michal Marek 4afd3a
			debuginfo=true
Michal Marek 4afd3a
			shift
Michal Marek 4afd3a
			;;
Michal Marek 4afd3a
		--disable-debug*)
Michal Marek 4afd3a
			debuginfo=false
Michal Marek 4afd3a
			shift
Michal Marek 4afd3a
			;;
Michal Marek e97f1b
		--do-checks)
Michal Marek e97f1b
			checks=true
Michal Marek e97f1b
			shift
Michal Marek e97f1b
			;;
Michal Marek e97f1b
		--no-checks | --nochecks)
Michal Marek e97f1b
			checks=false
Michal Marek e97f1b
			shift
Michal Marek e97f1b
			;;
Michal Marek cd070b
		--ibs | --obs)
Michal Marek cd070b
			api=$1
Michal Marek cd070b
			shift
Michal Marek cd070b
			;;
Michal Marek 2d635d
		--ignore-kabi)
Michal Marek 2d635d
			kabi=false
Michal Marek 2d635d
			shift
Michal Marek 2d635d
			;;
Joao 113491
		--klp-symbols)
Joao 113491
			klps=true
Joao 113491
			shift
Joao 113491
			;;
Michal Marek 270fc6
		*.spec)
Marcos Paulo de Souza 86d0aa
			spec=$1
Michal Marek ef7318
			shift
Michal Marek ef7318
			;;
Michal Marek ef7318
		*)
Michal Marek 270fc6
			osc_args=("${osc_args[@]}" "$1")
Michal Marek ef7318
			shift
Michal Marek 270fc6
			;;
Michal Marek ef7318
		esac
Michal Marek ef7318
	done
Michal Marek ef7318
	if test -z "$spec"; then
Michal Marek d816a0
		spec=$(find_spec) || usage
Michal Marek d816a0
	fi
Michal Marek 7689b0
	check_dir_commit "$(dirname "$spec")"
Michal Marek ebc995
	if $debuginfo; then
Michal Marek ebc995
		osc_args=("${osc_args[@]}" --debuginfo)
Michal Marek ebc995
	else
Michal Marek 4afd3a
		osc_args=("${osc_args[@]}" --disable-debuginfo)
Michal Marek 4afd3a
	fi
Michal Marek e97f1b
	if ! $checks; then
Joao 113491
		osc_args=("${osc_args[@]}" --no-checks
Michal Marek e97f1b
		--extra-pkgs=-brp-check-suse --extra-pkgs=-post-build-checks)
Michal Marek e97f1b
	fi
Michal Marek 2d635d
	if $kabi; then
Michal Suchanek e08c40
		osc_args=("${osc_args[@]}" --define 'ignore_kabi_badness 0')
Michal Marek 2d635d
	fi
Joao 113491
	if ! $klps; then
Michal Suchanek 01f623
		osc_args=("${osc_args[@]}" --define 'klp_symbols 1')
Joao 113491
	fi
Michal Marek d816a0
Michal Marek d816a0
	arch=$(uname -m | sed 's/^i.86$/i586/')
Michal Marek cd070b
	setup_api $api
Michal Marek d816a0
Michal Marek 9fea72
	rm -rf "$(dirname "$spec")/.osc"
Jiri Slaby 58db0d
	osc build --no-service --local-package \
Jiri Slaby 58db0d
		--alternative-project="$PROJECT" \
Michal Marek c44ee3
		"${osc_args[@]}" standard "$spec"
Michal Marek d816a0
}
Michal Marek d816a0
Michal Marek d816a0
### upload ###
Michal Marek d816a0
Michal Marek d816a0
do_upload()
Michal Marek d816a0
{
Michal Marek f096ba
	local api home_project flavor  debuginfo="" checks="" args=()
Michal Marek b54a24
Michal Marek 28acce
	api="https://api.opensuse.org"
ac1729
ac1729
	while test $# -gt 0
ac1729
	do
ac1729
	    case $1 in
ac1729
		--ibs) api="https://api.suse.de"; shift ;;
ac1729
		--obs) api="https://api.opensuse.org"; shift ;;
ac1729
		--enable-debug|--debug) debuginfo="--debuginfo"; shift ;;
ac1729
		--disable-debug) debuginfo=""; shift ;;
ac1729
		--do-checks) checks="--enable-checks"; shift ;;
ac1729
		--no-checks) checks=""; shift ;;
Michal Marek f096ba
		-*) args=("${args[@]}" "$1"); shift ;;
ac1729
		*)  break ;;
ac1729
	    esac
ac1729
	done
Michal Marek f096ba
	args=(-A "$api" "${args[@]}" $debuginfo $checks)
Michal Marek d816a0
	case $# in
Michal Marek d816a0
	1)
Michal Marek d816a0
		home_project=$1
Michal Marek 8a8cfc
		spec=$(try_spec kernel-source$VARIANT.spec)
Michal Marek d816a0
		if test -z "$spec"; then
Michal Marek 8a8cfc
			die "Can't find kernel-source$VARIANT directory"
Michal Marek d816a0
		fi
Michal Marek d816a0
		dir=$(dirname "$spec")
Michal Marek d816a0
		;;
Michal Marek d816a0
	2)
Michal Marek d816a0
		home_project=$1
Michal Marek f87504
		case "$2" in
Michal Marek f87504
		*.spec)
Michal Marek f87504
			flavor=${2##*/kernel-}
Michal Marek f096ba
			args=("${args[@]}" --flavor ${flavor%.spec})
Michal Marek f87504
			dir=${2%/*}
Michal Marek f87504
			;;
Michal Marek f87504
		*)
Michal Marek f87504
			dir=$2
Michal Marek f87504
		esac
Michal Marek d816a0
		;;
Michal Marek d816a0
	*)
Michal Marek d816a0
		usage
Michal Marek d816a0
	esac
Michal Marek 7689b0
	check_dir_commit "$dir"
Michal Marek 888e15
Michal Marek f096ba
	cmd=("$(dirname "$0")/bs-upload-kernel" "${args[@]}" "$dir" "$home_project")
Michal Marek 42552d
	if test "$(basename "$dir")" != "kernel-source$VARIANT"; then
Michal Marek 42552d
		cmd=("${cmd[@]}" "kernel-source$VARIANT")
Michal Marek 42552d
	fi
Michal Marek b54a24
	echo "${cmd[@]}"
Michal Marek b54a24
	"${cmd[@]}" || exit
Michal Marek d816a0
Michal Marek d816a0
	echo "Done. You can watch the build progress at"
Michal Marek 6e11e1
	echo "  ${api/api./build.}/project/monitor?project=${home_project//[:\/]/%3A}"
Michal Marek d816a0
}
Michal Marek d816a0
Michal Marek f2b0dc
command=
Michal Marek f2b0dc
spec=
Michal Marek 58874c
topdir=$(dirname "$0")/..
Michal Marek d816a0
Michal Marek 30f26f
# change 'osc_wrapper --ibs upload' to 'osc_wrapper upload --ibs'
Michal Marek 30f26f
case "$1" in
Michal Marek 30f26f
--ibs| --obs)
Michal Marek 30f26f
	api=$1
Michal Marek 30f26f
	cmd=$2
Michal Suchanek 511c39
	if [ -n "$cmd" ] ; then
Michal Suchanek 511c39
		shift 2
Michal Suchanek 511c39
		set -- "$cmd" "$api" "$@"
Michal Suchanek 511c39
	fi
Michal Marek 30f26f
esac
Michal Marek 30f26f
Michal Marek d816a0
case "$1" in
Michal Marek d816a0
build | upload)
Michal Marek d816a0
	command=$1
Michal Marek d816a0
	shift
Michal Marek d816a0
	;;
Michal Marek 135ce6
-h|--help) usage ;;
Michal Marek d816a0
-* | "" | *.spec)
Michal Marek d816a0
	# "build" is the default
Michal Marek d816a0
	command=build
Michal Marek d816a0
	;;
Michal Marek d816a0
*)
Michal Marek d816a0
	usage
Michal Marek d816a0
esac
Michal Marek d816a0
Michal Marek 58874c
source "$topdir/rpm/config.sh"
Michal Marek d816a0
do_$command "$@"