Enable virtual versions >= 4

In some cases we may need to have virtual versions >= 4, such as if
there is a board which inherits another board overlay. This adjusts
the pre-upload script to allow for these.

BUG=None
TEST=Try uploading a CL with a virtual that is version 4.

Change-Id: I289b2c85430cf134050dfea6d0ca4f2f190600d2
Reviewed-on: https://chromium-review.googlesource.com/321724
Commit-Ready: Bernie Thompson <bhthompson@chromium.org>
Tested-by: Bernie Thompson <bhthompson@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/pre-upload.py b/pre-upload.py
index 0fe499d..a98b16c 100755
--- a/pre-upload.py
+++ b/pre-upload.py
@@ -819,7 +819,11 @@
 
       pv = m.group(3).split('-', 1)[0]
 
-      if is_private(overlay):
+      # Virtual versions >= 4 are special cases used above the standard
+      # versioning structure, e.g. if one has a board inheriting a board.
+      if float(pv) >= 4:
+        want_pv = pv
+      elif is_private(overlay):
         want_pv = '3.5' if is_variant(overlay) else '3'
       elif is_board(overlay):
         want_pv = '2.5' if is_variant(overlay) else '2'
diff --git a/pre-upload_unittest.py b/pre-upload_unittest.py
index d4f458d..36ec973 100755
--- a/pre-upload_unittest.py
+++ b/pre-upload_unittest.py
@@ -453,10 +453,16 @@
     ret = pre_upload._check_ebuild_virtual_pv(self.PRIVATE_VARIANT_OVERLAY, 'H')
     self.assertEqual(ret, None)
 
+  def testSpecialVirtuals(self):
+    """Some cases require deeper versioning and can be >= 4."""
+    template = 'virtual/foo/foo-%s.ebuild'
     self.file_mock.return_value = [template % '4']
     ret = pre_upload._check_ebuild_virtual_pv(self.PRIVATE_VARIANT_OVERLAY, 'H')
-    self.assertTrue(isinstance(ret, errors.HookFailure))
+    self.assertEqual(ret, None)
 
+    self.file_mock.return_value = [template % '4.5']
+    ret = pre_upload._check_ebuild_virtual_pv(self.PRIVATE_VARIANT_OVERLAY, 'H')
+    self.assertEqual(ret, None)
 
 class CheckCrosLicenseCopyrightHeader(cros_test_lib.MockTestCase):
   """Tests for _check_cros_license."""