From 9d64754763d7469e5fc75c5d78b790e00d18aa30 Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Sat, 15 Jun 2024 08:20:53 +0000 Subject: [PATCH 1/7] Add `--keep_going` to make Bazel support more robust --- TODOS.md | 1 + src/main/java/org/javacs/InferConfig.java | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/TODOS.md b/TODOS.md index 2dae97392..c7e1db9da 100644 --- a/TODOS.md +++ b/TODOS.md @@ -20,6 +20,7 @@ - Select entire name, find references => no results - Crashes if maven is not installed - Homebrew users don't have src.zip, detect java version and download the appropriate src.zip +- Temporary files created for Bazel command output are not cleaned up. ## Optimizations - Compilation is very slow in the presence of lots of errors diff --git a/src/main/java/org/javacs/InferConfig.java b/src/main/java/org/javacs/InferConfig.java index 8cc004c55..d30b97075 100644 --- a/src/main/java/org/javacs/InferConfig.java +++ b/src/main/java/org/javacs/InferConfig.java @@ -302,7 +302,7 @@ private Path bazelOutputBase(Path bazelWorkspaceRoot) { String[] command = { "bazel", "info", "output_base", }; - var output = fork(bazelWorkspaceRoot, command); + var output = fork(bazelWorkspaceRoot, command, false); if (output == NOT_FOUND) { return NOT_FOUND; } @@ -319,11 +319,12 @@ private void bazelDryRunBuild(Path bazelWorkspaceRoot, Set targets) { var command = new ArrayList(); command.add("bazel"); command.add("build"); + command.add("--keep_going"); command.add("--nobuild"); command.addAll(targets); String[] c = new String[command.size()]; c = command.toArray(c); - var output = fork(bazelWorkspaceRoot, c); + var output = fork(bazelWorkspaceRoot, c, true); if (output == NOT_FOUND) { return; } @@ -331,8 +332,8 @@ private void bazelDryRunBuild(Path bazelWorkspaceRoot, Set targets) { } private Set bazelQuery(Path bazelWorkspaceRoot, String filterKind) { - String[] command = {"bazel", "query", "kind(" + filterKind + ",//...)"}; - var output = fork(bazelWorkspaceRoot, command); + String[] command = {"bazel", "query", "--keep_going", "kind(" + filterKind + ",//...)"}; + var output = fork(bazelWorkspaceRoot, command, true); if (output == NOT_FOUND) { return Set.of(); } @@ -366,13 +367,14 @@ private Set bazelAQuery( String[] command = { "bazel", "aquery", + "--keep_going", "--output=proto", "--include_aspects", // required for java_proto_library, see // https://stackoverflow.com/questions/63430530/bazel-aquery-returns-no-action-information-for-java-proto-library "--allow_analysis_failures", "mnemonic(" + filterMnemonic + ", " + kindUnion + ")" }; - var output = fork(bazelWorkspaceRoot, command); + var output = fork(bazelWorkspaceRoot, command, true); if (output == NOT_FOUND) { return Set.of(); } @@ -474,7 +476,7 @@ private static String buildPath(List fragments, int id) { throw new RuntimeException(); } - private static Path fork(Path workspaceRoot, String[] command) { + private static Path fork(Path workspaceRoot, String[] command, boolean allowNonZeroExit) { try { LOG.info("Running " + String.join(" ", command) + " ..."); var output = Files.createTempFile("java-language-server-bazel-output", ".proto"); @@ -489,7 +491,9 @@ private static Path fork(Path workspaceRoot, String[] command) { var result = process.waitFor(); if (result != 0) { LOG.severe("`" + String.join(" ", command) + "` returned " + result); - return NOT_FOUND; + if (!allowNonZeroExit) { + return NOT_FOUND; + } } return output; } catch (InterruptedException | IOException e) { From 6c3cfca8cf107ef6c437a2638b3d63d93f48ee25 Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Sat, 15 Jun 2024 08:24:03 +0000 Subject: [PATCH 2/7] Workflow triggers --- .github/workflows/release.yml | 1 + .github/workflows/test.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a7711159e..7fde52cea 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,6 +4,7 @@ on: push: tags: - release + workflow_dispatch: jobs: build: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ba76fef59..1a921df6c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,6 +7,7 @@ on: pull_request: branches: - master + workflow_dispatch: jobs: build: From 1e7c47dd97e2d7a53dab86d12116fd20e9bf6fde Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Sat, 15 Jun 2024 08:33:27 +0000 Subject: [PATCH 3/7] Pin bazel version for tests --- src/test/examples/bazel-project/.bazelversion | 1 + src/test/examples/bazel-protos-project/.bazelversion | 1 + 2 files changed, 2 insertions(+) create mode 100644 src/test/examples/bazel-project/.bazelversion create mode 100644 src/test/examples/bazel-protos-project/.bazelversion diff --git a/src/test/examples/bazel-project/.bazelversion b/src/test/examples/bazel-project/.bazelversion new file mode 100644 index 000000000..74ecad8a3 --- /dev/null +++ b/src/test/examples/bazel-project/.bazelversion @@ -0,0 +1 @@ +4.2.4 \ No newline at end of file diff --git a/src/test/examples/bazel-protos-project/.bazelversion b/src/test/examples/bazel-protos-project/.bazelversion new file mode 100644 index 000000000..74ecad8a3 --- /dev/null +++ b/src/test/examples/bazel-protos-project/.bazelversion @@ -0,0 +1 @@ +4.2.4 \ No newline at end of file From d4150c5186500f347e48fda5b7b7e204d6d63fb2 Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Sat, 15 Jun 2024 08:44:04 +0000 Subject: [PATCH 4/7] Add test for broken Bazel project --- .../bazel-project-broken/.bazelversion | 1 + .../examples/bazel-project-broken/.gitignore | 1 + .../examples/bazel-project-broken/WORKSPACE | 32 +++++++++++++++++++ .../bazel-project-broken/broken/BUILD | 1 + .../examples/bazel-project-broken/hello/BUILD | 9 ++++++ .../bazel-project-broken/hello/src/Hello.java | 5 +++ .../java/org/javacs/InferBazelConfigTest.java | 6 ++++ 7 files changed, 55 insertions(+) create mode 100644 src/test/examples/bazel-project-broken/.bazelversion create mode 100644 src/test/examples/bazel-project-broken/.gitignore create mode 100644 src/test/examples/bazel-project-broken/WORKSPACE create mode 100644 src/test/examples/bazel-project-broken/broken/BUILD create mode 100644 src/test/examples/bazel-project-broken/hello/BUILD create mode 100644 src/test/examples/bazel-project-broken/hello/src/Hello.java diff --git a/src/test/examples/bazel-project-broken/.bazelversion b/src/test/examples/bazel-project-broken/.bazelversion new file mode 100644 index 000000000..74ecad8a3 --- /dev/null +++ b/src/test/examples/bazel-project-broken/.bazelversion @@ -0,0 +1 @@ +4.2.4 \ No newline at end of file diff --git a/src/test/examples/bazel-project-broken/.gitignore b/src/test/examples/bazel-project-broken/.gitignore new file mode 100644 index 000000000..6d8ad95fa --- /dev/null +++ b/src/test/examples/bazel-project-broken/.gitignore @@ -0,0 +1 @@ +bazel-* \ No newline at end of file diff --git a/src/test/examples/bazel-project-broken/WORKSPACE b/src/test/examples/bazel-project-broken/WORKSPACE new file mode 100644 index 000000000..6fc327c5a --- /dev/null +++ b/src/test/examples/bazel-project-broken/WORKSPACE @@ -0,0 +1,32 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +RULES_JVM_EXTERNAL_TAG = "4.2" +RULES_JVM_EXTERNAL_SHA = "cd1a77b7b02e8e008439ca76fd34f5b07aecb8c752961f9640dea15e9e5ba1ca" + +http_archive( + name = "rules_jvm_external", + sha256 = RULES_JVM_EXTERNAL_SHA, + strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG, + url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG, +) + +load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps") + +rules_jvm_external_deps() + +load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup") + +rules_jvm_external_setup() + +load("@rules_jvm_external//:defs.bzl", "maven_install") + +maven_install( + artifacts = [ + "com.google.guava:guava:18.0", + ], + repositories = [ + "https://jcenter.bintray.com/", + "https://repo1.maven.org/maven2", + ], + fetch_sources = True, +) \ No newline at end of file diff --git a/src/test/examples/bazel-project-broken/broken/BUILD b/src/test/examples/bazel-project-broken/broken/BUILD new file mode 100644 index 000000000..52016f0c2 --- /dev/null +++ b/src/test/examples/bazel-project-broken/broken/BUILD @@ -0,0 +1 @@ +fail("intentionally broken") diff --git a/src/test/examples/bazel-project-broken/hello/BUILD b/src/test/examples/bazel-project-broken/hello/BUILD new file mode 100644 index 000000000..6b3070fe9 --- /dev/null +++ b/src/test/examples/bazel-project-broken/hello/BUILD @@ -0,0 +1,9 @@ +java_binary( + name = "main", + srcs = glob(["src/**/*.java"]), + main_class = "Hello", + visibility = ["//visibility:public"], + deps = [ + "@maven//:com_google_guava_guava", + ], +) \ No newline at end of file diff --git a/src/test/examples/bazel-project-broken/hello/src/Hello.java b/src/test/examples/bazel-project-broken/hello/src/Hello.java new file mode 100644 index 000000000..76b62dc8e --- /dev/null +++ b/src/test/examples/bazel-project-broken/hello/src/Hello.java @@ -0,0 +1,5 @@ +class Hello { + public static void main(String[] args) { + System.out.println("Hello, world!"); + } +} \ No newline at end of file diff --git a/src/test/java/org/javacs/InferBazelConfigTest.java b/src/test/java/org/javacs/InferBazelConfigTest.java index a1eaa8369..8010d242f 100644 --- a/src/test/java/org/javacs/InferBazelConfigTest.java +++ b/src/test/java/org/javacs/InferBazelConfigTest.java @@ -25,6 +25,12 @@ public void bazelClassPathWithProtos() { assertThat(bazel.classPath(), hasItem(hasToString(endsWith("libperson_proto-speed.jar")))); } + @Test + public void bazelClassPathBrokenProject() { + var bazel = new InferConfig(Paths.get("src/test/examples/bazel-project-broken")); + assertThat(bazel.classPath(), contains(hasToString(endsWith("guava-18.0.jar")))); + } + @Test public void bazelDocPath() { var bazel = new InferConfig(Paths.get("src/test/examples/bazel-project")); From fdec6c5e47a022dcf3132c2349f481cd0e952cea Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Sat, 15 Jun 2024 08:47:38 +0000 Subject: [PATCH 5/7] Not needed --- .github/workflows/release.yml | 1 - .github/workflows/test.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7fde52cea..a7711159e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,7 +4,6 @@ on: push: tags: - release - workflow_dispatch: jobs: build: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1a921df6c..ba76fef59 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,7 +7,6 @@ on: pull_request: branches: - master - workflow_dispatch: jobs: build: From e3555ad50a1075b4f3a46179c8d7c94f930e9cdb Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Sat, 15 Jun 2024 08:58:08 +0000 Subject: [PATCH 6/7] For testing --- .github/workflows/release.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a7711159e..7f5671406 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,8 +2,11 @@ name: Release on: push: - tags: - - release + branches: + - master + pull_request: + branches: + - master jobs: build: @@ -35,5 +38,8 @@ jobs: run: mvn --batch-mode package - name: Build extension run: npm run-script vscode:build - - name: Publish extension in VSCode marketplace - run: npx vsce publish --pat ${{ secrets.MARKETPLACE_TOKEN }} --packagePath build.vsix \ No newline at end of file + - name: Upload VSIX + uses: actions/upload-artifact@v4 + with: + name: vsix + path: build.vsix \ No newline at end of file From eccf19159cec7c981614c478f78899e3f45f2383 Mon Sep 17 00:00:00 2001 From: Jordan Mele Date: Sat, 15 Jun 2024 10:13:28 +0000 Subject: [PATCH 7/7] Cleanup for PR --- .github/workflows/release.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7f5671406..a7711159e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,11 +2,8 @@ name: Release on: push: - branches: - - master - pull_request: - branches: - - master + tags: + - release jobs: build: @@ -38,8 +35,5 @@ jobs: run: mvn --batch-mode package - name: Build extension run: npm run-script vscode:build - - name: Upload VSIX - uses: actions/upload-artifact@v4 - with: - name: vsix - path: build.vsix \ No newline at end of file + - name: Publish extension in VSCode marketplace + run: npx vsce publish --pat ${{ secrets.MARKETPLACE_TOKEN }} --packagePath build.vsix \ No newline at end of file