Skip to content

Commit fe9236f

Browse files
ambvhugovk
andauthored
Check for magic number mismatch early to avoid surprises in RC stage (#153)
Co-authored-by: Hugo van Kemenade <[email protected]>
1 parent 27ffbb4 commit fe9236f

File tree

5 files changed

+77
-1
lines changed

5 files changed

+77
-1
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ dist/
1616
downloads/
1717
eggs/
1818
.eggs/
19-
lib/
2019
lib64/
2120
parts/
2221
sdist/

run_release.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,49 @@ def check_cpython_repo_is_clean(db: ReleaseShelf) -> None:
375375
raise ReleaseException("Git repository is not clean")
376376

377377

378+
def check_magic_number(db: ReleaseShelf) -> None:
379+
release_tag = db["release"]
380+
if release_tag.is_final or release_tag.is_release_candidate:
381+
382+
def out(msg: str) -> None:
383+
raise ReleaseException(msg)
384+
385+
else:
386+
387+
def out(msg: str) -> None:
388+
print("warning:", msg, file=sys.stderr, flush=True)
389+
390+
def get_magic(source: Path, regex: re.Pattern[str]) -> str:
391+
if m := regex.search(source.read_text()):
392+
return m.group("magic")
393+
394+
out(f"Cannot find magic in {source}, tried {regex.pattern}")
395+
return "unknown"
396+
397+
work_dir = Path(db["git_repo"])
398+
magic_actual_file = work_dir / "Include" / "internal" / "pycore_magic_number.h"
399+
magic_actual_re = re.compile(
400+
r"^#define\s+PYC_MAGIC_NUMBER\s+(?P<magic>\d+)$", re.MULTILINE
401+
)
402+
magic_actual = get_magic(magic_actual_file, magic_actual_re)
403+
404+
magic_expected_file = work_dir / "Lib" / "test" / "test_importlib" / "test_util.py"
405+
magic_expected_re = re.compile(
406+
r"^\s+EXPECTED_MAGIC_NUMBER = (?P<magic>\d+)$", re.MULTILINE
407+
)
408+
magic_expected = get_magic(magic_expected_file, magic_expected_re)
409+
410+
if magic_actual == magic_expected:
411+
return
412+
413+
out(
414+
f"Magic numbers in {magic_actual_file} ({magic_actual})"
415+
f" and {magic_expected_file} ({magic_expected}) don't match."
416+
)
417+
if not ask_question("Do you want to continue? This will fail tests in RC stage."):
418+
raise ReleaseException("Magic numbers don't match!")
419+
420+
378421
def prepare_temporary_branch(db: ReleaseShelf) -> None:
379422
subprocess.check_call(
380423
["git", "checkout", "-b", f"branch-{db['release']}"], cwd=db["git_repo"]
@@ -1179,6 +1222,7 @@ def _api_key(api_key: str) -> str:
11791222
),
11801223
Task(check_buildbots, "Check buildbots are good"),
11811224
Task(check_cpython_repo_is_clean, "Checking Git repository is clean"),
1225+
Task(check_magic_number, "Checking the magic number is up-to-date"),
11821226
Task(prepare_temporary_branch, "Checking out a temporary release branch"),
11831227
Task(run_blurb_release, "Run blurb release"),
11841228
Task(check_cpython_repo_is_clean, "Checking Git repository is clean"),
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// copied from cpython bd3d31f380cd451a4ab6da5fbfde463fed95b5b5
2+
// ...
3+
4+
#ifndef Py_INTERNAL_MAGIC_NUMBER_H
5+
#define Py_INTERNAL_MAGIC_NUMBER_H
6+
7+
#define PYC_MAGIC_NUMBER 3603
8+
9+
#endif // !Py_INTERNAL_MAGIC_NUMBER_H
10+
11+
// ...
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# copied from cpython bd3d31f380cd451a4ab6da5fbfde463fed95b5b5
2+
3+
4+
class SomeClass:
5+
def some_method(self) -> None:
6+
EXPECTED_MAGIC_NUMBER = 3495
7+
print(EXPECTED_MAGIC_NUMBER)

tests/test_run_release.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
from pathlib import Path
2+
from typing import cast
3+
14
import pytest
25

36
import run_release
7+
from release import ReleaseShelf, Tag
48

59

610
@pytest.mark.parametrize(
@@ -22,3 +26,14 @@ def test_invalid_extract_github_owner() -> None:
2226
"https://example.com",
2327
):
2428
run_release.extract_github_owner("https://example.com")
29+
30+
31+
def test_check_magic_number() -> None:
32+
db = {
33+
"release": Tag("3.13.0rc1"),
34+
"git_repo": str(Path(__file__).parent / "magicdata"),
35+
}
36+
with pytest.raises(
37+
run_release.ReleaseException, match="Magic numbers in .* don't match"
38+
):
39+
run_release.check_magic_number(cast(ReleaseShelf, db))

0 commit comments

Comments
 (0)