scriptcollection 4.2.81__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.
Files changed (62) hide show
  1. ScriptCollection/AnionBuildPlatform.py +199 -0
  2. ScriptCollection/CertificateUpdater.py +149 -0
  3. ScriptCollection/Executables.py +921 -0
  4. ScriptCollection/GeneralUtilities.py +1589 -0
  5. ScriptCollection/HTTPMaintenanceOverheadHelper.py +36 -0
  6. ScriptCollection/OCIImages/AbstractImageHandler.py +38 -0
  7. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerDebian.py +20 -0
  8. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerDebianSlim.py +20 -0
  9. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerGeneric.py +20 -0
  10. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerGenericV.py +20 -0
  11. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerGitlabCE.py +20 -0
  12. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerGitlabEE.py +20 -0
  13. ScriptCollection/OCIImages/ConcreteImageHandlers/__init__.py +0 -0
  14. ScriptCollection/OCIImages/OCIImageManager.py +190 -0
  15. ScriptCollection/OCIImages/__init__.py +0 -0
  16. ScriptCollection/ProcessesRunner.py +43 -0
  17. ScriptCollection/ProgramRunnerBase.py +47 -0
  18. ScriptCollection/ProgramRunnerMock.py +2 -0
  19. ScriptCollection/ProgramRunnerPopen.py +57 -0
  20. ScriptCollection/ProgramRunnerSudo.py +108 -0
  21. ScriptCollection/Resources/CultureChooser/CultureChooser.js +29 -0
  22. ScriptCollection/Resources/CultureChooser/index.html +15 -0
  23. ScriptCollection/Resources/MaintenanceSite/MaintenanceSite.html +15 -0
  24. ScriptCollection/SCLog.py +115 -0
  25. ScriptCollection/ScriptCollectionCore.py +3485 -0
  26. ScriptCollection/TFCPS/Docker/TFCPS_CodeUnitSpecific_Docker.py +192 -0
  27. ScriptCollection/TFCPS/Docker/__init__.py +0 -0
  28. ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationBase.py +8 -0
  29. ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationGenerate.py +6 -0
  30. ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationNoGenerate.py +7 -0
  31. ScriptCollection/TFCPS/DotNet/TFCPS_CodeUnitSpecific_DotNet.py +547 -0
  32. ScriptCollection/TFCPS/DotNet/__init__.py +0 -0
  33. ScriptCollection/TFCPS/Flutter/TFCPS_CodeUnitSpecific_Flutter.py +137 -0
  34. ScriptCollection/TFCPS/Flutter/__init__.py +0 -0
  35. ScriptCollection/TFCPS/Go/TFCPS_CodeUnitSpecific_Go.py +72 -0
  36. ScriptCollection/TFCPS/Go/__init__.py +0 -0
  37. ScriptCollection/TFCPS/Maven/TFCPS_CodeUnitSpecific_Maven.py +42 -0
  38. ScriptCollection/TFCPS/Maven/__init__.py +0 -0
  39. ScriptCollection/TFCPS/NodeJS/TFCPS_CodeUnitSpecific_NodeJS.py +232 -0
  40. ScriptCollection/TFCPS/NodeJS/__init__.py +0 -0
  41. ScriptCollection/TFCPS/Python/TFCPS_CodeUnitSpecific_Python.py +239 -0
  42. ScriptCollection/TFCPS/Python/__init__.py +0 -0
  43. ScriptCollection/TFCPS/Rust/TFCPS_CodeUnitSpecific_Rust.py +42 -0
  44. ScriptCollection/TFCPS/Rust/__init__.py +0 -0
  45. ScriptCollection/TFCPS/TFCPS_CodeUnitSpecific_Base.py +433 -0
  46. ScriptCollection/TFCPS/TFCPS_CodeUnit_BuildCodeUnit.py +135 -0
  47. ScriptCollection/TFCPS/TFCPS_CodeUnit_BuildCodeUnits.py +301 -0
  48. ScriptCollection/TFCPS/TFCPS_CreateRelease.py +98 -0
  49. ScriptCollection/TFCPS/TFCPS_Generic.py +44 -0
  50. ScriptCollection/TFCPS/TFCPS_MergeToMain.py +128 -0
  51. ScriptCollection/TFCPS/TFCPS_MergeToStable.py +356 -0
  52. ScriptCollection/TFCPS/TFCPS_PreBuildCodeunitsScript.py +48 -0
  53. ScriptCollection/TFCPS/TFCPS_Tools_General.py +1565 -0
  54. ScriptCollection/TFCPS/__init__.py +0 -0
  55. ScriptCollection/__init__.py +0 -0
  56. ScriptCollection/__pycache__/GeneralUtilities.cpython-311.pyc +0 -0
  57. ScriptCollection/__pycache__/__init__.cpython-311.pyc +0 -0
  58. scriptcollection-4.2.81.dist-info/METADATA +169 -0
  59. scriptcollection-4.2.81.dist-info/RECORD +62 -0
  60. scriptcollection-4.2.81.dist-info/WHEEL +5 -0
  61. scriptcollection-4.2.81.dist-info/entry_points.txt +67 -0
  62. scriptcollection-4.2.81.dist-info/top_level.txt +1 -0
@@ -0,0 +1,356 @@
1
+ import argparse
2
+ import os
3
+ import shutil
4
+ from functools import cmp_to_key
5
+ from ..GeneralUtilities import GeneralUtilities
6
+ from ..ScriptCollectionCore import ScriptCollectionCore
7
+ from ..SCLog import LogLevel
8
+ from .TFCPS_Tools_General import TFCPS_Tools_General
9
+ from .TFCPS_MergeToMain import TFCPS_MergeToMain
10
+ from .TFCPS_CodeUnit_BuildCodeUnits import TFCPS_CodeUnit_BuildCodeUnits
11
+
12
+
13
+ class MergeToStableConfiguration:
14
+ log_level:LogLevel
15
+ source_branch:str#main
16
+ target_branch:str#stable
17
+ repository:str
18
+ build_repo:str
19
+ common_remote_name:str
20
+ build_repo_main_branch_name:str
21
+ reference_repo_main_branch_name:str
22
+ reference_remote_name:str
23
+ build_repo_remote_name:str
24
+ artifacts_target_folder:str
25
+ common_remote_url:str
26
+ additional_arguments_file:str
27
+
28
+ def __init__(self,loglevel:LogLevel,source_branch:str,target_branch:str,repository:str,build_repo:str,common_remote_name:str,build_repo_main_branch_name:str,reference_repo_main_branch_name:str,reference_remote_name:str,build_repo_remote_name:str,artifacts_target_folder:str,common_remote_url:str,additional_arguments_file:str):
29
+ self.log_level=loglevel
30
+ self.source_branch=source_branch
31
+ self.target_branch=target_branch
32
+ self.repository=repository
33
+ self.build_repo=build_repo
34
+ self.common_remote_name=common_remote_name
35
+ self.build_repo_main_branch_name=build_repo_main_branch_name
36
+ self.reference_repo_main_branch_name=reference_repo_main_branch_name
37
+ self.reference_remote_name=reference_remote_name
38
+ self.build_repo_remote_name=build_repo_remote_name
39
+ self.artifacts_target_folder=artifacts_target_folder
40
+ self.common_remote_url=common_remote_url
41
+ self.additional_arguments_file=additional_arguments_file
42
+
43
+ class TFCPS_MergeToStable:
44
+
45
+ sc:ScriptCollectionCore
46
+ tFCPS_Tools_General:TFCPS_Tools_General
47
+ createRelease_configuration: MergeToStableConfiguration
48
+
49
+ def __init__(self, createRelease_configuration: MergeToStableConfiguration):
50
+ self.sc=ScriptCollectionCore()
51
+ self.tFCPS_Tools_General=TFCPS_Tools_General(self.sc)
52
+ self.createRelease_configuration=createRelease_configuration
53
+
54
+ @GeneralUtilities.check_arguments
55
+ def merge_to_stable_branch(self):
56
+ self.sc.log.loglevel=self.createRelease_configuration.log_level
57
+ self.sc.log.log("Merge to stable-branch...")
58
+ product_name:str=os.path.basename(self.createRelease_configuration.repository)
59
+
60
+ if self.sc.git_get_commit_id(self.createRelease_configuration.repository,self.createRelease_configuration.source_branch)==self.sc.git_get_commit_id(self.createRelease_configuration.repository,self.createRelease_configuration.target_branch):
61
+ self.sc.log.log("Source- and target-branch are on the same commit.")
62
+ return
63
+
64
+ self.sc.assert_is_git_repository(self.createRelease_configuration.repository)
65
+ self.sc.assert_no_uncommitted_changes(self.createRelease_configuration.repository)
66
+ self.sc.git_checkout(self.createRelease_configuration.repository, self.createRelease_configuration.source_branch)
67
+ self.sc.assert_no_uncommitted_changes(self.createRelease_configuration.repository)
68
+
69
+ reference_repo=self.createRelease_configuration.repository+"Reference"
70
+ self.sc.assert_is_git_repository(reference_repo)
71
+ self.sc.assert_no_uncommitted_changes(reference_repo)
72
+
73
+ self.sc.assert_is_git_repository(self.createRelease_configuration.build_repo)
74
+ self.sc.assert_no_uncommitted_changes(self.createRelease_configuration.build_repo)
75
+
76
+ product_version:str=self.tFCPS_Tools_General.get_version_of_project(self.createRelease_configuration.repository)
77
+
78
+ #TODO do premerge-build instead
79
+ tfcps_CodeUnit_BuildCodeUnits:TFCPS_CodeUnit_BuildCodeUnits=TFCPS_CodeUnit_BuildCodeUnits(self.createRelease_configuration.repository,self.sc.log.loglevel,"Productive",self.createRelease_configuration.additional_arguments_file,False,False)
80
+ try:
81
+ tfcps_CodeUnit_BuildCodeUnits.build_codeunits()
82
+ except Exception:
83
+ self.sc.log.log(f"Branch {self.createRelease_configuration.source_branch} is not buildable.",LogLevel.Error)
84
+ self.sc.git_undo_all_changes(self.createRelease_configuration.repository)
85
+ raise
86
+
87
+ self.sc.log.log("Release artifacts...")
88
+ repository:str=self.createRelease_configuration.repository
89
+ project_version:str=self.tFCPS_Tools_General.get_version_of_project(repository)
90
+ for codeunit in self.tFCPS_Tools_General.get_codeunits(self.createRelease_configuration.repository):
91
+ self.sc.git_checkout(self.createRelease_configuration.repository, self.createRelease_configuration.source_branch, True,True)
92
+ if self.createRelease_configuration.artifacts_target_folder is not None:
93
+ #export artifacts to local target folder
94
+ self.sc.log.log(f"Export artifacts of codeunit {codeunit} to target-folder...")
95
+ source_folder:str=GeneralUtilities.resolve_relative_path(f"./{codeunit}/Other/Artifacts",self.createRelease_configuration.repository)
96
+ target_folder:str=GeneralUtilities.resolve_relative_path(f"./{product_name}/{product_version}/{codeunit}",self.createRelease_configuration.artifacts_target_folder)
97
+ GeneralUtilities.ensure_directory_exists(target_folder)
98
+ codeunit_version:str=self.tFCPS_Tools_General.get_version_of_codeunit(os.path.join(self.createRelease_configuration.repository,codeunit,f"{codeunit}.codeunit.xml"))
99
+ target_file:str=os.path.join(target_folder,f"{codeunit}.v{codeunit_version}.Artifacts.zip")
100
+ self.sc.create_zip_archive(source_folder,target_file)
101
+
102
+ #push artifacts
103
+ push_script:str=os.path.join( self.createRelease_configuration.build_repo,"Scripts","CreateRelease",f"PushArtifacts.{codeunit}.py")
104
+ if os.path.isfile(push_script):
105
+ self.sc.log.log(f"Push artifacts of codeunit {codeunit}...")
106
+ self.sc.run_program(GeneralUtilities.get_python_executable(),os.path.basename(push_script),os.path.dirname(push_script))
107
+ else:
108
+ self.sc.log.log(f"Codeunit {codeunit} does not have artifacts to push. (Scriptfile \"{push_script}\" does not exist.)",LogLevel.Debug)
109
+
110
+ # update codeunit-reference
111
+ self.sc.log.log(f"Release artifacts of codeunit {codeunit}...")
112
+ reference_folder:str=os.path.join(reference_repo,"ReferenceContent")
113
+ projectname:str=os.path.basename(repository)
114
+ public_repository_url:str=self.createRelease_configuration.common_remote_url
115
+ main_branch_name:str=self.createRelease_configuration.source_branch
116
+ codeunit_version=self.tFCPS_Tools_General.get_version_of_codeunit(os.path.join(repository,codeunit,f"{codeunit}.codeunit.xml"))
117
+ self.__export_codeunit_reference_content_to_reference_repository(f"v{project_version}", False, reference_folder, repository, codeunit, projectname, codeunit_version, public_repository_url, f"v{project_version}")
118
+ self.__export_codeunit_reference_content_to_reference_repository("Latest", True, reference_folder, repository, codeunit, projectname, codeunit_version, public_repository_url, main_branch_name)
119
+
120
+ #TODO set (update/overwrite) project-specific reference in reference_repo
121
+
122
+ #TODO set (update/overwrite) project-issues in reference_repo
123
+
124
+ # Generate reference
125
+ self.__generate_entire_reference(projectname, project_version, reference_folder,reference_repo)
126
+
127
+ self.sc.git_commit(reference_repo,f"Added reference for v{project_version}")
128
+
129
+ #TODO do this not as fast-forward-merge anymore, because the changes from the premerge-build should be included
130
+ self.sc.git_merge(self.createRelease_configuration.repository, self.createRelease_configuration.source_branch,self.createRelease_configuration.target_branch, True,True,None,True,True)
131
+
132
+ self.sc.assert_no_uncommitted_changes(self.createRelease_configuration.repository)
133
+ self.sc.assert_no_uncommitted_changes(reference_repo)
134
+ self.sc.git_commit(self.createRelease_configuration.build_repo,"Updated submodules")
135
+
136
+ self.sc.git_push_with_retry(self.createRelease_configuration.repository,self.createRelease_configuration.common_remote_name,self.createRelease_configuration.source_branch,self.createRelease_configuration.source_branch)
137
+ self.sc.git_push_with_retry(self.createRelease_configuration.repository,self.createRelease_configuration.common_remote_name,self.createRelease_configuration.target_branch,self.createRelease_configuration.target_branch)
138
+ self.sc.git_push_with_retry(self.createRelease_configuration.build_repo,self.createRelease_configuration.build_repo_remote_name,self.createRelease_configuration.build_repo_main_branch_name,self.createRelease_configuration.build_repo_main_branch_name)
139
+ self.sc.git_push_with_retry(reference_repo,self.createRelease_configuration.reference_remote_name,self.createRelease_configuration.reference_repo_main_branch_name,self.createRelease_configuration.reference_repo_main_branch_name)
140
+
141
+ self.sc.log.log(f"Finishing merging {projectname} v{project_version} to stable...")
142
+
143
+ @GeneralUtilities.check_arguments
144
+ def __remove_outdated_version(self,reference_repo:str):
145
+ now = GeneralUtilities.get_now()
146
+ for unsupported_version in self.tFCPS_Tools_General.get_unsupported_versions(self.createRelease_configuration.repository, now):
147
+ unsupported_reference_folder = f"{reference_repo}/ReferenceContent/v{unsupported_version[0]}"
148
+ GeneralUtilities.ensure_directory_does_not_exist(unsupported_reference_folder)
149
+
150
+
151
+ @GeneralUtilities.check_arguments
152
+ def __generate_entire_reference(self, projectname: str, project_version: str, reference_folder: str,reference_repo:str) -> None:
153
+ self.sc.log.log("Remove outdated versions...")
154
+ self.__remove_outdated_version(reference_repo)
155
+ self.sc.log.log("Generate reference...")
156
+ all_available_version_identifier_folders_of_reference: list[str] = list(folder for folder in GeneralUtilities.get_direct_folders_of_folder(reference_folder))
157
+ all_available_version_identifier_folders_of_reference = sorted(all_available_version_identifier_folders_of_reference, key=cmp_to_key(TFCPS_Tools_General.sort_reference_folder))
158
+ reference_versions_html_lines = []
159
+ reference_versions_html_lines.append(' <hr/>')
160
+ for all_available_version_identifier_folder_of_reference in all_available_version_identifier_folders_of_reference:
161
+ version_identifier_of_project = os.path.basename(all_available_version_identifier_folder_of_reference)
162
+ if version_identifier_of_project == "Latest":
163
+ latest_version_hint = f" (v{project_version})"
164
+ else:
165
+ latest_version_hint = GeneralUtilities.empty_string
166
+ reference_versions_html_lines.append(f' <h2>{version_identifier_of_project}{latest_version_hint}</h2>')
167
+ reference_versions_html_lines.append(" Contained codeunits:<br/>")
168
+ reference_versions_html_lines.append(" <ul>")
169
+ for codeunit_reference_folder in list(folder for folder in GeneralUtilities.get_direct_folders_of_folder(all_available_version_identifier_folder_of_reference)):
170
+ reference_versions_html_lines.append(f' <li><a href="./{version_identifier_of_project}/{os.path.basename(codeunit_reference_folder)}/index.html">' +
171
+ f'{os.path.basename(codeunit_reference_folder)} {version_identifier_of_project}</a></li>')
172
+ reference_versions_html_lines.append(" </ul>")
173
+ reference_versions_html_lines.append(' <hr/>')
174
+ if version_identifier_of_project == "Latest":
175
+ latest_version_hint = " <h2>History</h2>"
176
+
177
+ design_file = None
178
+ design = "ModestDark"
179
+ if design == "ModestDark":
180
+ design_file = GeneralUtilities.get_modest_dark_url()
181
+ # TODO make designs from customizable sources be available by a customizable name and outsource this to a class-property because this is duplicated code.
182
+ if design_file is None:
183
+ design_html = GeneralUtilities.empty_string
184
+ else:
185
+ design_html = f'<link type="text/css" rel="stylesheet" href="{design_file}" />'
186
+
187
+ reference_versions_links_file_content = " \n".join(reference_versions_html_lines)
188
+ title = f"{projectname}-reference"
189
+ reference_index_file = os.path.join(reference_folder, "index.html")
190
+ reference_index_file_content = f"""<!DOCTYPE html>
191
+ <html lang="en">
192
+
193
+ <head>
194
+ <meta charset="UTF-8">
195
+ <title>{title}</title>
196
+ {design_html}
197
+ </head>
198
+
199
+ <body>
200
+ <h1>{title}</h1>
201
+ {reference_versions_links_file_content}
202
+ </body>
203
+
204
+ </html>
205
+ """ # see https://getbootstrap.com/docs/5.1/getting-started/introduction/
206
+ GeneralUtilities.write_text_to_file(reference_index_file, reference_index_file_content)
207
+
208
+ @GeneralUtilities.check_arguments
209
+ 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:
210
+ codeunit_folder = os.path.join(repository, codeunitname)
211
+ codeunit_file = os.path.join(codeunit_folder, f"{codeunitname}.codeunit.xml")
212
+ codeunit_has_testcases = self.tFCPS_Tools_General.codeunit_has_testable_sourcecode(codeunit_file)
213
+ target_folder = os.path.join(target_folder_for_reference_repository, project_version_identifier, codeunitname)
214
+ if os.path.isdir(target_folder) and not replace_existing_content:
215
+ raise ValueError(f"Folder '{target_folder}' already exists.")
216
+ GeneralUtilities.ensure_directory_does_not_exist(target_folder)
217
+ GeneralUtilities.ensure_directory_exists(target_folder)
218
+ codeunit_version_identifier = "Latest" if project_version_identifier == "Latest" else "v"+codeunit_version
219
+ page_title = f"{codeunitname} {codeunit_version_identifier} codeunit-reference"
220
+ diff_report = f"{repository}/{codeunitname}/Other/Artifacts/DiffReport/DiffReport.html"
221
+ diff_target_folder = os.path.join(target_folder, "DiffReport")
222
+ GeneralUtilities.ensure_directory_exists(diff_target_folder)
223
+ diff_target_file = os.path.join(diff_target_folder, "DiffReport.html")
224
+ title = (f'Reference of codeunit {codeunitname} {codeunit_version_identifier} (contained in project <a href="{public_repository_url}">{projectname}</a> {project_version_identifier})')
225
+ if public_repository_url is None:
226
+ repo_url_html = GeneralUtilities.empty_string
227
+ else:
228
+ repo_url_html = f'<a href="{public_repository_url}/tree/{branch}/{codeunitname}">Source-code</a>'
229
+ if codeunit_has_testcases:
230
+ coverage_report_link = '<a href="./TestCoverageReport/index.html">Test-coverage-report</a><br>'
231
+ else:
232
+ coverage_report_link = GeneralUtilities.empty_string
233
+ index_file_for_reference = os.path.join(target_folder, "index.html")
234
+
235
+ design_file = None
236
+ design = "ModestDark"
237
+ if design == "ModestDark":
238
+ design_file = GeneralUtilities.get_modest_dark_url()
239
+ # TODO make designs from customizable sources be available by a customizable name and outsource this to a class-property because this is duplicated code.
240
+ if design_file is None:
241
+ design_html = GeneralUtilities.empty_string
242
+ else:
243
+ design_html = f'<link type="text/css" rel="stylesheet" href="{design_file}" />'
244
+
245
+ index_file_content = f"""<!DOCTYPE html>
246
+ <html lang="en">
247
+
248
+ <head>
249
+ <meta charset="UTF-8">
250
+ <title>{page_title}</title>
251
+ {design_html}
252
+ </head>
253
+
254
+ <body>
255
+ <h1>{title}</h1>
256
+ <hr/>
257
+ Available reference-content for {codeunitname}:<br>
258
+ {repo_url_html}<br>
259
+ <!--TODO add artefacts-link: <a href="./x">Artefacts</a><br>-->
260
+ <a href="./Reference/index.html">Reference</a><br>
261
+ <a href="./DiffReport/DiffReport.html">Diff-report</a><br>
262
+ {coverage_report_link}
263
+ </body>
264
+
265
+ </html>
266
+ """
267
+
268
+ GeneralUtilities.ensure_file_exists(index_file_for_reference)
269
+ GeneralUtilities.write_text_to_file(index_file_for_reference, index_file_content)
270
+ other_folder_in_repository = os.path.join(repository, codeunitname, "Other")
271
+ source_generatedreference = os.path.join(other_folder_in_repository, "Artifacts", "Reference")
272
+ target_generatedreference = os.path.join(target_folder, "Reference")
273
+ shutil.copytree(source_generatedreference, target_generatedreference)
274
+
275
+ shutil.copyfile(diff_report, diff_target_file)
276
+
277
+ if codeunit_has_testcases:
278
+ source_testcoveragereport = os.path.join(other_folder_in_repository, "Artifacts", "TestCoverageReport")
279
+ if os.path.isdir(source_testcoveragereport): # check, because it is not a mandatory artifact. if the artifact is not available, the user gets already a warning.
280
+ target_testcoveragereport = os.path.join(target_folder, "TestCoverageReport")
281
+ shutil.copytree(source_testcoveragereport, target_testcoveragereport)
282
+
283
+ class TFCPS_MergeToStable_CLI:
284
+
285
+ @staticmethod
286
+ @GeneralUtilities.check_arguments
287
+ def get_with_overwritable_defaults(file:str,default_loglevel:LogLevel=None,default_source_branch:str=None,default_additionalargumentsfile:str=None,default_target_branch:str=None,common_remote_name:str=None,build_repo_main_branch_name:str=None,reference_repo_main_branch_name:str=None,reference_remote_name:str=None,build_repo_remote_name:str=None,artifacts_target_folder:str=None,common_remote_url:str=None)->TFCPS_MergeToMain:
288
+ parser = argparse.ArgumentParser()
289
+ verbosity_values = ", ".join(f"{lvl.value}={lvl.name}" for lvl in LogLevel)
290
+ parser.add_argument('-a', '--additionalargumentsfile', required=False, default=None)
291
+ parser.add_argument('-s', '--sourcebranch', required=False)#default="main"
292
+ parser.add_argument('-t', '--targetbranch', required=False)#default="stable"
293
+ parser.add_argument( '--referencerepo', required=False, default=None)
294
+ parser.add_argument( '--commonremotename', required=False, default=None)
295
+ parser.add_argument( '--buildrepomainbranchname', required=False)#default="main"
296
+ parser.add_argument( '--referencerepomainbranchname', required=False)#default="main"
297
+ parser.add_argument( '--referenceremotename', required=False, default=None)
298
+ parser.add_argument( '--buildreporemotename', required=False, default=None)
299
+ parser.add_argument( '--artifactstargetfolder', required=False, default=None)
300
+ parser.add_argument( '--commonremoteurl', required=False, default=None)
301
+ parser.add_argument('-v', '--verbosity', required=False, help=f"Sets the loglevel. Possible values: {verbosity_values}")
302
+ args=parser.parse_args()
303
+
304
+ sc:ScriptCollectionCore=ScriptCollectionCore()
305
+
306
+ build_repo=GeneralUtilities.resolve_relative_path("../../..",file)
307
+ sc.assert_is_git_repository(build_repo)
308
+
309
+ default_product_name=os.path.basename(build_repo)[:-len("Build")]
310
+
311
+ if args.verbosity is not None:
312
+ default_loglevel=LogLevel(int( args.verbosity))
313
+ GeneralUtilities.assert_not_null(default_loglevel,"verbosity is not set")
314
+
315
+ if args.additionalargumentsfile is not None:
316
+ default_additionalargumentsfile=args.additionalargumentsfile
317
+
318
+ if args.sourcebranch is not None:
319
+ default_source_branch=args.sourcebranch
320
+ GeneralUtilities.assert_not_null(default_source_branch,"sourcebranch is not set")
321
+
322
+ if args.targetbranch is not None:
323
+ default_target_branch=args.targetbranch
324
+ GeneralUtilities.assert_not_null(default_target_branch,"targetbranch is not set")
325
+
326
+ if args.commonremotename is not None:
327
+ common_remote_name=args.commonremotename
328
+ GeneralUtilities.assert_not_null(common_remote_name,"commonremotename is not set")
329
+
330
+ if args.buildrepomainbranchname is not None:
331
+ build_repo_main_branch_name=args.buildrepomainbranchname
332
+ GeneralUtilities.assert_not_null(build_repo_main_branch_name,"buildrepomainbranchname is not set")
333
+
334
+ if args.referencerepomainbranchname is not None:
335
+ reference_repo_main_branch_name=args.referencerepomainbranchname
336
+ GeneralUtilities.assert_not_null(reference_repo_main_branch_name,"referencerepomainbranchname is not set")
337
+
338
+ if args.referenceremotename is not None:
339
+ reference_remote_name=args.referenceremotename
340
+ GeneralUtilities.assert_not_null(reference_remote_name,"referenceremotename is not set")
341
+
342
+ if args.buildreporemotename is not None:
343
+ build_repo_remote_name=args.buildreporemotename
344
+ GeneralUtilities.assert_not_null(build_repo_remote_name,"buildreporemotename is not set")
345
+
346
+ if args.artifactstargetfolder is not None:
347
+ artifacts_target_folder=args.artifactstargetfolder
348
+
349
+ if args.commonremoteurl is not None:
350
+ common_remote_url=args.commonremoteurl
351
+ GeneralUtilities.assert_not_null(common_remote_url,"commonremoteurl is not set")
352
+
353
+ repository=os.path.join(build_repo,"Submodules",default_product_name)
354
+ config:MergeToStableConfiguration=MergeToStableConfiguration(default_loglevel,default_source_branch,default_target_branch,repository,build_repo,common_remote_name,build_repo_main_branch_name,reference_repo_main_branch_name,reference_remote_name,build_repo_remote_name,artifacts_target_folder,common_remote_url,default_additionalargumentsfile)
355
+ tFCPS_MergeToMain:TFCPS_MergeToStable=TFCPS_MergeToStable(config)
356
+ return tFCPS_MergeToMain
@@ -0,0 +1,48 @@
1
+ import argparse
2
+ from ..SCLog import LogLevel
3
+ from ..ScriptCollectionCore import GeneralUtilities
4
+ from ..ScriptCollectionCore import ScriptCollectionCore
5
+ from .TFCPS_Tools_General import TFCPS_Tools_General
6
+
7
+ class TFCPS_PreBuildCodeunitsScriptConfiguration:
8
+ targetenvironmenttype:str
9
+ additionalargumentsfile:str
10
+ verbosity:LogLevel
11
+ use_cache:str
12
+ repository_folder:str=None
13
+ sc:ScriptCollectionCore=None
14
+ tfcps_Tools_General:TFCPS_Tools_General
15
+
16
+ def __init__(self,script_file:str,targetenvironmenttype:str,additionalargumentsfile:str,verbosity:LogLevel,use_cache:bool):
17
+ self.targetenvironmenttype=targetenvironmenttype
18
+ self.additionalargumentsfile=additionalargumentsfile
19
+ self.verbosity=verbosity
20
+ self.use_cache=use_cache
21
+ self.sc=ScriptCollectionCore()
22
+ self.sc.log.loglevel=self.verbosity
23
+ self.repository_folder=ScriptCollectionCore().search_repository_folder(script_file)
24
+ self.tfcps_Tools_General=TFCPS_Tools_General(self.sc)
25
+
26
+ class TFCPS_PreBuildCodeunitsScript:
27
+ configuration:TFCPS_PreBuildCodeunitsScriptConfiguration
28
+
29
+ def __init__(self,configuration:TFCPS_PreBuildCodeunitsScriptConfiguration):
30
+ self.configuration=configuration
31
+
32
+ @GeneralUtilities.check_arguments
33
+ def pre_merge(self):
34
+ pass#TODO
35
+
36
+ class TFCPS_PreBuildCodeunitsScript_CLI():
37
+
38
+ @staticmethod
39
+ @GeneralUtilities.check_arguments
40
+ def parse(script_file:str)->argparse.ArgumentParser:
41
+ parser = argparse.ArgumentParser()
42
+ verbosity_values = ", ".join(f"{lvl.value}={lvl.name}" for lvl in LogLevel)
43
+ parser.add_argument('-e', '--targetenvironmenttype', required=False, default="QualityCheck")
44
+ parser.add_argument('-a', '--additionalargumentsfile', required=False, default=None)
45
+ parser.add_argument('-v', '--verbosity', required=False, default=3, help=f"Sets the loglevel. Possible values: {verbosity_values}")
46
+ parser.add_argument('-c', '--nocache', action='store_true', required=False, default=False)
47
+ args=parser.parse_args()
48
+ return TFCPS_PreBuildCodeunitsScript(TFCPS_PreBuildCodeunitsScriptConfiguration(script_file,args.targetenvironmenttype,args.additionalargumentsfile,LogLevel(int(args.verbosity)),not args.nocache))