kernel_versions.version_encode mis-sorts _rcNN suffix in redhat-style kernel names.
Plus 4 other bugs in this function.
Risk: low, affects only presentation order in graphs.

Also added functions  is_released_kernel()  and  is_release_candidate() .

Tested by new unittest for this module, and by visual review of output of perf_graphs.cgi, and by visual review of manual dump of version_encode results for all kernel names now in our main Autotest tko database.

Signed-off-by: Duane Sand <duanes@google.com>




git-svn-id: http://test.kernel.org/svn/autotest/trunk@1621 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/client/bin/kernel_versions.py b/client/bin/kernel_versions.py
index 5b87789..3af08fe 100644
--- a/client/bin/kernel_versions.py
+++ b/client/bin/kernel_versions.py
@@ -18,14 +18,25 @@
 # 
 #   02.06.00-rc99 -> 02.06.01-rc01 -> 02.06.01-rc99
 # 
-encode_sep = re.compile('(\D+)')
+encode_sep = re.compile(r'(\D+)')
+
 def version_encode(version):
 	bits = encode_sep.split(version)
-	if len(bits) < 6 or bits[5] != '-rc':
-		bits.insert(5, '99')
-		bits.insert(5, '-rc')
+	n = 9
+	if len(bits[0]) == 0:
+		n += 2
+	if len(bits) == n or (len(bits) > n and bits[n] != '_rc'):
+		# Insert missing _rc99 after 2 . 6 . 18 -smp- 220 . 0 
+		bits.insert(n, '_rc')
+		bits.insert(n+1, '99')
+	n = 5
+	if len(bits[0]) == 0:
+		n += 2
+	if len(bits) <= n or bits[n] != '-rc':
+		bits.insert(n, '-rc')
+		bits.insert(n+1, '99')
 	for n in range(0, len(bits), 2):
-		if len(bits[n]) < 2:
+		if len(bits[n]) == 1:
 			bits[n] = '0' + bits[n]
 
 	return ''.join(bits)
@@ -84,3 +95,21 @@
 		version = version_limit(version, length)
 
 	return None
+
+
+def is_released_kernel(version):
+	# True if version name suggests a released kernel,  
+	#   not some release candidate or experimental kernel name
+	#   e.g.  2.6.18-smp-200.0  includes no other text, underscores, etc
+	version = version.strip('01234567890.-')
+	return version in ['', 'smp', 'smpx', 'pae']
+
+
+def is_release_candidate(version):
+	# True if version names a released kernel or release candidate,
+	#   not some experimental name containing arbitrary text
+	#   e.g.  2.6.18-smp-220.0_rc3  but not  2.6.18_patched
+	version = re.sub(r'[_-]rc\d+', '', version)
+	return is_released_kernel(version)
+
+