Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions news/changelog-1.9.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,20 @@ All changes included in 1.9:
- ([#13633](https://github.com/quarto-dev/quarto-cli/issues/13633)): Fix detection and auto-installation of babel language packages from newer error format that doesn't explicitly mention `.ldf` filename.
- ([#13694](https://github.com/quarto-dev/quarto-cli/issues/13694)): Fix `notebook-view.url` being ignored - external notebook links now properly use specified URLs instead of local preview files.
- ([#13732](https://github.com/quarto-dev/quarto-cli/issues/13732)): Fix automatic font package installation for fonts with spaces in their names (e.g., "Noto Emoji", "DejaVu Sans"). Font file search patterns now match both with and without spaces.
- ([#13798](https://github.com/quarto-dev/quarto-cli/pull/13798)): Directories specified in `ExecutionEngineDiscovery.ignoreDirs` were not getting ignored.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gordonwoodhull I don't think this is the right place for this.

Regression fixes in 1.9 changelog are the bug fix we do in 1.9 AND also in 1.8 to fix a regression that we introduced in 1.8 compared to 1.9.

For regression between a 1.9 pre-release, and another, we don't add changelog. It is in a way expected that a 1.9 pre-release could brok. So this PR is part of the "New engine extensions" item you added a bit lower.

Hope it makes sense.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @cderv, I was wondering as I did this. Felt weird not to log what the prerelease 1.9.14 will be about!

But I guess it's probably not helpful except for the very few people for whom 1.9.13 is breaking - and we haven't heard from any yet.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But I guess it's probably not helpful except for the very few people for whom 1.9.13 is breaking - and we haven't heard from any yet.

yes exactly. We don't have a good process for that.

I guess the right place would to mark this inside the 1.9.14 release note. Currently we only link users to the commit logs if you look at it: https://github.com/quarto-dev/quarto-cli/releases/tag/v1.9.13

We could find a new workflow logic to maybe add to this github release note some more information about what is noticeable in each pre-release. But this is a bit more work for us.

Unless we find an "automated way" by having specific keyword in commit, and looking for them to extract message for release not when we do create the github release 🤷‍♂️

Anyhow, our current logic is that there is no release note of specific changes for a specific prerelease (unless looking at commit themselves), and we advice all users to either use stable or very latest pre-release as it could be "normal" that a pre-release has breakage.
For no breakage => use stable. That is our logic I would say.

happy to evolve all this - to be discussed!


## Dependencies

- Update `esbuild` to 0.25.10
- Update `deno` to 2.4.5
- ([#13601](https://github.com/quarto-dev/quarto-cli/pull/13601)): Update `mermaid` to 11.12.0 (author: @multimeric)

## Extensions

- Metadata and brand extensions now work without a `_quarto.yml` project. (Engine extensions do too.) A temporary default project is created in memory.

- New **Engine Extensions**, to allow other execution engines than knitr, jupyter, julia. Julia is now a bundled extension. See [the prerelease notes](https://prerelease.quarto.org/docs/prerelease/1.9/) and [engine extension documentation](https://prerelease.quarto.org/docs/extensions/engine.html).

## Formats

### `gfm`
Expand Down
4 changes: 4 additions & 0 deletions src/project/project-context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import {
fileExecutionEngine,
fileExecutionEngineAndTarget,
projectIgnoreGlobs,
resolveEngines,
} from "../execute/engine.ts";
import { ExecutionEngineInstance, kMarkdownEngine } from "../execute/types.ts";

Expand Down Expand Up @@ -884,6 +885,9 @@ async function projectInputFilesInternal(
project: ProjectContext,
metadata?: ProjectConfig,
): Promise<{ files: string[]; engines: string[] }> {
// Resolve engines so engineIgnoreDirs() uses all engines (including external)
await resolveEngines(project);

const { dir } = project;

const outputDir = metadata?.project[kProjectOutputDir];
Expand Down
2 changes: 2 additions & 0 deletions tests/docs/books/book-404-detection/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/.quarto/
**/*.quarto_ipynb
27 changes: 27 additions & 0 deletions tests/docs/books/book-404-detection/404.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "404-page-content",
"metadata": {},
"source": [
"---\n",
"title: \"Page Not Found\"\n",
"---\n",
"\n",
"# 404 - Page Not Found\n",
"\n",
"Sorry, the page you're looking for doesn't exist."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
13 changes: 13 additions & 0 deletions tests/docs/books/book-404-detection/_quarto.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
project:
type: book

book:
title: "Test Book with 404"
author: "Test Author"
chapters:
- index.qmd
- chapter1.qmd

format:
html:
theme: default
3 changes: 3 additions & 0 deletions tests/docs/books/book-404-detection/chapter1.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Chapter 1

Content here.
3 changes: 3 additions & 0 deletions tests/docs/books/book-404-detection/index.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Welcome

This is the index page.
2 changes: 2 additions & 0 deletions tests/docs/books/book-404-rmd/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/.quarto/
**/*.quarto_ipynb
7 changes: 7 additions & 0 deletions tests/docs/books/book-404-rmd/404.rmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: "Page Not Found"
---

# 404 - Page Not Found

Sorry, the page you're looking for doesn't exist.
13 changes: 13 additions & 0 deletions tests/docs/books/book-404-rmd/_quarto.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
project:
type: book

book:
title: "Test Book with 404 RMD"
author: "Test Author"
chapters:
- index.qmd
- chapter1.qmd

format:
html:
theme: default
3 changes: 3 additions & 0 deletions tests/docs/books/book-404-rmd/chapter1.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Chapter 1

Content here.
3 changes: 3 additions & 0 deletions tests/docs/books/book-404-rmd/index.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Welcome

This is the index page.
3 changes: 3 additions & 0 deletions tests/docs/project/ignore-dirs/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/.quarto/
**/*.quarto_ipynb
*_files/
2 changes: 2 additions & 0 deletions tests/docs/project/ignore-dirs/_quarto.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
project:
type: default
5 changes: 5 additions & 0 deletions tests/docs/project/ignore-dirs/index.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "Test Project"
---

This file should be rendered.
5 changes: 5 additions & 0 deletions tests/docs/project/ignore-dirs/renv/test.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "Renv Test"
---

This file should NOT be rendered (renv is a Knitr ignore directory).
5 changes: 5 additions & 0 deletions tests/docs/project/ignore-dirs/venv/test.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "Venv Test"
---

This file should NOT be rendered (venv is a Jupyter ignore directory).
4 changes: 4 additions & 0 deletions tests/docs/websites/website-ignore-dirs/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/.quarto/
**/*.quarto_ipynb
*_files/
_site/
13 changes: 13 additions & 0 deletions tests/docs/websites/website-ignore-dirs/_quarto.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
project:
type: website

website:
title: "Test Website"
navbar:
left:
- text: Home
file: index.qmd

format:
html:
theme: default
5 changes: 5 additions & 0 deletions tests/docs/websites/website-ignore-dirs/index.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "Test Website"
---

This file should be rendered.
5 changes: 5 additions & 0 deletions tests/docs/websites/website-ignore-dirs/renv/test.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "Renv Test"
---

This file should NOT be rendered (renv is a Knitr ignore directory).
5 changes: 5 additions & 0 deletions tests/docs/websites/website-ignore-dirs/venv/test.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "Venv Test"
---

This file should NOT be rendered (venv is a Jupyter ignore directory).
4 changes: 4 additions & 0 deletions tests/docs/websites/website-sidebar-section-index/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/.quarto/
**/*.quarto_ipynb
*_files/
_site/
14 changes: 14 additions & 0 deletions tests/docs/websites/website-sidebar-section-index/_quarto.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
project:
type: website

website:
title: "Sidebar Auto Test"
sidebar:
contents:
- index.qmd
- section: "Subdir Section"
contents: subdir/*

format:
html:
theme: default
5 changes: 5 additions & 0 deletions tests/docs/websites/website-sidebar-section-index/index.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "Home"
---

This is the home page.
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"cells": [
{
"cell_type": "raw",
"metadata": {},
"source": [
"---\n",
"title: \"Subdir Index\"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is the index page for the subdir."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "Other Page"
---

This is another page in the subdir.
51 changes: 51 additions & 0 deletions tests/smoke/book/book-404-detection.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { testQuartoCmd } from "../../test.ts";
import { fileExists, noErrorsOrWarnings } from "../../verify.ts";
import { existsSync } from "../../../src/deno_ral/fs.ts";
import { join } from "../../../src/deno_ral/path.ts";
import { docs } from "../../utils.ts";

// Test that book 404 page with .ipynb extension is detected
const inputIpynb = docs("books/book-404-detection");
const outputDirIpynb = join(inputIpynb, "_book");

testQuartoCmd(
"render",
[inputIpynb],
[
noErrorsOrWarnings,
fileExists(join(outputDirIpynb, "index.html")),
fileExists(join(outputDirIpynb, "chapter1.html")),
fileExists(join(outputDirIpynb, "404.html")),
fileExists(join(outputDirIpynb, "search.json")),
],
{
teardown: async () => {
if (existsSync(outputDirIpynb)) {
await Deno.remove(outputDirIpynb, { recursive: true });
}
},
},
);

// Test that book 404 page with .rmd extension is detected
const inputRmd = docs("books/book-404-rmd");
const outputDirRmd = join(inputRmd, "_book");

testQuartoCmd(
"render",
[inputRmd],
[
noErrorsOrWarnings,
fileExists(join(outputDirRmd, "index.html")),
fileExists(join(outputDirRmd, "chapter1.html")),
fileExists(join(outputDirRmd, "404.html")),
fileExists(join(outputDirRmd, "search.json")),
],
{
teardown: async () => {
if (existsSync(outputDirRmd)) {
await Deno.remove(outputDirRmd, { recursive: true });
}
},
},
);
46 changes: 46 additions & 0 deletions tests/smoke/project/project-ignore-dirs.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* project-ignore-dirs.test.ts
*
* Verifies that engine-specific ignore directories (venv, renv, env, packrat, etc.)
* are properly excluded from project file discovery and rendering.
*
* Copyright (C) 2020-2025 Posit Software, PBC
*/

import { docs } from "../../utils.ts";
import { join } from "../../../src/deno_ral/path.ts";
import { existsSync } from "../../../src/deno_ral/fs.ts";
import { testQuartoCmd } from "../../test.ts";
import { fileExists, noErrors, pathDoNotExists } from "../../verify.ts";

const renderDir = docs("project/ignore-dirs");
const outDir = join(Deno.cwd(), renderDir);

// Test that engine ignore directories are properly excluded
testQuartoCmd(
"render",
[renderDir],
[
noErrors,
fileExists(join(outDir, "index.html")), // Control: regular file should be rendered
pathDoNotExists(join(outDir, "venv", "test.html")), // venv (Jupyter) should be ignored
pathDoNotExists(join(outDir, "renv", "test.html")), // renv (Knitr) should be ignored
pathDoNotExists(join(outDir, "env", "test.html")), // env (Jupyter) should be ignored
],
{
teardown: async () => {
// Clean up rendered HTML files
const htmlFiles = [
join(outDir, "index.html"),
join(outDir, "venv", "test.html"),
join(outDir, "renv", "test.html"),
join(outDir, "env", "test.html"),
];
for (const file of htmlFiles) {
if (existsSync(file)) {
await Deno.remove(file);
}
}
},
},
);
37 changes: 37 additions & 0 deletions tests/smoke/website/website-ignore-dirs.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* website-ignore-dirs.test.ts
*
* Verifies that engine-specific ignore directories (venv, renv, env, packrat, etc.)
* are properly excluded from website file discovery and rendering.
*
* Copyright (C) 2020-2025 Posit Software, PBC
*/

import { docs } from "../../utils.ts";
import { join } from "../../../src/deno_ral/path.ts";
import { existsSync } from "../../../src/deno_ral/fs.ts";
import { testQuartoCmd } from "../../test.ts";
import { fileExists, noErrors, pathDoNotExists } from "../../verify.ts";

const renderDir = docs("websites/website-ignore-dirs");
const outDir = join(Deno.cwd(), renderDir, "_site");

// Test that engine ignore directories are properly excluded
testQuartoCmd(
"render",
[renderDir],
[
noErrors,
fileExists(join(outDir, "index.html")), // Control: regular file should be rendered
pathDoNotExists(join(outDir, "venv", "test.html")), // venv (Jupyter) should be ignored
pathDoNotExists(join(outDir, "renv", "test.html")), // renv (Knitr) should be ignored
pathDoNotExists(join(outDir, "env", "test.html")), // env (Jupyter) should be ignored
],
{
teardown: async () => {
if (existsSync(outDir)) {
await Deno.remove(outDir, { recursive: true });
}
},
},
);
Loading
Loading