aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Tools
diff options
context:
space:
mode:
Diffstat (limited to 'Tools')
-rw-r--r--Tools/cases_generator/analyzer.py1
-rw-r--r--Tools/cases_generator/opcode_metadata_generator.py12
-rw-r--r--Tools/cases_generator/tier2_generator.py2
-rwxr-xr-xTools/patchcheck/patchcheck.py46
-rw-r--r--Tools/requirements-dev.txt6
5 files changed, 44 insertions, 23 deletions
diff --git a/Tools/cases_generator/analyzer.py b/Tools/cases_generator/analyzer.py
index 6ff0223d2ef..6466d2615cd 100644
--- a/Tools/cases_generator/analyzer.py
+++ b/Tools/cases_generator/analyzer.py
@@ -596,6 +596,7 @@ NON_ESCAPING_FUNCTIONS = (
"PyStackRef_IsNull",
"PyStackRef_MakeHeapSafe",
"PyStackRef_None",
+ "PyStackRef_RefcountOnObject",
"PyStackRef_TYPE",
"PyStackRef_True",
"PyTuple_GET_ITEM",
diff --git a/Tools/cases_generator/opcode_metadata_generator.py b/Tools/cases_generator/opcode_metadata_generator.py
index 10567204dcc..0bcdc5395dc 100644
--- a/Tools/cases_generator/opcode_metadata_generator.py
+++ b/Tools/cases_generator/opcode_metadata_generator.py
@@ -242,14 +242,10 @@ def generate_expansion_table(analysis: Analysis, out: CWriter) -> None:
assert name2 in analysis.instructions, f"{name2} doesn't match any instr"
instr1 = analysis.instructions[name1]
instr2 = analysis.instructions[name2]
- assert (
- len(instr1.parts) == 1
- ), f"{name1} is not a good superinstruction part"
- assert (
- len(instr2.parts) == 1
- ), f"{name2} is not a good superinstruction part"
- expansions.append((instr1.parts[0].name, "OPARG_TOP", 0))
- expansions.append((instr2.parts[0].name, "OPARG_BOTTOM", 0))
+ for part in instr1.parts:
+ expansions.append((part.name, "OPARG_TOP", 0))
+ for part in instr2.parts:
+ expansions.append((part.name, "OPARG_BOTTOM", 0))
elif not is_viable_expansion(inst):
continue
else:
diff --git a/Tools/cases_generator/tier2_generator.py b/Tools/cases_generator/tier2_generator.py
index 276f306dfff..fc3bc47286f 100644
--- a/Tools/cases_generator/tier2_generator.py
+++ b/Tools/cases_generator/tier2_generator.py
@@ -91,7 +91,7 @@ class Tier2Emitter(Emitter):
self.emit("}\n")
return not always_true(first_tkn)
- def exit_if( # type: ignore[override]
+ def exit_if(
self,
tkn: Token,
tkn_iter: TokenIterator,
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):
diff --git a/Tools/requirements-dev.txt b/Tools/requirements-dev.txt
index 5bf180bb30a..0beaab2d3e7 100644
--- a/Tools/requirements-dev.txt
+++ b/Tools/requirements-dev.txt
@@ -1,7 +1,7 @@
# Requirements file for external linters and checks we run on
# Tools/clinic, Tools/cases_generator/, and Tools/peg_generator/ in CI
-mypy==1.15
+mypy==1.16.1
# needed for peg_generator:
-types-psutil==6.0.0.20240901
-types-setuptools==74.0.0.20240831
+types-psutil==7.0.0.20250601
+types-setuptools==80.9.0.20250529