dev: Update devserver to handle new-style version numbers.

We recently switched from four-token versions like
"0.16.892.0" to three-token ones like "892.0.0".  Image
directories also have prefixes like "R16-" now.

BUG=chromium-os:21018
TEST=added unit tests; also manually tested it

Change-Id: Icc75ad1b4ef227ab6afe7c310c86ed0af6c5bc22
Reviewed-on: http://gerrit.chromium.org/gerrit/8557
Reviewed-by: Chris Sosa <sosa@chromium.org>
Tested-by: Daniel Erat <derat@chromium.org>
diff --git a/autoupdate.py b/autoupdate.py
index 5666ca3..719d9bf 100644
--- a/autoupdate.py
+++ b/autoupdate.py
@@ -111,20 +111,40 @@
   def _GetVersionFromDir(self, image_dir):
     """Returns the version of the image based on the name of the directory."""
     latest_version = os.path.basename(image_dir)
-    return latest_version.split('-')[0]
+    parts = latest_version.split('-')
+    if len(parts) == 2:
+      # Old-style, e.g. "0.15.938.2011_08_23_0941-a1".
+      # TODO(derat): Remove the code for old-style versions after 20120101.
+      return parts[0]
+    else:
+      # New-style, e.g. "R16-1102.0.2011_09_30_0806-a1".
+      return parts[1]
 
   def _CanUpdate(self, client_version, latest_version):
     """Returns true if the latest_version is greater than the client_version.
     """
-    client_tokens = client_version.replace('_', '').split('.')
-    latest_tokens = latest_version.replace('_', '').split('.')
     _LogMessage('client version %s latest version %s'
                 % (client_version, latest_version))
-    for i in range(4):
+
+    client_tokens = client_version.replace('_', '').split('.')
+    # If the client has an old four-token version like "0.16.892.0", drop the
+    # first two tokens -- we use versions like "892.0.0" now.
+    # TODO(derat): Remove the code for old-style versions after 20120101.
+    if len(client_tokens) == 4:
+      client_tokens = client_tokens[2:]
+
+    latest_tokens = latest_version.replace('_', '').split('.')
+    if len(latest_tokens) == 4:
+      latest_tokens = latest_tokens[2:]
+
+    for i in range(min(len(client_tokens), len(latest_tokens))):
       if int(latest_tokens[i]) == int(client_tokens[i]):
         continue
       return int(latest_tokens[i]) > int(client_tokens[i])
-    return False
+
+    # Favor four-token new-style versions on the server over old-style versions
+    # on the client if everything else matches.
+    return len(latest_tokens) > len(client_tokens)
 
   def _UnpackZip(self, image_dir):
     """Unpacks an image.zip into a given directory."""