]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
patchcheck: use URL paths to identify upstream remote (GH-135806)
authorKattni <kattni@kattni.com>
Sun, 22 Jun 2025 04:51:23 +0000 (00:51 -0400)
committerGitHub <noreply@github.com>
Sun, 22 Jun 2025 04:51:23 +0000 (04:51 +0000)
* find defined "(fetch)" remotes with "python/cpython" in their URL
* if there is exactly one, use that remote name
* if there is one named "upstream", "origin", or "python",
  use that remote (in that precedence order)
* otherwise report an error listing the defined remotes

Misc/ACKS
Tools/patchcheck/patchcheck.py

index d4557a03eb5400562c49d172b74c0051db425d48..74cf29cdbc552f5d666b49b9ee49b2a16530208e 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -943,6 +943,7 @@ Anton Kasyanov
 Lou Kates
 Makoto Kato
 Irit Katriel
+Kattni
 Hiroaki Kawai
 Dmitry Kazakov
 Brian Kearns
index 0dcf6ef844a04874a14f2e81c3c03329807b1a7e..afd010a52544a3d8f3a3c83f77b7410c52dd9a91 100755 (executable)
@@ -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):