Skip to content

Commit 337dec4

Browse files
committed
Better differentiate between commit ID and version for GL canonical name
Signed-off-by: Tobias Wolf <[email protected]>
1 parent 568cfa2 commit 337dec4

File tree

5 files changed

+82
-64
lines changed

5 files changed

+82
-64
lines changed

src/gardenlinux/features/__main__.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
_ARGS_TYPE_ALLOWED = [
2222
"cname",
2323
"cname_base",
24+
"commit_id",
2425
"features",
2526
"platforms",
2627
"flags",
2728
"elements",
2829
"arch",
2930
"version",
31+
"version_and_commit_id",
3032
"graph",
3133
]
3234

@@ -41,10 +43,11 @@ def main() -> None:
4143
parser = argparse.ArgumentParser()
4244

4345
parser.add_argument("--arch", dest="arch")
46+
parser.add_argument("--cname", dest="cname")
47+
parser.add_argument("--commit", dest="commit")
4448
parser.add_argument("--feature-dir", default="features")
45-
parser.add_argument("--cname")
46-
parser.add_argument("--default-arch")
47-
parser.add_argument("--default-version")
49+
parser.add_argument("--default-arch", dest="default_arch")
50+
parser.add_argument("--default-version", dest="default_version")
4851
parser.add_argument("--version", dest="version")
4952

5053
parser.add_argument(
@@ -68,7 +71,7 @@ def main() -> None:
6871

6972
arch = args.arch
7073
flavor = None
71-
commit_id = None
74+
commit_id = args.commit
7275
gardenlinux_root = path.dirname(args.feature_dir)
7376
version = args.version
7477

@@ -80,8 +83,7 @@ def main() -> None:
8083

8184
if version is None or version == "":
8285
try:
83-
version_data = get_version_and_commit_id_from_files(gardenlinux_root)
84-
version = f"{version_data[0]}-{version_data[1]}"
86+
version, commit_id = get_version_and_commit_id_from_files(gardenlinux_root)
8587
except RuntimeError as exc:
8688
logging.debug(
8789
"Failed to parse version information for GL root '{0}': {1}".format(
@@ -92,7 +94,7 @@ def main() -> None:
9294
version = args.default_version
9395

9496
if args.cname:
95-
cname = CName(args.cname, arch=arch, version=version)
97+
cname = CName(args.cname, arch=arch, commit_id=commit_id, version=version)
9698

9799
arch = cname.arch
98100
flavor = cname.flavor
@@ -108,7 +110,11 @@ def main() -> None:
108110
"Architecture could not be determined and no default architecture set"
109111
)
110112

111-
if version is None or version == "" and (args.type in ("cname", "version")):
113+
if (
114+
version is None
115+
or version == ""
116+
and (args.type in ("cname", "commit_id", "version", "version_and_commit_id"))
117+
):
112118
raise RuntimeError("Version not specified and no default version set")
113119

114120
feature_dir_name = path.basename(args.feature_dir)
@@ -160,7 +166,11 @@ def main() -> None:
160166
print(",".join(features_by_type["element"]))
161167
elif args.type == "flags":
162168
print(",".join(features_by_type["flag"]))
169+
elif args.type == "commit_id":
170+
print(commit_id)
163171
elif args.type == "version":
172+
print(version)
173+
elif args.type == "version_and_commit_id":
164174
print(f"{version}-{commit_id}")
165175

166176

src/gardenlinux/features/cname.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@ class CName(object):
2525
Apache License, Version 2.0
2626
"""
2727

28-
def __init__(self, cname, arch=None, version=None):
28+
def __init__(self, cname, arch=None, commit_id=None, version=None):
2929
"""
3030
Constructor __init__(CName)
3131
32-
:param cname: Canonical name to represent
33-
:param arch: Architecture if not part of cname
34-
:param version: Version if not part of cname
32+
:param cname: Canonical name to represent
33+
:param arch: Architecture if not part of cname
34+
:param commit_id: Commit ID if not part of cname
35+
:param version: Version if not part of cname
3536
3637
:since: 0.7.0
3738
"""
@@ -64,11 +65,16 @@ def __init__(self, cname, arch=None, version=None):
6465
self._arch = arch
6566

6667
if self._version is None and version is not None:
67-
re_match = re.match("([a-z0-9.]+)(-([a-z0-9]+))?$", version)
68-
assert re_match, f"Not a valid version {version}"
68+
# Support version values formatted as <version>-<commit_id>
69+
if commit_id is None:
70+
re_match = re.match("([a-z0-9.]+)(-([a-z0-9]+))?$", version)
71+
assert re_match, f"Not a valid version {version}"
6972

70-
self._commit_id = re_match[3]
71-
self._version = re_match[1]
73+
self._commit_id = re_match[3]
74+
self._version = re_match[1]
75+
else:
76+
self._commit_id = commit_id
77+
self._version = version
7278

7379
@property
7480
def arch(self) -> Optional[str]:

src/gardenlinux/features/cname_main.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def main():
3232
parser = argparse.ArgumentParser()
3333

3434
parser.add_argument("--arch", dest="arch")
35+
parser.add_argument("--commit", dest="commit")
3536
parser.add_argument("--feature-dir", default="features")
3637
parser.add_argument("--version", dest="version")
3738
parser.add_argument("cname")
@@ -46,6 +47,7 @@ def main():
4647
assert re_match, f"Not a valid GardenLinux canonical name {args.cname}"
4748

4849
arch = args.arch
50+
commit_id = args.commit
4951
gardenlinux_root = dirname(args.feature_dir)
5052
version = args.version
5153

@@ -54,16 +56,15 @@ def main():
5456

5557
if not version:
5658
try:
57-
version_data = get_version_and_commit_id_from_files(gardenlinux_root)
58-
version = f"{version_data[0]}-{version_data[1]}"
59+
version, commit_id = get_version_and_commit_id_from_files(gardenlinux_root)
5960
except RuntimeError as exc:
6061
logging.warning(
6162
"Failed to parse version information for GL root '{0}': {1}".format(
6263
gardenlinux_root, exc
6364
)
6465
)
6566

66-
cname = CName(args.cname, arch=arch, version=version)
67+
cname = CName(args.cname, arch=arch, commit_id=commit_id, version=version)
6768

6869
assert cname.arch, "Architecture could not be determined"
6970

tests/features/test_cname_main.py

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import sys
2-
import types
31
import logging
42
import pytest
3+
import sys
4+
import types
55

66
import gardenlinux.features.cname_main as cname_main
7+
from gardenlinux.features import CName
78

89

910
def test_main_happy(monkeypatch, capsys):
@@ -14,14 +15,6 @@ def test_main_happy(monkeypatch, capsys):
1415
argv = ["prog", "--arch", "amd64", "--version", "1.0-abc123", "flav-amd64"]
1516
monkeypatch.setattr(sys, "argv", argv)
1617

17-
class FakeCName:
18-
def __init__(self, cname, arch=None, version=None):
19-
self.arch = arch
20-
self.flavor = "flav"
21-
self.version_and_commit_id = "1.0-abc123"
22-
23-
monkeypatch.setattr(cname_main, "CName", FakeCName)
24-
2518
class FakeGraph:
2619
in_degree = lambda self: [("f1", 0)]
2720
edges = [("f1", "f2")]
@@ -62,14 +55,6 @@ def test_main_version_from_file(monkeypatch, capsys):
6255
lambda root: ("2.0", "abcdef12"),
6356
)
6457

65-
class FakeCName:
66-
def __init__(self, cname, arch=None, version=None):
67-
self.arch = arch
68-
self.flavor = "flav"
69-
self.version_and_commit_id = version
70-
71-
monkeypatch.setattr(cname_main, "CName", FakeCName)
72-
7358
class FakeParser:
7459
def __init__(self, *a, **k):
7560
pass
@@ -110,15 +95,6 @@ def raise_runtime(_):
11095
cname_main, "get_version_and_commit_id_from_files", raise_runtime
11196
)
11297

113-
# Patch CName to control attributes
114-
class FakeCName:
115-
def __init__(self, cname, arch=None, version=None):
116-
self.arch = arch
117-
self.flavor = "flav"
118-
self.version_and_commit_id = version
119-
120-
monkeypatch.setattr(cname_main, "CName", FakeCName)
121-
12298
# Patch Parser for minimal valid graph
12399
class FakeParser:
124100
def __init__(self, *a, **k):
@@ -165,14 +141,6 @@ def test_cname_main_missing_arch_in_cname_raises(monkeypatch):
165141
argv = ["prog", "--version", "1.0", "flav"]
166142
monkeypatch.setattr(sys, "argv", argv)
167143

168-
class FakeCName:
169-
def __init__(self, cname, arch=None, version=None):
170-
self.arch = None # Force missing arch
171-
self.flavor = "flav"
172-
self.version_and_commit_id = "1.0-abc"
173-
174-
monkeypatch.setattr(cname_main, "CName", FakeCName)
175-
176144
# Act / Assert
177145
with pytest.raises(AssertionError):
178146
cname_main.main()

tests/features/test_main.py

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,27 @@ def test_main_prints_arch(monkeypatch, capsys):
132132
assert "amd64" in out
133133

134134

135+
def test_main_prints_commit_id(monkeypatch, capsys):
136+
# Arrange
137+
argv = ["prog", "--arch", "amd64", "--features", "f1", "commit_id"]
138+
monkeypatch.setattr(sys, "argv", argv)
139+
monkeypatch.setattr(
140+
fema,
141+
"Parser",
142+
lambda *a, **kw: types.SimpleNamespace(filter=lambda *a, **k: None),
143+
)
144+
# Patch get_version_and_commit_id_from_files
145+
monkeypatch.setattr(
146+
fema, "get_version_and_commit_id_from_files", lambda root: ("1.2.3", "abcdef12")
147+
)
148+
149+
# Act
150+
fema.main()
151+
152+
captured = capsys.readouterr()
153+
assert "abcdef12" == captured.out.strip()
154+
155+
135156
def test_main_prints_flags_elements_platforms(monkeypatch, capsys):
136157
# Arrange
137158
argv = [
@@ -186,7 +207,28 @@ def test_main_prints_version(monkeypatch, capsys):
186207
fema.main()
187208

188209
captured = capsys.readouterr()
189-
assert "1.2.3-abcdef12" in captured.out
210+
assert "1.2.3" == captured.out.strip()
211+
212+
213+
def test_main_prints_version_and_commit_id(monkeypatch, capsys):
214+
# Arrange
215+
argv = ["prog", "--arch", "amd64", "--features", "f1", "version_and_commit_id"]
216+
monkeypatch.setattr(sys, "argv", argv)
217+
monkeypatch.setattr(
218+
fema,
219+
"Parser",
220+
lambda *a, **kw: types.SimpleNamespace(filter=lambda *a, **k: None),
221+
)
222+
# Patch get_version_and_commit_id_from_files
223+
monkeypatch.setattr(
224+
fema, "get_version_and_commit_id_from_files", lambda root: ("1.2.3", "abcdef12")
225+
)
226+
227+
# Act
228+
fema.main()
229+
230+
captured = capsys.readouterr()
231+
assert "1.2.3-abcdef12" == captured.out.strip()
190232

191233

192234
def test_main_arch_raises_missing_verison(monkeypatch, capsys):
@@ -202,15 +244,6 @@ def test_main_arch_raises_missing_verison(monkeypatch, capsys):
202244

203245
def test_main_with_cname_print_cname(monkeypatch, capsys):
204246
# Arrange
205-
class FakeCName:
206-
def __init__(self, cname, arch=None, version=None):
207-
self.arch = arch
208-
self.flavor = "flav"
209-
self.commit_id = "abc123"
210-
self.version = version
211-
212-
monkeypatch.setattr(fema, "CName", FakeCName)
213-
214247
class FakeGraph:
215248
def in_degree(self):
216249
# Simulate a graph where one feature has no dependencies

0 commit comments

Comments
 (0)