sh_cpl/tools/set_version/application.py

118 lines
5.1 KiB
Python

import os
import traceback
from cpl_cli.configuration import ProjectSettings
from cpl_core.utils import String
from cpl_cli.configuration.version_settings_name_enum import VersionSettingsNameEnum
from cpl_cli.configuration.workspace_settings import WorkspaceSettings
from cpl_core.application.application_abc import ApplicationABC
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.console.console import Console
from cpl_core.dependency_injection.service_provider_abc import ServiceProviderABC
from cpl_core.pipes.version_pipe import VersionPipe
from set_version.git_service import GitService
from set_version.version_setter_service import VersionSetterService
class Application(ApplicationABC):
def __init__(self, config: ConfigurationABC, services: ServiceProviderABC):
ApplicationABC.__init__(self, config, services)
self._workspace: WorkspaceSettings = config.get_configuration(WorkspaceSettings)
self._git_service: GitService = self._services.get_service(GitService)
self._version_setter: VersionSetterService = self._services.get_service(VersionSetterService)
self._version_pipe: VersionPipe = self._services.get_service(VersionPipe)
def configure(self):
self._configuration.parse_console_arguments(self._services)
def main(self):
Console.write_line('Set versions:')
args = self._configuration.additional_arguments
version = {}
branch = ""
suffix = ""
force = False
if '--force' in args:
args.remove('--force')
force = True
if len(args) > 1:
Console.error(f'Unexpected argument(s): {", ".join(args[1:])}')
return
if len(args) == 1:
suffix = args[0]
try:
branch = self._git_service.get_active_branch_name()
Console.write_line(f'Found branch: {branch}')
except Exception as e:
Console.error('Branch not found', traceback.format_exc())
return
try:
if suffix != '':
self._configuration.add_json_file(self._workspace.projects[self._workspace.default_project], optional=False, output=False)
ps: ProjectSettings = self._configuration.get_configuration(ProjectSettings)
version[VersionSettingsNameEnum.major.value] = ps.version.major
version[VersionSettingsNameEnum.minor.value] = ps.version.minor
version[VersionSettingsNameEnum.micro.value] = suffix
elif branch.startswith('#'):
self._configuration.add_json_file(self._workspace.projects[self._workspace.default_project], optional=False, output=False)
ps: ProjectSettings = self._configuration.get_configuration(ProjectSettings)
version[VersionSettingsNameEnum.major.value] = ps.version.major
version[VersionSettingsNameEnum.minor.value] = ps.version.minor
version[VersionSettingsNameEnum.micro.value] = f'dev{branch.split("#")[1]}'
else:
version[VersionSettingsNameEnum.major.value] = branch.split('.')[0]
version[VersionSettingsNameEnum.minor.value] = branch.split('.')[1]
if len(branch.split('.')) == 2:
if suffix == '':
suffix = '0'
version[VersionSettingsNameEnum.micro.value] = f'{suffix}'
else:
version[VersionSettingsNameEnum.micro.value] = f'{branch.split(".")[2]}{suffix}'
except Exception as e:
Console.error(f'Branch {branch} does not contain valid version')
return
diff_paths = []
for file in self._git_service.get_diff_files():
if file.startswith('tools'):
continue
if '/' in file:
file = file.split('/')[1]
else:
file = os.path.basename(os.path.dirname(file))
if file in diff_paths:
continue
diff_paths.append(file)
try:
skipped = []
for project in self._workspace.projects:
if project not in diff_paths and String.convert_to_snake_case(project) not in diff_paths and not force:
# Console.write_line(f'Skipping {project} due to missing changes')
skipped.append(project)
continue
Console.write_line(f'Set dependencies {self._version_pipe.transform(version)} for {project}')
self._version_setter.set_dependencies(self._workspace.projects[project], version, 'Dependencies', skipped=skipped)
self._version_setter.set_dependencies(self._workspace.projects[project], version, 'DevDependencies', skipped=skipped)
Console.write_line(f'Set version {self._version_pipe.transform(version)} for {project}')
self._version_setter.set_version(self._workspace.projects[project], version)
except Exception as e:
Console.error('Version could not be set', traceback.format_exc())
return