ScriptCollection 3.5.3__py3-none-any.whl → 3.5.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,6 +21,7 @@ from .GeneralUtilities import GeneralUtilities
21
21
  from .ScriptCollectionCore import ScriptCollectionCore
22
22
  from .ProgramRunnerEpew import ProgramRunnerEpew
23
23
 
24
+
24
25
  class CreateReleaseConfiguration():
25
26
  projectname: str
26
27
  remotename: str
@@ -232,8 +233,7 @@ class TasksForCommonProjectStructure:
232
233
  for target in targets:
233
234
  GeneralUtilities.write_message_to_stdout(f"Build package {package_name} for target {target}...")
234
235
  sc = ScriptCollectionCore()
235
- sc.program_runner = ProgramRunnerEpew()
236
- sc.run_program("flutter", f"build {target}", src_folder, verbosity)
236
+ self.run_with_epew("flutter", f"build {target}", src_folder, verbosity)
237
237
  if target == "web":
238
238
  web_relase_folder = os.path.join(src_folder, "build/web")
239
239
  web_folder = os.path.join(artifacts_folder, "BuildResult_WebApplication")
@@ -620,7 +620,7 @@ class TasksForCommonProjectStructure:
620
620
 
621
621
  @GeneralUtilities.check_arguments
622
622
  def __standardized_tasks_build_for_dotnet_build(self, csproj_file: str, originaloutputfolder: str, files_to_sign: dict[str, str], commitid: str, verbosity: int, runtimes: list[str], target_environmenttype: str, target_environmenttype_mapping: dict[str, str], copy_license_file_to_target_folder: bool, repository_folder: str, codeunit_name: str, commandline_arguments: list[str]) -> None:
623
- csproj_filename=os.path.basename(csproj_file)
623
+ csproj_filename = os.path.basename(csproj_file)
624
624
  GeneralUtilities.write_message_to_stdout(f"Build {csproj_filename}...")
625
625
  dotnet_build_configuration: str = target_environmenttype_mapping[target_environmenttype]
626
626
  verbosity = self.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
@@ -765,7 +765,7 @@ class TasksForCommonProjectStructure:
765
765
 
766
766
  @GeneralUtilities.check_arguments
767
767
  def standardized_tasks_generate_coverage_report(self, repository_folder: str, codeunitname: str, verbosity: int, generate_badges: bool, targetenvironmenttype: str, commandline_arguments: list[str], add_testcoverage_history_entry: bool = None) -> None:
768
- """This script expects that the file '<repositorybasefolder>/<codeunitname>/Other/Artifacts/TestCoverage/TestCoverage.xml'
768
+ """This function expects that the file '<repositorybasefolder>/<codeunitname>/Other/Artifacts/TestCoverage/TestCoverage.xml'
769
769
  which contains a test-coverage-report in the cobertura-format exists.
770
770
  This script expectes that the testcoverage-reportfolder is '<repositorybasefolder>/<codeunitname>/Other/Artifacts/TestCoverageReport'.
771
771
  This script expectes that a test-coverage-badges should be added to '<repositorybasefolder>/<codeunitname>/Other/Resources/Badges'."""
@@ -774,12 +774,14 @@ class TasksForCommonProjectStructure:
774
774
  verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
775
775
  if verbosity == 0:
776
776
  verbose_argument_for_reportgenerator = "Off"
777
- if verbosity == 1:
777
+ elif verbosity == 1:
778
778
  verbose_argument_for_reportgenerator = "Error"
779
- if verbosity == 2:
779
+ elif verbosity == 2:
780
780
  verbose_argument_for_reportgenerator = "Info"
781
- if verbosity == 3:
781
+ elif verbosity == 3:
782
782
  verbose_argument_for_reportgenerator = "Verbose"
783
+ else:
784
+ raise ValueError(f"Unknown value for verbosity: {GeneralUtilities.str_none_safe(verbosity)}")
783
785
 
784
786
  # Generating report
785
787
  GeneralUtilities.ensure_directory_does_not_exist(os.path.join(repository_folder, codeunitname, f"{codeunitname}/Other/Artifacts/TestCoverageReport"))
@@ -792,11 +794,8 @@ class TasksForCommonProjectStructure:
792
794
  history_folder_full = os.path.join(repository_folder, history_folder)
793
795
  GeneralUtilities.ensure_directory_exists(history_folder_full)
794
796
  history_argument = f" -historydir:{history_folder}"
795
- argument = (f"-reports:{codeunitname}/Other/Artifacts/TestCoverage/TestCoverage.xml " +
796
- f"-targetdir:{codeunitname}/Other/Artifacts/TestCoverageReport --verbosity:{verbose_argument_for_reportgenerator}{history_argument} " +
797
- f"-title:{codeunitname} -tag:v{codeunit_version}")
798
- self.__sc.run_program("reportgenerator", argument,
799
- repository_folder, verbosity=verbosity)
797
+ argument = f"-reports:{codeunitname}/Other/Artifacts/TestCoverage/TestCoverage.xml -targetdir:{codeunitname}/Other/Artifacts/TestCoverageReport --verbosity:{verbose_argument_for_reportgenerator}{history_argument} -title:{codeunitname} -tag:v{codeunit_version}"
798
+ self.__sc.run_program("reportgenerator", argument, repository_folder, verbosity=verbosity)
800
799
  if not add_testcoverage_history_entry:
801
800
  os.remove(GeneralUtilities.get_direct_files_of_folder(history_folder_full)[-1])
802
801
 
@@ -806,10 +805,7 @@ class TasksForCommonProjectStructure:
806
805
  fulltestcoverageubfolger = os.path.join(repository_folder, codeunitname, testcoverageubfolger)
807
806
  GeneralUtilities.ensure_directory_does_not_exist(fulltestcoverageubfolger)
808
807
  GeneralUtilities.ensure_directory_exists(fulltestcoverageubfolger)
809
- self.__sc.run_program("reportgenerator", "-reports:Other/Artifacts/TestCoverage/TestCoverage.xml " +
810
- f"-targetdir:{testcoverageubfolger} -reporttypes:Badges " +
811
- f"--verbosity:{verbose_argument_for_reportgenerator}", os.path.join(repository_folder, codeunitname),
812
- verbosity=verbosity)
808
+ self.__sc.run_program("reportgenerator", f"-reports:Other/Artifacts/TestCoverage/TestCoverage.xml -targetdir:{testcoverageubfolger} -reporttypes:Badges --verbosity:{verbose_argument_for_reportgenerator}", os.path.join(repository_folder, codeunitname), verbosity=verbosity)
813
809
 
814
810
  @GeneralUtilities.check_arguments
815
811
  def standardized_tasks_run_testcases_for_dotnet_project(self, runtestcases_file: str, targetenvironmenttype: str, verbosity: int, generate_badges: bool, target_environmenttype_mapping: dict[str, str], commandline_arguments: list[str]) -> None:
@@ -842,8 +838,7 @@ class TasksForCommonProjectStructure:
842
838
  self.run_testcases_common_post_task(repository_folder, codeunit_name, verbosity, generate_badges, targetenvironmenttype, commandline_arguments)
843
839
 
844
840
  @GeneralUtilities.check_arguments
845
- def run_testcases_common_post_task(self, repository_folder: str, codeunit_name: str, verbosity: int, generate_badges: bool,
846
- targetenvironmenttype: str, commandline_arguments: list[str]) -> None:
841
+ def run_testcases_common_post_task(self, repository_folder: str, codeunit_name: str, verbosity: int, generate_badges: bool, targetenvironmenttype: str, commandline_arguments: list[str]) -> None:
847
842
  coverage_file_folder = os.path.join(repository_folder, codeunit_name, "Other/Artifacts/TestCoverage")
848
843
  coveragefiletarget = os.path.join(coverage_file_folder, "TestCoverage.xml")
849
844
  self.update_path_of_source_in_testcoverage_file(repository_folder, codeunit_name)
@@ -865,8 +860,7 @@ class TasksForCommonProjectStructure:
865
860
  filename = match.group(1)
866
861
  file = os.path.join(source, filename)
867
862
  # GeneralUtilities.assert_condition(os.path.isfile(file),f"File \"{file}\" does not exist.")
868
- GeneralUtilities.assert_condition(file.startswith(codeunit_folder),
869
- f"Unexpected path for coverage-file. File: \"{file}\"; codeunitfolder: \"{codeunit_folder}\"")
863
+ GeneralUtilities.assert_condition(file.startswith(codeunit_folder), f"Unexpected path for coverage-file. File: \"{file}\"; codeunitfolder: \"{codeunit_folder}\"")
870
864
  filename_relative = f".{file[len(codeunit_folder):]}"
871
865
  return f'filename="{filename_relative}"'
872
866
 
@@ -876,15 +870,15 @@ class TasksForCommonProjectStructure:
876
870
  root: etree._ElementTree = etree.parse(testcoveragefile)
877
871
  codeunit_folder = os.path.join(repository_folder, codeunit_name)
878
872
  xpath = f"//coverage/packages/package[@name='{codeunit_name}']/classes/class"
879
- classes = root.xpath(xpath)
873
+ coverage_report_classes = root.xpath(xpath)
880
874
  found_existing_files = False
881
- for clas in classes:
882
- filename = clas.attrib['filename']
875
+ for coverage_report_class in coverage_report_classes:
876
+ filename = coverage_report_class.attrib['filename']
883
877
  file = os.path.join(codeunit_folder, filename)
884
878
  if os.path.isfile(file):
885
879
  found_existing_files = True
886
880
  else:
887
- clas.getparent().remove(clas)
881
+ coverage_report_class.getparent().remove(coverage_report_class)
888
882
  GeneralUtilities.assert_condition(found_existing_files, f"No existing files in testcoderage-report-file \"{testcoveragefile}\".")
889
883
  result = etree.tostring(root).decode("utf-8")
890
884
  GeneralUtilities.write_text_to_file(testcoveragefile, result)
@@ -916,7 +910,7 @@ class TasksForCommonProjectStructure:
916
910
  # TODO check if there are errors in sarif-file
917
911
 
918
912
  @GeneralUtilities.check_arguments
919
- def __export_codeunit_reference_content_to_reference_repository(self, project_version_identifier: str, replace_existing_content: bool, target_folder_for_reference_repository: str, repository: str, codeunitname: str, projectname: str, codeunit_version: str, public_repository_url: str, branch: str) -> None:
913
+ def __export_codeunit_reference_content_to_reference_repository(self, project_version_identifier: str, replace_existing_content: bool, target_folder_for_reference_repository: str, repository: str, codeunitname: str, projectname: str, codeunit_version: str, public_repository_url: str, branch: str) -> None:
920
914
  codeunit_folder = os.path.join(repository, codeunitname)
921
915
  codeunit_file = os.path.join(codeunit_folder, f"{codeunitname}.codeunit.xml")
922
916
  codeunit_has_testcases = self.codeunit_has_testable_sourcecode(codeunit_file)
@@ -931,8 +925,7 @@ class TasksForCommonProjectStructure:
931
925
  diff_target_folder = os.path.join(target_folder, "DiffReport")
932
926
  GeneralUtilities.ensure_directory_exists(diff_target_folder)
933
927
  diff_target_file = os.path.join(diff_target_folder, "DiffReport.html")
934
- title = (f'Reference of codeunit {codeunitname} {codeunit_version_identifier} (contained in project ' +
935
- f'<a href="{public_repository_url}">{projectname}</a> {project_version_identifier})')
928
+ title = (f'Reference of codeunit {codeunitname} {codeunit_version_identifier} (contained in project <a href="{public_repository_url}">{projectname}</a> {project_version_identifier})')
936
929
  if public_repository_url is None:
937
930
  repo_url_html = ""
938
931
  else:
@@ -1045,7 +1038,7 @@ class TasksForCommonProjectStructure:
1045
1038
  @GeneralUtilities.check_arguments
1046
1039
  def __generate_entire_reference(self, projectname: str, project_version: str, reference_folder: str) -> None:
1047
1040
  all_available_version_identifier_folders_of_reference: list[str] = list(folder for folder in GeneralUtilities.get_direct_folders_of_folder(reference_folder))
1048
- all_available_version_identifier_folders_of_reference = sorted(all_available_version_identifier_folders_of_reference, key=cmp_to_key(TasksForCommonProjectStructure._internal_sort_reference_folder))
1041
+ all_available_version_identifier_folders_of_reference = sorted(all_available_version_identifier_folders_of_reference, key=cmp_to_key(TasksForCommonProjectStructure._internal_sort_reference_folder))
1049
1042
  reference_versions_html_lines = []
1050
1043
  reference_versions_html_lines.append(' <hr/>')
1051
1044
  for all_available_version_identifier_folder_of_reference in all_available_version_identifier_folders_of_reference:
@@ -1109,17 +1102,26 @@ class TasksForCommonProjectStructure:
1109
1102
  raise ValueError(f"Repository '{repository_folder}' has uncommitted changes.")
1110
1103
 
1111
1104
  @GeneralUtilities.check_arguments
1112
- def generate_certificate_for_development_purposes(self, codeunit_folder: str, domain: str = None):
1105
+ def generate_certificate_for_development_purposes_for_external_service(self, service_folder: str, domain: str = None):
1106
+ testservice_name = os.path.basename(service_folder)
1107
+ self.__generate_certificate_for_development_purposes(testservice_name, os.path.join(service_folder, "Resources"), domain)
1108
+
1109
+ @GeneralUtilities.check_arguments
1110
+ def generate_certificate_for_development_purposes_for_codeunit(self, codeunit_folder: str, domain: str = None):
1113
1111
  codeunit_name = os.path.basename(codeunit_folder)
1112
+ self.__generate_certificate_for_development_purposes(codeunit_name, os.path.join(codeunit_folder, "Other", "Resources"), domain)
1113
+
1114
+ @GeneralUtilities.check_arguments
1115
+ def __generate_certificate_for_development_purposes(self, service_name: str, resources_folder: str, domain: str = None):
1114
1116
  if domain is None:
1115
- domain = f"{codeunit_name}.test.local"
1117
+ domain = f"{service_name}.test.local"
1116
1118
  domain = domain.lower()
1117
- resources_folder: str = os.path.join(codeunit_folder, "Other", "Resources")
1118
1119
  resource_name: str = "DevelopmentCertificate"
1119
1120
  certificate_folder: str = os.path.join(resources_folder, resource_name)
1120
- resource_content_filename: str = codeunit_name+resource_name
1121
+
1122
+ resource_content_filename: str = service_name+resource_name
1121
1123
  ca_resource_name: str = f"{resource_name}Authority"
1122
- dev_ca_name = codeunit_name+ca_resource_name
1124
+ dev_ca_name = service_name+ca_resource_name
1123
1125
  ca_folder = os.path.join(resources_folder, ca_resource_name)
1124
1126
  certificate_file = os.path.join(certificate_folder, f"{domain}.crt")
1125
1127
  unsignedcertificate_file = os.path.join(certificate_folder, f"{domain}.unsigned.crt")
@@ -1257,7 +1259,7 @@ class TasksForCommonProjectStructure:
1257
1259
  codeunit_folder = GeneralUtilities.resolve_relative_path("../..", str(os.path.dirname(build_script_file)))
1258
1260
  codeunitname_lower = codeunitname.lower()
1259
1261
  codeunitversion = self.get_version_of_codeunit(os.path.join(codeunit_folder, f"{codeunitname}.codeunit.xml"))
1260
- args = ["image", "build", "--pull", "--force-rm", "--progress=plain", "--build-arg", f"TargetEnvironmentType={target_environment_type}", "--tag", f"{codeunitname_lower}:latest", "--tag", f"{codeunitname_lower}:{codeunitversion}", "--file", f"{codeunitname}/Dockerfile"]
1262
+ args = ["image", "build", "--pull", "--force-rm", "--progress=plain", "--build-arg", f"TargetEnvironmentType={target_environment_type}", "--build-arg", f"Version={codeunitversion}", "--tag", f"{codeunitname_lower}:latest", "--tag", f"{codeunitname_lower}:{codeunitversion}", "--file", f"{codeunitname}/Dockerfile"]
1261
1263
  if not use_cache:
1262
1264
  args.append("--no-cache")
1263
1265
  args.append(".")
@@ -1351,7 +1353,7 @@ class TasksForCommonProjectStructure:
1351
1353
  def standardized_tasks_do_common_tasks(self, common_tasks_scripts_file: str, codeunit_version: str, verbosity: int, targetenvironmenttype: str, clear_artifacts_folder: bool, additional_arguments_file: str, assume_dependent_codeunits_are_already_built: bool, commandline_arguments: list[str]) -> None:
1352
1354
  additional_arguments_file = self.get_additionalargumentsfile_from_commandline_arguments(commandline_arguments, additional_arguments_file)
1353
1355
  target_environmenttype = self.get_targetenvironmenttype_from_commandline_arguments(commandline_arguments, targetenvironmenttype)
1354
- assume_dependent_codeunits_are_already_built = self.get_assume_dependent_codeunits_are_already_built_from_commandline_arguments(commandline_arguments,assume_dependent_codeunits_are_already_built)
1356
+ assume_dependent_codeunits_are_already_built = self.get_assume_dependent_codeunits_are_already_built_from_commandline_arguments(commandline_arguments, assume_dependent_codeunits_are_already_built)
1355
1357
  if commandline_arguments is None:
1356
1358
  raise ValueError('The "commandline_arguments"-parameter is not defined.')
1357
1359
  if len(commandline_arguments) == 0:
@@ -1432,7 +1434,7 @@ class TasksForCommonProjectStructure:
1432
1434
 
1433
1435
  # Get artifacts from dependent codeunits
1434
1436
  if assume_dependent_codeunits_are_already_built:
1435
- self.build_dependent_code_units(repository_folder, codeunit_name, verbosity, target_environmenttype, additional_arguments_file,commandline_arguments)
1437
+ self.build_dependent_code_units(repository_folder, codeunit_name, verbosity, target_environmenttype, additional_arguments_file, commandline_arguments)
1436
1438
  self.copy_artifacts_from_dependent_code_units(repository_folder, codeunit_name)
1437
1439
 
1438
1440
  # Update codeunit-version
@@ -1489,10 +1491,17 @@ class TasksForCommonProjectStructure:
1489
1491
 
1490
1492
  @GeneralUtilities.check_arguments
1491
1493
  def standardized_tasks_build_for_angular_codeunit(self, build_script_file: str, build_environment_target_type: str, verbosity: int, commandline_arguments: list[str]) -> None:
1494
+ build_script_folder = os.path.dirname(build_script_file)
1495
+ codeunit_folder = GeneralUtilities.resolve_relative_path("../..", build_script_folder)
1496
+ GeneralUtilities.ensure_directory_does_not_exist(f"{codeunit_folder}/.angular")
1497
+ self.standardized_tasks_build_for_angular_codeunit(build_script_file, build_environment_target_type, verbosity, commandline_arguments)
1498
+
1499
+ @GeneralUtilities.check_arguments
1500
+ def standardized_tasks_build_for_node_codeunit(self, build_script_file: str, build_environment_target_type: str, verbosity: int, commandline_arguments: list[str]) -> None:
1492
1501
  verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
1493
1502
  build_script_folder = os.path.dirname(build_script_file)
1494
1503
  codeunit_folder = GeneralUtilities.resolve_relative_path("../..", build_script_folder)
1495
- self.run_with_epew("ng", f"build --configuration {build_environment_target_type}", codeunit_folder, verbosity=verbosity)
1504
+ self.run_with_epew("npm", f"run build-{build_environment_target_type}", codeunit_folder, verbosity=verbosity)
1496
1505
  self.standardized_tasks_build_bom_for_node_project(codeunit_folder, verbosity, commandline_arguments)
1497
1506
  self.copy_source_files_to_output_directory(build_script_file)
1498
1507
 
@@ -1502,13 +1511,15 @@ class TasksForCommonProjectStructure:
1502
1511
  # TODO
1503
1512
 
1504
1513
  @GeneralUtilities.check_arguments
1505
- def standardized_tasks_linting_for_angular_codeunit(self, linting_script_file: str, verbosity: int,
1506
- build_environment_target_type: str, commandline_arguments: list[str]) -> None:
1514
+ def standardized_tasks_linting_for_angular_codeunit(self, linting_script_file: str, verbosity: int, build_environment_target_type: str, commandline_arguments: list[str]) -> None:
1515
+ self.standardized_tasks_linting_for_node_codeunit(linting_script_file, verbosity, build_environment_target_type, commandline_arguments)
1516
+
1517
+ @GeneralUtilities.check_arguments
1518
+ def standardized_tasks_linting_for_node_codeunit(self, linting_script_file: str, verbosity: int, build_environment_target_type: str, commandline_arguments: list[str]) -> None:
1507
1519
  verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
1508
1520
  build_script_folder = os.path.dirname(linting_script_file)
1509
1521
  codeunit_folder = GeneralUtilities.resolve_relative_path("../..", build_script_folder)
1510
1522
  self.run_with_epew("ng", "lint", codeunit_folder, verbosity=verbosity)
1511
- # TODO check if there are errors in sarif-file
1512
1523
 
1513
1524
  @GeneralUtilities.check_arguments
1514
1525
  def standardized_tasks_run_testcases_for_flutter_project_in_common_project_structure(self, script_file: str, verbosity: int, args: list[str], package_name: str, build_environment_target_type: str, generate_badges: bool):
@@ -1517,15 +1528,13 @@ class TasksForCommonProjectStructure:
1517
1528
  codeunit_name = os.path.basename(codeunit_folder)
1518
1529
  src_folder = GeneralUtilities.resolve_relative_path(package_name, codeunit_folder)
1519
1530
  verbosity = self.get_verbosity_from_commandline_arguments(args, verbosity)
1520
- sc = ScriptCollectionCore()
1521
- sc.program_runner = ProgramRunnerEpew()
1522
- sc.run_program("flutter", "test --coverage", src_folder, verbosity)
1531
+ self.run_with_epew("flutter", "test --coverage", src_folder, verbosity)
1523
1532
  test_coverage_folder_relative = "Other/Artifacts/TestCoverage"
1524
1533
  test_coverage_folder = GeneralUtilities.resolve_relative_path(test_coverage_folder_relative, codeunit_folder)
1525
1534
  GeneralUtilities.ensure_directory_exists(test_coverage_folder)
1526
1535
  coverage_file_relative = f"{test_coverage_folder_relative}/TestCoverage.xml"
1527
1536
  coverage_file = GeneralUtilities.resolve_relative_path(coverage_file_relative, codeunit_folder)
1528
- sc.run_program("lcov_cobertura", f"coverage/lcov.info --base-dir . --excludes test --output ../{coverage_file_relative} --demangle", src_folder, verbosity)
1537
+ self.run_with_epew("lcov_cobertura", f"coverage/lcov.info --base-dir . --excludes test --output ../{coverage_file_relative} --demangle", src_folder, verbosity)
1529
1538
  content = GeneralUtilities.read_text_from_file(coverage_file)
1530
1539
  content = re.sub('<![^<]+>', '', content)
1531
1540
  content = re.sub('\\\\', '/', content)
@@ -1537,21 +1546,65 @@ class TasksForCommonProjectStructure:
1537
1546
 
1538
1547
  @GeneralUtilities.check_arguments
1539
1548
  def standardized_tasks_run_testcases_for_angular_codeunit(self, runtestcases_script_file: str, build_environment_target_type: str, generate_badges: bool, verbosity: int, commandline_arguments: list[str]) -> None:
1549
+ # prepare
1540
1550
  codeunit_name: str = os.path.basename(str(Path(os.path.dirname(runtestcases_script_file)).parent.parent.absolute()))
1541
1551
  verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
1542
1552
  codeunit_folder = GeneralUtilities.resolve_relative_path("../..", os.path.dirname(runtestcases_script_file))
1543
1553
  repository_folder = os.path.dirname(codeunit_folder)
1544
- self.run_with_epew(
1545
- "ng", "test --watch=false --browsers ChromeHeadless --code-coverage", codeunit_folder, verbosity=verbosity)
1554
+
1555
+ # run testcases
1556
+ self.standardized_tasks_run_testcases_for_node_codeunit(runtestcases_script_file, build_environment_target_type, generate_badges, verbosity, commandline_arguments)
1557
+
1558
+ # rename file
1546
1559
  coverage_folder = os.path.join(codeunit_folder, "Other", "Artifacts", "TestCoverage")
1547
1560
  target_file = os.path.join(coverage_folder, "TestCoverage.xml")
1548
1561
  GeneralUtilities.ensure_file_does_not_exist(target_file)
1549
1562
  os.rename(os.path.join(coverage_folder, "cobertura-coverage.xml"), target_file)
1550
1563
  self.__rename_packagename_in_coverage_file(target_file, codeunit_name)
1564
+
1565
+ # adapt backslashs to slashs
1551
1566
  content = GeneralUtilities.read_text_from_file(target_file)
1552
1567
  content = re.sub('\\\\', '/', content)
1568
+ GeneralUtilities.write_text_to_file(target_file, content)
1569
+
1570
+ # aggregate packages in testcoverage-file
1571
+ roottree: etree._ElementTree = etree.parse(target_file)
1572
+ existing_classes = list(roottree.xpath('//coverage/packages/package/classes/class'))
1573
+
1574
+ old_packages_list = roottree.xpath('//coverage/packages/package')
1575
+ for package in old_packages_list:
1576
+ package.getparent().remove(package)
1577
+
1578
+ root = roottree.getroot()
1579
+ packages_element = root.find("packages")
1580
+ package_element = etree.SubElement(packages_element, "package")
1581
+ package_element.attrib['name'] = codeunit_name
1582
+ package_element.attrib['lines-valid'] = root.attrib["lines-valid"]
1583
+ package_element.attrib['lines-covered'] = root.attrib["lines-covered"]
1584
+ package_element.attrib['line-rate'] = root.attrib["line-rate"]
1585
+ package_element.attrib['branches-valid'] = root.attrib["branches-valid"]
1586
+ package_element.attrib['branches-covered'] = root.attrib["branches-covered"]
1587
+ package_element.attrib['branch-rate'] = root.attrib["branch-rate"]
1588
+ package_element.attrib['timestamp'] = root.attrib["timestamp"]
1589
+ package_element.attrib['complexity'] = root.attrib["complexity"]
1590
+
1591
+ classes_element = etree.SubElement(package_element, "classes")
1592
+
1593
+ for existing_class in existing_classes:
1594
+ classes_element.append(existing_class)
1595
+
1596
+ result = etree.tostring(roottree, pretty_print=True).decode("utf-8")
1597
+ GeneralUtilities.write_text_to_file(target_file, result)
1598
+
1599
+ # post tasks
1553
1600
  self.run_testcases_common_post_task(repository_folder, codeunit_name, verbosity, generate_badges, build_environment_target_type, commandline_arguments)
1554
1601
 
1602
+ @GeneralUtilities.check_arguments
1603
+ def standardized_tasks_run_testcases_for_node_codeunit(self, runtestcases_script_file: str, build_environment_target_type: str, generate_badges: bool, verbosity: int, commandline_arguments: list[str]) -> None:
1604
+ verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
1605
+ codeunit_folder = GeneralUtilities.resolve_relative_path("../..", os.path.dirname(runtestcases_script_file))
1606
+ self.run_with_epew("npm", f"run test-{build_environment_target_type}", codeunit_folder, verbosity=verbosity)
1607
+
1555
1608
  @GeneralUtilities.check_arguments
1556
1609
  def __rename_packagename_in_coverage_file(self, file: str, codeunit_name: str) -> None:
1557
1610
  root: etree._ElementTree = etree.parse(file)
@@ -1563,13 +1616,13 @@ class TasksForCommonProjectStructure:
1563
1616
 
1564
1617
  @GeneralUtilities.check_arguments
1565
1618
  def do_npm_install(self, package_json_folder: str, verbosity: int) -> None:
1566
- self.run_with_epew("npm", "install", package_json_folder, verbosity=verbosity)
1619
+ self.run_with_epew("npm", "clean-install", package_json_folder, verbosity=verbosity)
1567
1620
 
1568
1621
  @GeneralUtilities.check_arguments
1569
- def run_with_epew(self, program: str, argument: str, working_directory: str, verbosity: int) -> None:
1622
+ def run_with_epew(self, program: str, argument: str = "", working_directory: str = None, verbosity: int = 1, print_errors_as_information: bool = False, log_file: str = None, timeoutInSeconds: int = 600, addLogOverhead: bool = False, title: str = None, log_namespace: str = "", arguments_for_log: list[str] = None, throw_exception_if_exitcode_is_not_zero: bool = True, custom_argument: object = None, interactive: bool = False) -> tuple[int, str, str, int]:
1570
1623
  sc: ScriptCollectionCore = ScriptCollectionCore()
1571
1624
  sc.program_runner = ProgramRunnerEpew()
1572
- sc.run_program(program, argument, working_directory, verbosity=verbosity)
1625
+ return sc.run_program(program, argument, working_directory, verbosity, print_errors_as_information, log_file, timeoutInSeconds, addLogOverhead, title, log_namespace, arguments_for_log, throw_exception_if_exitcode_is_not_zero, custom_argument, interactive)
1573
1626
 
1574
1627
  @GeneralUtilities.check_arguments
1575
1628
  def set_default_constants(self, codeunit_folder: str) -> None:
@@ -1664,7 +1717,7 @@ class TasksForCommonProjectStructure:
1664
1717
  raise ValueError("Too many results found.")
1665
1718
 
1666
1719
  @GeneralUtilities.check_arguments
1667
- def copy_development_certificate_to_default_development_directory(self, codeunit_folder: str, build_environment: str, domain: str = None, certificate_resource_name: str = "DevelopmentCertificate") -> None:
1720
+ def copy_development_certificate_to_default_development_directory(self, codeunit_folder: str, build_environment: str, domain: str = None, certificate_resource_name: str = "DevelopmentCertificate") -> None:
1668
1721
  if build_environment == "Development":
1669
1722
  codeunit_name: str = os.path.basename(codeunit_folder)
1670
1723
  if domain is None:
@@ -1736,13 +1789,14 @@ class TasksForCommonProjectStructure:
1736
1789
  GeneralUtilities.write_message_to_stdout("Generate OpenAPI-specification-file...")
1737
1790
  codeunitname = os.path.basename(str(Path(os.path.dirname(buildscript_file)).parent.parent.absolute()))
1738
1791
  repository_folder = str(Path(os.path.dirname(buildscript_file)).parent.parent.parent.absolute())
1739
- artifacts_folder = os.path.join(repository_folder, codeunitname, "Other", "Artifacts")
1792
+ codeunit_folder = os.path.join(repository_folder, codeunitname)
1793
+ artifacts_folder = os.path.join(codeunit_folder, "Other", "Artifacts")
1740
1794
  GeneralUtilities.ensure_directory_exists(os.path.join(artifacts_folder, "APISpecification"))
1741
1795
  verbosity = self.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
1742
- codeunit_version = self.get_version_of_codeunit_folder(os.path.join(repository_folder, codeunitname))
1743
- self.__sc.run_program("swagger", f"tofile --output APISpecification\\{codeunitname}.v{codeunit_version}.api.json" +
1744
- f" BuildResult_DotNet_{runtime}\\{codeunitname}.dll {swagger_document_name}",
1745
- artifacts_folder, verbosity=verbosity)
1796
+ codeunit_version = self.get_version_of_codeunit_folder(codeunit_folder)
1797
+ versioned_api_spec_file = f"APISpecification/{codeunitname}.v{codeunit_version}.api.json"
1798
+ self.__sc.run_program("swagger", f"tofile --output {versioned_api_spec_file} BuildResult_DotNet_{runtime}/{codeunitname}.dll {swagger_document_name}", artifacts_folder, verbosity=verbosity)
1799
+ shutil.copyfile(os.path.join(artifacts_folder, versioned_api_spec_file), os.path.join(artifacts_folder, f"APISpecification/{codeunitname}.latest.api.json"))
1746
1800
 
1747
1801
  @GeneralUtilities.check_arguments
1748
1802
  def replace_version_in_packagejson_file(self, packagejson_file: str, codeunit_version: str) -> None:
@@ -1754,8 +1808,8 @@ class TasksForCommonProjectStructure:
1754
1808
  json.dump(data, f, indent=2)
1755
1809
 
1756
1810
  @GeneralUtilities.check_arguments
1757
- def build_dependent_code_units(self, repo_folder: str, codeunit_name: str, verbosity: int, target_environmenttype: str, additional_arguments_file: str, commandlinearguments:list[str]) -> None:
1758
- verbosity=self.get_verbosity_from_commandline_arguments(commandlinearguments,verbosity)
1811
+ def build_dependent_code_units(self, repo_folder: str, codeunit_name: str, verbosity: int, target_environmenttype: str, additional_arguments_file: str, commandlinearguments: list[str]) -> None:
1812
+ verbosity = self.get_verbosity_from_commandline_arguments(commandlinearguments, verbosity)
1759
1813
  codeunit_file = os.path.join(repo_folder, codeunit_name, codeunit_name + ".codeunit.xml")
1760
1814
  dependent_codeunits = self.get_dependent_code_units(codeunit_file)
1761
1815
  dependent_codeunits_folder = os.path.join(repo_folder, codeunit_name, "Other", "Resources", "DependentCodeUnits")
@@ -1763,7 +1817,7 @@ class TasksForCommonProjectStructure:
1763
1817
  if 0 < len(dependent_codeunits):
1764
1818
  GeneralUtilities.write_message_to_stdout(f"Start building dependent codeunits for codeunit {codeunit_name}.")
1765
1819
  for dependent_codeunit in dependent_codeunits:
1766
- self.__build_codeunit(os.path.join(repo_folder, dependent_codeunit), verbosity, target_environmenttype, additional_arguments_file,False,False,commandlinearguments)
1820
+ self.__build_codeunit(os.path.join(repo_folder, dependent_codeunit), verbosity, target_environmenttype, additional_arguments_file, False, False, commandlinearguments)
1767
1821
  if 0 < len(dependent_codeunits):
1768
1822
  GeneralUtilities.write_message_to_stdout(f"Finished building dependent codeunits for codeunit {codeunit_name}.")
1769
1823
 
@@ -1791,12 +1845,11 @@ class TasksForCommonProjectStructure:
1791
1845
  for codeunit in codeunits:
1792
1846
  artifact_files.append(self.__sc.find_file_by_extension(f"{build_artifacts_folder}\\{productname}\\{projectversion}\\{codeunit}", "Productive.Artifacts.zip"))
1793
1847
  changelog_file = os.path.join(repository_folder, "Other", "Resources", "Changelog", f"v{projectversion}.md")
1794
- self.__sc.run_program_argsasarray("gh", ["release", "create", f"v{projectversion}", "--repo", github_repo, "--notes-file", changelog_file,
1795
- "--title", f"Release v{projectversion}"]+artifact_files, verbosity=verbosity)
1848
+ self.__sc.run_program_argsasarray("gh", ["release", "create", f"v{projectversion}", "--repo", github_repo, "--notes-file", changelog_file, "--title", f"Release v{projectversion}"]+artifact_files, verbosity=verbosity)
1796
1849
 
1797
1850
  @GeneralUtilities.check_arguments
1798
1851
  def update_dependencies_of_typical_flutter_codeunit(self, update_script_file: str, verbosity: int, cmd_args: list[str]) -> None:
1799
- pass # TODO
1852
+ pass # TODO generalize and add option to ignore certain dependencies
1800
1853
 
1801
1854
  @GeneralUtilities.check_arguments
1802
1855
  def update_dependencies_of_typical_python_codeunit(self, update_script_file: str, verbosity: int, cmd_args: list[str]) -> None:
@@ -1825,11 +1878,36 @@ class TasksForCommonProjectStructure:
1825
1878
 
1826
1879
  @GeneralUtilities.check_arguments
1827
1880
  def update_dependencies_of_typical_node_codeunit(self, update_script_file: str, verbosity: int, cmd_args: list[str]) -> None:
1828
- pass # TODO generalize and add option to ignore certain dependencies
1881
+ current_folder = os.path.dirname(update_script_file)
1882
+ result = self.run_with_epew("npm", "outdated", current_folder, verbosity, throw_exception_if_exitcode_is_not_zero=False)
1883
+ if result[0] == 0:
1884
+ return # all dependencies up to date
1885
+ elif result[0] == 1:
1886
+ package_json_content = None
1887
+ package_json_file = f"{current_folder}/package.json"
1888
+ with open(package_json_file, "r", encoding="utf-8") as package_json_file_object:
1889
+ package_json_content = json.load(package_json_file_object)
1890
+ lines = GeneralUtilities.string_to_lines(result[1])[1:][:-1]
1891
+ for line in lines:
1892
+ normalized_line_splitted = ' '.join(line.split()).split(" ")
1893
+ package = normalized_line_splitted[0]
1894
+ latest_version = normalized_line_splitted[3]
1895
+ if package in package_json_content["dependencies"]:
1896
+ package_json_content["dependencies"][package] = latest_version
1897
+ if package in package_json_content["devDependencies"]:
1898
+ package_json_content["devDependencies"][package] = latest_version
1899
+ with open(package_json_file, "w", encoding="utf-8") as package_json_file_object:
1900
+ json.dump(package_json_content, package_json_file_object, indent=4)
1901
+ self.run_with_epew("npm", "install --force", current_folder, verbosity)
1902
+ else:
1903
+ GeneralUtilities.write_message_to_stderr("Update dependencies resulted in an error.")
1829
1904
 
1830
1905
  @GeneralUtilities.check_arguments
1831
1906
  def run_local_test_service(self, file: str):
1832
1907
  example_folder = os.path.dirname(file)
1908
+ docker_compose_file = os.path.join(example_folder, "docker-compose.yml")
1909
+ for service in self.__sc.get_services_from_yaml_file(docker_compose_file):
1910
+ self.__sc.kill_docker_container(service)
1833
1911
  example_name = os.path.basename(example_folder)
1834
1912
  title = f"Test{example_name}"
1835
1913
  self.__sc.run_program("docker", f"compose -p {title.lower()} up", example_folder, title=title)
@@ -1915,33 +1993,31 @@ class TasksForCommonProjectStructure:
1915
1993
  raise ValueError(f"Invalid target-environmenttype: '{target_environmenttype}'")
1916
1994
 
1917
1995
  @GeneralUtilities.check_arguments
1918
- def build_codeunit(self, codeunit_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None, assume_dependent_codeunits_are_already_built: bool = False,commandlinearguments:list[str]=[]) -> None:
1996
+ def build_codeunit(self, codeunit_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None, assume_dependent_codeunits_are_already_built: bool = False, commandlinearguments: list[str] = []) -> None:
1919
1997
  codeunit_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(codeunit_folder)
1920
1998
  codeunit_name = os.path.basename(codeunit_folder)
1921
1999
  repository_folder = os.path.dirname(codeunit_folder)
1922
- self.build_specific_codeunits(repository_folder, [codeunit_name], verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, export_target_directory, assume_dependent_codeunits_are_already_built,commandlinearguments)
2000
+ self.build_specific_codeunits(repository_folder, [codeunit_name], verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, export_target_directory, assume_dependent_codeunits_are_already_built, commandlinearguments)
1923
2001
 
1924
2002
  @GeneralUtilities.check_arguments
1925
- def build_codeunitsC(self, repository_folder: str, image: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None,commandlinearguments:list[str]=[]) -> None:
2003
+ def build_codeunitsC(self, repository_folder: str, image: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, commandlinearguments: list[str] = []) -> None:
1926
2004
  if target_environmenttype == "Development":
1927
2005
  raise ValueError(f"build_codeunitsC is not available for target_environmenttype {target_environmenttype}.")
1928
2006
  # TODO handle additional_arguments_file
1929
2007
  # TODO add option to allow building different codeunits in same project with different images due to their demands
1930
2008
  # TODO check if image provides all demands of codeunit
1931
2009
  self.__sc.run_program(
1932
- "docker", f"run --volume {repository_folder}:/Workspace/Repository " +
1933
- f"-e repositoryfolder=/Workspace/Repository -e verbosity={verbosity} -e targetenvironment={target_environmenttype} {image}",
1934
- repository_folder)
2010
+ "docker", f"run --volume {repository_folder}:/Workspace/Repository " + f"-e repositoryfolder=/Workspace/Repository -e verbosity={verbosity} -e targetenvironment={target_environmenttype} {image}", repository_folder)
1935
2011
 
1936
2012
  @GeneralUtilities.check_arguments
1937
- def build_codeunits(self, repository_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None,commandline_arguments:list[str]=[]) -> None:
2013
+ def build_codeunits(self, repository_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None, commandline_arguments: list[str] = []) -> None:
1938
2014
  self.__check_target_environmenttype(target_environmenttype)
1939
2015
  repository_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(repository_folder)
1940
2016
  codeunits = self.get_codeunits(repository_folder, False)
1941
- self.build_specific_codeunits(repository_folder, codeunits, verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, export_target_directory,False,commandline_arguments)
2017
+ self.build_specific_codeunits(repository_folder, codeunits, verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, export_target_directory, False, commandline_arguments)
1942
2018
 
1943
2019
  @GeneralUtilities.check_arguments
1944
- def build_specific_codeunits(self, repository_folder: str, codeunits: list[str], verbosity: int = 1, target_environmenttype: str = "QualityCheck",additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None, assume_dependent_codeunits_are_already_built: bool = True,commandline_arguments:list[str]=[]) -> None:
2020
+ def build_specific_codeunits(self, repository_folder: str, codeunits: list[str], verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None, assume_dependent_codeunits_are_already_built: bool = True, commandline_arguments: list[str] = []) -> None:
1945
2021
  self.__check_target_environmenttype(target_environmenttype)
1946
2022
  repository_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(repository_folder)
1947
2023
  contains_uncommitted_changes = self.__sc.git_repository_has_uncommitted_changes(repository_folder)
@@ -1971,8 +2047,7 @@ class TasksForCommonProjectStructure:
1971
2047
  line = "----------"
1972
2048
  for codeunit in sorted_codeunits:
1973
2049
  GeneralUtilities.write_message_to_stdout(line)
1974
- self.__build_codeunit(os.path.join(repository_folder, codeunit), verbosity, target_environmenttype,
1975
- additional_arguments_file, is_pre_merge, assume_dependent_codeunits_are_already_built,commandline_arguments)
2050
+ self.__build_codeunit(os.path.join(repository_folder, codeunit), verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, assume_dependent_codeunits_are_already_built, commandline_arguments)
1976
2051
  GeneralUtilities.write_message_to_stdout(line)
1977
2052
  if not contains_uncommitted_changes and self.__sc.git_repository_has_uncommitted_changes(repository_folder) and not is_pre_merge:
1978
2053
  message = f'Due to the build-process the repository "{repository_folder}" has new uncommitted changes.'
@@ -2003,7 +2078,7 @@ class TasksForCommonProjectStructure:
2003
2078
 
2004
2079
  @GeneralUtilities.check_arguments
2005
2080
  def __check_if_folder_is_git_repository(self, repository_folder: str) -> None:
2006
- if(not self.__sc.is_git_repository(repository_folder)):
2081
+ if (not self.__sc.is_git_repository(repository_folder)):
2007
2082
  raise ValueError(f"Folder {repository_folder} is not a git-repository")
2008
2083
 
2009
2084
  @GeneralUtilities.check_arguments
@@ -2146,7 +2221,7 @@ class TasksForCommonProjectStructure:
2146
2221
  for file in GeneralUtilities.get_all_files_of_folder(files_folder):
2147
2222
  if file.endswith(".plantuml"):
2148
2223
  argument = ['-jar', f'{plant_uml_folder}/plantuml.jar', os.path.basename(file).replace("\\", "/"), '-tsvg']
2149
- sc.run_program_argsasarray("java", argument, os.path.dirname(file),verbosity=0)
2224
+ sc.run_program_argsasarray("java", argument, os.path.dirname(file), verbosity=0)
2150
2225
 
2151
2226
  @GeneralUtilities.check_arguments
2152
2227
  def load_deb_control_file_content(self, file: str, codeunitname: str, codeunitversion: str, installedsize: int, maintainername: str, maintaineremail: str, description: str,) -> str:
@@ -2224,7 +2299,7 @@ class TasksForCommonProjectStructure:
2224
2299
  GeneralUtilities.write_message_to_stderr(f"Warning: {message}")
2225
2300
 
2226
2301
  @GeneralUtilities.check_arguments
2227
- def __build_codeunit(self, codeunit_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, assume_dependent_codeunits_are_already_built: bool = False,commandline_arguments:list[str]=[]) -> None:
2302
+ def __build_codeunit(self, codeunit_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, assume_dependent_codeunits_are_already_built: bool = False, commandline_arguments: list[str] = []) -> None:
2228
2303
  now = datetime.now()
2229
2304
  codeunit_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(codeunit_folder)
2230
2305
  codeunit_name: str = os.path.basename(codeunit_folder)
@@ -2242,7 +2317,7 @@ class TasksForCommonProjectStructure:
2242
2317
  GeneralUtilities.write_message_to_stdout(f"Build-environmenttype: {target_environmenttype}")
2243
2318
  GeneralUtilities.ensure_directory_does_not_exist(artifacts_folder)
2244
2319
 
2245
- verbosity_for_executed_programs = self.get_verbosity_from_commandline_arguments(commandline_arguments,verbosity)
2320
+ verbosity_for_executed_programs = self.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
2246
2321
 
2247
2322
  other_folder = os.path.join(codeunit_folder, "Other")
2248
2323
  build_folder = os.path.join(other_folder, "Build")
@@ -2340,13 +2415,15 @@ class TasksForCommonProjectStructure:
2340
2415
  def generic_update_dependencies(self, repository_folder: str):
2341
2416
  codeunits = self.get_codeunits(repository_folder)
2342
2417
  updated_dependencies = False
2418
+ verbosity: int = 1 # TODO set value dynamically
2343
2419
  for codeunit in codeunits:
2344
2420
  codeunit_file = os.path.join(repository_folder, codeunit, f"{codeunit}.codeunit.xml")
2345
2421
  codeunit_has_updatable_dependencies = self.codeunit_has_updatable_dependencies(codeunit_file)
2346
2422
  if codeunit_has_updatable_dependencies:
2347
2423
  codeunit_folder = os.path.join(repository_folder, codeunit)
2348
2424
  update_dependencies_script_folder = os.path.join(codeunit_folder, "Other")
2349
- self.__sc.run_program("python", "UpdateDependencies.py", update_dependencies_script_folder)#TODO set verbosity
2425
+ GeneralUtilities.ensure_directory_exists(os.path.join(update_dependencies_script_folder, "Resources", "CodeAnalysisResult"))
2426
+ self.__sc.run_program("python", "UpdateDependencies.py", update_dependencies_script_folder, verbosity)
2350
2427
  if self.__sc.git_repository_has_uncommitted_changes(repository_folder):
2351
2428
  version_of_project = self.get_version_of_project(repository_folder)
2352
2429
  changelog_file = os.path.join(repository_folder, "Other", "Resources", "Changelog", f"v{version_of_project}.md")
@@ -2362,7 +2439,7 @@ class TasksForCommonProjectStructure:
2362
2439
  else:
2363
2440
  GeneralUtilities.write_message_to_stdout(f"There are no dependencies to update in codeunit {codeunit}.")
2364
2441
  if updated_dependencies:
2365
- self.__sc.run_program("scbuildcodeunits", "--targetenvironment QualityCheck", repository_folder)#TODO set verbosity
2442
+ self.__sc.run_program("scbuildcodeunits", "--targetenvironment QualityCheck", repository_folder) # TODO set verbosity
2366
2443
  self.__sc.git_commit(repository_folder, "Updated dependencies")
2367
2444
 
2368
2445
  class GenericPrepareNewReleaseArguments:
@@ -2389,7 +2466,7 @@ class TasksForCommonProjectStructure:
2389
2466
  # prepare
2390
2467
  self.assert_no_uncommitted_changes(repository_folder)
2391
2468
  self.__sc.git_checkout(repository_folder, merge_source_branch)
2392
- if not "--prevent-dependency-update" in generic_prepare_new_release_arguments.commandline_arguments:
2469
+ if "--dependencyupdate" in generic_prepare_new_release_arguments.commandline_arguments:
2393
2470
  self.generic_update_dependencies(repository_folder)
2394
2471
  self.merge_to_main_branch(repository_folder, merge_source_branch, verbosity=verbosity, fast_forward_source_branch=True)
2395
2472
  self.__sc.git_commit(build_repository_folder, "Updated submodule due to merge to main-branch.")
@@ -2401,7 +2478,7 @@ class TasksForCommonProjectStructure:
2401
2478
  artifacts_target_folder: str
2402
2479
  commandline_arguments: list[str]
2403
2480
 
2404
- def __init__(self, current_file: str, product_name: str, common_remote_name: str, artifacts_target_folder: str,commandline_arguments: list[str]):
2481
+ def __init__(self, current_file: str, product_name: str, common_remote_name: str, artifacts_target_folder: str, commandline_arguments: list[str]):
2405
2482
  self.current_file = current_file
2406
2483
  self.product_name = product_name
2407
2484
  self.common_remote_name = common_remote_name
@@ -2409,7 +2486,7 @@ class TasksForCommonProjectStructure:
2409
2486
  self.commandline_arguments = commandline_arguments
2410
2487
 
2411
2488
  @GeneralUtilities.check_arguments
2412
- def generic_create_release(self, generic_create_release_arguments:GenericCreateReleaseArguments) -> str:
2489
+ def generic_create_release(self, generic_create_release_arguments: GenericCreateReleaseArguments) -> str:
2413
2490
  folder_of_this_file = os.path.dirname(generic_create_release_arguments.current_file)
2414
2491
  build_repository_folder = GeneralUtilities.resolve_relative_path("../..", folder_of_this_file)
2415
2492
  repository_folder_name = generic_create_release_arguments.product_name
@@ -2418,10 +2495,18 @@ class TasksForCommonProjectStructure:
2418
2495
  verbosity: int = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(generic_create_release_arguments.commandline_arguments, 1)
2419
2496
  createReleaseConfiguration: CreateReleaseConfiguration = CreateReleaseConfiguration(
2420
2497
  generic_create_release_arguments.product_name, generic_create_release_arguments.common_remote_name, generic_create_release_arguments.artifacts_target_folder, folder_of_this_file, verbosity, repository_folder, additional_arguments_file, repository_folder_name)
2498
+
2499
+ reference_repo: str = os.path.join(build_repository_folder, "Submodules", f"{generic_create_release_arguments.product_name}Reference")
2500
+ self.__sc.git_commit(reference_repo, "Updated reference")
2501
+
2421
2502
  self.__sc.git_commit(build_repository_folder, "Updated submodule")
2422
2503
 
2423
2504
  # create release
2424
2505
  new_version = self.merge_to_stable_branch(generic_create_release_arguments.current_file, createReleaseConfiguration)
2506
+
2507
+ merge_source_branch = "other/next-release"
2508
+ self.__sc.git_checkout(repository_folder, merge_source_branch)
2509
+
2425
2510
  return new_version
2426
2511
 
2427
2512
  class UpdateHTTPDocumentationArguments: