diff --git a/silecs_cli/silecs.py b/silecs_cli/silecs.py index b97fa9e3584c9eb41b5618a6252a29cf826a4b98..000f24d8d07792d23e10d44de1a653bc9a6f1606 100644 --- a/silecs_cli/silecs.py +++ b/silecs_cli/silecs.py @@ -6,6 +6,7 @@ import datetime import shutil import subprocess +import lxml.etree from xml.dom import minidom from packaging import version @@ -151,6 +152,13 @@ def create_backup_file(filepath): with open(backup_file, 'w+'): shutil.copyfile(src=filepath, dst=backup_file) +def get_version_underscored_tiny_as_x(version): + version_splitted = version.split(".") + major = version_splitted[0] + minor = version_splitted[1] + return major + "_" + minor + "_x" + + ##### Validate silecs design deploy ###### def validate(silecs_design_deploy_path, xsd_path): @@ -450,11 +458,57 @@ def silecs_release(file_paths): print("Error during release. Check errors above.") +def is_silecs_design_file(filepath): + return get_extension(filepath) == SILECSDESIGN + +def is_silecs_deploy_file(filepath): + return get_extension(filepath) == SILECSDEPLOY + +def get_silecs_version_from_silecsdesign_file(silecsdesign_file): + silecs_design_document = minidom.parse(silecsdesign_file) + silecs_design_element = silecs_design_document.getElementsByTagName("SILECS-Design")[0] + version = silecs_design_element.getAttribute("silecs-version") + return version + + +def get_silecs_version_from_silecsdeploy_file(silecsdeploy_file): + silecs_deploy_document = minidom.parse(silecsdeploy_file) + silecs_deploy_element = silecs_deploy_document.getElementsByTagName("SILECS-Depoloy")[0] + version = silecs_deploy_element.getAttribute("silecs-version") + return version + + +def get_silecs_version_from_file(filepath): + if is_silecs_design_file(filepath): + return get_silecs_version_from_silecsdesign_file(filepath) + else: + return get_silecs_version_from_silecsdeploy_file(filepath) + + +def get_silecs_desing_deploy_file(project_path): + project_path_src = os.path.join(project_path, "src") + is_silecs_deploy_design = lambda f: f.split(".")[-1] == SILECSDESIGN or f.split(".")[-1] == SILECSDEPLOY + silecs_design_deploy_files = [f for f in os.listdir(project_path) if os.path.isfile(os.path.join(project_path, f)) and is_silecs_deploy_design(f)] + if not silecs_design_deploy_files: + return Exception("No silecs design/deploy files found for that project") + # elif len(silecs_design_deploy_files) > 1 : + # return Exception("In directory should be one silecs design/deploy file") + return os.path.abspath(os.path.join(project_path, silecs_design_deploy_files[0])) + +def get_silecs_version_from_project(project_path): + try: + silecs_desing_deploy_file = get_silecs_desing_deploy_file(project_path) + return get_silecs_version_from_file(silecs_desing_deploy_file) + except Exception as e: + print(e) + ##### Migrate file to new silecs version ###### +def silecs_migrate(project_path, new_version): + old_version = get_silecs_version_from_project(project_path) + + old_version_underscored = get_version_underscored_tiny_as_x(old_version) + new_version_underscored = get_version_underscored_tiny_as_x(new_version) -def silecs_migrate(file_paths): -# TODO - See here for details: https://gitlab.com/al.schwinn/silecs-cli/-/issues/7 - print("Not implemented yet .. please update/migrate by hand for now") ##### Parse arguments ###### @@ -514,8 +568,9 @@ def _parse_arguments(): parser.add_argument( "-m", "--migrate", - metavar="file", - help="migrate silecs design/deploy to new silecs version (TODO)" + nargs=2, + metavar=("file", "new_version"), + help="migrate silecs design/deploy to new silecs version" ) return parser @@ -545,7 +600,9 @@ def run(): if options.release: silecs_release(options.release) if options.migrate: - silecs_migrate(options.migrate) + project_path=options.migrate[0] + new_version=options.migrate[1] + silecs_migrate(project_path, new_version) if __name__ == "__main__": run()