Browse Source

Recover ./script/release/release.py

Signed-off-by: ulyssessouza <[email protected]>
ulyssessouza 5 years ago
parent
commit
7009370bf2
1 changed files with 126 additions and 0 deletions
  1. 126 0
      script/release/release.py

+ 126 - 0
script/release/release.py

@@ -0,0 +1,126 @@
+#!/usr/bin/env python3
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+import re
+
+import click
+from git import Repo
+from utils import update_init_py_version
+from utils import update_run_sh_version
+from utils import yesno
+
+VALID_VERSION_PATTERN = re.compile(r"^\d+\.\d+\.\d+(-rc\d+)?$")
+
+
+class Version(str):
+    def matching_groups(self):
+        match = VALID_VERSION_PATTERN.match(self)
+        if not match:
+            return False
+
+        return match.groups()
+
+    def is_ga_version(self):
+        groups = self.matching_groups()
+        if not groups:
+            return False
+
+        rc_suffix = groups[1]
+        return not rc_suffix
+
+    def validate(self):
+        return len(self.matching_groups()) > 0
+
+    def branch_name(self):
+        if not self.validate():
+            return None
+
+        rc_part = self.matching_groups()[0]
+        ver = self
+        if rc_part:
+            ver = ver[:-len(rc_part)]
+
+        tokens = ver.split(".")
+        tokens[-1] = 'x'
+
+        return ".".join(tokens)
+
+
+def create_bump_commit(repository, version):
+    print('Creating bump commit...')
+    repository.commit('-a', '-s', '-m "Bump {}"'.format(version), '--no-verify')
+
+
+def validate_environment(version, repository):
+    if not version.validate():
+        print('Version "{}" has an invalid format. This should follow D+.D+.D+(-rcD+). '
+              'Like: 1.26.0 or 1.26.0-rc1'.format(version))
+        return False
+
+    expected_branch = version.branch_name()
+    if str(repository.active_branch) != expected_branch:
+        print('Cannot tag in this branch with version "{}". '
+              'Please checkout "{}" to tag'.format(version, version.branch_name()))
+        return False
+    return True
+
+
[email protected]()
+def cli():
+    pass
+
+
[email protected]()
[email protected]('version')
+def tag(version):
+    """
+    Updates the version related files and tag
+    """
+    repo = Repo(".")
+    version = Version(version)
+    if not validate_environment(version, repo):
+        return
+
+    update_init_py_version(version)
+    update_run_sh_version(version)
+
+    input('Please add the release notes to the CHANGELOG.md file, then press Enter to continue.')
+    proceed = False
+    while not proceed:
+        print(repo.git.diff())
+        proceed = yesno('Are these changes ok? y/N ', default=False)
+
+    if repo.git.diff():
+        create_bump_commit(repo.git, version)
+    else:
+        print('No changes to commit. Exiting...')
+        return
+
+    repo.create_tag(version)
+
+    print('Please, check the changes. If everything is OK, you just need to push with:\n'
+          '$ git push --tags upstream {}'.format(version.branch_name()))
+
+
[email protected]()
[email protected]('version')
+def push_latest(version):
+    """
+    TODO Pushes the latest tag pointing to a certain GA version
+    """
+    raise NotImplementedError
+
+
[email protected]()
[email protected]('version')
+def ghtemplate(version):
+    """
+    TODO Generates the github release page content
+    """
+    version = Version(version)
+    raise NotImplementedError
+
+
+if __name__ == '__main__':
+    cli()