Skip to content

Commit a8f8b2b

Browse files
fix(core): add exponential backoff for repository cloning
1 parent c9d9211 commit a8f8b2b

1 file changed

Lines changed: 26 additions & 3 deletions

File tree

src/edit_python_pe/github_client.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import logging
12
import os
3+
import random
24
import shutil
35
from time import sleep
46

@@ -13,6 +15,8 @@
1315
from .markdown_builder import _create_member_file
1416
from .strings import _
1517

18+
logger = logging.getLogger(__name__)
19+
1620

1721
def get_repo(token: str) -> tuple[str, Repository]:
1822
auth = Auth.Token(token)
@@ -41,8 +45,27 @@ def fork_repo(token: str, original_repo: Repository) -> tuple[str, Repository]:
4145
callbacks = pygit2.callbacks.RemoteCallbacks(
4246
credentials=pygit2.UserPass(token, "x-oauth-basic")
4347
)
44-
sleep(3)
45-
pygit2.clone_repository(forked_repo_url, repo_path, callbacks=callbacks)
48+
49+
max_retries = 5
50+
for attempt in range(max_retries):
51+
try:
52+
pygit2.clone_repository(forked_repo_url, repo_path, callbacks=callbacks)
53+
break
54+
except Exception as e:
55+
if attempt == max_retries - 1:
56+
logger.error(
57+
"Failed to clone forked repository after %d attempts", max_retries
58+
)
59+
raise
60+
sleep_time = 2**attempt + random.uniform(0, 1) # noqa: S311
61+
logger.warning(
62+
"Attempt %d to clone repository failed: %s. Retrying in %.2fs...",
63+
attempt + 1,
64+
e,
65+
sleep_time,
66+
)
67+
sleep(sleep_time)
68+
4669
return repo_path, forked_repo
4770

4871

@@ -57,7 +80,7 @@ def create_pr(
5780
name: str,
5881
email: str,
5982
) -> tuple[str, str | None]:
60-
name_file, file_path = _create_member_file(
83+
name_file, _unused_file_path = _create_member_file(
6184
file_content,
6285
current_file,
6386
repo_path,

0 commit comments

Comments
 (0)