Skip to content

Commit 454b81d

Browse files
committed
Various fixes
1 parent 805aa18 commit 454b81d

File tree

4 files changed

+117
-4
lines changed

4 files changed

+117
-4
lines changed

kernel_patches_daemon/branch_worker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ def parse_pr_ref(ref: str) -> Dict[str, Any]:
416416
res["target"] = tmp[1]
417417

418418
tmp = res["series"].split("/", maxsplit=1)
419-
if len(tmp) >= 2:
419+
if len(tmp) >= 2 and tmp[1].isdigit():
420420
res["series_id"] = int(tmp[1])
421421

422422
return res

kernel_patches_daemon/github_sync.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,10 @@ async def sync_patches(self) -> None:
321321
if worker._is_relevant_pr(pr):
322322
parsed_ref = parse_pr_ref(pr.head.ref)
323323
# ignore unknown format branch/PRs.
324-
if parsed_pr_ref_ok(parsed_ref):
324+
if not parsed_pr_ref_ok(parsed_ref):
325+
logger.warning(
326+
f"Unexpected format of the branch name: {pr.head.ref}"
327+
)
325328
continue
326329

327330
series_id = parsed_ref["series_id"]

tests/test_branch_worker.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
email_in_submitter_allowlist,
3535
EmailBodyContext,
3636
furnish_ci_email_body,
37+
parse_pr_ref,
3738
same_series_different_target,
3839
temporary_patch_file,
3940
UPSTREAM_REMOTE_NAME,
@@ -1400,3 +1401,109 @@ def test_email_submitter_not_in_allowlist_and_allowlist_disabled(self):
14001401
)
14011402
self.assertEqual(expected_cmd, cmd)
14021403
self.assertEqual(expected_email, email)
1404+
1405+
1406+
class TestParsePrRef(unittest.TestCase):
1407+
def test_parse_pr_ref_comprehensive(self):
1408+
test_cases = [
1409+
(
1410+
"series/123456=>main",
1411+
{"series": "series/123456", "series_id": 123456, "target": "main"},
1412+
),
1413+
(
1414+
"patch/789=>bpf-next",
1415+
{"series": "patch/789", "series_id": 789, "target": "bpf-next"},
1416+
),
1417+
("series/42", {"series": "series/42", "series_id": 42}),
1418+
("series/abc=>target", {"series": "series/abc", "target": "target"}),
1419+
(
1420+
"series/999=>feature/branch-name",
1421+
{
1422+
"series": "series/999",
1423+
"series_id": 999,
1424+
"target": "feature/branch-name",
1425+
},
1426+
),
1427+
("", {"series": ""}),
1428+
("=>", {"series": "", "target": ""}),
1429+
("series", {"series": "series"}),
1430+
("=>target", {"series": "", "target": "target"}),
1431+
(
1432+
"series/123=>target=>extra",
1433+
{"series": "series/123", "series_id": 123, "target": "target=>extra"},
1434+
),
1435+
(
1436+
"path/to/series/456=>target",
1437+
{"series": "path/to/series/456", "target": "target"},
1438+
),
1439+
("series/abc123=>target", {"series": "series/abc123", "target": "target"}),
1440+
("series/123abc=>target", {"series": "series/123abc", "target": "target"}),
1441+
(
1442+
" series/123=>target ",
1443+
{"series": " series/123", "series_id": 123, "target": "target "},
1444+
),
1445+
(
1446+
"series/1=>target",
1447+
{"series": "series/1", "series_id": 1, "target": "target"},
1448+
),
1449+
(
1450+
"series/007=>target",
1451+
{"series": "series/007", "series_id": 7, "target": "target"},
1452+
),
1453+
(
1454+
"series/000=>target",
1455+
{"series": "series/000", "series_id": 0, "target": "target"},
1456+
),
1457+
("series/12a34=>target", {"series": "series/12a34", "target": "target"}),
1458+
("series/a1234=>target", {"series": "series/a1234", "target": "target"}),
1459+
("series/abc=>target", {"series": "series/abc", "target": "target"}),
1460+
("series/=>target", {"series": "series/", "target": "target"}),
1461+
(
1462+
"path/123/series/456=>target",
1463+
{"series": "path/123/series/456", "target": "target"},
1464+
),
1465+
("series/123!@#=>target", {"series": "series/123!@#", "target": "target"}),
1466+
(
1467+
"série/123=>tärget",
1468+
{"series": "série/123", "series_id": 123, "target": "tärget"},
1469+
),
1470+
(
1471+
"series/999999999999999999999=>target",
1472+
{
1473+
"series": "series/999999999999999999999",
1474+
"series_id": 999999999999999999999,
1475+
"target": "target",
1476+
},
1477+
),
1478+
("series/-123=>target", {"series": "series/-123", "target": "target"}),
1479+
(
1480+
"series/0=>target",
1481+
{"series": "series/0", "series_id": 0, "target": "target"},
1482+
),
1483+
("series/123.45=>target", {"series": "series/123.45", "target": "target"}),
1484+
("series/1e5=>target", {"series": "series/1e5", "target": "target"}),
1485+
("\n\r\t", {"series": "\n\r\t"}),
1486+
("/" * 100, {"series": "/" * 100}),
1487+
]
1488+
1489+
def validate_parsed_pr_ref(ref):
1490+
self.assertIsInstance(ref, dict)
1491+
self.assertIn("series", ref)
1492+
self.assertIsInstance(ref["series"], str)
1493+
if "target" in ref:
1494+
self.assertIsInstance(ref["target"], str)
1495+
if "series_id" in ref:
1496+
self.assertIsInstance(ref["series_id"], int)
1497+
valid_keys = {"series", "target", "series_id"}
1498+
self.assertTrue(set(result.keys()).issubset(valid_keys))
1499+
1500+
for test_input, expected in test_cases:
1501+
with self.subTest(input=test_input):
1502+
try:
1503+
result = parse_pr_ref(test_input)
1504+
validate_parsed_pr_ref(result)
1505+
self.assertEqual(result, expected)
1506+
except Exception as e:
1507+
self.fail(
1508+
f"parse_pr_ref raised {type(e).__name__} for input '{test_input}': {e}"
1509+
)

tests/test_github_sync.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# pyre-unsafe
88

99
import copy
10+
import os
1011
import unittest
1112
from dataclasses import dataclass
1213
from typing import Any, Dict, Optional
@@ -330,9 +331,11 @@ async def test_sync_patches_pr_summary_success(self, m: aioresponses) -> None:
330331
For patchwork mocking, it uses real response examples stored at tests/data/
331332
"""
332333

333-
test_data = load_test_data(
334-
"tests/data/test_github_sync.test_sync_patches_pr_summary_success"
334+
data_path = os.path.join(
335+
os.path.dirname(__file__),
336+
"data/test_github_sync.test_sync_patches_pr_summary_success",
335337
)
338+
test_data = load_test_data(data_path)
336339
init_pw_responses(m, test_data)
337340

338341
# Set up mocks and test data

0 commit comments

Comments
 (0)