ScriptCollection 3.5.2__py3-none-any.whl → 3.5.4__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.
- ScriptCollection/Executables.py +5 -4
- ScriptCollection/ProcessesRunner.py +41 -0
- ScriptCollection/ProgramRunnerBase.py +5 -0
- ScriptCollection/RPStream.py +42 -0
- ScriptCollection/ScriptCollectionCore.py +137 -225
- ScriptCollection/TasksForCommonProjectStructure.py +138 -77
- ScriptCollection/UpdateCertificates.py +2 -2
- {ScriptCollection-3.5.2.dist-info → ScriptCollection-3.5.4.dist-info}/METADATA +3 -2
- ScriptCollection-3.5.4.dist-info/RECORD +16 -0
- {ScriptCollection-3.5.2.dist-info → ScriptCollection-3.5.4.dist-info}/WHEEL +1 -1
- ScriptCollection-3.5.2.dist-info/RECORD +0 -14
- {ScriptCollection-3.5.2.dist-info → ScriptCollection-3.5.4.dist-info}/entry_points.txt +0 -0
- {ScriptCollection-3.5.2.dist-info → ScriptCollection-3.5.4.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|
@@ -169,6 +170,7 @@ class TasksForCommonProjectStructure:
|
|
|
169
170
|
|
|
170
171
|
@GeneralUtilities.check_arguments
|
|
171
172
|
def check_testcoverage(self, testcoverage_file_in_cobertura_format: str, repository_folder: str, codeunitname: str) -> None:
|
|
173
|
+
GeneralUtilities.write_message_to_stdout("Check testcoverage..")
|
|
172
174
|
root: etree._ElementTree = etree.parse(testcoverage_file_in_cobertura_format)
|
|
173
175
|
if len(root.xpath('//coverage/packages/package')) != 1:
|
|
174
176
|
raise ValueError(f"'{testcoverage_file_in_cobertura_format}' must contain exactly 1 package.")
|
|
@@ -204,6 +206,7 @@ class TasksForCommonProjectStructure:
|
|
|
204
206
|
|
|
205
207
|
@GeneralUtilities.check_arguments
|
|
206
208
|
def copy_source_files_to_output_directory(self, buildscript_file: str) -> None:
|
|
209
|
+
GeneralUtilities.write_message_to_stdout("Copy sourcecode...")
|
|
207
210
|
sc = ScriptCollectionCore()
|
|
208
211
|
folder = os.path.dirname(os.path.realpath(buildscript_file))
|
|
209
212
|
codeunit_folder = GeneralUtilities.resolve_relative_path("../..", folder)
|
|
@@ -230,8 +233,7 @@ class TasksForCommonProjectStructure:
|
|
|
230
233
|
for target in targets:
|
|
231
234
|
GeneralUtilities.write_message_to_stdout(f"Build package {package_name} for target {target}...")
|
|
232
235
|
sc = ScriptCollectionCore()
|
|
233
|
-
|
|
234
|
-
sc.run_program("flutter", f"build {target}", src_folder, verbosity)
|
|
236
|
+
self.run_with_epew("flutter", f"build {target}", src_folder, verbosity)
|
|
235
237
|
if target == "web":
|
|
236
238
|
web_relase_folder = os.path.join(src_folder, "build/web")
|
|
237
239
|
web_folder = os.path.join(artifacts_folder, "BuildResult_WebApplication")
|
|
@@ -618,6 +620,8 @@ class TasksForCommonProjectStructure:
|
|
|
618
620
|
|
|
619
621
|
@GeneralUtilities.check_arguments
|
|
620
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)
|
|
624
|
+
GeneralUtilities.write_message_to_stdout(f"Build {csproj_filename}...")
|
|
621
625
|
dotnet_build_configuration: str = target_environmenttype_mapping[target_environmenttype]
|
|
622
626
|
verbosity = self.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
|
|
623
627
|
codeunit_folder = os.path.join(repository_folder, codeunit_name)
|
|
@@ -720,6 +724,7 @@ class TasksForCommonProjectStructure:
|
|
|
720
724
|
|
|
721
725
|
@GeneralUtilities.check_arguments
|
|
722
726
|
def generate_sbom_for_dotnet_project(self, codeunit_folder: str, verbosity: int, commandline_arguments: list[str]) -> None:
|
|
727
|
+
GeneralUtilities.write_message_to_stdout("Generate SBOM...")
|
|
723
728
|
codeunit_name = os.path.basename(codeunit_folder)
|
|
724
729
|
sc = ScriptCollectionCore()
|
|
725
730
|
bomfile_folder = "Other\\Artifacts\\BOM"
|
|
@@ -764,16 +769,19 @@ class TasksForCommonProjectStructure:
|
|
|
764
769
|
which contains a test-coverage-report in the cobertura-format exists.
|
|
765
770
|
This script expectes that the testcoverage-reportfolder is '<repositorybasefolder>/<codeunitname>/Other/Artifacts/TestCoverageReport'.
|
|
766
771
|
This script expectes that a test-coverage-badges should be added to '<repositorybasefolder>/<codeunitname>/Other/Resources/Badges'."""
|
|
772
|
+
GeneralUtilities.write_message_to_stdout("Generate testcoverage report..")
|
|
767
773
|
codeunit_version = self.get_version_of_codeunit(os.path.join(repository_folder, codeunitname, f"{codeunitname}.codeunit.xml"))
|
|
768
774
|
verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
|
|
769
775
|
if verbosity == 0:
|
|
770
776
|
verbose_argument_for_reportgenerator = "Off"
|
|
771
|
-
|
|
777
|
+
elif verbosity == 1:
|
|
772
778
|
verbose_argument_for_reportgenerator = "Error"
|
|
773
|
-
|
|
779
|
+
elif verbosity == 2:
|
|
774
780
|
verbose_argument_for_reportgenerator = "Info"
|
|
775
|
-
|
|
781
|
+
elif verbosity == 3:
|
|
776
782
|
verbose_argument_for_reportgenerator = "Verbose"
|
|
783
|
+
else:
|
|
784
|
+
raise ValueError(f"Unknown value for verbosity: {GeneralUtilities.str_none_safe(verbosity)}")
|
|
777
785
|
|
|
778
786
|
# Generating report
|
|
779
787
|
GeneralUtilities.ensure_directory_does_not_exist(os.path.join(repository_folder, codeunitname, f"{codeunitname}/Other/Artifacts/TestCoverageReport"))
|
|
@@ -786,11 +794,8 @@ class TasksForCommonProjectStructure:
|
|
|
786
794
|
history_folder_full = os.path.join(repository_folder, history_folder)
|
|
787
795
|
GeneralUtilities.ensure_directory_exists(history_folder_full)
|
|
788
796
|
history_argument = f" -historydir:{history_folder}"
|
|
789
|
-
argument =
|
|
790
|
-
|
|
791
|
-
f"-title:{codeunitname} -tag:v{codeunit_version}")
|
|
792
|
-
self.__sc.run_program("reportgenerator", argument,
|
|
793
|
-
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)
|
|
794
799
|
if not add_testcoverage_history_entry:
|
|
795
800
|
os.remove(GeneralUtilities.get_direct_files_of_folder(history_folder_full)[-1])
|
|
796
801
|
|
|
@@ -800,13 +805,11 @@ class TasksForCommonProjectStructure:
|
|
|
800
805
|
fulltestcoverageubfolger = os.path.join(repository_folder, codeunitname, testcoverageubfolger)
|
|
801
806
|
GeneralUtilities.ensure_directory_does_not_exist(fulltestcoverageubfolger)
|
|
802
807
|
GeneralUtilities.ensure_directory_exists(fulltestcoverageubfolger)
|
|
803
|
-
self.__sc.run_program("reportgenerator", "-reports:Other/Artifacts/TestCoverage/TestCoverage.xml "
|
|
804
|
-
f"-targetdir:{testcoverageubfolger} -reporttypes:Badges " +
|
|
805
|
-
f"--verbosity:{verbose_argument_for_reportgenerator}", os.path.join(repository_folder, codeunitname),
|
|
806
|
-
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)
|
|
807
809
|
|
|
808
810
|
@GeneralUtilities.check_arguments
|
|
809
|
-
def standardized_tasks_run_testcases_for_dotnet_project(self, runtestcases_file: str, targetenvironmenttype: str, verbosity: int, generate_badges: bool,
|
|
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:
|
|
812
|
+
GeneralUtilities.write_message_to_stdout("Run testcases...")
|
|
810
813
|
dotnet_build_configuration: str = target_environmenttype_mapping[targetenvironmenttype]
|
|
811
814
|
codeunit_name: str = os.path.basename(str(Path(os.path.dirname(runtestcases_file)).parent.parent.absolute()))
|
|
812
815
|
verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
|
|
@@ -835,8 +838,7 @@ class TasksForCommonProjectStructure:
|
|
|
835
838
|
self.run_testcases_common_post_task(repository_folder, codeunit_name, verbosity, generate_badges, targetenvironmenttype, commandline_arguments)
|
|
836
839
|
|
|
837
840
|
@GeneralUtilities.check_arguments
|
|
838
|
-
def run_testcases_common_post_task(self, repository_folder: str, codeunit_name: str, verbosity: int, generate_badges: bool,
|
|
839
|
-
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:
|
|
840
842
|
coverage_file_folder = os.path.join(repository_folder, codeunit_name, "Other/Artifacts/TestCoverage")
|
|
841
843
|
coveragefiletarget = os.path.join(coverage_file_folder, "TestCoverage.xml")
|
|
842
844
|
self.update_path_of_source_in_testcoverage_file(repository_folder, codeunit_name)
|
|
@@ -846,6 +848,7 @@ class TasksForCommonProjectStructure:
|
|
|
846
848
|
@staticmethod
|
|
847
849
|
@GeneralUtilities.check_arguments
|
|
848
850
|
def update_path_of_source_in_testcoverage_file(repository_folder: str, codeunitname: str) -> None:
|
|
851
|
+
GeneralUtilities.write_message_to_stdout("Update paths of source files in testcoverage files..")
|
|
849
852
|
folder = f"{repository_folder}/{codeunitname}/Other/Artifacts/TestCoverage"
|
|
850
853
|
filename = "TestCoverage.xml"
|
|
851
854
|
full_file = os.path.join(folder, filename)
|
|
@@ -857,8 +860,7 @@ class TasksForCommonProjectStructure:
|
|
|
857
860
|
filename = match.group(1)
|
|
858
861
|
file = os.path.join(source, filename)
|
|
859
862
|
# GeneralUtilities.assert_condition(os.path.isfile(file),f"File \"{file}\" does not exist.")
|
|
860
|
-
GeneralUtilities.assert_condition(file.startswith(codeunit_folder),
|
|
861
|
-
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}\"")
|
|
862
864
|
filename_relative = f".{file[len(codeunit_folder):]}"
|
|
863
865
|
return f'filename="{filename_relative}"'
|
|
864
866
|
|
|
@@ -868,15 +870,15 @@ class TasksForCommonProjectStructure:
|
|
|
868
870
|
root: etree._ElementTree = etree.parse(testcoveragefile)
|
|
869
871
|
codeunit_folder = os.path.join(repository_folder, codeunit_name)
|
|
870
872
|
xpath = f"//coverage/packages/package[@name='{codeunit_name}']/classes/class"
|
|
871
|
-
|
|
873
|
+
coverage_report_classes = root.xpath(xpath)
|
|
872
874
|
found_existing_files = False
|
|
873
|
-
for
|
|
874
|
-
filename =
|
|
875
|
+
for coverage_report_class in coverage_report_classes:
|
|
876
|
+
filename = coverage_report_class.attrib['filename']
|
|
875
877
|
file = os.path.join(codeunit_folder, filename)
|
|
876
878
|
if os.path.isfile(file):
|
|
877
879
|
found_existing_files = True
|
|
878
880
|
else:
|
|
879
|
-
|
|
881
|
+
coverage_report_class.getparent().remove(coverage_report_class)
|
|
880
882
|
GeneralUtilities.assert_condition(found_existing_files, f"No existing files in testcoderage-report-file \"{testcoveragefile}\".")
|
|
881
883
|
result = etree.tostring(root).decode("utf-8")
|
|
882
884
|
GeneralUtilities.write_text_to_file(testcoveragefile, result)
|
|
@@ -903,11 +905,12 @@ class TasksForCommonProjectStructure:
|
|
|
903
905
|
|
|
904
906
|
@GeneralUtilities.check_arguments
|
|
905
907
|
def standardized_tasks_linting_for_dotnet_project(self, linting_script_file: str, verbosity: int, targetenvironmenttype: str, commandline_arguments: list[str]) -> None:
|
|
908
|
+
GeneralUtilities.write_message_to_stdout("Run linting...")
|
|
906
909
|
verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
|
|
907
910
|
# TODO check if there are errors in sarif-file
|
|
908
911
|
|
|
909
912
|
@GeneralUtilities.check_arguments
|
|
910
|
-
def __export_codeunit_reference_content_to_reference_repository(self, project_version_identifier: str, replace_existing_content: bool,
|
|
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:
|
|
911
914
|
codeunit_folder = os.path.join(repository, codeunitname)
|
|
912
915
|
codeunit_file = os.path.join(codeunit_folder, f"{codeunitname}.codeunit.xml")
|
|
913
916
|
codeunit_has_testcases = self.codeunit_has_testable_sourcecode(codeunit_file)
|
|
@@ -922,8 +925,7 @@ class TasksForCommonProjectStructure:
|
|
|
922
925
|
diff_target_folder = os.path.join(target_folder, "DiffReport")
|
|
923
926
|
GeneralUtilities.ensure_directory_exists(diff_target_folder)
|
|
924
927
|
diff_target_file = os.path.join(diff_target_folder, "DiffReport.html")
|
|
925
|
-
title = (f'Reference of codeunit {codeunitname} {codeunit_version_identifier} (contained in project '
|
|
926
|
-
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})')
|
|
927
929
|
if public_repository_url is None:
|
|
928
930
|
repo_url_html = ""
|
|
929
931
|
else:
|
|
@@ -1036,7 +1038,7 @@ class TasksForCommonProjectStructure:
|
|
|
1036
1038
|
@GeneralUtilities.check_arguments
|
|
1037
1039
|
def __generate_entire_reference(self, projectname: str, project_version: str, reference_folder: str) -> None:
|
|
1038
1040
|
all_available_version_identifier_folders_of_reference: list[str] = list(folder for folder in GeneralUtilities.get_direct_folders_of_folder(reference_folder))
|
|
1039
|
-
all_available_version_identifier_folders_of_reference = sorted(all_available_version_identifier_folders_of_reference,
|
|
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))
|
|
1040
1042
|
reference_versions_html_lines = []
|
|
1041
1043
|
reference_versions_html_lines.append(' <hr/>')
|
|
1042
1044
|
for all_available_version_identifier_folder_of_reference in all_available_version_identifier_folders_of_reference:
|
|
@@ -1100,17 +1102,26 @@ class TasksForCommonProjectStructure:
|
|
|
1100
1102
|
raise ValueError(f"Repository '{repository_folder}' has uncommitted changes.")
|
|
1101
1103
|
|
|
1102
1104
|
@GeneralUtilities.check_arguments
|
|
1103
|
-
def
|
|
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):
|
|
1104
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):
|
|
1105
1116
|
if domain is None:
|
|
1106
|
-
domain = f"{
|
|
1117
|
+
domain = f"{service_name}.test.local"
|
|
1107
1118
|
domain = domain.lower()
|
|
1108
|
-
resources_folder: str = os.path.join(codeunit_folder, "Other", "Resources")
|
|
1109
1119
|
resource_name: str = "DevelopmentCertificate"
|
|
1110
1120
|
certificate_folder: str = os.path.join(resources_folder, resource_name)
|
|
1111
|
-
|
|
1121
|
+
|
|
1122
|
+
resource_content_filename: str = service_name+resource_name
|
|
1112
1123
|
ca_resource_name: str = f"{resource_name}Authority"
|
|
1113
|
-
dev_ca_name =
|
|
1124
|
+
dev_ca_name = service_name+ca_resource_name
|
|
1114
1125
|
ca_folder = os.path.join(resources_folder, ca_resource_name)
|
|
1115
1126
|
certificate_file = os.path.join(certificate_folder, f"{domain}.crt")
|
|
1116
1127
|
unsignedcertificate_file = os.path.join(certificate_folder, f"{domain}.unsigned.crt")
|
|
@@ -1248,7 +1259,7 @@ class TasksForCommonProjectStructure:
|
|
|
1248
1259
|
codeunit_folder = GeneralUtilities.resolve_relative_path("../..", str(os.path.dirname(build_script_file)))
|
|
1249
1260
|
codeunitname_lower = codeunitname.lower()
|
|
1250
1261
|
codeunitversion = self.get_version_of_codeunit(os.path.join(codeunit_folder, f"{codeunitname}.codeunit.xml"))
|
|
1251
|
-
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"]
|
|
1252
1263
|
if not use_cache:
|
|
1253
1264
|
args.append("--no-cache")
|
|
1254
1265
|
args.append(".")
|
|
@@ -1339,10 +1350,10 @@ class TasksForCommonProjectStructure:
|
|
|
1339
1350
|
shutil.copyfile(source_file, target_file)
|
|
1340
1351
|
|
|
1341
1352
|
@GeneralUtilities.check_arguments
|
|
1342
|
-
def standardized_tasks_do_common_tasks(self, common_tasks_scripts_file: str, codeunit_version: str, verbosity: int, targetenvironmenttype: str, clear_artifacts_folder: bool,
|
|
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:
|
|
1343
1354
|
additional_arguments_file = self.get_additionalargumentsfile_from_commandline_arguments(commandline_arguments, additional_arguments_file)
|
|
1344
1355
|
target_environmenttype = self.get_targetenvironmenttype_from_commandline_arguments(commandline_arguments, targetenvironmenttype)
|
|
1345
|
-
assume_dependent_codeunits_are_already_built = self.get_assume_dependent_codeunits_are_already_built_from_commandline_arguments(commandline_arguments,
|
|
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)
|
|
1346
1357
|
if commandline_arguments is None:
|
|
1347
1358
|
raise ValueError('The "commandline_arguments"-parameter is not defined.')
|
|
1348
1359
|
if len(commandline_arguments) == 0:
|
|
@@ -1423,7 +1434,7 @@ class TasksForCommonProjectStructure:
|
|
|
1423
1434
|
|
|
1424
1435
|
# Get artifacts from dependent codeunits
|
|
1425
1436
|
if assume_dependent_codeunits_are_already_built:
|
|
1426
|
-
self.build_dependent_code_units(repository_folder, codeunit_name, verbosity, target_environmenttype, additional_arguments_file)
|
|
1437
|
+
self.build_dependent_code_units(repository_folder, codeunit_name, verbosity, target_environmenttype, additional_arguments_file, commandline_arguments)
|
|
1427
1438
|
self.copy_artifacts_from_dependent_code_units(repository_folder, codeunit_name)
|
|
1428
1439
|
|
|
1429
1440
|
# Update codeunit-version
|
|
@@ -1493,8 +1504,7 @@ class TasksForCommonProjectStructure:
|
|
|
1493
1504
|
# TODO
|
|
1494
1505
|
|
|
1495
1506
|
@GeneralUtilities.check_arguments
|
|
1496
|
-
def standardized_tasks_linting_for_angular_codeunit(self, linting_script_file: str, verbosity: int,
|
|
1497
|
-
build_environment_target_type: str, commandline_arguments: list[str]) -> None:
|
|
1507
|
+
def standardized_tasks_linting_for_angular_codeunit(self, linting_script_file: str, verbosity: int, build_environment_target_type: str, commandline_arguments: list[str]) -> None:
|
|
1498
1508
|
verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
|
|
1499
1509
|
build_script_folder = os.path.dirname(linting_script_file)
|
|
1500
1510
|
codeunit_folder = GeneralUtilities.resolve_relative_path("../..", build_script_folder)
|
|
@@ -1508,15 +1518,13 @@ class TasksForCommonProjectStructure:
|
|
|
1508
1518
|
codeunit_name = os.path.basename(codeunit_folder)
|
|
1509
1519
|
src_folder = GeneralUtilities.resolve_relative_path(package_name, codeunit_folder)
|
|
1510
1520
|
verbosity = self.get_verbosity_from_commandline_arguments(args, verbosity)
|
|
1511
|
-
|
|
1512
|
-
sc.program_runner = ProgramRunnerEpew()
|
|
1513
|
-
sc.run_program("flutter", "test --coverage", src_folder, verbosity)
|
|
1521
|
+
self.run_with_epew("flutter", "test --coverage", src_folder, verbosity)
|
|
1514
1522
|
test_coverage_folder_relative = "Other/Artifacts/TestCoverage"
|
|
1515
1523
|
test_coverage_folder = GeneralUtilities.resolve_relative_path(test_coverage_folder_relative, codeunit_folder)
|
|
1516
1524
|
GeneralUtilities.ensure_directory_exists(test_coverage_folder)
|
|
1517
1525
|
coverage_file_relative = f"{test_coverage_folder_relative}/TestCoverage.xml"
|
|
1518
1526
|
coverage_file = GeneralUtilities.resolve_relative_path(coverage_file_relative, codeunit_folder)
|
|
1519
|
-
|
|
1527
|
+
self.run_with_epew("lcov_cobertura", f"coverage/lcov.info --base-dir . --excludes test --output ../{coverage_file_relative} --demangle", src_folder, verbosity)
|
|
1520
1528
|
content = GeneralUtilities.read_text_from_file(coverage_file)
|
|
1521
1529
|
content = re.sub('<![^<]+>', '', content)
|
|
1522
1530
|
content = re.sub('\\\\', '/', content)
|
|
@@ -1528,19 +1536,57 @@ class TasksForCommonProjectStructure:
|
|
|
1528
1536
|
|
|
1529
1537
|
@GeneralUtilities.check_arguments
|
|
1530
1538
|
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:
|
|
1539
|
+
# prepare
|
|
1531
1540
|
codeunit_name: str = os.path.basename(str(Path(os.path.dirname(runtestcases_script_file)).parent.parent.absolute()))
|
|
1532
1541
|
verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
|
|
1533
1542
|
codeunit_folder = GeneralUtilities.resolve_relative_path("../..", os.path.dirname(runtestcases_script_file))
|
|
1534
1543
|
repository_folder = os.path.dirname(codeunit_folder)
|
|
1535
|
-
|
|
1536
|
-
|
|
1544
|
+
|
|
1545
|
+
# run testcases
|
|
1546
|
+
self.run_with_epew("ng", "test --watch=false --browsers ChromeHeadless --code-coverage", codeunit_folder, verbosity=verbosity)
|
|
1547
|
+
|
|
1548
|
+
# rename file
|
|
1537
1549
|
coverage_folder = os.path.join(codeunit_folder, "Other", "Artifacts", "TestCoverage")
|
|
1538
1550
|
target_file = os.path.join(coverage_folder, "TestCoverage.xml")
|
|
1539
1551
|
GeneralUtilities.ensure_file_does_not_exist(target_file)
|
|
1540
1552
|
os.rename(os.path.join(coverage_folder, "cobertura-coverage.xml"), target_file)
|
|
1541
1553
|
self.__rename_packagename_in_coverage_file(target_file, codeunit_name)
|
|
1554
|
+
|
|
1555
|
+
# adapt backslashs to slashs
|
|
1542
1556
|
content = GeneralUtilities.read_text_from_file(target_file)
|
|
1543
1557
|
content = re.sub('\\\\', '/', content)
|
|
1558
|
+
GeneralUtilities.write_text_to_file(target_file, content)
|
|
1559
|
+
|
|
1560
|
+
# aggregate packages in testcoverage-file
|
|
1561
|
+
roottree: etree._ElementTree = etree.parse(target_file)
|
|
1562
|
+
existing_classes = list(roottree.xpath('//coverage/packages/package/classes/class'))
|
|
1563
|
+
|
|
1564
|
+
old_packages_list = roottree.xpath('//coverage/packages/package')
|
|
1565
|
+
for package in old_packages_list:
|
|
1566
|
+
package.getparent().remove(package)
|
|
1567
|
+
|
|
1568
|
+
root = roottree.getroot()
|
|
1569
|
+
packages_element = root.find("packages")
|
|
1570
|
+
package_element = etree.SubElement(packages_element, "package")
|
|
1571
|
+
package_element.attrib['name'] = codeunit_name
|
|
1572
|
+
package_element.attrib['lines-valid'] = root.attrib["lines-valid"]
|
|
1573
|
+
package_element.attrib['lines-covered'] = root.attrib["lines-covered"]
|
|
1574
|
+
package_element.attrib['line-rate'] = root.attrib["line-rate"]
|
|
1575
|
+
package_element.attrib['branches-valid'] = root.attrib["branches-valid"]
|
|
1576
|
+
package_element.attrib['branches-covered'] = root.attrib["branches-covered"]
|
|
1577
|
+
package_element.attrib['branch-rate'] = root.attrib["branch-rate"]
|
|
1578
|
+
package_element.attrib['timestamp'] = root.attrib["timestamp"]
|
|
1579
|
+
package_element.attrib['complexity'] = root.attrib["complexity"]
|
|
1580
|
+
|
|
1581
|
+
classes_element = etree.SubElement(package_element, "classes")
|
|
1582
|
+
|
|
1583
|
+
for existing_class in existing_classes:
|
|
1584
|
+
classes_element.append(existing_class)
|
|
1585
|
+
|
|
1586
|
+
result = etree.tostring(roottree, pretty_print=True).decode("utf-8")
|
|
1587
|
+
GeneralUtilities.write_text_to_file(target_file, result)
|
|
1588
|
+
|
|
1589
|
+
# post tasks
|
|
1544
1590
|
self.run_testcases_common_post_task(repository_folder, codeunit_name, verbosity, generate_badges, build_environment_target_type, commandline_arguments)
|
|
1545
1591
|
|
|
1546
1592
|
@GeneralUtilities.check_arguments
|
|
@@ -1655,7 +1701,7 @@ class TasksForCommonProjectStructure:
|
|
|
1655
1701
|
raise ValueError("Too many results found.")
|
|
1656
1702
|
|
|
1657
1703
|
@GeneralUtilities.check_arguments
|
|
1658
|
-
def copy_development_certificate_to_default_development_directory(self, codeunit_folder: str, build_environment: str, domain: str = None,
|
|
1704
|
+
def copy_development_certificate_to_default_development_directory(self, codeunit_folder: str, build_environment: str, domain: str = None, certificate_resource_name: str = "DevelopmentCertificate") -> None:
|
|
1659
1705
|
if build_environment == "Development":
|
|
1660
1706
|
codeunit_name: str = os.path.basename(codeunit_folder)
|
|
1661
1707
|
if domain is None:
|
|
@@ -1724,15 +1770,17 @@ class TasksForCommonProjectStructure:
|
|
|
1724
1770
|
|
|
1725
1771
|
@GeneralUtilities.check_arguments
|
|
1726
1772
|
def generate_openapi_file(self, buildscript_file: str, runtime: str, verbosity: int, commandline_arguments: list[str], swagger_document_name: str = "APISpecification") -> None:
|
|
1773
|
+
GeneralUtilities.write_message_to_stdout("Generate OpenAPI-specification-file...")
|
|
1727
1774
|
codeunitname = os.path.basename(str(Path(os.path.dirname(buildscript_file)).parent.parent.absolute()))
|
|
1728
1775
|
repository_folder = str(Path(os.path.dirname(buildscript_file)).parent.parent.parent.absolute())
|
|
1729
|
-
|
|
1776
|
+
codeunit_folder = os.path.join(repository_folder, codeunitname)
|
|
1777
|
+
artifacts_folder = os.path.join(codeunit_folder, "Other", "Artifacts")
|
|
1730
1778
|
GeneralUtilities.ensure_directory_exists(os.path.join(artifacts_folder, "APISpecification"))
|
|
1731
1779
|
verbosity = self.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
|
|
1732
|
-
codeunit_version = self.get_version_of_codeunit_folder(
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1780
|
+
codeunit_version = self.get_version_of_codeunit_folder(codeunit_folder)
|
|
1781
|
+
versioned_api_spec_file = f"APISpecification/{codeunitname}.v{codeunit_version}.api.json"
|
|
1782
|
+
self.__sc.run_program("swagger", f"tofile --output {versioned_api_spec_file} BuildResult_DotNet_{runtime}/{codeunitname}.dll {swagger_document_name}", artifacts_folder, verbosity=verbosity)
|
|
1783
|
+
shutil.copyfile(os.path.join(artifacts_folder, versioned_api_spec_file), os.path.join(artifacts_folder, f"APISpecification/{codeunitname}.latest.api.json"))
|
|
1736
1784
|
|
|
1737
1785
|
@GeneralUtilities.check_arguments
|
|
1738
1786
|
def replace_version_in_packagejson_file(self, packagejson_file: str, codeunit_version: str) -> None:
|
|
@@ -1744,7 +1792,8 @@ class TasksForCommonProjectStructure:
|
|
|
1744
1792
|
json.dump(data, f, indent=2)
|
|
1745
1793
|
|
|
1746
1794
|
@GeneralUtilities.check_arguments
|
|
1747
|
-
def build_dependent_code_units(self, repo_folder: str, codeunit_name: str, verbosity: int, target_environmenttype: str, additional_arguments_file: str) -> None:
|
|
1795
|
+
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:
|
|
1796
|
+
verbosity = self.get_verbosity_from_commandline_arguments(commandlinearguments, verbosity)
|
|
1748
1797
|
codeunit_file = os.path.join(repo_folder, codeunit_name, codeunit_name + ".codeunit.xml")
|
|
1749
1798
|
dependent_codeunits = self.get_dependent_code_units(codeunit_file)
|
|
1750
1799
|
dependent_codeunits_folder = os.path.join(repo_folder, codeunit_name, "Other", "Resources", "DependentCodeUnits")
|
|
@@ -1752,7 +1801,7 @@ class TasksForCommonProjectStructure:
|
|
|
1752
1801
|
if 0 < len(dependent_codeunits):
|
|
1753
1802
|
GeneralUtilities.write_message_to_stdout(f"Start building dependent codeunits for codeunit {codeunit_name}.")
|
|
1754
1803
|
for dependent_codeunit in dependent_codeunits:
|
|
1755
|
-
self.__build_codeunit(os.path.join(repo_folder, dependent_codeunit), verbosity, target_environmenttype, additional_arguments_file)
|
|
1804
|
+
self.__build_codeunit(os.path.join(repo_folder, dependent_codeunit), verbosity, target_environmenttype, additional_arguments_file, False, False, commandlinearguments)
|
|
1756
1805
|
if 0 < len(dependent_codeunits):
|
|
1757
1806
|
GeneralUtilities.write_message_to_stdout(f"Finished building dependent codeunits for codeunit {codeunit_name}.")
|
|
1758
1807
|
|
|
@@ -1780,8 +1829,7 @@ class TasksForCommonProjectStructure:
|
|
|
1780
1829
|
for codeunit in codeunits:
|
|
1781
1830
|
artifact_files.append(self.__sc.find_file_by_extension(f"{build_artifacts_folder}\\{productname}\\{projectversion}\\{codeunit}", "Productive.Artifacts.zip"))
|
|
1782
1831
|
changelog_file = os.path.join(repository_folder, "Other", "Resources", "Changelog", f"v{projectversion}.md")
|
|
1783
|
-
self.__sc.run_program_argsasarray("gh", ["release", "create", f"v{projectversion}", "--repo", github_repo, "--notes-file", changelog_file,
|
|
1784
|
-
"--title", f"Release v{projectversion}"]+artifact_files, verbosity=verbosity)
|
|
1832
|
+
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)
|
|
1785
1833
|
|
|
1786
1834
|
@GeneralUtilities.check_arguments
|
|
1787
1835
|
def update_dependencies_of_typical_flutter_codeunit(self, update_script_file: str, verbosity: int, cmd_args: list[str]) -> None:
|
|
@@ -1819,6 +1867,9 @@ class TasksForCommonProjectStructure:
|
|
|
1819
1867
|
@GeneralUtilities.check_arguments
|
|
1820
1868
|
def run_local_test_service(self, file: str):
|
|
1821
1869
|
example_folder = os.path.dirname(file)
|
|
1870
|
+
docker_compose_file = os.path.join(example_folder, "docker-compose.yml")
|
|
1871
|
+
for service in self.__sc.get_services_from_yaml_file(docker_compose_file):
|
|
1872
|
+
self.__sc.kill_docker_container(service)
|
|
1822
1873
|
example_name = os.path.basename(example_folder)
|
|
1823
1874
|
title = f"Test{example_name}"
|
|
1824
1875
|
self.__sc.run_program("docker", f"compose -p {title.lower()} up", example_folder, title=title)
|
|
@@ -1904,36 +1955,31 @@ class TasksForCommonProjectStructure:
|
|
|
1904
1955
|
raise ValueError(f"Invalid target-environmenttype: '{target_environmenttype}'")
|
|
1905
1956
|
|
|
1906
1957
|
@GeneralUtilities.check_arguments
|
|
1907
|
-
def build_codeunit(self, codeunit_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck",
|
|
1908
|
-
additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None,
|
|
1909
|
-
assume_dependent_codeunits_are_already_built: bool = False) -> None:
|
|
1958
|
+
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:
|
|
1910
1959
|
codeunit_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(codeunit_folder)
|
|
1911
1960
|
codeunit_name = os.path.basename(codeunit_folder)
|
|
1912
1961
|
repository_folder = os.path.dirname(codeunit_folder)
|
|
1913
|
-
self.build_specific_codeunits(repository_folder, [codeunit_name], verbosity, target_environmenttype, additional_arguments_file,
|
|
1914
|
-
is_pre_merge, export_target_directory, assume_dependent_codeunits_are_already_built)
|
|
1962
|
+
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)
|
|
1915
1963
|
|
|
1916
1964
|
@GeneralUtilities.check_arguments
|
|
1917
|
-
def build_codeunitsC(self, repository_folder: str, image: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None) -> None:
|
|
1965
|
+
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:
|
|
1918
1966
|
if target_environmenttype == "Development":
|
|
1919
1967
|
raise ValueError(f"build_codeunitsC is not available for target_environmenttype {target_environmenttype}.")
|
|
1920
1968
|
# TODO handle additional_arguments_file
|
|
1921
1969
|
# TODO add option to allow building different codeunits in same project with different images due to their demands
|
|
1922
1970
|
# TODO check if image provides all demands of codeunit
|
|
1923
1971
|
self.__sc.run_program(
|
|
1924
|
-
"docker", f"run --volume {repository_folder}:/Workspace/Repository " +
|
|
1925
|
-
f"-e repositoryfolder=/Workspace/Repository -e verbosity={verbosity} -e targetenvironment={target_environmenttype} {image}",
|
|
1926
|
-
repository_folder)
|
|
1972
|
+
"docker", f"run --volume {repository_folder}:/Workspace/Repository " + f"-e repositoryfolder=/Workspace/Repository -e verbosity={verbosity} -e targetenvironment={target_environmenttype} {image}", repository_folder)
|
|
1927
1973
|
|
|
1928
1974
|
@GeneralUtilities.check_arguments
|
|
1929
|
-
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) -> None:
|
|
1975
|
+
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:
|
|
1930
1976
|
self.__check_target_environmenttype(target_environmenttype)
|
|
1931
1977
|
repository_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(repository_folder)
|
|
1932
1978
|
codeunits = self.get_codeunits(repository_folder, False)
|
|
1933
|
-
self.build_specific_codeunits(repository_folder, codeunits, verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, export_target_directory)
|
|
1979
|
+
self.build_specific_codeunits(repository_folder, codeunits, verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, export_target_directory, False, commandline_arguments)
|
|
1934
1980
|
|
|
1935
1981
|
@GeneralUtilities.check_arguments
|
|
1936
|
-
def build_specific_codeunits(self, repository_folder: str, codeunits: list[str], verbosity: int = 1, target_environmenttype: str = "QualityCheck",
|
|
1982
|
+
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:
|
|
1937
1983
|
self.__check_target_environmenttype(target_environmenttype)
|
|
1938
1984
|
repository_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(repository_folder)
|
|
1939
1985
|
contains_uncommitted_changes = self.__sc.git_repository_has_uncommitted_changes(repository_folder)
|
|
@@ -1963,8 +2009,7 @@ class TasksForCommonProjectStructure:
|
|
|
1963
2009
|
line = "----------"
|
|
1964
2010
|
for codeunit in sorted_codeunits:
|
|
1965
2011
|
GeneralUtilities.write_message_to_stdout(line)
|
|
1966
|
-
self.__build_codeunit(os.path.join(repository_folder, codeunit), verbosity, target_environmenttype,
|
|
1967
|
-
additional_arguments_file, is_pre_merge, assume_dependent_codeunits_are_already_built)
|
|
2012
|
+
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)
|
|
1968
2013
|
GeneralUtilities.write_message_to_stdout(line)
|
|
1969
2014
|
if not contains_uncommitted_changes and self.__sc.git_repository_has_uncommitted_changes(repository_folder) and not is_pre_merge:
|
|
1970
2015
|
message = f'Due to the build-process the repository "{repository_folder}" has new uncommitted changes.'
|
|
@@ -1987,11 +2032,17 @@ class TasksForCommonProjectStructure:
|
|
|
1987
2032
|
|
|
1988
2033
|
@GeneralUtilities.check_arguments
|
|
1989
2034
|
def __do_repository_checks(self, repository_folder: str, project_version: str) -> None:
|
|
2035
|
+
self.__check_if_folder_is_git_repository(repository_folder)
|
|
1990
2036
|
self.__check_if_changelog_exists(repository_folder, project_version)
|
|
1991
2037
|
self.__check_whether_security_txt_exists(repository_folder)
|
|
1992
2038
|
self.__check_whether_workspace_file_exists(repository_folder)
|
|
1993
2039
|
self.__check_for_staged_or_committed_ignored_files(repository_folder)
|
|
1994
2040
|
|
|
2041
|
+
@GeneralUtilities.check_arguments
|
|
2042
|
+
def __check_if_folder_is_git_repository(self, repository_folder: str) -> None:
|
|
2043
|
+
if (not self.__sc.is_git_repository(repository_folder)):
|
|
2044
|
+
raise ValueError(f"Folder {repository_folder} is not a git-repository")
|
|
2045
|
+
|
|
1995
2046
|
@GeneralUtilities.check_arguments
|
|
1996
2047
|
def __check_if_changelog_exists(self, repository_folder: str, project_version: str) -> None:
|
|
1997
2048
|
changelog_folder = os.path.join(repository_folder, "Other", "Resources", "Changelog")
|
|
@@ -2132,7 +2183,7 @@ class TasksForCommonProjectStructure:
|
|
|
2132
2183
|
for file in GeneralUtilities.get_all_files_of_folder(files_folder):
|
|
2133
2184
|
if file.endswith(".plantuml"):
|
|
2134
2185
|
argument = ['-jar', f'{plant_uml_folder}/plantuml.jar', os.path.basename(file).replace("\\", "/"), '-tsvg']
|
|
2135
|
-
sc.run_program_argsasarray("java", argument, os.path.dirname(file),verbosity=0)
|
|
2186
|
+
sc.run_program_argsasarray("java", argument, os.path.dirname(file), verbosity=0)
|
|
2136
2187
|
|
|
2137
2188
|
@GeneralUtilities.check_arguments
|
|
2138
2189
|
def load_deb_control_file_content(self, file: str, codeunitname: str, codeunitversion: str, installedsize: int, maintainername: str, maintaineremail: str, description: str,) -> str:
|
|
@@ -2210,7 +2261,7 @@ class TasksForCommonProjectStructure:
|
|
|
2210
2261
|
GeneralUtilities.write_message_to_stderr(f"Warning: {message}")
|
|
2211
2262
|
|
|
2212
2263
|
@GeneralUtilities.check_arguments
|
|
2213
|
-
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) -> None:
|
|
2264
|
+
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:
|
|
2214
2265
|
now = datetime.now()
|
|
2215
2266
|
codeunit_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(codeunit_folder)
|
|
2216
2267
|
codeunit_name: str = os.path.basename(codeunit_folder)
|
|
@@ -2228,7 +2279,7 @@ class TasksForCommonProjectStructure:
|
|
|
2228
2279
|
GeneralUtilities.write_message_to_stdout(f"Build-environmenttype: {target_environmenttype}")
|
|
2229
2280
|
GeneralUtilities.ensure_directory_does_not_exist(artifacts_folder)
|
|
2230
2281
|
|
|
2231
|
-
verbosity_for_executed_programs =
|
|
2282
|
+
verbosity_for_executed_programs = self.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
|
|
2232
2283
|
|
|
2233
2284
|
other_folder = os.path.join(codeunit_folder, "Other")
|
|
2234
2285
|
build_folder = os.path.join(other_folder, "Build")
|
|
@@ -2273,7 +2324,7 @@ class TasksForCommonProjectStructure:
|
|
|
2273
2324
|
c_additionalargumentsfile_argument = f' --overwrite_additionalargumentsfile "{additional_arguments_file}"'
|
|
2274
2325
|
|
|
2275
2326
|
GeneralUtilities.write_message_to_stdout('Run "CommonTasks.py"...')
|
|
2276
|
-
self.__sc.run_program("python", f"CommonTasks.py{additional_arguments_c}{general_argument}{c_additionalargumentsfile_argument}", other_folder,
|
|
2327
|
+
self.__sc.run_program("python", f"CommonTasks.py{additional_arguments_c}{general_argument}{c_additionalargumentsfile_argument}", other_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True)
|
|
2277
2328
|
self.verify_artifact_exists(codeunit_folder, dict[str, bool]({"Changelog": False, "License": True, "DiffReport": True}))
|
|
2278
2329
|
|
|
2279
2330
|
GeneralUtilities.write_message_to_stdout('Run "Build.py"...')
|
|
@@ -2326,13 +2377,15 @@ class TasksForCommonProjectStructure:
|
|
|
2326
2377
|
def generic_update_dependencies(self, repository_folder: str):
|
|
2327
2378
|
codeunits = self.get_codeunits(repository_folder)
|
|
2328
2379
|
updated_dependencies = False
|
|
2380
|
+
verbosity: int = 1 # TODO set value dynamically
|
|
2329
2381
|
for codeunit in codeunits:
|
|
2330
2382
|
codeunit_file = os.path.join(repository_folder, codeunit, f"{codeunit}.codeunit.xml")
|
|
2331
2383
|
codeunit_has_updatable_dependencies = self.codeunit_has_updatable_dependencies(codeunit_file)
|
|
2332
2384
|
if codeunit_has_updatable_dependencies:
|
|
2333
2385
|
codeunit_folder = os.path.join(repository_folder, codeunit)
|
|
2334
2386
|
update_dependencies_script_folder = os.path.join(codeunit_folder, "Other")
|
|
2335
|
-
|
|
2387
|
+
GeneralUtilities.ensure_directory_exists(os.path.join(update_dependencies_script_folder, "Resources", "CodeAnalysisResult"))
|
|
2388
|
+
self.__sc.run_program("python", "UpdateDependencies.py", update_dependencies_script_folder, verbosity)
|
|
2336
2389
|
if self.__sc.git_repository_has_uncommitted_changes(repository_folder):
|
|
2337
2390
|
version_of_project = self.get_version_of_project(repository_folder)
|
|
2338
2391
|
changelog_file = os.path.join(repository_folder, "Other", "Resources", "Changelog", f"v{version_of_project}.md")
|
|
@@ -2348,7 +2401,7 @@ class TasksForCommonProjectStructure:
|
|
|
2348
2401
|
else:
|
|
2349
2402
|
GeneralUtilities.write_message_to_stdout(f"There are no dependencies to update in codeunit {codeunit}.")
|
|
2350
2403
|
if updated_dependencies:
|
|
2351
|
-
self.__sc.run_program("scbuildcodeunits", "--targetenvironment QualityCheck", repository_folder)#TODO set verbosity
|
|
2404
|
+
self.__sc.run_program("scbuildcodeunits", "--targetenvironment QualityCheck", repository_folder) # TODO set verbosity
|
|
2352
2405
|
self.__sc.git_commit(repository_folder, "Updated dependencies")
|
|
2353
2406
|
|
|
2354
2407
|
class GenericPrepareNewReleaseArguments:
|
|
@@ -2375,7 +2428,7 @@ class TasksForCommonProjectStructure:
|
|
|
2375
2428
|
# prepare
|
|
2376
2429
|
self.assert_no_uncommitted_changes(repository_folder)
|
|
2377
2430
|
self.__sc.git_checkout(repository_folder, merge_source_branch)
|
|
2378
|
-
if
|
|
2431
|
+
if "--dependencyupdate" in generic_prepare_new_release_arguments.commandline_arguments:
|
|
2379
2432
|
self.generic_update_dependencies(repository_folder)
|
|
2380
2433
|
self.merge_to_main_branch(repository_folder, merge_source_branch, verbosity=verbosity, fast_forward_source_branch=True)
|
|
2381
2434
|
self.__sc.git_commit(build_repository_folder, "Updated submodule due to merge to main-branch.")
|
|
@@ -2387,7 +2440,7 @@ class TasksForCommonProjectStructure:
|
|
|
2387
2440
|
artifacts_target_folder: str
|
|
2388
2441
|
commandline_arguments: list[str]
|
|
2389
2442
|
|
|
2390
|
-
def __init__(self, current_file: str, product_name: str, common_remote_name: str, artifacts_target_folder: str,commandline_arguments: list[str]):
|
|
2443
|
+
def __init__(self, current_file: str, product_name: str, common_remote_name: str, artifacts_target_folder: str, commandline_arguments: list[str]):
|
|
2391
2444
|
self.current_file = current_file
|
|
2392
2445
|
self.product_name = product_name
|
|
2393
2446
|
self.common_remote_name = common_remote_name
|
|
@@ -2395,7 +2448,7 @@ class TasksForCommonProjectStructure:
|
|
|
2395
2448
|
self.commandline_arguments = commandline_arguments
|
|
2396
2449
|
|
|
2397
2450
|
@GeneralUtilities.check_arguments
|
|
2398
|
-
def generic_create_release(self, generic_create_release_arguments:GenericCreateReleaseArguments) -> str:
|
|
2451
|
+
def generic_create_release(self, generic_create_release_arguments: GenericCreateReleaseArguments) -> str:
|
|
2399
2452
|
folder_of_this_file = os.path.dirname(generic_create_release_arguments.current_file)
|
|
2400
2453
|
build_repository_folder = GeneralUtilities.resolve_relative_path("../..", folder_of_this_file)
|
|
2401
2454
|
repository_folder_name = generic_create_release_arguments.product_name
|
|
@@ -2404,10 +2457,18 @@ class TasksForCommonProjectStructure:
|
|
|
2404
2457
|
verbosity: int = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(generic_create_release_arguments.commandline_arguments, 1)
|
|
2405
2458
|
createReleaseConfiguration: CreateReleaseConfiguration = CreateReleaseConfiguration(
|
|
2406
2459
|
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)
|
|
2460
|
+
|
|
2461
|
+
reference_repo: str = os.path.join(build_repository_folder, "Submodules", f"{generic_create_release_arguments.product_name}Reference")
|
|
2462
|
+
self.__sc.git_commit(reference_repo, "Updated reference")
|
|
2463
|
+
|
|
2407
2464
|
self.__sc.git_commit(build_repository_folder, "Updated submodule")
|
|
2408
2465
|
|
|
2409
2466
|
# create release
|
|
2410
2467
|
new_version = self.merge_to_stable_branch(generic_create_release_arguments.current_file, createReleaseConfiguration)
|
|
2468
|
+
|
|
2469
|
+
merge_source_branch = "other/next-release"
|
|
2470
|
+
self.__sc.git_checkout(repository_folder, merge_source_branch)
|
|
2471
|
+
|
|
2411
2472
|
return new_version
|
|
2412
2473
|
|
|
2413
2474
|
class UpdateHTTPDocumentationArguments:
|
|
@@ -40,7 +40,7 @@ class CertificateUpdater:
|
|
|
40
40
|
print(filenames)
|
|
41
41
|
numbers = [int(file[len("privkey"):]) for file in filenames]
|
|
42
42
|
# numbers=[]
|
|
43
|
-
#print([os.path.basename(file) for file in filenames])
|
|
43
|
+
# print([os.path.basename(file) for file in filenames])
|
|
44
44
|
result = max(numbers)
|
|
45
45
|
return result
|
|
46
46
|
|
|
@@ -108,7 +108,7 @@ class CertificateUpdater:
|
|
|
108
108
|
dockerargument = f"run --name {certbot_container_name} --volume {self.__letsencrypt_folder}:/etc/letsencrypt"
|
|
109
109
|
dockerargument = dockerargument+f" --volume {self.__log_folder}:/var/log/letsencrypt -p 80:80 certbot/certbot:latest"
|
|
110
110
|
certbotargument = f"--standalone --email {self.__email} --agree-tos --force-renewal --rsa-key-size 4096 --non-interactive --no-eff-email --domain {domain}"
|
|
111
|
-
if(certificate_for_domain_already_exists):
|
|
111
|
+
if (certificate_for_domain_already_exists):
|
|
112
112
|
self.__sc.run_program("docker", f"{dockerargument} certonly --no-random-sleep-on-renew {certbotargument}", self.__current_folder, throw_exception_if_exitcode_is_not_zero=True)
|
|
113
113
|
self.__replace_symlinks_by_files(domain)
|
|
114
114
|
else:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ScriptCollection
|
|
3
|
-
Version: 3.5.
|
|
3
|
+
Version: 3.5.4
|
|
4
4
|
Summary: The ScriptCollection is the place for reusable scripts.
|
|
5
5
|
Home-page: https://github.com/anionDev/ScriptCollection
|
|
6
6
|
Author: Marius Göcke
|
|
@@ -33,10 +33,11 @@ Requires-Dist: ntplib >=0.4.0
|
|
|
33
33
|
Requires-Dist: Pillow >=10.3.0
|
|
34
34
|
Requires-Dist: pycdlib >=1.14.0
|
|
35
35
|
Requires-Dist: Pygments >=2.18.0
|
|
36
|
-
Requires-Dist: pylint >=3.
|
|
36
|
+
Requires-Dist: pylint >=3.2.0
|
|
37
37
|
Requires-Dist: pyOpenSSL >=24.1.0
|
|
38
38
|
Requires-Dist: PyPDF2 >=3.0.1
|
|
39
39
|
Requires-Dist: pytest >=8.2.0
|
|
40
|
+
Requires-Dist: PyYAML >=6.0.1
|
|
40
41
|
Requires-Dist: qrcode >=7.4.2
|
|
41
42
|
Requires-Dist: send2trash >=1.8.3
|
|
42
43
|
Requires-Dist: twine >=5.0.0
|