From 502857fced57f9d2b29d8e83bf43ac3e88447e69 Mon Sep 17 00:00:00 2001 From: Max Rydahl Andersen Date: Mon, 2 Dec 2024 08:46:05 +0100 Subject: [PATCH 1/3] feat: add --no-integrations option --- src/main/java/dev/jbang/catalog/Alias.java | 19 ++++++++++--------- src/main/java/dev/jbang/cli/Alias.java | 8 ++++---- .../java/dev/jbang/cli/BaseBuildCommand.java | 1 + src/main/java/dev/jbang/cli/BuildMixin.java | 10 ++++++++++ .../java/dev/jbang/source/AppBuilder.java | 4 +++- src/main/java/dev/jbang/source/Project.java | 9 +++++++++ .../java/dev/jbang/source/ProjectBuilder.java | 12 ++++++++++++ src/test/java/dev/jbang/cli/TestRun.java | 3 +-- 8 files changed, 50 insertions(+), 16 deletions(-) diff --git a/src/main/java/dev/jbang/catalog/Alias.java b/src/main/java/dev/jbang/catalog/Alias.java index 4736e28dc..6f761fdfc 100644 --- a/src/main/java/dev/jbang/catalog/Alias.java +++ b/src/main/java/dev/jbang/catalog/Alias.java @@ -42,6 +42,7 @@ public class Alias extends CatalogItem { public final Boolean nativeImage; @SerializedName(value = "native-options") public final List nativeOptions; + public final Boolean integrations; public final String jfr; public final Map debug; public final Boolean cds; @@ -87,8 +88,7 @@ public int hashCode() { public Alias() { this(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, - null, null, null, null, null, null, null); + null, null, null, null, null, null, null, null, null); } public Alias(String scriptRef, @@ -107,6 +107,7 @@ public Alias(String scriptRef, List compileOptions, Boolean nativeImage, List nativeOptions, + Boolean integrations, String jfr, Map debug, Boolean cds, @@ -134,6 +135,7 @@ public Alias(String scriptRef, this.compileOptions = compileOptions; this.nativeImage = nativeImage; this.nativeOptions = nativeOptions; + this.integrations = integrations; this.jfr = jfr; this.debug = debug; this.cds = cds; @@ -226,6 +228,7 @@ private static Alias merge(Alias a1, String name, Function findUn List nopts = a1.nativeOptions != null && !a1.nativeOptions.isEmpty() ? a1.nativeOptions : a2.nativeOptions; Boolean nimg = a1.nativeImage != null ? a1.nativeImage : a2.nativeImage; + Boolean ints = a1.integrations != null ? a1.integrations : a2.integrations; String jfr = a1.jfr != null ? a1.jfr : a2.jfr; Map debug = a1.debug != null ? a1.debug : a2.debug; Boolean cds = a1.cds != null ? a1.cds : a2.cds; @@ -238,7 +241,7 @@ private static Alias merge(Alias a1, String name, Function findUn List jags = a1.javaAgents != null && !a1.javaAgents.isEmpty() ? a1.javaAgents : a2.javaAgents; Catalog catalog = a2.catalog != null ? a2.catalog : a1.catalog; return new Alias(a2.scriptRef, desc, args, jopts, srcs, ress, deps, repos, cpaths, props, javaVersion, - mainClass, moduleName, copts, nimg, nopts, jfr, debug, cds, inter, ep, ea, esa, mopts, jags, + mainClass, moduleName, copts, nimg, nopts, ints, jfr, debug, cds, inter, ep, ea, esa, mopts, jags, catalog); } else { return a1; @@ -283,16 +286,14 @@ private static Alias fromCatalog(String catalogName, String aliasName) { public Alias withCatalog(Catalog catalog) { return new Alias(scriptRef, description, arguments, runtimeOptions, sources, resources, dependencies, repositories, classpaths, properties, javaVersion, mainClass, moduleName, compileOptions, nativeImage, - nativeOptions, jfr, debug, cds, interactive, enablePreview, enableAssertions, enableSystemAssertions, - manifestOptions, - javaAgents, catalog); + nativeOptions, integrations, jfr, debug, cds, interactive, enablePreview, enableAssertions, + enableSystemAssertions, manifestOptions, javaAgents, catalog); } public Alias withScriptRef(String scriptRef) { return new Alias(scriptRef, description, arguments, runtimeOptions, sources, resources, dependencies, repositories, classpaths, properties, javaVersion, mainClass, moduleName, compileOptions, nativeImage, - nativeOptions, jfr, debug, cds, interactive, enablePreview, enableAssertions, enableSystemAssertions, - manifestOptions, - javaAgents, catalog); + nativeOptions, integrations, jfr, debug, cds, interactive, enablePreview, enableAssertions, + enableSystemAssertions, manifestOptions, javaAgents, catalog); } } diff --git a/src/main/java/dev/jbang/cli/Alias.java b/src/main/java/dev/jbang/cli/Alias.java index 4f2b1e2ac..13092dc59 100644 --- a/src/main/java/dev/jbang/cli/Alias.java +++ b/src/main/java/dev/jbang/cli/Alias.java @@ -115,11 +115,10 @@ public Integer doCall() { dependencyInfoMixin.getDependencies(), dependencyInfoMixin.getRepositories(), dependencyInfoMixin.getClasspaths(), dependencyInfoMixin.getProperties(), buildMixin.javaVersion, buildMixin.main, buildMixin.module, - buildMixin.compileOptions, nativeMixin.nativeImage, nativeMixin.nativeOptions, + buildMixin.compileOptions, nativeMixin.nativeImage, nativeMixin.nativeOptions, buildMixin.integrations, runMixin.flightRecorderString, runMixin.debugString, runMixin.cds, runMixin.interactive, - enablePreviewRequested, - runMixin.enableAssertions, runMixin.enableSystemAssertions, buildMixin.manifestOptions, - createJavaAgents(), null); + enablePreviewRequested, runMixin.enableAssertions, runMixin.enableSystemAssertions, + buildMixin.manifestOptions, createJavaAgents(), null); Path catFile = getCatalog(false); if (catFile == null) { catFile = Catalog.getCatalogFile(null); @@ -149,6 +148,7 @@ ProjectBuilder createProjectBuilder() { .compileOptions(buildMixin.compileOptions) .nativeImage(nativeMixin.nativeImage) .nativeOptions(nativeMixin.nativeOptions) + .integrations(buildMixin.integrations) .enablePreview(enablePreviewRequested); Path cat = getCatalog(false); if (cat != null) { diff --git a/src/main/java/dev/jbang/cli/BaseBuildCommand.java b/src/main/java/dev/jbang/cli/BaseBuildCommand.java index 8aaafa53f..6bdc1f321 100644 --- a/src/main/java/dev/jbang/cli/BaseBuildCommand.java +++ b/src/main/java/dev/jbang/cli/BaseBuildCommand.java @@ -52,6 +52,7 @@ protected ProjectBuilder createBaseProjectBuilder() { .manifestOptions(buildMixin.manifestOptions) .nativeImage(nativeMixin.nativeImage) .nativeOptions(nativeMixin.nativeOptions) + .integrations(buildMixin.integrations) .enablePreview(enablePreviewRequested); // NB: Do not put `.mainClass(buildMixin.main)` here diff --git a/src/main/java/dev/jbang/cli/BuildMixin.java b/src/main/java/dev/jbang/cli/BuildMixin.java index e6677050b..d279e3931 100644 --- a/src/main/java/dev/jbang/cli/BuildMixin.java +++ b/src/main/java/dev/jbang/cli/BuildMixin.java @@ -5,6 +5,7 @@ import java.util.Map; import picocli.CommandLine; +import picocli.CommandLine.Option; public class BuildMixin { public String javaVersion; @@ -33,6 +34,10 @@ void setJavaVersion(String javaVersion) { @CommandLine.Option(names = { "--manifest" }, parameterConsumer = KeyValueConsumer.class) public Map manifestOptions; + @Option(names = { + "--integrations" }, description = "Enable integration execution (default: true)", negatable = true) + public Boolean integrations; + public List opts() { List opts = new ArrayList<>(); if (javaVersion != null) { @@ -47,6 +52,11 @@ public List opts() { opts.add("--module"); opts.add(module); } + if (Boolean.TRUE.equals(integrations)) { + opts.add("--integrations"); + } else if (Boolean.FALSE.equals(integrations)) { + opts.add("--no-integrations"); + } if (compileOptions != null) { for (String c : compileOptions) { opts.add("-C"); diff --git a/src/main/java/dev/jbang/source/AppBuilder.java b/src/main/java/dev/jbang/source/AppBuilder.java index 5771c255c..15fa65921 100644 --- a/src/main/java/dev/jbang/source/AppBuilder.java +++ b/src/main/java/dev/jbang/source/AppBuilder.java @@ -95,7 +95,9 @@ public CmdGeneratorBuilder build() throws IOException { // do the actual building try { getCompileBuildStep().build(); - integrationResult = getIntegrationBuildStep().build(); + if (project.isIntegrations()) { + integrationResult = getIntegrationBuildStep().build(); + } getJarBuildStep().build(); } finally { if (!keepClasses()) { diff --git a/src/main/java/dev/jbang/source/Project.java b/src/main/java/dev/jbang/source/Project.java index 8c708f122..564c056c3 100644 --- a/src/main/java/dev/jbang/source/Project.java +++ b/src/main/java/dev/jbang/source/Project.java @@ -39,6 +39,7 @@ public class Project { private String mainClass; private String moduleName; private boolean nativeImage; + private boolean integrations = true; private boolean enablePreviewRequested; private final List subProjects = new ArrayList<>(); @@ -220,6 +221,14 @@ public void setNativeImage(boolean isNative) { this.nativeImage = isNative; } + public boolean isIntegrations() { + return integrations; + } + + public void setIntegrations(boolean integrations) { + this.integrations = integrations; + } + public boolean enableCDS() { return mainSource != null && mainSource.enableCDS(); } diff --git a/src/main/java/dev/jbang/source/ProjectBuilder.java b/src/main/java/dev/jbang/source/ProjectBuilder.java index 9b7f76efb..a55148c53 100644 --- a/src/main/java/dev/jbang/source/ProjectBuilder.java +++ b/src/main/java/dev/jbang/source/ProjectBuilder.java @@ -52,6 +52,7 @@ public class ProjectBuilder { private Map manifestOptions = new HashMap<>(); private File catalogFile; private Boolean nativeImage; + private Boolean integrations; private String javaVersion; private Boolean enablePreview; @@ -172,6 +173,11 @@ public ProjectBuilder nativeImage(Boolean nativeImage) { return this; } + public ProjectBuilder integrations(Boolean integrations) { + this.integrations = integrations; + return this; + } + public ProjectBuilder enablePreview(Boolean enablePreviewRequested) { this.enablePreview = enablePreviewRequested; return this; @@ -429,6 +435,9 @@ private Project updateProject(Project prj) { if (nativeImage != null) { prj.setNativeImage(nativeImage); } + if (integrations != null) { + prj.setIntegrations(integrations); + } if (enablePreview != null) { prj.setEnablePreviewRequested(enablePreview); } @@ -591,6 +600,9 @@ private void updateFromAlias(Alias alias) { if (nativeOptions.isEmpty()) { nativeOptions(alias.nativeOptions); } + if (integrations == null) { + integrations(alias.integrations); + } if (manifestOptions.isEmpty()) { manifestOptions(alias.manifestOptions); } diff --git a/src/test/java/dev/jbang/cli/TestRun.java b/src/test/java/dev/jbang/cli/TestRun.java index 478b091c1..0bbce1593 100644 --- a/src/test/java/dev/jbang/cli/TestRun.java +++ b/src/test/java/dev/jbang/cli/TestRun.java @@ -2528,8 +2528,7 @@ void testAliasArguments() throws IOException { File f = examplesTestFolder.resolve("echo.java").toFile(); List args = Arrays.asList("foo", "bar"); Alias alias = new Alias(f.toString(), null, args, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, - null, null, null, null, null, null, null, null); + null, null, null, null, null, null, null, null, null, null, null, null, null, null); CatalogUtil.addNearestAlias("echo", alias); CommandLine.ParseResult pr = JBang .getCommandLine() From 91a2f9acdf4df07d30324a9c86fbab20d1b617a9 Mon Sep 17 00:00:00 2001 From: Tako Schotanus Date: Tue, 3 Dec 2024 15:28:36 +0100 Subject: [PATCH 2/3] test: added tests for skipping integrations --- .../java/dev/jbang/source/TestBuilder.java | 91 ++++++++++++++----- 1 file changed, 69 insertions(+), 22 deletions(-) diff --git a/src/test/java/dev/jbang/source/TestBuilder.java b/src/test/java/dev/jbang/source/TestBuilder.java index 7ebd680a9..5b11283b1 100644 --- a/src/test/java/dev/jbang/source/TestBuilder.java +++ b/src/test/java/dev/jbang/source/TestBuilder.java @@ -13,6 +13,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Function; @@ -30,9 +31,11 @@ import dev.jbang.catalog.Alias; import dev.jbang.catalog.CatalogUtil; import dev.jbang.cli.ExitException; +import dev.jbang.source.buildsteps.IntegrationBuildStep; import dev.jbang.source.buildsteps.JarBuildStep; import dev.jbang.source.buildsteps.NativeBuildStep; import dev.jbang.source.sources.JavaSource; +import dev.jbang.spi.IntegrationResult; import dev.jbang.util.Util; public class TestBuilder extends BaseTest { @@ -43,7 +46,21 @@ void testHelloworld() throws IOException { ProjectBuilder pb = Project.builder(); Project prj = pb.build(foo.toString()); BuildContext ctx = BuildContext.forProject(prj); - runBuild(ctx, (ctxx, optionList) -> assertThat(optionList, hasItems(foo.toString(), "-g")), null, null); + AtomicBoolean integrationStepCalled = new AtomicBoolean(false); + AtomicBoolean jarStepCalled = new AtomicBoolean(false); + AtomicBoolean nativeStepCalled = new AtomicBoolean(false); + runBuild(ctx, (ctxx, optionList) -> assertThat(optionList, hasItems(foo.toString(), "-g")), (ctxx) -> { + integrationStepCalled.set(true); + return new IntegrationResult(null, null, null); + }, (ctxx) -> { + jarStepCalled.set(true); + return ctxx.getProject(); + }, (ctxx, nativeStep) -> { + nativeStepCalled.set(true); + }); + assertThat(integrationStepCalled.get(), is(true)); + assertThat(jarStepCalled.get(), is(true)); + assertThat(nativeStepCalled.get(), is(false)); } @Test @@ -54,7 +71,7 @@ void testEnablePreview() throws IOException { prj.setEnablePreviewRequested(true); BuildContext ctx = BuildContext.forProject(prj); runBuild(ctx, (ctxx, optionList) -> assertThat(optionList, hasItems(foo.toString(), "--enable-preview")), null, - null); + null, null); } @Test @@ -68,7 +85,7 @@ void testDualHelloworld(@TempDir File out1, @TempDir File out2) throws IOExcepti assertThat(optionList, hasItems(containsString(out1.toString()))); assertThat(optionList, not(hasItems(containsString(out2.toString())))); assertThat(optionList, not(hasItems(containsString(Settings.getCacheDir().toString())))); - }, ctxx -> { + }, null, ctxx -> { assertThat(ctxx.getJarFile().toString(), containsString(out1.toString())); assertThat(ctxx.getJarFile().toString(), not(containsString(out2.toString()))); assertThat(ctxx.getJarFile().toString(), not(containsString(Settings.getCacheDir().toString()))); @@ -78,7 +95,7 @@ void testDualHelloworld(@TempDir File out1, @TempDir File out2) throws IOExcepti assertThat(optionList, hasItems(containsString(out2.toString()))); assertThat(optionList, not(hasItems(containsString(out1.toString())))); assertThat(optionList, not(hasItems(containsString(Settings.getCacheDir().toString())))); - }, ctxx -> { + }, null, ctxx -> { assertThat(ctxx.getJarFile().toString(), containsString(out2.toString())); assertThat(ctxx.getJarFile().toString(), not(containsString(out1.toString()))); assertThat(ctxx.getJarFile().toString(), not(containsString(Settings.getCacheDir().toString()))); @@ -93,7 +110,7 @@ void testCompileOptions() throws IOException { Project prj = pb.build(foo.toString()); BuildContext ctx = BuildContext.forProject(prj); runBuild(ctx, (ctxx, optionList) -> assertThat(optionList, hasItems(foo.toString(), "-g", "--foo", "--bar")), - null, null); + null, null, null); } @Test @@ -103,7 +120,7 @@ void testKotlinCompileOptions() throws IOException { Project prj = pb.build(foo.toString()); BuildContext ctx = BuildContext.forProject(prj); runBuild(ctx, (ctxx, optionList) -> assertThat(optionList, hasItems(foo.toString(), "--foo", "--bar")), null, - null); + null, null); } @Test @@ -117,7 +134,7 @@ void testBuildAdditionalSources() throws IOException { runBuild(ctx, (ctxx, optionList) -> { assertThat(optionList, hasItem(foo.toString())); assertThat(optionList, hasItem(bar.toString())); - }, null, null); + }, null, null, null); } @Test @@ -134,7 +151,7 @@ void testAdditionalSourcesUsingAlias() throws IOException { runBuild(ctx, (ctxx, optionList) -> { assertThat(optionList, hasItem(mainFile)); assertThat(optionList, hasItem(incFile)); - }, null, null); + }, null, null, null); } @Test @@ -154,7 +171,7 @@ void testIncludedSourcesUsingAlias(@TempDir Path dir) throws IOException { runBuild(ctx, (ctxx, optionList) -> { assertThat(optionList, hasItem(mainFile.toString())); assertThat(optionList, hasItem(incFile)); - }, null, null); + }, null, null, null); } @Test @@ -170,7 +187,7 @@ void testAdditionalSourcesGlobbing() throws IOException { runBuild(ctx, (ctxx, optionList) -> { assertThat(optionList, hasItem(mainFile)); assertThat(optionList, hasItem(incFile)); - }, null, null); + }, null, null, null); } @Test @@ -186,7 +203,7 @@ void testAdditionalSourcesAbsGlobbing() throws IOException { runBuild(ctx, (ctxx, optionList) -> { assertThat(optionList, hasItem(mainFile)); assertThat(optionList, hasItem(incFile)); - }, null, null); + }, null, null, null); } @Test @@ -202,7 +219,7 @@ void testAdditionalSourcesFolder() throws IOException { runBuild(ctx, (ctxx, optionList) -> { assertThat(optionList, hasItem(mainFile)); assertThat(optionList, hasItem(incFile)); - }, null, null); + }, null, null, null); } @Test @@ -218,7 +235,7 @@ void testBuildAdditionalResources() throws IOException { Project prj = pb.build(foo.toString()); BuildContext ctx = BuildContext.forProject(prj); runBuild(ctx, (ctxx, optionList) -> { - }, ctxx -> { + }, null, ctxx -> { Project project = ctxx.getProject(); assertThat(project.getMainSourceSet().getResources().size(), is(2)); assertThat( @@ -244,7 +261,7 @@ void testBuildAdditionalResourcesMounted() throws IOException { Project prj = pb.build(foo.toString()); BuildContext ctx = BuildContext.forProject(prj); runBuild(ctx, (ctxx, optionList) -> { - }, ctxx -> { + }, null, ctxx -> { Project project = ctxx.getProject(); assertThat(project.getMainSourceSet().getResources().size(), is(2)); assertThat(project.getMainSourceSet().getResources().get(0).getTarget().toString(), @@ -273,7 +290,7 @@ void testAdditionalResourcesGlobbing() throws IOException { BuildContext ctx = BuildContext.forProject(prj); runBuild(ctx, (ctxx, optionList) -> { assertThat(optionList, hasItem(endsWith(File.separator + "foo.java"))); - }, ctxx -> { + }, null, ctxx -> { Project project = ctxx.getProject(); assertThat(project.getMainSourceSet().getResources().size(), is(3)); List ps = project .getMainSourceSet() @@ -298,7 +315,7 @@ void testAdditionalResourcesFolder() throws IOException { BuildContext ctx = BuildContext.forProject(prj); runBuild(ctx, (ctxx, optionList) -> { assertThat(optionList, hasItem(endsWith(File.separator + "foo.java"))); - }, ctxx -> { + }, null, ctxx -> { Project project = ctxx.getProject(); assertThat(project.getMainSourceSet().getResources().size(), is(4)); List ps = project .getMainSourceSet() @@ -325,7 +342,7 @@ void testNativeOutputName() throws IOException { BuildContext ctx = BuildContext.forProject(prj); runBuild(ctx, (ctxx, optionList) -> { assertThat(optionList, hasItem(endsWith(File.separator + "foo.java"))); - }, null, (ctxx, optionList) -> { + }, null, null, (ctxx, optionList) -> { if (Util.isWindows()) { assertThat(optionList.get(optionList.size() - 1), not(endsWith(".exe"))); } else { @@ -366,7 +383,7 @@ void testNative() throws IOException { Project prj = pb.build(foo.toString()); BuildContext ctx = BuildContext.forProject(prj); runBuild(ctx, (ctxx, optionList) -> { - }, null, (ctxx, optionList) -> assertThat(optionList, hasItem("-O1"))); + }, null, null, (ctxx, optionList) -> assertThat(optionList, hasItem("-O1"))); } @Test @@ -377,7 +394,7 @@ void testNativeFresh() throws IOException { BuildContext ctx = BuildContext.forProject(prj); AtomicInteger callCount = new AtomicInteger(0); runBuild(ctx, (ctxx, optionList) -> { - }, null, (ctxx, optionList) -> { + }, null, null, (ctxx, optionList) -> { try { ctxx.getNativeImageFile().toFile().createNewFile(); } catch (IOException e) { @@ -386,7 +403,7 @@ void testNativeFresh() throws IOException { callCount.incrementAndGet(); }); runBuild(ctx, (ctxx, optionList) -> { - }, null, (ctxx, optionList) -> callCount.incrementAndGet()); + }, null, null, (ctxx, optionList) -> callCount.incrementAndGet()); assertThat(callCount.get(), equalTo(2)); } @@ -411,7 +428,7 @@ void testSourceDep() throws IOException { } else { throw new IllegalStateException("Should not be called more than twice!"); } - }, null, null); + }, null, null, null); assertThat(callCount.get(), equalTo(2)); } @@ -426,8 +443,24 @@ void testSourceSelfDep() throws IOException { } } + @Test + void testNoIntegration() throws IOException { + Path foo = examplesTestFolder.resolve("helloworld.java").toAbsolutePath(); + ProjectBuilder pb = Project.builder(); + pb.integrations(false); + Project prj = pb.build(foo.toString()); + BuildContext ctx = BuildContext.forProject(prj); + AtomicBoolean integrationStepCalled = new AtomicBoolean(false); + runBuild(ctx, null, (ctxx) -> { + integrationStepCalled.set(true); + return new IntegrationResult(null, null, null); + }, null, null); + assertThat(integrationStepCalled.get(), is(false)); + } + private void runBuild(BuildContext ctx, BiConsumer> compileStep, - Function jarStep, BiConsumer> nativeStep) + Function integrationStep, Function jarStep, + BiConsumer> nativeStep) throws IOException { new CodeBuilderProvider(ctx) { @Nonnull @@ -448,6 +481,20 @@ protected void runCompiler(List optionList) throws IOException { }; } + @Override + protected Builder getIntegrationBuildStep() { + return new IntegrationBuildStep(ctx) { + @Override + public IntegrationResult build() throws IOException { + if (integrationStep != null) { + return integrationStep.apply(ctx); + } else { + return super.build(); + } + } + }; + } + @Override protected Builder getJarBuildStep() { return new JarBuildStep(ctx) { From e53cf48c8afe676681f8cd256561ef71c285bee6 Mon Sep 17 00:00:00 2001 From: Tako Schotanus Date: Tue, 3 Dec 2024 19:20:37 +0100 Subject: [PATCH 3/3] feat: added support for `//NOINTEGRATIONS` tag --- itests/noints.java | 8 ++++++++ src/main/java/dev/jbang/source/AppBuilder.java | 2 +- src/main/java/dev/jbang/source/Project.java | 12 ++++++------ src/main/java/dev/jbang/source/Source.java | 4 ++++ src/test/java/dev/jbang/source/TestBuilder.java | 17 ++++++++++++++++- 5 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 itests/noints.java diff --git a/itests/noints.java b/itests/noints.java new file mode 100644 index 000000000..f10cd21fb --- /dev/null +++ b/itests/noints.java @@ -0,0 +1,8 @@ +///usr/bin/env jbang "$0" "$@" ; exit $? +//NOINTEGRATIONS + +public class noints { + public static void main(String... args) { + System.out.println("No integrations here"); + } +} diff --git a/src/main/java/dev/jbang/source/AppBuilder.java b/src/main/java/dev/jbang/source/AppBuilder.java index 15fa65921..f33ebf582 100644 --- a/src/main/java/dev/jbang/source/AppBuilder.java +++ b/src/main/java/dev/jbang/source/AppBuilder.java @@ -95,7 +95,7 @@ public CmdGeneratorBuilder build() throws IOException { // do the actual building try { getCompileBuildStep().build(); - if (project.isIntegrations()) { + if (!project.disableIntegrations()) { integrationResult = getIntegrationBuildStep().build(); } getJarBuildStep().build(); diff --git a/src/main/java/dev/jbang/source/Project.java b/src/main/java/dev/jbang/source/Project.java index 564c056c3..04bbd1fe5 100644 --- a/src/main/java/dev/jbang/source/Project.java +++ b/src/main/java/dev/jbang/source/Project.java @@ -50,10 +50,6 @@ public class Project { public static final String ATTR_PREMAIN_CLASS = "Premain-Class"; public static final String ATTR_AGENT_CLASS = "Agent-Class"; - public boolean enablePreview() { - return enablePreviewRequested || (mainSource != null && mainSource.enablePreview()); - } - public enum BuildFile { jbang("build.jbang"); @@ -198,6 +194,10 @@ public void setMainClass(String mainClass) { this.mainClass = mainClass; } + public boolean enablePreview() { + return enablePreviewRequested || (mainSource != null && mainSource.enablePreview()); + } + public void setEnablePreviewRequested(boolean enablePreview) { this.enablePreviewRequested = enablePreview; } @@ -221,8 +221,8 @@ public void setNativeImage(boolean isNative) { this.nativeImage = isNative; } - public boolean isIntegrations() { - return integrations; + public boolean disableIntegrations() { + return !integrations || (mainSource != null && mainSource.disableIntegrations()); } public void setIntegrations(boolean integrations) { diff --git a/src/main/java/dev/jbang/source/Source.java b/src/main/java/dev/jbang/source/Source.java index 22fc42529..0052c715a 100644 --- a/src/main/java/dev/jbang/source/Source.java +++ b/src/main/java/dev/jbang/source/Source.java @@ -111,6 +111,10 @@ public boolean enablePreview() { return !tagReader.collectRawOptions("PREVIEW").isEmpty(); } + public boolean disableIntegrations() { + return !tagReader.collectRawOptions("NOINTEGRATIONS").isEmpty(); + } + // Used only by tests static Source forResource(String resource, Function replaceProperties) { return forResource(ResourceResolver.forResources(), resource, replaceProperties); diff --git a/src/test/java/dev/jbang/source/TestBuilder.java b/src/test/java/dev/jbang/source/TestBuilder.java index 5b11283b1..437d2d0bf 100644 --- a/src/test/java/dev/jbang/source/TestBuilder.java +++ b/src/test/java/dev/jbang/source/TestBuilder.java @@ -444,7 +444,7 @@ void testSourceSelfDep() throws IOException { } @Test - void testNoIntegration() throws IOException { + void testNoIntegrationsFlag() throws IOException { Path foo = examplesTestFolder.resolve("helloworld.java").toAbsolutePath(); ProjectBuilder pb = Project.builder(); pb.integrations(false); @@ -458,6 +458,21 @@ void testNoIntegration() throws IOException { assertThat(integrationStepCalled.get(), is(false)); } + @Test + void testNoIntegrationsTag() throws IOException { + Path foo = examplesTestFolder.resolve("noints.java").toAbsolutePath(); + ProjectBuilder pb = Project.builder(); + Project prj = pb.build(foo.toString()); + assertThat(prj.disableIntegrations(), is(true)); + BuildContext ctx = BuildContext.forProject(prj); + AtomicBoolean integrationStepCalled = new AtomicBoolean(false); + runBuild(ctx, null, (ctxx) -> { + integrationStepCalled.set(true); + return new IntegrationResult(null, null, null); + }, null, null); + assertThat(integrationStepCalled.get(), is(false)); + } + private void runBuild(BuildContext ctx, BiConsumer> compileStep, Function integrationStep, Function jarStep, BiConsumer> nativeStep)