mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-02-05 11:52:39 -05:00
150 lines
4.4 KiB
Python
Executable File
150 lines
4.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved.
|
|
# For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md
|
|
|
|
from git.repo import Repo
|
|
from os import getcwd
|
|
from jira import JIRA
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
|
|
release_base_regex = re.compile(r'^release-(\d+).(\d+).(\d+)$')
|
|
rc_regex = re.compile(release_base_regex.pattern[:-1] + r'-rc(\d+)$')
|
|
release_regex = re.compile(release_base_regex.pattern[:-1] + r'(-internal)?$')
|
|
commit_regex = re.compile(r'^\[((EGD|BH|CP)-\d+)\] .*$')
|
|
|
|
|
|
class Version(object):
|
|
def __init__(self, major, minor, subminor, internal=False):
|
|
self.major = major
|
|
self.minor = minor
|
|
self.subminor = subminor
|
|
self.internal = internal
|
|
|
|
@staticmethod
|
|
def from_tag(tag):
|
|
match = release_regex.match(tag)
|
|
if match is None:
|
|
raise RuntimeError("Invalid version tag " + tag)
|
|
|
|
internal = match.lastindex == 4 and match.group(4) == "-internal"
|
|
|
|
return Version(int(match.group(1)), int(match.group(2)), int(match.group(3)), internal)
|
|
|
|
def __str__(self):
|
|
s = "{}.{}.{}".format(self.major, self.minor, self.subminor)
|
|
if self.internal:
|
|
s += "-internal"
|
|
return s
|
|
|
|
def __gt__(self, other):
|
|
if self.major == other.major:
|
|
if self.minor == other.minor:
|
|
return self.subminor > other.subminor
|
|
else:
|
|
return self.minor > other.minor
|
|
else:
|
|
return self.major > other.major
|
|
|
|
def is_next(self, other):
|
|
if self.major == other.major:
|
|
if self.minor == other.minor:
|
|
return self.subminor - other.subminor == 1
|
|
else:
|
|
return self.minor - other.minor == 1 and self.subminor == 1
|
|
else:
|
|
return self.major - other.major == 1 and self.minor == 0 and self.subminor == 0
|
|
|
|
def tag(self):
|
|
return "release-" + str(self)
|
|
|
|
|
|
def jira_connect():
|
|
juser = os.environ.get('JIRA_USER')
|
|
jtoken = os.environ.get('JIRA_TOKEN')
|
|
jserver = "https://appnroll.atlassian.net"
|
|
options = {'server': jserver}
|
|
return JIRA(options, basic_auth=(juser, jtoken))
|
|
|
|
|
|
def main(args):
|
|
if len(args) == 2:
|
|
repo = Repo(args[1])
|
|
else:
|
|
repo = Repo(getcwd())
|
|
|
|
# get all versions
|
|
versions = [Version.from_tag(str(t))
|
|
for t in repo.tags if release_regex.match(str(t))]
|
|
versions.sort()
|
|
current_version = versions[-1]
|
|
|
|
# make new version looking for the last RC version
|
|
rc = [t for t in repo.tags if rc_regex.match(str(t))][-1]
|
|
match = rc_regex.match(str(rc))
|
|
if match is None:
|
|
print("No RC version")
|
|
return 1
|
|
new_version = Version(int(match.group(1)), int(
|
|
match.group(2)), int(match.group(3)))
|
|
|
|
print("Current version : " + str(current_version))
|
|
print("Next version : " + str(new_version))
|
|
|
|
commits = [c for c in repo.iter_commits(
|
|
rev=current_version.tag() + ".." + str(rc))]
|
|
|
|
issues = []
|
|
for c in commits:
|
|
match = commit_regex.match(c.summary)
|
|
if match is None:
|
|
print("Skipping commit: " + c.summary)
|
|
continue
|
|
issue = match.group(1)
|
|
if issue in issues:
|
|
print("Skipping duplicate issue: " + issue)
|
|
continue
|
|
|
|
issues.append(issue)
|
|
|
|
issues.sort()
|
|
|
|
# jira
|
|
jira = jira_connect()
|
|
egd = jira.project('EGD')
|
|
sversions = [str(v) for v in jira.project_versions(egd)]
|
|
if str(new_version) in sversions:
|
|
print("JIRA version found: " + str(new_version))
|
|
else:
|
|
print("Creating JIRA version: " + str(new_version))
|
|
jira.create_version(str(new_version), egd)
|
|
|
|
for issueName in issues:
|
|
print("Updating version for: " + issueName)
|
|
try:
|
|
issue = jira.issue(issueName)
|
|
except:
|
|
print("Failed to fetch version")
|
|
continue
|
|
fix_versions = [str(v) for v in issue.fields.fixVersions]
|
|
if str(new_version) in fix_versions:
|
|
print(str(issue) + " alredy in version " + str(new_version))
|
|
continue
|
|
|
|
update_versions = []
|
|
for v in fix_versions:
|
|
update_versions.append({'name': v})
|
|
update_versions.append({'name': str(new_version)})
|
|
try:
|
|
issue.update(fields={'fixVersions': update_versions})
|
|
except:
|
|
print("Failed to update issue")
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main(sys.argv))
|