From 32602bd4f7f83093b0b0a9711ebdde8745385b30 Mon Sep 17 00:00:00 2001 From: Riccardo Strina Date: Fri, 17 Jul 2026 23:26:52 +0200 Subject: [PATCH 1/2] Bump binaries version to 6.8.23 and move task helper to separate bin dir - Update all `Cargo.toml` versions and `Cargo.lock` - Move task helper binary to `task-bin/` directory to avoid breaking `tasks.json` on each release - Simplify gradle bridge release fetching to use compile-time version - Extract platform-specific binary naming to shared utilities --- Cargo.lock | 8 ++--- gradle-bridge/Cargo.toml | 2 +- justfile | 4 +-- languages/java/tasks.cmd.example.json | 10 +++--- languages/java/tasks.fish.example.json | 10 +++--- languages/java/tasks.json | 10 +++--- proxy-common/Cargo.toml | 2 +- proxy/Cargo.toml | 2 +- src/gradle_bridge.rs | 25 +++----------- src/task.rs | 48 +++++++------------------- src/util.rs | 10 ++---- task_helper/Cargo.toml | 2 +- tests/task_verification_test.rs | 2 +- 13 files changed, 47 insertions(+), 88 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 98010a8..0087c7a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -337,7 +337,7 @@ dependencies = [ [[package]] name = "gradle-lsp-bridge" -version = "6.8.20" +version = "6.8.23" dependencies = [ "prost", "proxy-common", @@ -645,7 +645,7 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "java-lsp-proxy" -version = "6.8.20" +version = "6.8.23" dependencies = [ "proxy-common", "serde", @@ -654,7 +654,7 @@ dependencies = [ [[package]] name = "java-task-helper" -version = "0.1.0" +version = "6.8.23" dependencies = [ "serde", "serde_json", @@ -809,7 +809,7 @@ dependencies = [ [[package]] name = "proxy-common" -version = "6.8.20" +version = "6.8.23" dependencies = [ "libc", "serde", diff --git a/gradle-bridge/Cargo.toml b/gradle-bridge/Cargo.toml index 43a92b4..53d229c 100644 --- a/gradle-bridge/Cargo.toml +++ b/gradle-bridge/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gradle-lsp-bridge" -version = "6.8.20" +version = "6.8.23" edition = "2021" publish = false license = "Apache-2.0" diff --git a/justfile b/justfile index b02f477..fe378d5 100644 --- a/justfile +++ b/justfile @@ -1,7 +1,7 @@ native_target := `rustc -vV | grep host | awk '{print $2}'` ext_dir := if os() == "macos" { env("HOME") / "Library/Application Support/Zed/extensions/work/java" } else if os() == "linux" { env("HOME") / ".local/share/zed/extensions/work/java" } else { env("LOCALAPPDATA") / "Zed/extensions/work/java" } proxy_bin := ext_dir / "bin" / "java-lsp-proxy" -tasks_bin := ext_dir / "bin" / "java-task-helper" +tasks_bin := ext_dir / "task-bin" / "java-task-helper" bridge_bin := ext_dir / "bin" / "gradle-lsp-bridge" # Build proxy in debug mode @@ -30,7 +30,7 @@ task-release: # Build task helper release and install to extension workdir for testing task-install: task-release - mkdir -p "{{ ext_dir }}/bin" + mkdir -p "{{ ext_dir }}/task-bin" cp "target/{{ native_target }}/release/java-task-helper" "{{ tasks_bin }}" @echo "Installed to {{ ext_dir }}" diff --git a/languages/java/tasks.cmd.example.json b/languages/java/tasks.cmd.example.json index 6becf32..7b095b4 100644 --- a/languages/java/tasks.cmd.example.json +++ b/languages/java/tasks.cmd.example.json @@ -1,35 +1,35 @@ [ { "label": "Run $ZED_CUSTOM_java_class_name", - "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\bin\\java-task-helper.exe\" run-class \"%ZED_FILE%\" \"%ZED_CUSTOM_java_package_name%\" \"%ZED_CUSTOM_java_class_name%\" \"%ZED_CUSTOM_java_outer_class_name%\"", + "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe\" run-class \"%ZED_FILE%\" \"%ZED_CUSTOM_java_package_name%\" \"%ZED_CUSTOM_java_class_name%\" \"%ZED_CUSTOM_java_outer_class_name%\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-main"] }, { "label": "Run $ZED_CUSTOM_java_class_name.$ZED_CUSTOM_java_method_name", - "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\bin\\java-task-helper.exe\" run-test-method \"%ZED_FILE%\" \"%ZED_CUSTOM_java_package_name%\" \"%ZED_CUSTOM_java_class_name%\" \"%ZED_CUSTOM_java_outer_class_name%\" \"%ZED_CUSTOM_java_method_name%\"", + "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe\" run-test-method \"%ZED_FILE%\" \"%ZED_CUSTOM_java_package_name%\" \"%ZED_CUSTOM_java_class_name%\" \"%ZED_CUSTOM_java_outer_class_name%\" \"%ZED_CUSTOM_java_method_name%\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-test-method", "java-test-method-nested"] }, { "label": "Test class $ZED_CUSTOM_java_class_name", - "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\bin\\java-task-helper.exe\" run-test-class \"%ZED_FILE%\" \"%ZED_CUSTOM_java_package_name%\" \"%ZED_CUSTOM_java_class_name%\" \"%ZED_CUSTOM_java_outer_class_name%\"", + "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe\" run-test-class \"%ZED_FILE%\" \"%ZED_CUSTOM_java_package_name%\" \"%ZED_CUSTOM_java_class_name%\" \"%ZED_CUSTOM_java_outer_class_name%\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-test-class", "java-test-class-nested"] }, { "label": "Run tests", - "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\bin\\java-task-helper.exe\" run-all-tests \"%ZED_FILE%\"", + "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe\" run-all-tests \"%ZED_FILE%\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-test-all"] }, { "label": "Clear JDTLS cache", - "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\bin\\java-task-helper.exe\" clear-cache", + "command": "\"%LOCALAPPDATA%\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe\" clear-cache", "use_new_terminal": false, "reveal": "always", "tags": [] diff --git a/languages/java/tasks.fish.example.json b/languages/java/tasks.fish.example.json index 0f0a14d..9f587ad 100644 --- a/languages/java/tasks.fish.example.json +++ b/languages/java/tasks.fish.example.json @@ -1,35 +1,35 @@ [ { "label": "Run $ZED_CUSTOM_java_class_name", - "command": "\"$HOME/.local/share/zed/extensions/work/java/bin/java-task-helper\" run-class \"$ZED_FILE\" \"$ZED_CUSTOM_java_package_name\" \"$ZED_CUSTOM_java_class_name\" \"$ZED_CUSTOM_java_outer_class_name\"", + "command": "\"$HOME/.local/share/zed/extensions/work/java/task-bin/java-task-helper\" run-class \"$ZED_FILE\" \"$ZED_CUSTOM_java_package_name\" \"$ZED_CUSTOM_java_class_name\" \"$ZED_CUSTOM_java_outer_class_name\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-main"] }, { "label": "Run $ZED_CUSTOM_java_class_name.$ZED_CUSTOM_java_method_name", - "command": "\"$HOME/.local/share/zed/extensions/work/java/bin/java-task-helper\" run-test-method \"$ZED_FILE\" \"$ZED_CUSTOM_java_package_name\" \"$ZED_CUSTOM_java_class_name\" \"$ZED_CUSTOM_java_outer_class_name\" \"$ZED_CUSTOM_java_method_name\"", + "command": "\"$HOME/.local/share/zed/extensions/work/java/task-bin/java-task-helper\" run-test-method \"$ZED_FILE\" \"$ZED_CUSTOM_java_package_name\" \"$ZED_CUSTOM_java_class_name\" \"$ZED_CUSTOM_java_outer_class_name\" \"$ZED_CUSTOM_java_method_name\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-test-method", "java-test-method-nested"] }, { "label": "Test class $ZED_CUSTOM_java_class_name", - "command": "\"$HOME/.local/share/zed/extensions/work/java/bin/java-task-helper\" run-test-class \"$ZED_FILE\" \"$ZED_CUSTOM_java_package_name\" \"$ZED_CUSTOM_java_class_name\" \"$ZED_CUSTOM_java_outer_class_name\"", + "command": "\"$HOME/.local/share/zed/extensions/work/java/task-bin/java-task-helper\" run-test-class \"$ZED_FILE\" \"$ZED_CUSTOM_java_package_name\" \"$ZED_CUSTOM_java_class_name\" \"$ZED_CUSTOM_java_outer_class_name\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-test-class", "java-test-class-nested"] }, { "label": "Run tests", - "command": "\"$HOME/.local/share/zed/extensions/work/java/bin/java-task-helper\" run-all-tests \"$ZED_FILE\"", + "command": "\"$HOME/.local/share/zed/extensions/work/java/task-bin/java-task-helper\" run-all-tests \"$ZED_FILE\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-test-all"] }, { "label": "Clear JDTLS cache", - "command": "\"$HOME/.local/share/zed/extensions/work/java/bin/java-task-helper\" clear-cache", + "command": "\"$HOME/.local/share/zed/extensions/work/java/task-bin/java-task-helper\" clear-cache", "use_new_terminal": false, "reveal": "always", "tags": [] diff --git a/languages/java/tasks.json b/languages/java/tasks.json index 87c9b0c..38c25ba 100644 --- a/languages/java/tasks.json +++ b/languages/java/tasks.json @@ -1,35 +1,35 @@ [ { "label": "Run $ZED_CUSTOM_java_class_name", - "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/bin/java-task-helper\\\" run-class \\\"$ZED_FILE\\\" \\\"${ZED_CUSTOM_java_package_name:-}\\\" \\\"$ZED_CUSTOM_java_class_name\\\" \\\"${ZED_CUSTOM_java_outer_class_name:-}\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\bin\\java-task-helper.exe$Q run-class $Q$env:ZED_FILE$Q $Q$env:ZED_CUSTOM_java_package_name$Q $Q$env:ZED_CUSTOM_java_class_name$Q $Q$env:ZED_CUSTOM_java_outer_class_name$Q\"", + "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/task-bin/java-task-helper\\\" run-class \\\"$ZED_FILE\\\" \\\"${ZED_CUSTOM_java_package_name:-}\\\" \\\"$ZED_CUSTOM_java_class_name\\\" \\\"${ZED_CUSTOM_java_outer_class_name:-}\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe$Q run-class $Q$env:ZED_FILE$Q $Q$env:ZED_CUSTOM_java_package_name$Q $Q$env:ZED_CUSTOM_java_class_name$Q $Q$env:ZED_CUSTOM_java_outer_class_name$Q\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-main"] }, { "label": "Run $ZED_CUSTOM_java_class_name.${ZED_CUSTOM_java_outer_class_name:}.$ZED_CUSTOM_java_method_name", - "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/bin/java-task-helper\\\" run-test-method \\\"$ZED_FILE\\\" \\\"${ZED_CUSTOM_java_package_name:-}\\\" \\\"$ZED_CUSTOM_java_class_name\\\" \\\"${ZED_CUSTOM_java_outer_class_name:-}\\\" \\\"$ZED_CUSTOM_java_method_name\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\bin\\java-task-helper.exe$Q run-test-method $Q$env:ZED_FILE$Q $Q$env:ZED_CUSTOM_java_package_name$Q $Q$env:ZED_CUSTOM_java_class_name$Q $Q$env:ZED_CUSTOM_java_outer_class_name$Q $Q$env:ZED_CUSTOM_java_method_name$Q\"", + "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/task-bin/java-task-helper\\\" run-test-method \\\"$ZED_FILE\\\" \\\"${ZED_CUSTOM_java_package_name:-}\\\" \\\"$ZED_CUSTOM_java_class_name\\\" \\\"${ZED_CUSTOM_java_outer_class_name:-}\\\" \\\"$ZED_CUSTOM_java_method_name\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe$Q run-test-method $Q$env:ZED_FILE$Q $Q$env:ZED_CUSTOM_java_package_name$Q $Q$env:ZED_CUSTOM_java_class_name$Q $Q$env:ZED_CUSTOM_java_outer_class_name$Q $Q$env:ZED_CUSTOM_java_method_name$Q\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-test-method", "java-test-method-nested"] }, { "label": "Test class $ZED_CUSTOM_java_class_name", - "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/bin/java-task-helper\\\" run-test-class \\\"$ZED_FILE\\\" \\\"${ZED_CUSTOM_java_package_name:-}\\\" \\\"$ZED_CUSTOM_java_class_name\\\" \\\"${ZED_CUSTOM_java_outer_class_name:-}\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\bin\\java-task-helper.exe$Q run-test-class $Q$env:ZED_FILE$Q $Q$env:ZED_CUSTOM_java_package_name$Q $Q$env:ZED_CUSTOM_java_class_name$Q $Q$env:ZED_CUSTOM_java_outer_class_name$Q\"", + "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/task-bin/java-task-helper\\\" run-test-class \\\"$ZED_FILE\\\" \\\"${ZED_CUSTOM_java_package_name:-}\\\" \\\"$ZED_CUSTOM_java_class_name\\\" \\\"${ZED_CUSTOM_java_outer_class_name:-}\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe$Q run-test-class $Q$env:ZED_FILE$Q $Q$env:ZED_CUSTOM_java_package_name$Q $Q$env:ZED_CUSTOM_java_class_name$Q $Q$env:ZED_CUSTOM_java_outer_class_name$Q\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-test-class", "java-test-class-nested"] }, { "label": "Run tests", - "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/bin/java-task-helper\\\" run-all-tests \\\"$ZED_FILE\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\bin\\java-task-helper.exe$Q run-all-tests $Q$env:ZED_FILE$Q\"", + "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/task-bin/java-task-helper\\\" run-all-tests \\\"$ZED_FILE\\\" ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe$Q run-all-tests $Q$env:ZED_FILE$Q\"", "use_new_terminal": false, "reveal": "always", "tags": ["java-test-all"] }, { "label": "Clear JDTLS cache", - "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/bin/java-task-helper\\\" clear-cache ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\bin\\java-task-helper.exe$Q clear-cache\"", + "command": "set ErrorActionPreference SilentlyContinue ; eval \"EXT=\\\"${XDG_DATA_HOME:-$HOME/.local/share}/zed/extensions/work/java\\\"; if [ \\\"$(uname 2>/dev/null)\\\" = \\\"Darwin\\\" ]; then EXT=\\\"$HOME/Library/Application Support/Zed/extensions/work/java\\\"; fi; if [ -n \\\"$LOCALAPPDATA\\\" ]; then CYGP=$(cygpath -u \\\"$LOCALAPPDATA\\\" 2>/dev/null); if [ -n \\\"$CYGP\\\" ]; then EXT=\\\"$CYGP/zed/extensions/work/java\\\"; else EXT=\\\"$LOCALAPPDATA/zed/extensions/work/java\\\"; fi; fi; \\\"\\$EXT/task-bin/java-task-helper\\\" clear-cache ; exit\" ; set ErrorActionPreference Continue ; $Q=[char]34 ; iex \"& $Q$env:LOCALAPPDATA\\zed\\extensions\\work\\java\\task-bin\\java-task-helper.exe$Q clear-cache\"", "use_new_terminal": false, "reveal": "always", "tags": [] diff --git a/proxy-common/Cargo.toml b/proxy-common/Cargo.toml index 8f6bc44..08d80ce 100644 --- a/proxy-common/Cargo.toml +++ b/proxy-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "proxy-common" -version = "6.8.20" +version = "6.8.23" edition = "2021" publish = false license = "Apache-2.0" diff --git a/proxy/Cargo.toml b/proxy/Cargo.toml index 8c16f5a..dad6fea 100644 --- a/proxy/Cargo.toml +++ b/proxy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "java-lsp-proxy" -version = "6.8.20" +version = "6.8.23" edition = "2021" publish = false license = "Apache-2.0" diff --git a/src/gradle_bridge.rs b/src/gradle_bridge.rs index 8c37bcb..51d3820 100644 --- a/src/gradle_bridge.rs +++ b/src/gradle_bridge.rs @@ -1,9 +1,8 @@ use std::{fs::metadata, path::PathBuf}; use zed_extension_api::{ - self as zed, DownloadedFileType, GithubReleaseOptions, LanguageServerId, - LanguageServerInstallationStatus, Worktree, serde_json::Value, - set_language_server_installation_status, + self as zed, DownloadedFileType, LanguageServerId, LanguageServerInstallationStatus, Worktree, + serde_json::Value, set_language_server_installation_status, }; use crate::{ @@ -66,15 +65,7 @@ impl Downloadable for GradleBridge { } fn fetch_latest_version(&self, _worktree: &Worktree) -> zed::Result { - Ok(zed::latest_github_release( - GITHUB_REPO, - GithubReleaseOptions { - require_assets: true, - pre_release: false, - }, - ) - .map_err(|err| format!("Failed to fetch latest bridge release from {GITHUB_REPO}: {err}"))? - .version) + Ok(format!("v{}", env!("CARGO_PKG_VERSION"))) } fn download( @@ -91,14 +82,8 @@ impl Downloadable for GradleBridge { return Ok(PathBuf::from(bin_path)); } - let release = zed::latest_github_release( - GITHUB_REPO, - GithubReleaseOptions { - require_assets: true, - pre_release: false, - }, - ) - .map_err(|err| format!("Failed to fetch bridge release: {err}"))?; + let release = zed::github_release_by_tag_name(GITHUB_REPO, version) + .map_err(|err| format!("Failed to fetch bridge release: {err}"))?; let asset = release .assets diff --git a/src/task.rs b/src/task.rs index 11f03ad..fec9652 100644 --- a/src/task.rs +++ b/src/task.rs @@ -7,11 +7,16 @@ use zed_extension_api::{ use crate::{ downloadable::Downloadable, - util::{mark_checked_once, remove_all_files_except, should_use_local_or_download}, + util::{ + mark_checked_once, platform_asset_name, platform_exec_name, remove_all_files_except, + should_use_local_or_download, + }, }; const TASK_HELPER_BINARY: &str = "java-task-helper"; -const TASK_HELPER_INSTALL_PATH: &str = "bin"; +/// It needs to live in a different directory compared to other vended binaries +/// to avoid breaking `tasks.json` on each release +const TASK_HELPER_INSTALL_PATH: &str = "task-bin"; const GITHUB_REPO: &str = "zed-extensions/java"; pub struct TaskHelper { @@ -58,10 +63,8 @@ impl Downloadable for TaskHelper { _worktree: &Worktree, ) -> zed::Result { let (name, file_type) = asset_name()?; - let bin_path = format!( - "{TASK_HELPER_INSTALL_PATH}/{version}/{}", - task_helper_exec() - ); + let exec_name = task_helper_exec(); + let bin_path = format!("{TASK_HELPER_INSTALL_PATH}/{}", exec_name); if metadata(&bin_path).is_ok() { self.cached_path = Some(bin_path.clone()); @@ -77,14 +80,12 @@ impl Downloadable for TaskHelper { .find(|a| a.name == name) .ok_or_else(|| format!("No asset found matching {name:?}"))?; - let version_dir = format!("{TASK_HELPER_INSTALL_PATH}/{version}"); - set_language_server_installation_status( language_server_id, &LanguageServerInstallationStatus::Downloading, ); - zed::download_file(&asset.download_url, &version_dir, file_type) + zed::download_file(&asset.download_url, TASK_HELPER_INSTALL_PATH, file_type) .map_err(|err| format!("Failed to download task helper: {err}"))?; let _ = zed::make_file_executable(&bin_path); @@ -92,7 +93,7 @@ impl Downloadable for TaskHelper { language_server_id, &LanguageServerInstallationStatus::None, ); - let _ = remove_all_files_except(TASK_HELPER_INSTALL_PATH, version); + let _ = remove_all_files_except(TASK_HELPER_INSTALL_PATH, &exec_name); let _ = mark_checked_once(TASK_HELPER_INSTALL_PATH, version); self.cached_path = Some(bin_path.clone()); @@ -151,32 +152,9 @@ impl Downloadable for TaskHelper { } fn asset_name() -> zed::Result<(String, DownloadedFileType)> { - let (os, arch) = zed::current_platform(); - let (os_str, file_type) = match os { - zed::Os::Mac => ("darwin", DownloadedFileType::GzipTar), - zed::Os::Linux => ("linux", DownloadedFileType::GzipTar), - zed::Os::Windows => ("windows", DownloadedFileType::Zip), - }; - let arch_str = match arch { - zed::Architecture::Aarch64 => "aarch64", - zed::Architecture::X8664 => "x86_64", - _ => return Err("Unsupported architecture".into()), - }; - let ext = if matches!(file_type, DownloadedFileType::Zip) { - "zip" - } else { - "tar.gz" - }; - Ok(( - format!("{TASK_HELPER_BINARY}-{os_str}-{arch_str}.{ext}"), - file_type, - )) + platform_asset_name(TASK_HELPER_BINARY) } fn task_helper_exec() -> String { - let (os, _arch) = zed::current_platform(); - match os { - zed::Os::Linux | zed::Os::Mac => TASK_HELPER_BINARY.to_string(), - zed::Os::Windows => format!("{TASK_HELPER_BINARY}.exe"), - } + platform_exec_name(TASK_HELPER_BINARY) } diff --git a/src/util.rs b/src/util.rs index e36b58e..fc234a2 100644 --- a/src/util.rs +++ b/src/util.rs @@ -199,10 +199,7 @@ pub fn get_java_executable( /// /// Returns the executable java name pub fn get_java_exec_name() -> String { - match current_platform().0 { - Os::Windows => "java.exe".to_string(), - _ => "java".to_string(), - } + platform_exec_name("java") } /// The single install directory shared by every native binary the extension @@ -211,9 +208,8 @@ pub fn get_java_exec_name() -> String { /// other's `remove_all_files_except` cleanup. pub const NATIVE_BIN_DIR: &str = "bin"; -/// The platform-specific executable file name for a downloaded native binary -/// (appends `.exe` on Windows). Shared by the proxy and the Gradle bridge, which -/// differ only in `binary`. +/// The platform-specific executable file name for a binary +/// (appends `.exe` on Windows). pub fn platform_exec_name(binary: &str) -> String { match current_platform().0 { Os::Windows => format!("{binary}.exe"), diff --git a/task_helper/Cargo.toml b/task_helper/Cargo.toml index 334b85b..ee0776e 100644 --- a/task_helper/Cargo.toml +++ b/task_helper/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "java-task-helper" -version = "0.1.0" +version = "6.8.23" edition = "2021" publish = false license = "Apache-2.0" diff --git a/tests/task_verification_test.rs b/tests/task_verification_test.rs index 7bc2fbd..56a7ea8 100644 --- a/tests/task_verification_test.rs +++ b/tests/task_verification_test.rs @@ -236,7 +236,7 @@ impl<'a> TaskRunner<'a> { // Create a temporary ZED_EXT directory structure matching what tasks.json expects let zed_ext_base = self.project.temp_dir.join("mock_zed_ext"); - let zed_ext_dir = zed_ext_base.join("zed/extensions/work/java/bin"); + let zed_ext_dir = zed_ext_base.join("zed/extensions/work/java/task-bin"); fs::create_dir_all(&zed_ext_dir).unwrap(); let dest_bin = zed_ext_dir.join("java-task-helper"); fs::copy(&found_bin, &dest_bin).unwrap(); From 054f2fff6e77f6563c5c8ca5fa40faf290c7ea90 Mon Sep 17 00:00:00 2001 From: Riccardo Strina Date: Sun, 19 Jul 2026 17:42:11 +0200 Subject: [PATCH 2/2] Refactor Maven exec to run main class in standalone JVM Switch from `exec:java` to `exec:exec` with explicit Java invocation, allowing JDWP debugging to target the application process rather than Maven itself. Pass debug args via `-Dexec.args` and set `-Dexec.inheritIo=true` and `-Dexec.longClasspath=true` for proper I/O and classpath handling. Update tests to verify the new exec mode and add a test case for standalone JVM debugging. --- task_helper/src/build_tool/maven.rs | 22 ++++++++-- tests/task_verification_test.rs | 65 +++++++++++++++++++++++------ 2 files changed, 72 insertions(+), 15 deletions(-) diff --git a/task_helper/src/build_tool/maven.rs b/task_helper/src/build_tool/maven.rs index da7ffdd..5cf1f94 100644 --- a/task_helper/src/build_tool/maven.rs +++ b/task_helper/src/build_tool/maven.rs @@ -36,6 +36,19 @@ impl Maven { is_debug().then(|| "-Dmaven.surefire.debug".to_string()) } + fn application_args(full_name: &str) -> String { + let mut args = vec![]; + if is_debug() { + args.push(get_jdwp_args()); + } + args.extend([ + "-classpath".to_string(), + "%classpath".to_string(), + full_name.to_string(), + ]); + format!("-Dexec.args={}", args.join(" ")) + } + fn test_filter( package: &str, class: &str, @@ -82,12 +95,15 @@ impl BuildTool for Maven { let compile_goal = if is_test { "test-compile" } else { "compile" }; let classpath_scope = if is_test { "test" } else { "runtime" }; - let mut args = vec![compile_goal.to_string(), "exec:java".to_string()]; + let mut args = vec![compile_goal.to_string(), "exec:exec".to_string()]; args.extend(Self::module_prefix(&module)); - args.push(format!("-Dexec.mainClass={}", full_name)); + args.push("-Dexec.executable=java".to_string()); + args.push(Self::application_args(&full_name)); args.push(format!("-Dexec.classpathScope={}", classpath_scope)); + args.push("-Dexec.inheritIo=true".to_string()); + args.push("-Dexec.longClasspath=true".to_string()); - task(self.command(), args, self.cwd(), Self::debug_env()) + task(self.command(), args, self.cwd(), vec![]) } fn run_test_method( diff --git a/tests/task_verification_test.rs b/tests/task_verification_test.rs index 56a7ea8..532d8d2 100644 --- a/tests/task_verification_test.rs +++ b/tests/task_verification_test.rs @@ -228,6 +228,10 @@ impl<'a> TaskRunner<'a> { .push(("ZED_CUSTOM_java_outer_class_name", o.to_string())); self } + fn env(mut self, key: &'static str, value: &str) -> Self { + self.extra_env.push((key, value.to_string())); + self + } fn run(self) -> String { let mut cmd = std::process::Command::new("sh"); @@ -236,7 +240,11 @@ impl<'a> TaskRunner<'a> { // Create a temporary ZED_EXT directory structure matching what tasks.json expects let zed_ext_base = self.project.temp_dir.join("mock_zed_ext"); - let zed_ext_dir = zed_ext_base.join("zed/extensions/work/java/task-bin"); + let zed_ext_dir = if cfg!(target_os = "macos") { + zed_ext_base.join("Library/Application Support/Zed/extensions/work/java/task-bin") + } else { + zed_ext_base.join("zed/extensions/work/java/task-bin") + }; fs::create_dir_all(&zed_ext_dir).unwrap(); let dest_bin = zed_ext_dir.join("java-task-helper"); fs::copy(&found_bin, &dest_bin).unwrap(); @@ -253,6 +261,7 @@ impl<'a> TaskRunner<'a> { .env("ZED_CUSTOM_java_package_name", &self.package) .env("ZED_CUSTOM_java_class_name", &self.class) .env("PATH", &self.project.new_path) + .env("HOME", &zed_ext_base) .env("XDG_DATA_HOME", zed_ext_base.to_string_lossy().to_string()) .current_dir(&self.project.temp_dir); @@ -286,18 +295,26 @@ fn test_maven_single_module_command_logic() { .run(); assert!( - stdout.contains("MVN_CALLED: compile exec:java"), + stdout.contains("MVN_CALLED: compile exec:exec"), "Should run as single module. Got: {}", stdout ); + assert!( + stdout.contains("-Dexec.executable=java") + && stdout.contains("-Dexec.args=-classpath %classpath com.example.Main") + && stdout.contains("-Dexec.inheritIo=true") + && stdout.contains("-Dexec.longClasspath=true"), + "Should launch the main class in a standalone JVM. Got: {}", + stdout + ); assert!( stdout.contains("-Dexec.classpathScope=runtime"), "Should use runtime classpath scope. Got: {}", stdout ); assert!( - stdout_test - .contains("MVN_CALLED: test-compile exec:java -Dexec.mainClass=com.example.Main"), + stdout_test.contains("MVN_CALLED: test-compile exec:exec") + && stdout_test.contains("-Dexec.args=-classpath %classpath com.example.Main"), "Should run as single module. Got: {}", stdout_test ); @@ -319,12 +336,12 @@ fn test_maven_multi_module_command_logic() { .run(); assert!( - stdout.contains("MVN_CALLED: compile exec:java -pl module-a -am"), + stdout.contains("MVN_CALLED: compile exec:exec -pl module-a -am"), "Should build submodule with dependencies. Got: {}", stdout ); assert!( - stdout.contains("-Dexec.mainClass=com.example.Main"), + stdout.contains("-Dexec.args=-classpath %classpath com.example.Main"), "Should run only the submodule. Got: {}", stdout ); @@ -335,12 +352,12 @@ fn test_maven_multi_module_command_logic() { ); assert!( - stdout_test.contains("MVN_CALLED: test-compile exec:java -pl module-a -am"), + stdout_test.contains("MVN_CALLED: test-compile exec:exec -pl module-a -am"), "Should build submodule with dependencies. Got: {}", stdout_test ); assert!( - stdout_test.contains("-Dexec.mainClass=com.example.Main"), + stdout_test.contains("-Dexec.args=-classpath %classpath com.example.Main"), "Should run only the submodule. Got: {}", stdout_test ); @@ -361,12 +378,12 @@ fn test_maven_nested_module_command_logic() { .run(); assert!( - stdout.contains("MVN_CALLED: test-compile exec:java -pl nested/module-b -am"), + stdout.contains("MVN_CALLED: test-compile exec:exec -pl nested/module-b -am"), "Should build nested submodule with dependencies. Got: {}", stdout ); assert!( - stdout.contains("-Dexec.mainClass=com.example.Main"), + stdout.contains("-Dexec.args=-classpath %classpath com.example.Main"), "Should run only the nested submodule. Got: {}", stdout ); @@ -463,7 +480,7 @@ fn test_maven_single_level_package_logic() { .run(); assert!( - stdout.contains("-Dexec.mainClass=example.Main"), + stdout.contains("-Dexec.args=-classpath %classpath example.Main"), "Should include the single-level package in Maven. Got: {}", stdout ); @@ -475,12 +492,36 @@ fn test_maven_default_package_command_logic() { let stdout = project.task("java-main").package("").class("Main").run(); assert!( - stdout.contains("-Dexec.mainClass=Main"), + stdout.contains("-Dexec.args=-classpath %classpath Main"), "Should not include leading dot for default package in Maven. Got: {}", stdout ); } +#[test] +fn test_maven_debugs_standalone_jvm() { + let project = TestProject::new("maven_debug", "maven", None); + let stdout = project + .task("java-main") + .env("ZED_JAVA_DEBUG", "1") + .env("ZED_JAVA_DEBUG_PORT", "6123") + .run(); + + assert!( + stdout.contains( + "-Dexec.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=6123 \ + -classpath %classpath com.example.Main" + ), + "Should pass JDWP options to the standalone JVM. Got: {}", + stdout + ); + assert!( + !stdout.contains("MAVEN_OPTS"), + "Should not debug the Maven process. Got: {}", + stdout + ); +} + #[test] fn test_maven_default_package_test_method_logic() { let project = TestProject::new("maven_default_test", "maven", None);