Home Home > GIT Browse
summaryrefslogtreecommitdiff
blob: 0848df2be786d87f97ce3873f44870f88f3a389a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#!/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"