# HG changeset patch
# User Georges Racinet <georges.racinet@octobus.net>
# Date 1615187743 -3600
#      Mon Mar 08 08:15:43 2021 +0100
# Node ID 0b260d291f77da57f87f77e85cb49392651ca727
# Parent  74f4f366680e7ec6f654fefa329cf761e3aaa8d0
push-release: added consistency check on /RELEASE file

could be really weird if something got wrong in Omnibus package
version logic. Also an opportunity to display the build number
for human operator alert if it's unexpected

diff --git a/push-release b/push-release
--- a/push-release
+++ b/push-release
@@ -22,6 +22,10 @@
 parser.add_argument('--stable-series', help="Example: 0-14")
 
 
+class InvalidBuildNumber(RuntimeError):
+    pass
+
+
 def testing_img(stable_series, py_version):
     return image_tag('testing', py_version=py_version,
                      stable_series=stable_series)
@@ -36,8 +40,9 @@
     return '%s-py%d' % (default, py_version)
 
 
-def read_version(stable_series, py_version):
-    img = testing_img(stable_series, py_version=py_version)
+def read_check_version(stable_series):
+    """Read version files and check consistency."""
+    img = testing_img(stable_series, py_version=None)
     logger.info("Reading version metadata from image %r", img)
 
     cmd = ('docker', 'run', '-it', '--rm', img)
@@ -46,10 +51,20 @@
         cmd + ('cat', GITLAB_RAILS + '.hg_archival.txt')).decode()
     version = subprocess.check_output(
         cmd + ('cat', GITLAB_RAILS + 'HEPTAPOD_VERSION')).decode().strip()
+    release = subprocess.check_output(
+        cmd + ('cat', '/RELEASE')).decode().splitlines()
     version = version.replace(".rc", "rc")
     assert any(re.match(r'^tag: heptapod-{}$'.format(version), line)
                for line in archival.splitlines())
-    return archival, version
+    assert release[0].rstrip() == "RELEASE_PACKAGE=heptapod"
+    release_version, build_number = release[1].rstrip().rsplit('-', 1)
+    assert release_version == "RELEASE_VERSION=" + version
+    try:
+        build_number = int(build_number)
+    except TypeError:
+        raise InvalidBuildNumber(release[1])
+
+    return archival, version, build_number
 
 
 def call(cmd, simulate=True):
@@ -75,8 +90,16 @@
 logging.basicConfig(level=getattr(logging, parsed_args.logging_level.upper()))
 stable_series = parsed_args.stable_series
 
-archival, version = read_version(stable_series=stable_series, py_version=None)
-logger.info("Detected version %r in testing image", version)
+try:
+    archival, version, build_nr = read_check_version(
+        stable_series=stable_series)
+except InvalidBuildNumber as exc:
+    logger.error("Invalid build number in /RELEASE file: %r. "
+                 "Bailing", **exc.args)
+    sys.exit(1)
+
+logger.info("Detected version %r (Omnibus build %r) in testing image",
+            version, build_nr)
 
 if not parsed_args.simulate and not parsed_args.no_confirmation:
     print("Are you sure you want to tag and push version %r?" % version)