spl-core 7.6.1__py3-none-any.whl → 7.8.0__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.
- spl_core/__init__.py +1 -1
- spl_core/steps/collect_pr_changes.py +97 -0
- spl_core/test_utils/spl_build.py +7 -4
- {spl_core-7.6.1.dist-info → spl_core-7.8.0.dist-info}/METADATA +3 -1
- {spl_core-7.6.1.dist-info → spl_core-7.8.0.dist-info}/RECORD +8 -8
- spl_core/common/command_line_executor.py +0 -70
- {spl_core-7.6.1.dist-info → spl_core-7.8.0.dist-info}/LICENSE +0 -0
- {spl_core-7.6.1.dist-info → spl_core-7.8.0.dist-info}/WHEEL +0 -0
- {spl_core-7.6.1.dist-info → spl_core-7.8.0.dist-info}/entry_points.txt +0 -0
spl_core/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "7.
|
|
1
|
+
__version__ = "7.8.0"
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import List, Optional
|
|
5
|
+
|
|
6
|
+
from mashumaro.mixins.json import DataClassJSONMixin
|
|
7
|
+
from py_app_dev.core.logging import logger
|
|
8
|
+
from py_app_dev.core.subprocess import SubprocessExecutor
|
|
9
|
+
from pypeline.domain.pipeline import PipelineStep
|
|
10
|
+
from pypeline_semantic_release.steps import CIContext
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class PR_Changes(DataClassJSONMixin):
|
|
15
|
+
"""Dataclass for storing PR changes."""
|
|
16
|
+
|
|
17
|
+
ci_system: str
|
|
18
|
+
target_branch: str
|
|
19
|
+
current_branch: str
|
|
20
|
+
commit_id: str
|
|
21
|
+
changed_files: List[str]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class CollectPRChanges(PipelineStep):
|
|
25
|
+
"""Collect changed files from a pull request."""
|
|
26
|
+
|
|
27
|
+
def run(self) -> None:
|
|
28
|
+
logger.info(f"{self.get_name()}")
|
|
29
|
+
ci_contexts = self.execution_context.data_registry.find_data(CIContext)
|
|
30
|
+
if len(ci_contexts) > 0:
|
|
31
|
+
ci_context = ci_contexts[0]
|
|
32
|
+
logger.info(f"CI context: {ci_context}")
|
|
33
|
+
if ci_context.is_pull_request:
|
|
34
|
+
logger.info(f"Collecting PR changes between branch {ci_context.target_branch} and {ci_context.current_branch}")
|
|
35
|
+
changed_files = self._get_changed_files(ci_context.target_branch, ci_context.current_branch)
|
|
36
|
+
output_file = self.get_outputs()[0]
|
|
37
|
+
output_file.parent.mkdir(parents=True, exist_ok=True)
|
|
38
|
+
output_file.write_text(json.dumps(
|
|
39
|
+
PR_Changes(
|
|
40
|
+
ci_system=ci_context.ci_system.name, target_branch=ci_context.target_branch, current_branch=ci_context.current_branch, commit_id=self._get_commit_id(ci_context), changed_files=changed_files
|
|
41
|
+
).to_dict(),
|
|
42
|
+
indent=2
|
|
43
|
+
))
|
|
44
|
+
logger.info(f"PR changes saved to {output_file}")
|
|
45
|
+
|
|
46
|
+
def _get_changed_files(self, target_branch: str, current_branch: str) -> List[str]:
|
|
47
|
+
"""Get list of changed files in the current branch/PR"""
|
|
48
|
+
try:
|
|
49
|
+
result = SubprocessExecutor(["git", "fetch", "origin", current_branch]).execute(handle_errors=False)
|
|
50
|
+
if result and result.returncode == 0:
|
|
51
|
+
result = SubprocessExecutor(["git", "diff", "--name-only", f"origin/{target_branch}...origin/{current_branch}"]).execute(handle_errors=False)
|
|
52
|
+
|
|
53
|
+
if result and result.returncode == 0 and result.stdout.strip():
|
|
54
|
+
files = [line.strip() for line in result.stdout.strip().split("\n") if line.strip()]
|
|
55
|
+
return files
|
|
56
|
+
|
|
57
|
+
except Exception as e:
|
|
58
|
+
logger.error(f"Git command failed: {e}")
|
|
59
|
+
return [] # Ensure a list is always returned
|
|
60
|
+
return []
|
|
61
|
+
|
|
62
|
+
def get_inputs(self) -> List[Path]:
|
|
63
|
+
return []
|
|
64
|
+
|
|
65
|
+
def get_outputs(self) -> List[Path]:
|
|
66
|
+
return [self.output_dir.joinpath("pr_changes.json")]
|
|
67
|
+
|
|
68
|
+
def get_name(self) -> str:
|
|
69
|
+
return self.__class__.__name__
|
|
70
|
+
|
|
71
|
+
def update_execution_context(self) -> None:
|
|
72
|
+
pass
|
|
73
|
+
|
|
74
|
+
def get_config(self) -> dict[str, str] | None:
|
|
75
|
+
"""
|
|
76
|
+
Get runnable configuration.
|
|
77
|
+
|
|
78
|
+
(!) Do NOT put sensitive information in the configuration. It will be stored in a file.
|
|
79
|
+
"""
|
|
80
|
+
return {"latest_commit": self._get_commit_id()}
|
|
81
|
+
|
|
82
|
+
def _get_commit_id(self, ci_context: Optional[CIContext] = None) -> str:
|
|
83
|
+
"""Get the latest commit ID in the current branch."""
|
|
84
|
+
try:
|
|
85
|
+
if not ci_context:
|
|
86
|
+
ci_contexts = self.execution_context.data_registry.find_data(CIContext)
|
|
87
|
+
if len(ci_contexts) == 0:
|
|
88
|
+
logger.info("No CI context found.")
|
|
89
|
+
return ""
|
|
90
|
+
ci_context = ci_contexts[0]
|
|
91
|
+
if isinstance(ci_context, CIContext) and ci_context.is_pull_request:
|
|
92
|
+
result = SubprocessExecutor(["git", "rev-parse", f"origin/{ci_context.current_branch}"]).execute(handle_errors=False)
|
|
93
|
+
if result and result.returncode == 0:
|
|
94
|
+
return result.stdout.strip()
|
|
95
|
+
except Exception as e:
|
|
96
|
+
logger.info(f"Failed to get commit ID: {e}")
|
|
97
|
+
return ""
|
spl_core/test_utils/spl_build.py
CHANGED
|
@@ -6,8 +6,7 @@ from pathlib import Path
|
|
|
6
6
|
from typing import Callable, ClassVar, List, Optional
|
|
7
7
|
|
|
8
8
|
from py_app_dev.core.logging import time_it
|
|
9
|
-
|
|
10
|
-
from spl_core.common.command_line_executor import CommandLineExecutor
|
|
9
|
+
from py_app_dev.core.subprocess import SubprocessExecutor
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
@dataclass
|
|
@@ -110,7 +109,7 @@ class SplBuild:
|
|
|
110
109
|
target = self.target if self.target else "all"
|
|
111
110
|
return_code = -1
|
|
112
111
|
while True:
|
|
113
|
-
cmd = [
|
|
112
|
+
cmd: list[str | Path] = [
|
|
114
113
|
"build.bat",
|
|
115
114
|
"-build",
|
|
116
115
|
"-buildKit",
|
|
@@ -125,7 +124,11 @@ class SplBuild:
|
|
|
125
124
|
cmd.extend(["-buildType", self.build_type])
|
|
126
125
|
if additional_args:
|
|
127
126
|
cmd.extend(additional_args)
|
|
128
|
-
|
|
127
|
+
# Cast to Union[str, List[Union[str, Path]]] to satisfy SubprocessExecutor type
|
|
128
|
+
result = SubprocessExecutor(command=cmd).execute(handle_errors=False)
|
|
129
|
+
if result is None:
|
|
130
|
+
return_code = -1
|
|
131
|
+
break
|
|
129
132
|
return_code = result.returncode
|
|
130
133
|
if result.returncode:
|
|
131
134
|
if result.stdout:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: spl-core
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.8.0
|
|
4
4
|
Summary: Software Product Line Support for CMake
|
|
5
5
|
License: MIT
|
|
6
6
|
Author: Avengineers
|
|
@@ -23,6 +23,8 @@ Requires-Dist: kconfiglib (>=14.1,<15.0)
|
|
|
23
23
|
Requires-Dist: mlx-traceability (>=10.0,<11.0)
|
|
24
24
|
Requires-Dist: myst-parser (>=0.16)
|
|
25
25
|
Requires-Dist: py-app-dev (>=2.1,<3.0)
|
|
26
|
+
Requires-Dist: pypeline-runner (>=1,<=2)
|
|
27
|
+
Requires-Dist: pypeline-semantic-release (>=0.4.1,<=0.5.0)
|
|
26
28
|
Requires-Dist: sphinx (>=7.3,<8.0)
|
|
27
29
|
Requires-Dist: sphinx-book-theme (>=1.1,<2.0)
|
|
28
30
|
Requires-Dist: sphinx-copybutton (>=0.5,<0.6)
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
spl_core/__init__.py,sha256=
|
|
1
|
+
spl_core/__init__.py,sha256=vZw91QDi0kVrQT2yAQVzBUsHnFXKxQOJTwxJLeLNYNo,22
|
|
2
2
|
spl_core/__run.py,sha256=DphnN7_Bjiw_mOOztsHxTDHS8snz1g2MMWAaJpZxPKM,361
|
|
3
3
|
spl_core/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
spl_core/common/command_line_executor.py,sha256=fvrzZRFmxgY9pMf2byr3ufyQoT7zMd4hzruqObMgRs0,2622
|
|
5
4
|
spl_core/common/path.py,sha256=sDujd3n4XP1XGjHc7ImXEdjihO6A8BOIDbKCf7HgQ0Y,462
|
|
6
5
|
spl_core/common.cmake,sha256=sRWqQeK04iUpeM3beQZXIi5mpEQNyO751O-yBoFCrqk,35160
|
|
7
6
|
spl_core/conan.cmake,sha256=i1AuyN-e8cczX7TI1nl6e3Y8N-EP-QXPVY7LG6NUyJY,41958
|
|
@@ -60,11 +59,12 @@ spl_core/kickstart/templates/project/tools/toolchains/clang/toolchain.cmake,sha2
|
|
|
60
59
|
spl_core/kickstart/templates/project/tools/toolchains/gcc/toolchain.cmake,sha256=AmLzPyhTgfc_Dsre4AlsvSOkVGW6VswWvrEnUL8JLhA,183
|
|
61
60
|
spl_core/main.py,sha256=_hL4j155WZMXog_755bgAH1PeUwvTdJZvVdVw9EWhvo,1225
|
|
62
61
|
spl_core/spl.cmake,sha256=W8h-Zj-N302qxMrRG8MhoEkJ0io92bWGp4Y5r8LBQnc,4535
|
|
62
|
+
spl_core/steps/collect_pr_changes.py,sha256=0zqjF55K3P8V3ZfCNQc33pYrCxhJJhBmAG4cVxVuy1U,4182
|
|
63
63
|
spl_core/test_utils/archive_artifacts_collection.py,sha256=x7LH5dGIvssyhXsTFzB6rjgb5D2efKvHVpnjId3MNDk,5126
|
|
64
64
|
spl_core/test_utils/base_variant_test_runner.py,sha256=Oq27lkJlpB_y-p2_8S23F5zjn1438HW148q-hQNz3EY,3795
|
|
65
|
-
spl_core/test_utils/spl_build.py,sha256=
|
|
66
|
-
spl_core-7.
|
|
67
|
-
spl_core-7.
|
|
68
|
-
spl_core-7.
|
|
69
|
-
spl_core-7.
|
|
70
|
-
spl_core-7.
|
|
65
|
+
spl_core/test_utils/spl_build.py,sha256=bSM6hwhTH9aRryvUvtSPDfk_zoZuKEO5g3QXK4SIrco,8442
|
|
66
|
+
spl_core-7.8.0.dist-info/LICENSE,sha256=UjjA0o8f5tT3wVm7qodTLAhPWLl6kgVyn9FPAd1VeYY,1099
|
|
67
|
+
spl_core-7.8.0.dist-info/METADATA,sha256=cI-eKefU7d5Y4TL740Uubo_11uPvfd8d2ufGp7-vy-s,5257
|
|
68
|
+
spl_core-7.8.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
69
|
+
spl_core-7.8.0.dist-info/entry_points.txt,sha256=18_sdVY93N1GVBiAHxQ_F9ZM-bBvOmVMOMn7PNe2EqU,45
|
|
70
|
+
spl_core-7.8.0.dist-info/RECORD,,
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import locale
|
|
2
|
-
import subprocess
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
from typing import Dict, List, Optional
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class CommandLineExecutor:
|
|
8
|
-
def __init__(
|
|
9
|
-
self,
|
|
10
|
-
cwd: Optional[Path] = None,
|
|
11
|
-
env: Optional[Dict[str, str]] = None,
|
|
12
|
-
):
|
|
13
|
-
"""
|
|
14
|
-
A class for executing command line commands.
|
|
15
|
-
|
|
16
|
-
Args:
|
|
17
|
-
- cmd: A string or list of strings representing the command to be executed.
|
|
18
|
-
- cwd: An optional Path object representing the current working directory.
|
|
19
|
-
- env: An optional dictionary of environment variables to be used in the command execution.
|
|
20
|
-
"""
|
|
21
|
-
self.current_working_directory = cwd
|
|
22
|
-
self.env = env
|
|
23
|
-
|
|
24
|
-
def execute(self, cmd: str | List[str]) -> subprocess.CompletedProcess[str]:
|
|
25
|
-
"""
|
|
26
|
-
Executes the command and returns a CompletedProcess object.
|
|
27
|
-
|
|
28
|
-
Returns:
|
|
29
|
-
- A subprocess.CompletedProcess object representing the result of the command execution.
|
|
30
|
-
"""
|
|
31
|
-
if isinstance(cmd, str):
|
|
32
|
-
command: str | list[str] = cmd
|
|
33
|
-
use_shell = True
|
|
34
|
-
else:
|
|
35
|
-
# Check if any argument contains quotes, which indicates shell processing is needed
|
|
36
|
-
has_quotes = any('"' in arg or "'" in arg for arg in cmd)
|
|
37
|
-
if has_quotes:
|
|
38
|
-
command = " ".join(cmd)
|
|
39
|
-
use_shell = True
|
|
40
|
-
else:
|
|
41
|
-
command = cmd
|
|
42
|
-
use_shell = False
|
|
43
|
-
|
|
44
|
-
output = ""
|
|
45
|
-
try:
|
|
46
|
-
print("=" * 120)
|
|
47
|
-
print(f"= Running command: {command}")
|
|
48
|
-
print("=" * 120)
|
|
49
|
-
with subprocess.Popen(
|
|
50
|
-
command,
|
|
51
|
-
cwd=str(self.current_working_directory or Path.cwd()),
|
|
52
|
-
stdout=subprocess.PIPE,
|
|
53
|
-
stderr=subprocess.STDOUT,
|
|
54
|
-
bufsize=1,
|
|
55
|
-
text=True,
|
|
56
|
-
env=self.env,
|
|
57
|
-
universal_newlines=True,
|
|
58
|
-
encoding=locale.getpreferredencoding(False),
|
|
59
|
-
errors="replace",
|
|
60
|
-
shell=use_shell,
|
|
61
|
-
) as process:
|
|
62
|
-
if process.stdout:
|
|
63
|
-
for line in process.stdout:
|
|
64
|
-
print(line, end="")
|
|
65
|
-
# We have to store the stdout content.
|
|
66
|
-
# This is necessary because the stdout object is closed after we printed its content
|
|
67
|
-
output += line
|
|
68
|
-
except Exception:
|
|
69
|
-
raise RuntimeError(f"Command '{command}' failed.") # noqa: B904
|
|
70
|
-
return subprocess.CompletedProcess(args=command, returncode=process.returncode, stdout=output, stderr=None)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|