From 441d392c35b7574f13f7b2fedd504c1d9d6e72af Mon Sep 17 00:00:00 2001 From: arcwiser Date: Mon, 12 Oct 2026 23:53:47 +1100 Subject: [PATCH] fix(tools): batch pr_overlap fetch refspecs --- tools/pr_overlap.py | 4 +++- tools/tests/test_pr_overlap.py | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tools/pr_overlap.py b/tools/pr_overlap.py index 183d01311..819c38e0c 100644 --- a/tools/pr_overlap.py +++ b/tools/pr_overlap.py @@ -13,6 +13,7 @@ DEPENDS = re.compile(r'Depends on:[ \t]*((?:#\d+\b(?:(?:[ \t]*,[ \t]*(?:and[ \t] PLAIN_DEPENDS = re.compile(r'Depends on[ \t]+(#\d+\b(?:(?:[ \t]*,[ \t]*(?:and[ \t]+)?|[ \t]+and[ \t]+)#\d+\b)*)') HUNK = re.compile(r"^@@ -(\d+)(?:,(\d+))?", re.M) MARKER = "" +FETCH_REFS = 100 def git(*args): @@ -51,7 +52,8 @@ def open_prs(base): def fetch(base, prs): refspecs = [f"+refs/heads/{base}:refs/pr/base"] + [f"+{pr['sha']}:{pr['ref']}" for pr in prs.values()] - git("fetch", "--no-tags", "-q", f"https://github.com/{REPO}.git", *refspecs) + for start in range(0, len(refspecs), FETCH_REFS): + git("fetch", "--no-tags", "-q", f"https://github.com/{REPO}.git", *refspecs[start:start + FETCH_REFS]) def merge(*args): diff --git a/tools/tests/test_pr_overlap.py b/tools/tests/test_pr_overlap.py index 31488bb0c..f250ca15d 100644 --- a/tools/tests/test_pr_overlap.py +++ b/tools/tests/test_pr_overlap.py @@ -69,6 +69,22 @@ class FetchTests(unittest.TestCase): "+refs/heads/main:refs/pr/base", f"+{'a' * 40}:refs/pr/7", f"+{'b' * 40}:refs/pr/9", ) + def test_batches_large_sets_of_pull_request_heads(self): + prs = { + number: { + "ref": f"refs/pr/{number}", "sha": f"{number:040x}", + "author": "contributor", "depends": set(), + } + for number in range(250) + } + with patch.object(pr_overlap, "REPO", "owner/project", create=True), \ + patch.object(pr_overlap, "git", return_value="") as git: + pr_overlap.fetch("main", prs) + self.assertEqual(git.call_count, 3) + self.assertEqual([len(call.args) - 4 for call in git.call_args_list], [100, 100, 51]) + self.assertEqual(git.call_args_list[0].args[4], "+refs/heads/main:refs/pr/base") + self.assertEqual(git.call_args_list[-1].args[-1], "+00000000000000000000000000000000000000f9:refs/pr/249") + if __name__ == "__main__": unittest.main()