Skip to content

Commit fca251c

Browse files
committed
fix: resource references with property resolving
1 parent 4497615 commit fca251c

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

src/main/java/dev/jbang/source/ProjectBuilder.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,12 +258,41 @@ private List<MavenRepo> allToMavenRepo(List<String> repos) {
258258
}
259259

260260
public Project build(String resource) {
261-
ResourceRef resourceRef = resolveChecked(getResourceResolver(), resource);
261+
ResourceRef resourceRef = resolveChecked(getResourceResolver(), resource, true);
262262
return build(resourceRef);
263263
}
264264

265265
private ResourceRef resolveChecked(ResourceResolver resolver, String resource) {
266-
Util.verboseMsg("Resolving resource ref: " + resource);
266+
return resolveChecked(resolver, resource, false);
267+
}
268+
269+
/**
270+
* Resolves the given resource, with property resolution from project context
271+
* and handles retry on caching.
272+
*
273+
* Note: only enable property replacement if you know the resource is not
274+
* something that can be embedded/included directly in the project from users
275+
* data.
276+
*
277+
* i.e. jbang run someref${os.detected.os}.jar is ok but //FILES with
278+
* ${user.home} is definitely not.
279+
*
280+
* @param resolver
281+
* @param resource
282+
* @return
283+
*/
284+
private ResourceRef resolveChecked(ResourceResolver resolver, String orginal_resource,
285+
boolean propertyReplacement) {
286+
final String resource = propertyReplacement
287+
? PropertiesValueResolver.replaceProperties(orginal_resource, getContextProperties())
288+
: orginal_resource;
289+
290+
if (!resource.equals(orginal_resource)) {
291+
Util.verboseMsg("Resolving resource ref: " + orginal_resource + " -> " + resource);
292+
} else {
293+
Util.verboseMsg("Resolving resource ref:" + resource);
294+
}
295+
267296
boolean retryCandidate = catalogFile == null && !Util.isFresh() && Settings.getCacheEvict() > 0
268297
&& (Catalog.isValidName(resource) || Catalog.isValidCatalogReference(resource)
269298
|| Util.isRemoteRef(resource));
@@ -618,6 +647,7 @@ private ResourceResolver getAliasResourceResolver(Alias alias) {
618647
if (alias != null) {
619648
updateFromAlias(alias);
620649
}
650+
621651
return new CombinedResourceResolver(
622652
new RenamingScriptResourceResolver(forceType),
623653
new LiteralScriptResourceResolver(forceType),

src/test/java/dev/jbang/cli/TestRun.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2101,6 +2101,30 @@ void testJavaFXMagicPropertyViaCommandline() throws IOException {
21012101

21022102
}
21032103

2104+
@Test
2105+
void testMagicPropertyViaRun(@TempDir Path tdir) throws IOException {
2106+
2107+
String res = "https://github.com/HanSolo/jarkanoid/releases/download/17.0.17/jarkanoid-${os.detected.jfxname}-17.0.17.jar";
2108+
try {
2109+
TrustedSources.instance().add(res, tdir.resolve("test.trust").toFile());
2110+
// todo fix so --deps can use system properties
2111+
CommandLine.ParseResult pr = JBang.getCommandLine()
2112+
.parseArgs("run", res);
2113+
2114+
Run run = (Run) pr.subcommand().commandSpec().userObject();
2115+
2116+
ProjectBuilder pb = run.createProjectBuilderForRun();
2117+
2118+
Project prj = pb.build(res);
2119+
String line = run.updateGeneratorForRun(CmdGenerator.builder(prj)).build().generate();
2120+
2121+
assertThat(line, containsString(" --module-path "));
2122+
} finally {
2123+
TrustedSources.instance().remove(Collections.singletonList(res), tdir.resolve("test.trust").toFile());
2124+
}
2125+
2126+
}
2127+
21042128
@Test
21052129
void testScriptCliReposAndDeps(@TempDir File output) throws IOException {
21062130
String base = "" +

0 commit comments

Comments
 (0)