Michal Marek f1ef36
#!/bin/bash
Michal Marek f1ef36
#
Michal Marek 0a417c
#############################################################################
Michal Marek 0a417c
# Copyright (c) 2009 Novell, Inc.
Michal Marek 0a417c
# All Rights Reserved.
Michal Marek 0a417c
#
Michal Marek 0a417c
# This program is free software; you can redistribute it and/or
Michal Marek 0a417c
# modify it under the terms of version 2 of the GNU General Public License as
Michal Marek 0a417c
# published by the Free Software Foundation.
Michal Marek 0a417c
#
Michal Marek 0a417c
# This program is distributed in the hope that it will be useful,
Michal Marek 0a417c
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Michal Marek 0a417c
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the
Michal Marek 0a417c
# GNU General Public License for more details.
Michal Marek 0a417c
#
Michal Marek 0a417c
# You should have received a copy of the GNU General Public License
Michal Marek 0a417c
# along with this program; if not, contact Novell, Inc.
Michal Marek 0a417c
#
Michal Marek 0a417c
# To contact Novell about this file by physical or electronic mail,
Michal Marek 0a417c
# you may find current contact information at www.novell.com
Michal Marek 0a417c
#############################################################################
Michal Marek 0a417c
#
Michal Marek f1ef36
# print the mainline / stable commit id this kernel is based on
Michal Marek f1ef36
Michal Marek f1ef36
usage()
Michal Marek f1ef36
{
Michal Marek f1ef36
	echo "Usage: $0 -g <mainline kernel git> [-v] [-f] version"
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek f1ef36
die()
Michal Marek f1ef36
{
Michal Marek f1ef36
	echo "$@" >&2
Michal Marek f1ef36
	exit 1
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek f1ef36
git()
Michal Marek f1ef36
{
Michal Marek f1ef36
	(cd "$git"; command git "$@")
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek f1ef36
rev_parse()
Michal Marek f1ef36
{
Michal Marek f1ef36
	git rev-parse --verify "$@"
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek f1ef36
git=
Michal Marek f1ef36
quiet=-q
Michal Marek f1ef36
force=false
Michal Marek f1ef36
options=$(getopt -n "$0" -o g:vfh --long git:,verbose,force,help -- "$@")
Michal Marek f1ef36
if test $? != 0; then
Michal Marek f1ef36
	usage >&2
Michal Marek f1ef36
	exit 1
Michal Marek f1ef36
fi
Michal Marek f1ef36
eval set -- "$options"
Michal Marek f1ef36
while test $# -gt 0; do
Michal Marek f1ef36
	case "$1" in
Michal Marek f1ef36
	-g | --git)
Michal Marek f1ef36
		git=$2
Michal Marek f1ef36
		shift 2
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	-v | --verbose)
Michal Marek f1ef36
		quiet=
Michal Marek f1ef36
		shift
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	-f | --force)
Michal Marek f1ef36
		force=true
Michal Marek f1ef36
		shift
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	--)
Michal Marek f1ef36
		shift
Michal Marek f1ef36
		break
Michal Marek f1ef36
		;;
Michal Marek f1ef36
	esac
Michal Marek f1ef36
done
Michal Marek f1ef36
if test -z "$git" -o $# -ne 1; then
Michal Marek f1ef36
	usage >&2
Michal Marek f1ef36
	exit 1
Michal Marek f1ef36
fi
Michal Marek f1ef36
base=$1
Michal Marek f1ef36
Michal Marek f1ef36
sanity_check()
Michal Marek f1ef36
{
Michal Marek 9ce091
	if ! $force && ! rev_parse 1da177e4c3^0 >/dev/null; then
Michal Marek f1ef36
		die "$git does not look like Linus' kernel repository"
Michal Marek f1ef36
	fi
Michal Marek 9ce091
}
Michal Marek 9ce091
Michal Marek 9ce091
# hardcoded list of a few -bk snapshots used in the suse kernels,
Michal Marek 9ce091
# generated by the bk-commit script
Michal Marek 9ce091
hardcoded_ids=(
Michal Marek 9ce091
	2.6.8-rc4-bk1   783707a1a3fd16d70938a53dd598f6dcd4a6acd2
Michal Marek 9ce091
	2.6.8-rc4-bk2   da58de4bc4757780df70c71195ced7f4611102ca
Michal Marek 9ce091
	2.6.10-rc3-bk10 9d53e4dd111c4bcb1f55961fce39823e340016f6
Michal Marek 9ce091
	2.6.10-rc3-bk14 0233f53fa39d43e2f923c3485502b0461cecc0d7
Michal Marek 9ce091
	2.6.11-rc1-bk8  f21ec4092851e6d7939d7c2a49ac94947840f789
Michal Marek 9ce091
	2.6.11-rc2-bk1  dea9f2aa018246b995d582b8670b362c9cdc69f4
Michal Marek 9ce091
	2.6.11-rc2-bk2  b82f54f7ca17c0ee66bbbc6216275727beef4645
Michal Marek 9ce091
	2.6.11-rc2-bk3  31d881c779c6b98a306c2b0b6063827fb4076102
Michal Marek 9ce091
	2.6.11-rc2-bk4  0bfe221f282f6050b0e999efa9840f67b4fc4d86
Michal Marek 9ce091
	2.6.11-rc2-bk5  c4eadeb71803d271a4b1c09f976824190e4f1f60
Michal Marek 9ce091
	2.6.11-rc2-bk6  c3dfb72cd40074699d7c0940bb0dab976d764952
Michal Marek 9ce091
	2.6.11-rc2-bk7  c923dd8bf3a6002c27ffc23bd11c5f9d86a779ca
Michal Marek 9ce091
	2.6.11-rc2-bk8  31ae6999d2d740b826610547a0fc72382c8c8985
Michal Marek 9ce091
	2.6.11-rc2-bk9  2db1b65b7049001d1451ab1d678da6136b6bbf1c
Michal Marek 9ce091
	2.6.11-rc2-bk10 b389f3821f284617ea17a11ca750d78d1e1cbfc5
Michal Marek 9ce091
	2.6.11-rc3-bk1  b8a743970378fc8e3206b1b4fcdbecc5f37732f5
Michal Marek 9ce091
	2.6.11-rc3-bk2  f69229f575d96cbd0ba28927b734e11fdfe3b51c
Michal Marek 9ce091
	2.6.11-rc3-bk3  1581782eada791b39ffb9de30b8e88b235d87af7
Michal Marek 9ce091
	2.6.11-rc3-bk4  72aa1a6208693f23aec38d8156f60323c2ef61d4
Michal Marek 9ce091
	2.6.11-rc3-bk5  26815161adef49875c03f19536c2c176d638c151
Michal Marek 9ce091
	2.6.11-rc3-bk6  3d23006057f7aaaf01b53305327d542a72626fe5
Michal Marek 9ce091
	2.6.11-rc3-bk7  f24ad951c5114bcfb587b4f348969c002215a2b4
Michal Marek 9ce091
	2.6.11-rc3-bk8  eeca3f3459cae2a1446b1a9b9b1a2c0805471b21
Michal Marek 9ce091
	2.6.11-rc3-bk9  d007c49cc9d6d0e8542320549e74bdd8bf82ccb4
Michal Marek 9ce091
	2.6.11-rc4-bk2  d14d4021344ded14661bf0507098ac14a6c78051
Michal Marek 9ce091
	2.6.11-rc4-bk3  547b39b5be57eee77e574ce55aef1ea3d9151e54
Michal Marek 9ce091
	2.6.11-rc4-bk4  5ff974d98118d600159788c9637d013df8361fa7
Michal Marek 9ce091
	2.6.11-rc4-bk5  9a7a579e7532dc9c8ca995c0bd247bd8f0c9f696
Michal Marek 9ce091
	2.6.11-rc4-bk6  28ad2df3a4f2471f8de501ec9e1eefca42b08f93
Michal Marek 9ce091
	2.6.11-rc4-bk7  175df1ee8b945ea85682f82112766c029327c9d8
Michal Marek 9ce091
	2.6.11-rc4-bk8  fca717c5fe8afad05b62bd84b1b88076e50df89d
Michal Marek 9ce091
	2.6.11-rc4-bk9  c0d51c67f9c398279a95c5a7df387f2d9a586c98
Michal Marek 9ce091
	2.6.11-rc4-bk10 21e99435aee5b96f9db89bc7b03be98ec3be4fbc
Michal Marek 9ce091
	2.6.11-rc4-bk11 9f459dee9e73e90a0a357e5bf53b4bc56282c1da
Michal Marek 9ce091
	2.6.11-rc5-bk1  6101e24910aee642d8bafe2c8dda3ef739353542
Michal Marek 9ce091
	2.6.11-rc5-bk2  8ad4c6043159b2c80e8a44d45cc134af31bb4b01
Michal Marek 9ce091
	2.6.11-rc5-bk3  54077d3c29a1afba9fe5a0c91f4a24d34083e764
Michal Marek 9ce091
	2.6.11-rc5-bk4  a847f56464f9737ddb11a7e41f63b142b237b776
Michal Marek f1ef36
Michal Marek 9ce091
	2.6.11          1274fcd685ec15f10261f48dc990367c2180d589
Michal Marek 9ce091
)
Michal Marek 9ce091
Michal Marek 9ce091
fetch_from()
Michal Marek 9ce091
{
Michal Marek 9ce091
	local url="git://git.kernel.org/pub/scm/linux/kernel/git/$1"
Michal Marek 9ce091
	local version=$2 refspec
Michal Marek 9ce091
	local name=${1%.git}
Michal Marek 9ce091
Michal Marek 9ce091
	name=${name##**/}
Michal Marek 9ce091
	case "$version" in
Michal Marek 9502a1
	*.* )
Michal Marek 9ce091
		version=v${version}
Michal Marek 9ce091
	esac
Michal Marek 9ce091
	base_id=$(rev_parse "$version^{commit}")
Michal Marek 9ce091
	if test -n "$base_id"; then
Michal Marek 9ce091
		return 0
Michal Marek f1ef36
	fi
Michal Marek 9ce091
	refspec=($(git ls-remote "$url" | \
Michal Marek 9502a1
		sed -rn -e 's@.*(refs/tags/v[1-9][^^]*)$@\1:\1@p' -e \
Michal Marek 9ce091
			"s@.*(refs/heads/master)\$@\\1:upstream/$name@p"))
Michal Marek 9ce091
	case "$version" in
Michal Marek 9502a1
	v*)
Michal Marek 9ce091
		if ! echo "${refspec[@]}" | grep -q "/$version:"; then
Michal Marek 9502a1
			# if we are looking for a v* tag and it is not there,
Michal Marek 9ce091
			# do not bother fetching anything
Michal Marek 9ce091
			return 1
Michal Marek 9ce091
		fi
Michal Marek 9ce091
	esac
Michal Marek 9ce091
	git fetch $quiet "$url" "${refspec[@]}"
Michal Marek 9ce091
	base_id=$(rev_parse "$version^{commit}")
Michal Marek 9ce091
	test -n "$base_id"
Michal Marek 9ce091
}
Michal Marek 9ce091
Michal Marek 9ce091
kernel_version()
Michal Marek 9ce091
{
Michal Marek 9ce091
	local version=$1 major minor micro
Michal Marek 9ce091
Michal Marek 2f8429
	version=${version%%[^0-9.]*}
Michal Marek 2f8429
	local IFS=.
Michal Marek 2f8429
	set -- $version
Michal Marek 2f8429
	major=$1
Michal Marek 2f8429
	minor=$2
Michal Marek 2f8429
	micro=$3
Michal Marek 2f8429
	expr "$major" '*' 65536 '+' "0$minor" '*' 256 + "0$micro"
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek f1ef36
get_base_id()
Michal Marek f1ef36
{
Michal Marek f1ef36
	local base=$1
Michal Marek f1ef36
Michal Marek f1ef36
	base_id=
Michal Marek 9ce091
	for ((i = 0; i < ${#hardcoded_ids[@]}; i += 2)); do
Michal Marek 9ce091
		if test "$base" = "${hardcoded_ids[i]}"; then
Michal Marek 9ce091
			base_id=${hardcoded_ids[i+1]}
Michal Marek 9ce091
			fetch_from "tglx/history.git" "$base_id"
Michal Marek 9ce091
			return
Michal Marek 9ce091
		fi
Michal Marek 9ce091
	done
Michal Marek 9ce091
	if test "$base" = "2.6.12git9"; then
Michal Marek 9ce091
		base=2.6.12-git9
Michal Marek 9ce091
	fi
Michal Marek f1ef36
	case "$base" in
Michal Marek f1ef36
	2.6.*-git*)
Michal Marek 9ce091
		local url="http://www.kernel.org/pub/linux/kernel/v2.6/snapshots"
Michal Marek f1ef36
		base_id=$(curl -f -s "$url/patch-$base.id")
Michal Marek f1ef36
		if test -z "$base_id"; then
Michal Marek f1ef36
			base_id=$(curl -f -s "$url/old/patch-$base.id")
Michal Marek f1ef36
		fi
Michal Marek 9ce091
		if test -n "$base_id"; then
Michal Marek 9ce091
			fetch_from "torvalds/linux-2.6.git" "$base_id"
Michal Marek 9ce091
			return
Michal Marek 9ce091
		fi
Michal Marek 9ce091
	esac
Michal Marek 9ce091
	if test $(kernel_version "$base") -le $(kernel_version 2.6.11); then
Michal Marek 9ce091
		fetch_from "tglx/history.git" "$base"
Michal Marek 9ce091
		if test -n "$base_id"; then
Michal Marek 9ce091
			return
Michal Marek f1ef36
		fi
Michal Marek 9ce091
	fi
Michal Marek 9502a1
	local is_stable=false
Michal Marek 9ce091
	case "$base" in
Michal Marek 384948
	[3-9].*.0-rc* | [1-9][0-9].*.0-rc*)
Michal Marek 04cbe4
		base=${base/.0-/-}
Michal Marek 384948
		;;
Michal Marek 384948
	[3-9].*.0 | [1-9][0-9].*.0)
Michal Marek 384948
		base=${base%.0}
Michal Marek 04cbe4
	esac
Michal Marek 04cbe4
	case "$base" in
Michal Marek 9ce091
	2.6.11.*)
Michal Marek 9ce091
		# The history tree has 2.6.11.y up to 2.6.11.5; but there 
Michal Marek 9ce091
		# is no tree for the rest and I don't plan to create any
Michal Marek 9ce091
		base_id=0
Michal Marek 9ce091
		;;
Michal Marek 9ce091
	2.6.*-rt*)
Michal Marek 9ce091
		fetch_from "tip/linux-2.6-tip.git"
Michal Marek f1ef36
		;;
Michal Marek 9502a1
	2.6.*.* | [3-9].*.* | [1-9][0-9].*.* )
Michal Marek 9502a1
		is_stable=true
Hannes Reinecke 72c492
		if ! fetch_from "stable/linux-stable.git" "$base"; then
Michal Marek 9ce091
			fetch_from "longterm/linux-${base%.*}.y.git" "$base"
Michal Marek f1ef36
		fi
Michal Marek f1ef36
		;;
Michal Marek 9502a1
	2.6.* | [3-9].* | [1-9][0-9].*)
Hannes Reinecke 72c492
		fetch_from "torvalds/linux.git" "$base"
Michal Marek f1ef36
		;;
Michal Marek 9ce091
	*)
Michal Marek 9ce091
		die "Unexpected kernel version $base"
Michal Marek f1ef36
	esac
Michal Marek 9ce091
	if test -z "$base_id"; then
Michal Marek 9ce091
		case "$base" in
Michal Marek 9ce091
		2.6.*-rt*)
Michal Marek 9ce091
			# not all rt releases are tagged in tip
Michal Marek 9ce091
			base_id=0
Michal Marek 9ce091
			;;
Michal Marek 9502a1
		*-rc* )
Michal Marek 9502a1
			if $is_stable; then
Michal Marek 9502a1
				# RCs for stable are typically not in git
Michal Marek 9502a1
				base_id=0
Michal Marek 9502a1
			fi
Michal Marek 9502a1
			;;
Michal Marek 9ce091
		esac
Michal Marek 9ce091
	fi
Michal Marek f1ef36
}
Michal Marek f1ef36
Michal Marek f1ef36
sanity_check >&2
Michal Marek f1ef36
get_base_id "$base" >&2
Michal Marek f1ef36
if test -z "$base_id"; then
Michal Marek f1ef36
	die "Cannot match $base to commit id"
Michal Marek f1ef36
fi
Michal Marek 9ce091
if test "$base_id" = 0; then
Michal Marek 9ce091
	echo "Warning: no id for $base" >&2
Michal Marek 9ce091
elif ! rev_parse "$base_id^{commit}" >/dev/null; then
Michal Marek 9ce091
	die "internal error: got bogus id $base_id for $base"
Michal Marek f1ef36
fi
Michal Marek f1ef36
echo "$base_id"
Michal Marek f1ef36