aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Tools/patchcheck/patchcheck.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/patchcheck/patchcheck.py')
-rwxr-xr-xTools/patchcheck/patchcheck.py46
1 files changed, 35 insertions, 11 deletions
diff --git a/Tools/patchcheck/patchcheck.py b/Tools/patchcheck/patchcheck.py
index 0dcf6ef844a..afd010a5254 100755
--- a/Tools/patchcheck/patchcheck.py
+++ b/Tools/patchcheck/patchcheck.py
@@ -53,19 +53,43 @@ def get_git_branch():
def get_git_upstream_remote():
- """Get the remote name to use for upstream branches
+ """
+ Get the remote name to use for upstream branches
- Uses "upstream" if it exists, "origin" otherwise
+ Check for presence of "https://github.com/python/cpython" remote URL.
+ If only one is found, return that remote name. If multiple are found,
+ check for and return "upstream", "origin", or "python", in that
+ order. Raise an error if no valid matches are found.
"""
- cmd = "git remote get-url upstream".split()
- try:
- subprocess.check_output(cmd,
- stderr=subprocess.DEVNULL,
- cwd=SRCDIR,
- encoding='UTF-8')
- except subprocess.CalledProcessError:
- return "origin"
- return "upstream"
+ cmd = "git remote -v".split()
+ output = subprocess.check_output(
+ cmd,
+ stderr=subprocess.DEVNULL,
+ cwd=SRCDIR,
+ encoding="UTF-8"
+ )
+ # Filter to desired remotes, accounting for potential uppercasing
+ filtered_remotes = {
+ remote.split("\t")[0].lower() for remote in output.split('\n')
+ if "python/cpython" in remote.lower() and remote.endswith("(fetch)")
+ }
+ if len(filtered_remotes) == 1:
+ [remote] = filtered_remotes
+ return remote
+ for remote_name in ["upstream", "origin", "python"]:
+ if remote_name in filtered_remotes:
+ return remote_name
+ remotes_found = "\n".join(
+ {remote for remote in output.split('\n') if remote.endswith("(fetch)")}
+ )
+ raise ValueError(
+ f"Patchcheck was unable to find an unambiguous upstream remote, "
+ f"with URL matching 'https://github.com/python/cpython'. "
+ f"For help creating an upstream remote, see Dev Guide: "
+ f"https://devguide.python.org/getting-started/"
+ f"git-boot-camp/#cloning-a-forked-cpython-repository "
+ f"\nRemotes found: \n{remotes_found}"
+ )
def get_git_remote_default_branch(remote_name):