Skip to content

Commit 53cc506

Browse files
committed
runtime.txt: allow name-yyyy-mm-dd (no version)
1 parent 7ec064c commit 53cc506

File tree

2 files changed

+38
-9
lines changed

2 files changed

+38
-9
lines changed

repo2docker/buildpacks/base.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,11 @@ def runtime(self):
759759
760760
Returns (runtime, version, date), tuple components may be None.
761761
Returns (None, None, None) if runtime.txt not found.
762+
763+
Supported formats:
764+
name-version
765+
name-version-yyyy-mm-dd
766+
name-yyyy-mm-dd
762767
"""
763768
if hasattr(self, "_runtime"):
764769
return self._runtime
@@ -776,15 +781,19 @@ def runtime(self):
776781
version = None
777782
date = None
778783

779-
parts = runtime_txt.split("-", 2)
780-
if len(parts) > 0 and parts[0]:
781-
name = parts[0]
782-
if len(parts) > 1 and parts[1]:
784+
parts = runtime_txt.split("-")
785+
if len(parts) not in (2, 4, 5) or any(not (p) for p in parts):
786+
raise ValueError(f"Invalid runtime.txt: {runtime_txt}")
787+
788+
name = parts[0]
789+
790+
if len(parts) in (2, 5):
783791
version = parts[1]
784-
if len(parts) > 2 and parts[2]:
785-
date = parts[2]
792+
793+
if len(parts) in (4, 5):
794+
date = "-".join(parts[-3:])
786795
if not re.match(r"\d\d\d\d-\d\d-\d\d", date):
787-
raise ValueError(f"Invalid date, expected YYYY-MM-DD: {date}")
796+
raise ValueError(f"Invalid runtime.txt date: {date}")
788797
date = datetime.datetime.fromisoformat(date).date()
789798

790799
self._runtime = (name, version, date)

tests/unit/test_buildpack.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,9 @@ def test_unsupported_python(tmpdir, python_version, base_image):
5757
"runtime_txt, expected",
5858
[
5959
(None, (None, None, None)),
60-
("", (None, None, None)),
61-
("abc", ("abc", None, None)),
6260
("abc-001", ("abc", "001", None)),
6361
("abc-001-2025-06-22", ("abc", "001", date(2025, 6, 22))),
62+
("abc-2025-06-22", ("abc", None, date(2025, 6, 22))),
6463
("a_b/c-0.0.1-2025-06-22", ("a_b/c", "0.0.1", date(2025, 6, 22))),
6564
],
6665
)
@@ -73,3 +72,24 @@ def test_runtime(tmpdir, runtime_txt, expected, base_image):
7372

7473
base = BaseImage(base_image)
7574
assert base.runtime == expected
75+
76+
77+
@pytest.mark.parametrize(
78+
"runtime_txt",
79+
[
80+
"",
81+
"abc",
82+
"abc-001-25-06-22",
83+
],
84+
)
85+
def test_invalid_runtime(tmpdir, runtime_txt, base_image):
86+
tmpdir.chdir()
87+
88+
if runtime_txt is not None:
89+
with open("runtime.txt", "w") as f:
90+
f.write(runtime_txt)
91+
92+
base = BaseImage(base_image)
93+
94+
with pytest.raises(ValueError, match=r"^Invalid runtime.txt.*"):
95+
base.runtime

0 commit comments

Comments
 (0)