# HG changeset patch
# User Georges Racinet <georges.racinet@octobus.net>
# Date 1668966294 -3600
#      Sun Nov 20 18:44:54 2022 +0100
# Node ID be9d7ede98130fdffd5ecf68744b2553d331fb40
# Parent  c9cebb04a5f7dc526697921e32af3f75426ae063
push-release: switch to object-oriented style

We will have to init some constants after CLI parsing, it's
cleaner to make attributes out of them.

diff --git a/push-release b/push-release
--- a/push-release
+++ b/push-release
@@ -12,6 +12,57 @@
 BASE_IMAGE = 'octobus/heptapod'
 GITLAB_RAILS = '/opt/gitlab/embedded/service/gitlab-rails/'
 
+
+class Releaser:
+
+    def __init__(self, simulate):
+        self.simulate = simulate
+
+    def testing_img(self, stable_series):
+        return self.image_tag('testing',
+                              stable_series=stable_series)
+
+    def image_tag(self, label, stable_series=None):
+        if stable_series is not None:
+            label = '-'.join((stable_series, label))
+        return ':'.join((self.docker_hub_base_image(), label))
+
+    def read_check_version(self, stable_series, validate_build_number=True):
+        """Read version files and check consistency."""
+        img = self.testing_img(stable_series)
+        logger.info("Reading version metadata from image %r", img)
+
+        cmd = ('docker', 'run', '-it', '--rm', img)
+
+        archival = subprocess.check_output(
+            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())
+        assert release[0].rstrip() == "RELEASE_PACKAGE=heptapod"
+        release_version, build_number = release[1].rstrip().rsplit('-', 1)
+        assert release_version.replace('~', '') == "RELEASE_VERSION=" + version
+        if validate_build_number:
+            try:
+                int(build_number)
+            except TypeError:
+                raise InvalidBuildNumber(release[1])
+
+        return archival, version, build_number
+
+    def push_tag(self, label, stable_series=None, tag_series=None):
+        img_tag = self.image_tag(label, stable_series=tag_series)
+        call(('docker', 'tag',
+              self.testing_img(stable_series),
+              img_tag),
+             simulate=self.simulate)
+        call(('docker', 'push', img_tag), simulate=self.simulate)
+
+
 parser = argparse.ArgumentParser(
     "Create Docker image tags from the current testing, after some "
     "verifications.")
@@ -44,45 +95,6 @@
     pass
 
 
-def testing_img(stable_series):
-    return image_tag('testing',
-                     stable_series=stable_series)
-
-
-def image_tag(label, stable_series=None):
-    if stable_series is not None:
-        label = '-'.join((stable_series, label))
-    return ':'.join((BASE_IMAGE, label))
-
-
-def read_check_version(stable_series, validate_build_number=True):
-    """Read version files and check consistency."""
-    img = testing_img(stable_series)
-    logger.info("Reading version metadata from image %r", img)
-
-    cmd = ('docker', 'run', '-it', '--rm', img)
-
-    archival = subprocess.check_output(
-        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())
-    assert release[0].rstrip() == "RELEASE_PACKAGE=heptapod"
-    release_version, build_number = release[1].rstrip().rsplit('-', 1)
-    assert release_version.replace('~', '') == "RELEASE_VERSION=" + version
-    if validate_build_number:
-        try:
-            int(build_number)
-        except TypeError:
-            raise InvalidBuildNumber(release[1])
-
-    return archival, version, build_number
-
-
 def call(cmd, simulate=True):
     logger.info("Simulation mode, would run %r" if simulate else "Running %r",
                 cmd)
@@ -90,24 +102,15 @@
         subprocess.check_call(cmd)
 
 
-def push_tag(label,
-             stable_series=None, tag_series=None,
-             simulate=True):
-    img_tag = image_tag(label,
-                        stable_series=tag_series)
-    call(('docker', 'tag',
-          testing_img(stable_series),
-          img_tag),
-         simulate=simulate)
-    call(('docker', 'push', img_tag), simulate=simulate)
-
-
 parsed_args = parser.parse_args()
 logging.basicConfig(level=getattr(logging, parsed_args.logging_level.upper()))
 stable_series = parsed_args.series
+releaser = Releaser(simulate=parsed_args.simulate,
+                    )
+
 
 try:
-    archival, version, build_nr = read_check_version(
+    archival, version, build_nr = releaser.read_check_version(
         stable_series=stable_series,
         validate_build_number=not parsed_args.arbitrary_build_number)
 except InvalidBuildNumber as exc:
@@ -125,18 +128,13 @@
         print("Not confirmed, bye")
         sys.exit(0)
 
-simulate = parsed_args.simulate
-
-push_tag(version,
-         simulate=simulate,
-         stable_series=stable_series)
-push_tag('latest',
-         simulate=simulate,
-         tag_series=stable_series,
-         stable_series=stable_series)
+releaser.push_tag(version,
+                  stable_series=stable_series)
+releaser.push_tag('latest',
+                  tag_series=stable_series,
+                  stable_series=stable_series)
 if stable_series is None:
     future_stable_series = '-'.join(version.split('.', 2)[:2])
-    push_tag('latest',
-             simulate=simulate,
-             tag_series=future_stable_series,
-             stable_series=stable_series)
+    releaser.push_tag('latest',
+                      tag_series=future_stable_series,
+                      stable_series=stable_series)