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