fix(builder): 版本时间格式改回 YYYYMMDDTHHMM

按要求保留字母分隔符:20260918T1722。分钟精度不变,同一分支同日多次
构建仍能正确排序。

记录切换边界:Debian 里字母排在标点之前,YYYYMMDDT… 小于旧格式的
YYYYMMDD.…,切换当天同日的旧格式包会压住新包,需要在仓库里把那些旧包
移除或停用;次日新格式始终更大。回归测试显式断言这行边界。
This commit is contained in:
2026-09-19 13:32:16 +08:00
parent eb2d0ce651
commit e60755f280
4 changed files with 58 additions and 47 deletions
+22 -11
View File
@@ -17,7 +17,7 @@ VERSION_MK = SCRIPTS / "version.mk"
# Frozen build instant so test versions are deterministic.
SOURCE_DATE_EPOCH = "1704067200" # 2024-01-01T00:00:00Z
BUILD_STAMP = "202401010000"
BUILD_STAMP = "20240101T0000"
def git(cwd: Path, *args: str, env: dict[str, str] | None = None) -> str:
@@ -183,9 +183,11 @@ class BuilderVersionTests(unittest.TestCase):
"""同一天重建必须比上一包大,否则 apt 永远拿不到最新构建。
只写到日期时同分支同日的版本前缀完全相同,只剩 +g<sha> 可区分,
Debian 版本比较把哈希当普通文本,新包可能被判成比旧包小。带分钟的
时间必须与日期拼在同一段数字里:字母排在标点之前,YYYYMMDDTHHMM
这种带字母分隔的写法会小于同日旧格式包的 YYYYMMDD.…。
Debian 版本比较把哈希当普通文本,新包可能被判成比旧包小。
已知边界(故意断言):切换格式当天,旧格式同日包 `YYYYMMDD.…` 仍
大于新格式 `YYYYMMDDT…`,因为 Debian 把字母排在标点之前。那天需要
把旧格式包在仓库里移除或停用,或者等次日(次日新格式一定更大)。
"""
if shutil.which("dpkg") is None:
self.skipTest("dpkg not available")
@@ -200,17 +202,15 @@ class BuilderVersionTests(unittest.TestCase):
self.assertEqual(early.returncode, 0, early.stderr)
self.assertEqual(later.returncode, 0, later.stderr)
first, second = early.stdout.strip(), later.stdout.strip()
self.assertEqual(first.rsplit(".", 1)[0].split("~")[1].split(".")[0], "202401010000")
self.assertEqual(second.rsplit(".", 1)[0].split("~")[1].split(".")[0], "202401011000")
self.assertEqual(
second,
f"0.0.0~202401011000.main+g{sha7(repo)}",
"时间必须与日期拼成一段数字,不能插入字母分隔符",
f"0.0.0~20240101T1000.main+g{sha7(repo)}",
"构建时间精确到分钟,形如 YYYYMMDDTHHMM",
)
for label, a, b in (
("同日重建", second, first),
("已上传的旧格式同日包", second, "0.0.0~20240101.main+gaaaaaaa"),
("次日新格式包", "0.0.0~202401021000.main+gccccccc", second),
("旧格式前一日包", second, "0.0.0~20231231.main+gaaaaaaa"),
("次日新格式包", "0.0.0~20240102T1000.main+gccccccc", second),
("下一正式版", "0.1.0", second),
):
compared = subprocess.run(
@@ -220,6 +220,17 @@ class BuilderVersionTests(unittest.TestCase):
check=False,
)
self.assertEqual(compared.returncode, 0, f"{label}:{a} 应大于 {b}")
compared = subprocess.run(
["dpkg", "--compare-versions", "0.0.0~20240101.main+gaaaaaaa", "gt", second],
text=True,
capture_output=True,
check=False,
)
self.assertEqual(
compared.returncode,
0,
"已知边界:旧格式同日包大于 YYYYMMDDT…,切换当天需要移除旧包或等次日",
)
def test_detached_uses_env_branch(self) -> None:
with tempfile.TemporaryDirectory() as temp:
@@ -250,7 +261,7 @@ class BuilderVersionTests(unittest.TestCase):
sha = sha7(repo)
later = version_sh(cwd=repo, env={"SOURCE_DATE_EPOCH": "1725148800"})
self.assertEqual(later.returncode, 0, later.stderr)
self.assertEqual(later.stdout.strip(), f"1.0.1~202409010000.main.1+g{sha}")
self.assertEqual(later.stdout.strip(), f"1.0.1~20240901T0000.main.1+g{sha}")
def test_official_version_ignores_build_date(self) -> None:
with tempfile.TemporaryDirectory() as temp: