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