pre-upload: reject -r0 ebuilds

These are redundant, confusing, and some tools don't like them.

BUG=chromium:1150672
TEST=unittests pass
TEST=ran against example commits in chromiumos-overlay

Change-Id: I0bee561cb00486f66a5064a611bbf53d4cbd15ac
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/repohooks/+/2551822
Reviewed-by: Manoj Gupta <manojgupta@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
diff --git a/pre-upload.py b/pre-upload.py
index d37c7b4..0624254 100755
--- a/pre-upload.py
+++ b/pre-upload.py
@@ -1296,6 +1296,20 @@
   return None
 
 
+def _check_ebuild_r0(_project, commit):
+  """Do not allow ebuilds to end with -r0 versions."""
+  ebuilds = _filter_files(
+      _get_affected_files(commit, include_symlinks=True, relative=True),
+      (r'-r0\.ebuild$',))
+  if ebuilds:
+    return HookFailure(
+        'The -r0 in ebuilds is redundant and confusing. Simply remove it.\n'
+        'For example: git mv foo-1.0-r0.ebuild foo-1.0.ebuild',
+        ebuilds)
+
+  return None
+
+
 def _check_ebuild_virtual_pv(project, commit):
   """Enforce the virtual PV policies."""
   # If this is the portage-stable overlay, then ignore the check.
@@ -2070,6 +2084,7 @@
     _check_ebuild_eapi,
     _check_ebuild_keywords,
     _check_ebuild_licenses,
+    _check_ebuild_r0,
     _check_ebuild_virtual_pv,
     _check_exec_files,
     _check_for_uprev,
diff --git a/pre-upload_unittest.py b/pre-upload_unittest.py
index b5902aa..8aeeee7 100755
--- a/pre-upload_unittest.py
+++ b/pre-upload_unittest.py
@@ -801,6 +801,25 @@
     self._CheckContent(u'# HEADER\nKEYWORDS="~arm x86"\nblah\n', True)
 
 
+class CheckEbuildR0(PreUploadTestCase):
+  """Tests for _check_ebuild_r0."""
+
+  def setUp(self):
+    self.file_mock = self.PatchObject(pre_upload, '_get_affected_files')
+
+  def testNoMatches(self):
+    """Handle no matching files."""
+    self.file_mock.return_value = []
+    ret = pre_upload._check_ebuild_r0('project', 'HEAD')
+    self.assertIsNone(ret)
+
+  def testBadEbuilds(self):
+    """Handle matching r0 files."""
+    self.file_mock.return_value = ['foo-1-r0.ebuild']
+    ret = pre_upload._check_ebuild_r0('project', 'HEAD')
+    self.assertIsNotNone(ret)
+
+
 class CheckEbuildVirtualPv(PreUploadTestCase):
   """Tests for _check_ebuild_virtual_pv."""