This is an automated email from the ASF dual-hosted git repository.
yuqi1129 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 3604c670b2 [#12660] fix(mcp-server): Invoke isort/black console
scripts and pin their versions (#12661)
3604c670b2 is described below
commit 3604c670b27d3deac2b80e53a83c363974dd1fcc
Author: Qi Yu <[email protected]>
AuthorDate: Thu Aug 27 14:09:10 2026 +0800
[#12660] fix(mcp-server): Invoke isort/black console scripts and pin their
versions (#12661)
### What changes were proposed in this pull request?
In `mcp-server/build.gradle.kts`:
1. Invoke the formatters through their venv console scripts
(`.venv/bin/isort`, `.venv/bin/black`) instead of `python -m <tool>`,
via a small `venvExecutable(name)` helper that mirrors the existing
`venvPython` Windows/POSIX handling.
2. Pin the installed versions (`black==26.5.1`, `isort==9.0.0`) instead
of installing them unconstrained.
### Why are the changes needed?
`isort` 9.0.0 no longer ships an `isort/__main__.py`, so `python -m
isort` fails outright:
```
.venv/bin/python: No code object available for isort.__main__;
'isort' is a package and cannot be directly executed
> Task :mcp-server:formatCheckPython FAILED
```
`installFormatTools` installed `black` and `isort` without version
constraints, so CI resolved the new release as soon as it was published
and every job that runs `formatCheckPython` started failing — including
the backend integration test jobs, which run the check before the tests.
Pinning also keeps a future `black` release from silently changing the
format check outcome.
Fix: #12660
### Does this PR introduce _any_ user-facing change?
No.
### How was this patch tested?
Locally on a clean venv:
- `./gradlew :mcp-server:formatCheckPython` — BUILD SUCCESSFUL (`80
files would be left unchanged`); fails on `main` with the error above.
- `./gradlew :mcp-server:formatApplyPython` — BUILD SUCCESSFUL, no files
modified.
---
mcp-server/build.gradle.kts | 32 ++++++++++++++++++++++----------
1 file changed, 22 insertions(+), 10 deletions(-)
diff --git a/mcp-server/build.gradle.kts b/mcp-server/build.gradle.kts
index fe773fcf62..9bc51ad8e6 100644
--- a/mcp-server/build.gradle.kts
+++ b/mcp-server/build.gradle.kts
@@ -39,13 +39,21 @@ fun getUvExecutable(): String {
}
}
-val venvPython = when {
+// The formatters are invoked through their console scripts rather than
`python -m <tool>`:
+// isort 9 no longer ships an `__main__` module, so `python -m isort` cannot
be executed.
+fun venvExecutable(name: String): String = when {
System.getProperty("os.name").contains("win", ignoreCase = true) ->
- venvDir.resolve("Scripts/python.exe").absolutePath
+ venvDir.resolve("Scripts/$name.exe").absolutePath
else ->
- venvDir.resolve("bin/python").absolutePath
+ venvDir.resolve("bin/$name").absolutePath
}
+val venvPython = venvExecutable("python")
+
+// Pinned so that a new formatter release cannot change the outcome of the
format check in CI.
+val blackRequirement = "black==26.5.1"
+val isortRequirement = "isort==9.0.0"
+
tasks {
register<Exec>("installUv") {
group = "python"
@@ -160,7 +168,7 @@ tasks {
workingDir(pythonProjectDir)
doFirst {
- commandLine(getUvExecutable(), "pip", "install", "--python", venvPython,
"black", "isort")
+ commandLine(getUvExecutable(), "pip", "install", "--python", venvPython,
blackRequirement, isortRequirement)
}
doLast {
@@ -213,13 +221,13 @@ tasks {
// Apply isort
exec {
workingDir = pythonProjectDir
- commandLine(venvPython, "-m", "isort", "mcp_server", "tests")
+ commandLine(venvExecutable("isort"), "mcp_server", "tests")
}
// Apply Black
exec {
workingDir = pythonProjectDir
- commandLine(venvPython, "-m", "black", "mcp_server", "tests")
+ commandLine(venvExecutable("black"), "mcp_server", "tests")
}
logger.lifecycle("Python formatting applied (isort + Black)")
@@ -234,8 +242,10 @@ tasks {
doLast {
val isortExitCode = exec {
workingDir = pythonProjectDir
- commandLine(venvPython, "-m", "isort", "--check", "mcp_server",
"tests")
- isIgnoreExitValue = false
+ commandLine(venvExecutable("isort"), "--check", "mcp_server", "tests")
+ // Let the exit code reach the check below, so the failure is reported
with the message
+ // that names the tool instead of a bare Gradle ExecException.
+ isIgnoreExitValue = true
}.exitValue
if (isortExitCode != 0) {
@@ -244,8 +254,10 @@ tasks {
val blackExitCode = exec {
workingDir = pythonProjectDir
- commandLine(venvPython, "-m", "black", "--check", "mcp_server",
"tests")
- isIgnoreExitValue = false
+ commandLine(venvExecutable("black"), "--check", "mcp_server", "tests")
+ // Let the exit code reach the check below, so the failure is reported
with the message
+ // that names the tool instead of a bare Gradle ExecException.
+ isIgnoreExitValue = true
}.exitValue
if (blackExitCode != 0) {