diff --git a/src/main/java/dev/jbang/catalog/Alias.java b/src/main/java/dev/jbang/catalog/Alias.java index 63164b851..6a931ebcf 100644 --- a/src/main/java/dev/jbang/catalog/Alias.java +++ b/src/main/java/dev/jbang/catalog/Alias.java @@ -189,6 +189,8 @@ private static Alias merge(Alias a1, String name, Function findUn String[] parts = name.split("@"); if (parts.length > 2 || parts[0].isEmpty()) { throw new RuntimeException("Invalid alias name '" + name + "'"); + } else if (parts.length == 1 && (name.endsWith("@"))) { + parts = new String[] { parts[0], Catalog.JBANG_DEFAULT_CATALOG }; } Alias a2; if (parts.length == 1) { @@ -197,6 +199,9 @@ private static Alias merge(Alias a1, String name, Function findUn if (parts[1].isEmpty()) { throw new RuntimeException("Invalid alias name '" + name + "'"); } + if (parts[1].startsWith("/")) { + parts[1] = Catalog.JBANG_DEFAULT_CATALOG + parts[1]; + } a2 = fromCatalog(parts[1], parts[0]); } if (a2 != null) { diff --git a/src/main/java/dev/jbang/catalog/Catalog.java b/src/main/java/dev/jbang/catalog/Catalog.java index c60b478a3..9d333e575 100644 --- a/src/main/java/dev/jbang/catalog/Catalog.java +++ b/src/main/java/dev/jbang/catalog/Catalog.java @@ -30,6 +30,7 @@ public class Catalog { public static final String JBANG_CATALOG_JSON = "jbang-catalog.json"; public static final String JBANG_IMPLICIT_CATALOG_JSON = "implicit-catalog.json"; + public static final String JBANG_DEFAULT_CATALOG = "jbanghub"; static final Map catalogCache = new HashMap<>(); diff --git a/src/main/java/dev/jbang/catalog/CatalogRef.java b/src/main/java/dev/jbang/catalog/CatalogRef.java index c8e70cc45..9bf724c06 100644 --- a/src/main/java/dev/jbang/catalog/CatalogRef.java +++ b/src/main/java/dev/jbang/catalog/CatalogRef.java @@ -52,9 +52,10 @@ static CatalogRef get(String catalogName) { if (catalog != null) { catalogRef = catalog.catalogs.get(catalogName); } - if (catalogRef == null && Util.isValidPath(catalogName)) { + if (catalogRef == null && (!catalogName.startsWith("/") || !catalogName.equals("")) + && Util.isValidPath(catalogName)) { Path p = Util.getCwd().resolve(catalogName); - if (!p.getFileName().toString().equals(Catalog.JBANG_CATALOG_JSON)) { + if (p.getFileName() != null && !p.getFileName().toString().equals(Catalog.JBANG_CATALOG_JSON)) { p = p.resolve(Catalog.JBANG_CATALOG_JSON); } if (Files.isRegularFile(p)) { diff --git a/src/main/java/dev/jbang/catalog/ImplicitCatalogRef.java b/src/main/java/dev/jbang/catalog/ImplicitCatalogRef.java index b456f6bad..23a5ce751 100644 --- a/src/main/java/dev/jbang/catalog/ImplicitCatalogRef.java +++ b/src/main/java/dev/jbang/catalog/ImplicitCatalogRef.java @@ -41,6 +41,9 @@ public static ImplicitCatalogRef parse(String name) { if (Util.isURL(name)) { return null; } + if (name.startsWith("/")) { + name = Catalog.JBANG_DEFAULT_CATALOG + name; + } String[] parts = name.split("~", 2); String path; if (parts.length == 2) { diff --git a/src/test/java/dev/jbang/TestImplicitAlias.java b/src/test/java/dev/jbang/TestImplicitAlias.java index 8cbf4a308..3cf42bca0 100644 --- a/src/test/java/dev/jbang/TestImplicitAlias.java +++ b/src/test/java/dev/jbang/TestImplicitAlias.java @@ -1,14 +1,18 @@ package dev.jbang; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; import java.nio.file.Files; import java.nio.file.Path; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import dev.jbang.catalog.Alias; +import dev.jbang.catalog.Catalog; import dev.jbang.catalog.ImplicitCatalogRef; /** @@ -19,16 +23,36 @@ public class TestImplicitAlias extends BaseTest { @Test public void testGitImplicitCatalog() { assertThat(ImplicitCatalogRef.getImplicitCatalogUrl("jbangdev").get(), - Matchers.equalTo("https://github.com/jbangdev/jbang-catalog/blob/HEAD/jbang-catalog.json")); + equalTo("https://github.com/jbangdev/jbang-catalog/blob/HEAD/jbang-catalog.json")); assertThat(ImplicitCatalogRef.getImplicitCatalogUrl("jbangdev/jbang-examples").get(), - Matchers.equalTo("https://github.com/jbangdev/jbang-examples/blob/HEAD/jbang-catalog.json")); + equalTo("https://github.com/jbangdev/jbang-examples/blob/HEAD/jbang-catalog.json")); + } + + @ParameterizedTest + @ValueSource(strings = { /* not sure this should be allowed "", */ "/", "/sqlline", "jbanghub/sqlline" }) + public void testGitImplicitCatalogHub(String catalog) { + String cref = ImplicitCatalogRef.getImplicitCatalogUrl(catalog).get(); + assertThat(cref, + startsWith("https://github.com/jbanghub/")); + + Catalog c = Catalog.getByName(catalog); + assertThat(c.catalogRef.getOriginalResource(), + startsWith("https://github.com/jbanghub/")); + } + + @ParameterizedTest + @ValueSource(strings = { "sqlline@", "sqlline@/", "sqlline@/sqlline", "sqlline@jbanghub/sqlline" }) + public void testImplicitHub(String alias) { + Alias a = Alias.get(alias); + assertThat(a.scriptRef, containsString("sqlline:sqlline")); + assertThat(a.catalog.baseRef, containsString("jbanghub")); } @Test public void testImplictURLAlias() { Alias url = Alias.get("tree@xam.dk"); - assertThat(url.scriptRef, Matchers.equalTo("tree/main.java")); + assertThat(url.scriptRef, equalTo("tree/main.java")); } @@ -36,7 +60,7 @@ public void testImplictURLAlias() { public void testImplictExplicitURLAlias() { Alias url = Alias.get("tree@https://xam.dk"); - assertThat(url.scriptRef, Matchers.equalTo("tree/main.java")); + assertThat(url.scriptRef, equalTo("tree/main.java")); } @@ -56,7 +80,7 @@ public void testFileURLAlias() throws Exception { Alias alias = Alias.get(url); - assertThat(alias.scriptRef, Matchers.equalTo("helloworld.java")); + assertThat(alias.scriptRef, equalTo("helloworld.java")); } }