From 28e6b044f981638b5936c730020af481790eb208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 8 Feb 2026 20:43:56 +0100 Subject: [PATCH 1/4] fix: `quarto use template` creates empty `_extensions` folder and fails to copy extensions Fixes #14008 --- src/command/use/commands/template.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/command/use/commands/template.ts b/src/command/use/commands/template.ts index 3bd1c40b6b8..9ee7ab185d6 100644 --- a/src/command/use/commands/template.ts +++ b/src/command/use/commands/template.ts @@ -157,7 +157,7 @@ async function useTemplate( // Copy the extensions into a substaging directory // this will ensure that they are namespaced properly const subStagedDir = tempContext.createDir(); - await copyExtensions(source, stagedDir, subStagedDir); + await copyExtensions(source, extDir, subStagedDir); // Now complete installation from this sub-staged directory await completeInstallation(subStagedDir, outputDirectory); From d4a61902b11bf86d289f40a235851a800c91df87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 8 Feb 2026 20:44:06 +0100 Subject: [PATCH 2/4] test: Refactor template tests to iterate over extensions Update the template tests to dynamically handle multiple extensions. This change improves test coverage and ensures that both 'jasa' and 'acm' templates are validated correctly. --- tests/smoke/use/template.test.ts | 50 +++++++++++++++++--------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/tests/smoke/use/template.test.ts b/tests/smoke/use/template.test.ts index b1c17a47da8..9fe96efb9fe 100644 --- a/tests/smoke/use/template.test.ts +++ b/tests/smoke/use/template.test.ts @@ -1,35 +1,37 @@ import { testQuartoCmd } from "../../test.ts"; -import { directoryContainsOnlyAllowedPaths, fileExists, folderExists, noErrorsOrWarnings, printsMessage } from "../../verify.ts"; +import { directoryContainsOnlyAllowedPaths, fileExists, noErrorsOrWarnings, printsMessage } from "../../verify.ts"; import { join } from "../../../src/deno_ral/path.ts"; import { ensureDirSync } from "../../../src/deno_ral/fs.ts"; const tempDir = Deno.makeTempDirSync(); -const templateFolder = "article"; -const workingDir = join(tempDir, templateFolder); -const extensionsDir = join(workingDir, "_extensions"); -ensureDirSync(workingDir); -testQuartoCmd( - "use", - ["template", "quarto-journals/jasa", "--no-prompt"], - [noErrorsOrWarnings, fileExists(`${templateFolder}.qmd`), folderExists(extensionsDir)], - { - setup: () => { - return Promise.resolve(); - }, - cwd: () => { - return workingDir; - }, - teardown: () => { - try { - Deno.removeSync(workingDir, {recursive: true}); - } catch { +for (const ext of ["jasa", "acm"]) { + const templateFolder = `${ext}-article`; + const workingDir = join(tempDir, templateFolder); + const extensionYml = join(workingDir, "_extensions", "quarto-journals", ext, "_extension.yml"); + ensureDirSync(workingDir); + testQuartoCmd( + "use", + ["template", `quarto-journals/${ext}`, "--no-prompt"], + [noErrorsOrWarnings, fileExists(`${templateFolder}.qmd`), fileExists(extensionYml)], + { + setup: () => { + return Promise.resolve(); + }, + cwd: () => { + return workingDir; + }, + teardown: () => { + try { + Deno.removeSync(workingDir, {recursive: true}); + } catch { + } + return Promise.resolve(); } - return Promise.resolve(); } - } -) + ) +} const nonEmptyTemplateFolder = "notempty"; const nonEmptyFileName = `${nonEmptyTemplateFolder}.qmd`; @@ -52,7 +54,7 @@ testQuartoCmd( try { Deno.removeSync(nonEmptyWorkingDir, {recursive: true}); } catch { - + } return Promise.resolve(); } From 1fc4b3c2c0f44060fa39bcef4ad0f87a079f6b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 8 Feb 2026 20:46:53 +0100 Subject: [PATCH 3/4] chore: update changelog --- news/changelog-1.9.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/news/changelog-1.9.md b/news/changelog-1.9.md index 47942e71f19..b3ae7d05286 100644 --- a/news/changelog-1.9.md +++ b/news/changelog-1.9.md @@ -117,6 +117,10 @@ All changes included in 1.9: ## Commands +### `use template` + +- ([#14008](https://github.com/quarto-dev/quarto-cli/issues/14008)): Fix `quarto use template` failing to install extensions from GitHub organisation repositories (e.g., `quarto-journals/acm`). (author: @mcanouil) + ### `use brand` - ([#13828](https://github.com/quarto-dev/quarto-cli/pull/13828)): New `quarto use brand` command copies and synchronizes the `_brand/` directory from a repo, directory, or ZIP file. See [the prerelease documentation](https://prerelease.quarto.org/docs/authoring/brand.html#quarto-use-brand) for details. From 5ff99762f81577f6d6b22315b11b82b1e15a4866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 8 Feb 2026 20:51:20 +0100 Subject: [PATCH 4/4] chore: update changelog entry --- news/changelog-1.9.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/news/changelog-1.9.md b/news/changelog-1.9.md index b3ae7d05286..f94252311ed 100644 --- a/news/changelog-1.9.md +++ b/news/changelog-1.9.md @@ -119,7 +119,7 @@ All changes included in 1.9: ### `use template` -- ([#14008](https://github.com/quarto-dev/quarto-cli/issues/14008)): Fix `quarto use template` failing to install extensions from GitHub organisation repositories (e.g., `quarto-journals/acm`). (author: @mcanouil) +- ([#14008](https://github.com/quarto-dev/quarto-cli/issues/14008)): Fix `quarto use template` failing to install extensions from GitHub organisation repositories when the extension was scoped with the organisation (e.g., `quarto-journals/acm`). (author: @mcanouil) ### `use brand`