import copy from ddadevops import DevopsBuild from ddadevops import execute from ddadevops import gopass_field_from_path, gopass_password_from_path from version import Version from version_repository import VersionRepository from services import InitReleaseService, PrepareReleaseService, TagAndPushReleaseService from git_repository import GitRepository from release_type import ReleaseType def create_release_mixin_config(config_file, main_branch) -> dict: config = {} config.update( {'ReleaseMixin': {'main_branch': main_branch, 'file': config_file}}) return config def add_versions(config, release_version, bump_version) -> dict: config['ReleaseMixin'].update( {'release_version': release_version, 'bump_version': bump_version}) return config class ReleaseMixin(DevopsBuild): def __init__(self, project, config): super().__init__(project, config) release_mixin_config = config['ReleaseMixin'] self.file = release_mixin_config['file'] self.main_branch = release_mixin_config['main_branch'] self.version_repo = VersionRepository(self.file) self.release_version = None self.bump_version = None self.commit_string = None def init(self): init_service = InitReleaseService(self.version_repo) self.release_version = init_service.create_release_version(self.commit_string) self.bump_version = self.release_version.create_bump_version() def prepare(self, version): git_repository = GitRepository() if self.main_branch not in git_repository.get_current_branch(): raise Exception('Trying to release while not on main branch') self.version_repo.write_file(version.get_version_string()) git_repository.add_file(self.file) match version.release_type: case None: raise Exception('Release type not set but trying to commit.') case ReleaseType.BUMP: git_repository.commit(f'Version bump') case _: git_repository.commit(f'Release {version.get_version_string()}') def tag_and_push(self, version): git_repository = GitRepository() match version.release_type: case None: raise Exception('Release type not set but trying to tag and push.') case ReleaseType.BUMP: annotation = 'v' + version.get_version_string() message = 'Version bump' case _: annotation = 'v' + self.release_version.get_version_string() message = 'Release' + annotation git_repository.tag_annotated(annotation, message) git_repository.push()