From 377ec93592a77f5dcdda39e89c6c245a70065b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 15 Jun 2025 19:59:17 +0200 Subject: [PATCH 01/11] feat: add custom tinytex feature for arm64 --- .github/.devcontainer/devcontainer.json | 5 +- .../quarto-computing-dependencies/install.sh | 2 + .../tinytex/devcontainer-feature.json | 10 +++ .github/.devcontainer/tinytex/install.sh | 68 +++++++++++++++++++ .../uv/devcontainer-feature.json | 1 + .github/.devcontainer/uv/install.sh | 3 + 6 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 .github/.devcontainer/tinytex/devcontainer-feature.json create mode 100644 .github/.devcontainer/tinytex/install.sh diff --git a/.github/.devcontainer/devcontainer.json b/.github/.devcontainer/devcontainer.json index f0f05a5..53016f7 100644 --- a/.github/.devcontainer/devcontainer.json +++ b/.github/.devcontainer/devcontainer.json @@ -40,10 +40,9 @@ "version": "latest" }, "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "${localEnv:QUARTO_VERSION}", - "installTinyTex": "true", - "installChromium": "false" + "version": "${localEnv:QUARTO_VERSION}" }, + "./tinytex": {}, "ghcr.io/devcontainers/features/github-cli:1": {} } } diff --git a/.github/.devcontainer/quarto-computing-dependencies/install.sh b/.github/.devcontainer/quarto-computing-dependencies/install.sh index 89c7a31..86055c1 100755 --- a/.github/.devcontainer/quarto-computing-dependencies/install.sh +++ b/.github/.devcontainer/quarto-computing-dependencies/install.sh @@ -55,3 +55,5 @@ quarto_python_deps ${PYTHON_DEPS} quarto_julia_deps ${JULIA_DEPS} apt-get clean && rm -rf /var/lib/apt/lists/* + +echo "Done!" diff --git a/.github/.devcontainer/tinytex/devcontainer-feature.json b/.github/.devcontainer/tinytex/devcontainer-feature.json new file mode 100644 index 0000000..46b5729 --- /dev/null +++ b/.github/.devcontainer/tinytex/devcontainer-feature.json @@ -0,0 +1,10 @@ +{ + "id": "tinytex", + "version": "1.0.0", + "name": "TinyTeX", + "description": "Install TinyTeX, a lightweight LaTeX distribution.", + "installsAfter": [ + "ghcr.io/devcontainers/features/common-utils", + "ghcr.io/rocker-org/devcontainer-features/quarto-cli" + ] +} diff --git a/.github/.devcontainer/tinytex/install.sh b/.github/.devcontainer/tinytex/install.sh new file mode 100644 index 0000000..85e481c --- /dev/null +++ b/.github/.devcontainer/tinytex/install.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +set -e + +export DEBIAN_FRONTEND=noninteractive + +USERNAME=${USERNAME:-${_REMOTE_USER:-"automatic"}} + +if [ "$(id -u)" -ne 0 ]; then + echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' + exit 1 +fi + +architecture="$(dpkg --print-architecture)" +if [ "${architecture}" != "amd64" ] && [ "${architecture}" != "arm64" ]; then + echo "(!) Architecture ${architecture} unsupported" + exit 2 +fi + +# Determine the appropriate non-root user +if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then + USERNAME="" + POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)") + for CURRENT_USER in "${POSSIBLE_USERS[@]}"; do + if id -u "${CURRENT_USER}" >/dev/null 2>&1; then + USERNAME=${CURRENT_USER} + break + fi + done + if [ "${USERNAME}" = "" ]; then + USERNAME=root + fi +elif [ "${USERNAME}" = "none" ] || ! id -u "${USERNAME}" >/dev/null 2>&1; then + USERNAME=root +fi + +apt_get_update() { + if [ "$(find /var/lib/apt/lists/* | wc -l)" = "0" ]; then + echo "Running apt-get update..." + apt-get update -y + fi +} + +# Checks if packages are installed and installs them if not +check_packages() { + if ! dpkg -s "$@" >/dev/null 2>&1; then + apt_get_update + apt-get -y install --no-install-recommends "$@" + fi +} + +echo "Installing TinyTeX..." +check_packages libfontconfig + +if [ "${architecture}" == "amd64" ]; then + su "${USERNAME}" -c 'quarto install tinytex --quiet' +fi + +if [ "${architecture}" == "arm64" ]; then + check_packages curl ca-certificates + su "${USERNAME}" -c 'curl -sL "https://yihui.org/tinytex/install-bin-unix.sh" | sh' +fi + +echo "TinyTeX installation complete." + +apt-get clean && rm -rf /var/lib/apt/lists/* + +echo "Done!" diff --git a/.github/.devcontainer/uv/devcontainer-feature.json b/.github/.devcontainer/uv/devcontainer-feature.json index 8e1c05b..690cad9 100644 --- a/.github/.devcontainer/uv/devcontainer-feature.json +++ b/.github/.devcontainer/uv/devcontainer-feature.json @@ -12,6 +12,7 @@ } }, "installsAfter": [ + "ghcr.io/devcontainers/features/common-utils", "./quarto-computing-dependencies" ] } diff --git a/.github/.devcontainer/uv/install.sh b/.github/.devcontainer/uv/install.sh index 2a06ddb..5f969a9 100644 --- a/.github/.devcontainer/uv/install.sh +++ b/.github/.devcontainer/uv/install.sh @@ -58,4 +58,7 @@ enable_autocompletion() { install_uv ${VERSION} enable_autocompletion + apt-get clean && rm -rf /var/lib/apt/lists/* + +echo "Done!" From 3d92c57c771dd33d37a6cbc49dd183ebc6e364dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 15 Jun 2025 20:05:48 +0200 Subject: [PATCH 02/11] chore: build tinytex from source for both arch --- .github/.devcontainer/tinytex/install.sh | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/.devcontainer/tinytex/install.sh b/.github/.devcontainer/tinytex/install.sh index 85e481c..98527af 100644 --- a/.github/.devcontainer/tinytex/install.sh +++ b/.github/.devcontainer/tinytex/install.sh @@ -51,16 +51,9 @@ check_packages() { echo "Installing TinyTeX..." check_packages libfontconfig - -if [ "${architecture}" == "amd64" ]; then - su "${USERNAME}" -c 'quarto install tinytex --quiet' -fi - -if [ "${architecture}" == "arm64" ]; then - check_packages curl ca-certificates - su "${USERNAME}" -c 'curl -sL "https://yihui.org/tinytex/install-bin-unix.sh" | sh' -fi - +# su "${USERNAME}" -c 'quarto install tinytex --quiet' +check_packages curl ca-certificates +su "${USERNAME}" -c 'curl -sL "https://yihui.org/tinytex/install-bin-unix.sh" | sh' echo "TinyTeX installation complete." apt-get clean && rm -rf /var/lib/apt/lists/* From cf76e91ebdc0e1fd2ba6ab02fa135fbbb54cb019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 15 Jun 2025 20:06:40 +0200 Subject: [PATCH 03/11] feat: add arch check --- .../.devcontainer/quarto-computing-dependencies/install.sh | 6 ++++++ .github/.devcontainer/uv/install.sh | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.github/.devcontainer/quarto-computing-dependencies/install.sh b/.github/.devcontainer/quarto-computing-dependencies/install.sh index 86055c1..357cb53 100755 --- a/.github/.devcontainer/quarto-computing-dependencies/install.sh +++ b/.github/.devcontainer/quarto-computing-dependencies/install.sh @@ -15,6 +15,12 @@ if [ "$(id -u)" -ne 0 ]; then exit 1 fi +architecture="$(dpkg --print-architecture)" +if [ "${architecture}" != "amd64" ] && [ "${architecture}" != "arm64" ]; then + echo "(!) Architecture ${architecture} unsupported" + exit 2 +fi + # Determine the appropriate non-root user if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then USERNAME="" diff --git a/.github/.devcontainer/uv/install.sh b/.github/.devcontainer/uv/install.sh index 5f969a9..4ecb1cd 100644 --- a/.github/.devcontainer/uv/install.sh +++ b/.github/.devcontainer/uv/install.sh @@ -13,6 +13,12 @@ if [ "$(id -u)" -ne 0 ]; then exit 1 fi +architecture="$(dpkg --print-architecture)" +if [ "${architecture}" != "amd64" ] && [ "${architecture}" != "arm64" ]; then + echo "(!) Architecture ${architecture} unsupported" + exit 2 +fi + # Determine the appropriate non-root user if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then USERNAME="" From 254f7e8e13ce3daf03e0eeec4ccc1112e871c89b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 15 Jun 2025 20:10:52 +0200 Subject: [PATCH 04/11] style: reformat --- .devcontainer/devcontainer.json | 76 +++++----- .devcontainer/mcanouil-1.0/devcontainer.json | 80 +++++------ .devcontainer/mcanouil-1.1/devcontainer.json | 80 +++++------ .devcontainer/mcanouil-1.2/devcontainer.json | 80 +++++------ .devcontainer/mcanouil-1.3/devcontainer.json | 80 +++++------ .devcontainer/mcanouil-1.4/devcontainer.json | 80 +++++------ .devcontainer/mcanouil-1.5/devcontainer.json | 80 +++++------ .devcontainer/mcanouil-1.6/devcontainer.json | 80 +++++------ .devcontainer/mcanouil-1.7/devcontainer.json | 80 +++++------ .../mcanouil-latest/devcontainer.json | 80 +++++------ .devcontainer/universal/devcontainer.json | 130 +++++++++--------- .../devcontainer-feature.json | 50 +++---- .../universal/uv/devcontainer-feature.json | 4 +- .github/.devcontainer/devcontainer.json | 97 +++++++------ .../devcontainer-feature.json | 54 ++++---- .../tinytex/devcontainer-feature.json | 2 +- .../uv/devcontainer-feature.json | 2 +- 17 files changed, 542 insertions(+), 593 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d898034..c2e3d77 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,42 +1,38 @@ { - "name": "Public - Quarto Codespaces", - "image": "ghcr.io/mcanouil/quarto-codespaces:latest", - "remoteUser": "vscode", - "features": { - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "release", - "installTinyTex": "false", - "installChromium": "false" - } - }, - "customizations": { - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "name": "Public - Quarto Codespaces", + "image": "ghcr.io/mcanouil/quarto-codespaces:latest", + "remoteUser": "vscode", + "features": { + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "release", + "installTinyTex": "false", + "installChromium": "false" + } + }, + "customizations": { + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/mcanouil-1.0/devcontainer.json b/.devcontainer/mcanouil-1.0/devcontainer.json index 8b23392..78269f1 100644 --- a/.devcontainer/mcanouil-1.0/devcontainer.json +++ b/.devcontainer/mcanouil-1.0/devcontainer.json @@ -1,21 +1,19 @@ { - "name": "1.0 - Mickaël CANOUIL - Quarto Codespaces", - "image": "ghcr.io/mcanouil/quarto-codespaces:latest", - "remoteUser": "vscode", - "features": { - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "1.0", - "installTinyTex": "false", - "installChromium": "false" - } - }, - "customizations": { - "codespaces": { + "name": "1.0 - Mickaël CANOUIL - Quarto Codespaces", + "image": "ghcr.io/mcanouil/quarto-codespaces:latest", + "remoteUser": "vscode", + "features": { + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "1.0" + } + }, + "customizations": { + "codespaces": { "repositories": { "mcanouil/quarto-codespaces": { "permissions": { "contents": "write", - "pull_requests": "write" + "pull_requests": "write" } }, "mcanouil/quarto-issues-experiments": { @@ -23,40 +21,36 @@ "contents": "write" } }, - "mcanouil/*": { + "mcanouil/*": { "permissions": { "contents": "read" } } } }, - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/mcanouil-1.1/devcontainer.json b/.devcontainer/mcanouil-1.1/devcontainer.json index 16f6892..d6d3d42 100644 --- a/.devcontainer/mcanouil-1.1/devcontainer.json +++ b/.devcontainer/mcanouil-1.1/devcontainer.json @@ -1,21 +1,19 @@ { - "name": "1.1 - Mickaël CANOUIL - Quarto Codespaces", - "image": "ghcr.io/mcanouil/quarto-codespaces:latest", - "remoteUser": "vscode", - "features": { - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "1.1", - "installTinyTex": "false", - "installChromium": "false" - } - }, - "customizations": { - "codespaces": { + "name": "1.1 - Mickaël CANOUIL - Quarto Codespaces", + "image": "ghcr.io/mcanouil/quarto-codespaces:latest", + "remoteUser": "vscode", + "features": { + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "1.1" + } + }, + "customizations": { + "codespaces": { "repositories": { "mcanouil/quarto-codespaces": { "permissions": { "contents": "write", - "pull_requests": "write" + "pull_requests": "write" } }, "mcanouil/quarto-issues-experiments": { @@ -23,40 +21,36 @@ "contents": "write" } }, - "mcanouil/*": { + "mcanouil/*": { "permissions": { "contents": "read" } } } }, - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/mcanouil-1.2/devcontainer.json b/.devcontainer/mcanouil-1.2/devcontainer.json index 1ec9166..788e242 100644 --- a/.devcontainer/mcanouil-1.2/devcontainer.json +++ b/.devcontainer/mcanouil-1.2/devcontainer.json @@ -1,21 +1,19 @@ { - "name": "1.2 - Mickaël CANOUIL - Quarto Codespaces", - "image": "ghcr.io/mcanouil/quarto-codespaces:latest", - "remoteUser": "vscode", - "features": { - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "1.2", - "installTinyTex": "false", - "installChromium": "false" - } - }, - "customizations": { - "codespaces": { + "name": "1.2 - Mickaël CANOUIL - Quarto Codespaces", + "image": "ghcr.io/mcanouil/quarto-codespaces:latest", + "remoteUser": "vscode", + "features": { + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "1.2" + } + }, + "customizations": { + "codespaces": { "repositories": { "mcanouil/quarto-codespaces": { "permissions": { "contents": "write", - "pull_requests": "write" + "pull_requests": "write" } }, "mcanouil/quarto-issues-experiments": { @@ -23,40 +21,36 @@ "contents": "write" } }, - "mcanouil/*": { + "mcanouil/*": { "permissions": { "contents": "read" } } } }, - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/mcanouil-1.3/devcontainer.json b/.devcontainer/mcanouil-1.3/devcontainer.json index 8ca743e..8c72dab 100644 --- a/.devcontainer/mcanouil-1.3/devcontainer.json +++ b/.devcontainer/mcanouil-1.3/devcontainer.json @@ -1,21 +1,19 @@ { - "name": "1.3 - Mickaël CANOUIL - Quarto Codespaces", - "image": "ghcr.io/mcanouil/quarto-codespaces:latest", - "remoteUser": "vscode", - "features": { - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "1.3", - "installTinyTex": "false", - "installChromium": "false" - } - }, - "customizations": { - "codespaces": { + "name": "1.3 - Mickaël CANOUIL - Quarto Codespaces", + "image": "ghcr.io/mcanouil/quarto-codespaces:latest", + "remoteUser": "vscode", + "features": { + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "1.3" + } + }, + "customizations": { + "codespaces": { "repositories": { "mcanouil/quarto-codespaces": { "permissions": { "contents": "write", - "pull_requests": "write" + "pull_requests": "write" } }, "mcanouil/quarto-issues-experiments": { @@ -23,40 +21,36 @@ "contents": "write" } }, - "mcanouil/*": { + "mcanouil/*": { "permissions": { "contents": "read" } } } }, - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/mcanouil-1.4/devcontainer.json b/.devcontainer/mcanouil-1.4/devcontainer.json index 156d7a8..1fb6240 100644 --- a/.devcontainer/mcanouil-1.4/devcontainer.json +++ b/.devcontainer/mcanouil-1.4/devcontainer.json @@ -1,21 +1,19 @@ { - "name": "1.4 - Mickaël CANOUIL - Quarto Codespaces", - "image": "ghcr.io/mcanouil/quarto-codespaces:latest", - "remoteUser": "vscode", - "features": { - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "1.4", - "installTinyTex": "false", - "installChromium": "false" - } - }, - "customizations": { - "codespaces": { + "name": "1.4 - Mickaël CANOUIL - Quarto Codespaces", + "image": "ghcr.io/mcanouil/quarto-codespaces:latest", + "remoteUser": "vscode", + "features": { + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "1.4" + } + }, + "customizations": { + "codespaces": { "repositories": { "mcanouil/quarto-codespaces": { "permissions": { "contents": "write", - "pull_requests": "write" + "pull_requests": "write" } }, "mcanouil/quarto-issues-experiments": { @@ -23,40 +21,36 @@ "contents": "write" } }, - "mcanouil/*": { + "mcanouil/*": { "permissions": { "contents": "read" } } } }, - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/mcanouil-1.5/devcontainer.json b/.devcontainer/mcanouil-1.5/devcontainer.json index 2784308..2476343 100644 --- a/.devcontainer/mcanouil-1.5/devcontainer.json +++ b/.devcontainer/mcanouil-1.5/devcontainer.json @@ -1,21 +1,19 @@ { - "name": "1.5 - Mickaël CANOUIL - Quarto Codespaces", - "image": "ghcr.io/mcanouil/quarto-codespaces:latest", - "remoteUser": "vscode", - "features": { - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "1.5", - "installTinyTex": "false", - "installChromium": "false" - } - }, - "customizations": { - "codespaces": { + "name": "1.5 - Mickaël CANOUIL - Quarto Codespaces", + "image": "ghcr.io/mcanouil/quarto-codespaces:latest", + "remoteUser": "vscode", + "features": { + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "1.5" + } + }, + "customizations": { + "codespaces": { "repositories": { "mcanouil/quarto-codespaces": { "permissions": { "contents": "write", - "pull_requests": "write" + "pull_requests": "write" } }, "mcanouil/quarto-issues-experiments": { @@ -23,40 +21,36 @@ "contents": "write" } }, - "mcanouil/*": { + "mcanouil/*": { "permissions": { "contents": "read" } } } }, - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/mcanouil-1.6/devcontainer.json b/.devcontainer/mcanouil-1.6/devcontainer.json index f0d4b7a..9b9646f 100644 --- a/.devcontainer/mcanouil-1.6/devcontainer.json +++ b/.devcontainer/mcanouil-1.6/devcontainer.json @@ -1,21 +1,19 @@ { - "name": "1.6 - Mickaël CANOUIL - Quarto Codespaces", - "image": "ghcr.io/mcanouil/quarto-codespaces:latest", - "remoteUser": "vscode", - "features": { - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "1.6", - "installTinyTex": "false", - "installChromium": "false" - } - }, - "customizations": { - "codespaces": { + "name": "1.6 - Mickaël CANOUIL - Quarto Codespaces", + "image": "ghcr.io/mcanouil/quarto-codespaces:latest", + "remoteUser": "vscode", + "features": { + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "1.6" + } + }, + "customizations": { + "codespaces": { "repositories": { "mcanouil/quarto-codespaces": { "permissions": { "contents": "write", - "pull_requests": "write" + "pull_requests": "write" } }, "mcanouil/quarto-issues-experiments": { @@ -23,40 +21,36 @@ "contents": "write" } }, - "mcanouil/*": { + "mcanouil/*": { "permissions": { "contents": "read" } } } }, - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/mcanouil-1.7/devcontainer.json b/.devcontainer/mcanouil-1.7/devcontainer.json index c382ac0..242821a 100644 --- a/.devcontainer/mcanouil-1.7/devcontainer.json +++ b/.devcontainer/mcanouil-1.7/devcontainer.json @@ -1,21 +1,19 @@ { - "name": "1.7 - Mickaël CANOUIL - Quarto Codespaces", - "image": "ghcr.io/mcanouil/quarto-codespaces:latest", - "remoteUser": "vscode", - "features": { - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "1.7", - "installTinyTex": "false", - "installChromium": "false" - } - }, - "customizations": { - "codespaces": { + "name": "1.7 - Mickaël CANOUIL - Quarto Codespaces", + "image": "ghcr.io/mcanouil/quarto-codespaces:latest", + "remoteUser": "vscode", + "features": { + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "1.7" + } + }, + "customizations": { + "codespaces": { "repositories": { "mcanouil/quarto-codespaces": { "permissions": { "contents": "write", - "pull_requests": "write" + "pull_requests": "write" } }, "mcanouil/quarto-issues-experiments": { @@ -23,40 +21,36 @@ "contents": "write" } }, - "mcanouil/*": { + "mcanouil/*": { "permissions": { "contents": "read" } } } }, - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/mcanouil-latest/devcontainer.json b/.devcontainer/mcanouil-latest/devcontainer.json index 8ca3f79..26f713a 100644 --- a/.devcontainer/mcanouil-latest/devcontainer.json +++ b/.devcontainer/mcanouil-latest/devcontainer.json @@ -1,21 +1,19 @@ { - "name": "Latest - Mickaël CANOUIL - Quarto Codespaces", - "image": "ghcr.io/mcanouil/quarto-codespaces:latest", - "remoteUser": "vscode", - "features": { - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "prerelease", - "installTinyTex": "false", - "installChromium": "false" - } - }, - "customizations": { - "codespaces": { + "name": "Latest - Mickaël CANOUIL - Quarto Codespaces", + "image": "ghcr.io/mcanouil/quarto-codespaces:latest", + "remoteUser": "vscode", + "features": { + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "prerelease" + } + }, + "customizations": { + "codespaces": { "repositories": { "mcanouil/quarto-codespaces": { "permissions": { "contents": "write", - "pull_requests": "write" + "pull_requests": "write" } }, "mcanouil/quarto-issues-experiments": { @@ -23,40 +21,36 @@ "contents": "write" } }, - "mcanouil/*": { + "mcanouil/*": { "permissions": { "contents": "read" } } } }, - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/universal/devcontainer.json b/.devcontainer/universal/devcontainer.json index b14a257..e739d43 100644 --- a/.devcontainer/universal/devcontainer.json +++ b/.devcontainer/universal/devcontainer.json @@ -1,66 +1,68 @@ { - "name": "Universal - Quarto Codespaces", - "build": { - "dockerfile": "Dockerfile", - "context": ".", - "args": { - "IMAGE": "mcr.microsoft.com/devcontainers/universal:latest" - }, - "options": [ - "--label", "org.opencontainers.image.title=Quarto Codespaces", - "--label", "org.opencontainers.image.description=Quarto Codespaces / Dev Containers setup for quick online testing.", - "--label", "org.opencontainers.image.authors=Mickaël CANOUIL ", - "--label", "org.opencontainers.image.url=https://github.com/mcanouil/quarto-codespaces", - "--label", "org.opencontainers.image.source=https://github.com/mcanouil/quarto-codespaces", - // "--label", "org.opencontainers.image.ref.name=", - // "--label", "org.opencontainers.image.version=", - "--label", "org.opencontainers.image.licenses=MIT" - ] - }, - "remoteUser": "codespace", - "features": { - "./quarto-computing-dependencies": { - "rDeps": "rmarkdown,languageserver,nx10/httpgd@v2.0.3,prompt,lintr", - "pythonDeps": "jupyter,papermill", - "juliaDeps": "IJulia" - }, - "./uv": { - "version": "latest" - }, - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "release", - "installTinyTex": "true", - "installChromium": "false" - } - }, - "customizations": { - "vscode": { - "extensions": [ - "quarto.quarto", - "mcanouil.quarto-wizard", - "REditorSupport.r", - "ms-python.python", - "julialang.language-julia", - "ms-python.black-formatter", - "ms-python.flake8", - "ms-python.vscode-pylance", - "ms-python.pylint", - "ms-python.isort", - "ms-toolsai.jupyter", - "Posit.air-vscode" - ], - "settings": { - "r.rterm.option": [ - "--no-save", - "--no-restore-data", - "--quiet" - ], - "r.useRenvLibPath": true, - "[r]": { - "editor.defaultFormatter": "Posit.air-vscode", - "editor.formatOnSave": true - } - } - } - } + "name": "Universal - Quarto Codespaces", + "build": { + "dockerfile": "Dockerfile", + "context": ".", + "args": { + "IMAGE": "mcr.microsoft.com/devcontainers/universal:latest" + }, + "options": [ + "--label", + "org.opencontainers.image.title=Quarto Codespaces", + "--label", + "org.opencontainers.image.description=Quarto Codespaces / Dev Containers setup for quick online testing.", + "--label", + "org.opencontainers.image.authors=Mickaël CANOUIL ", + "--label", + "org.opencontainers.image.url=https://github.com/mcanouil/quarto-codespaces", + "--label", + "org.opencontainers.image.source=https://github.com/mcanouil/quarto-codespaces", + // "--label", "org.opencontainers.image.ref.name=", + // "--label", "org.opencontainers.image.version=", + "--label", + "org.opencontainers.image.licenses=MIT" + ] + }, + "remoteUser": "codespace", + "features": { + "./quarto-computing-dependencies": { + "rDeps": "rmarkdown,languageserver,nx10/httpgd@v2.0.3,prompt,lintr", + "pythonDeps": "jupyter,papermill", + "juliaDeps": "IJulia" + }, + "./uv": { + "version": "latest" + }, + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "release", + "installTinyTex": "true", + "installChromium": "false" + } + }, + "customizations": { + "vscode": { + "extensions": [ + "quarto.quarto", + "mcanouil.quarto-wizard", + "REditorSupport.r", + "ms-python.python", + "julialang.language-julia", + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-python.isort", + "ms-toolsai.jupyter", + "Posit.air-vscode" + ], + "settings": { + "r.rterm.option": ["--no-save", "--no-restore-data", "--quiet"], + "r.useRenvLibPath": true, + "[r]": { + "editor.defaultFormatter": "Posit.air-vscode", + "editor.formatOnSave": true + } + } + } + } } diff --git a/.devcontainer/universal/quarto-computing-dependencies/devcontainer-feature.json b/.devcontainer/universal/quarto-computing-dependencies/devcontainer-feature.json index f2443ba..595fc69 100644 --- a/.devcontainer/universal/quarto-computing-dependencies/devcontainer-feature.json +++ b/.devcontainer/universal/quarto-computing-dependencies/devcontainer-feature.json @@ -9,36 +9,36 @@ "default": "rmarkdown", "description": "Specify what R dependencies to install." }, - "pythonDeps": { - "type": "string", - "default": "jupyter,papermill", - "description": "Specify what Python dependencies to install." - }, - "juliaDeps": { - "type": "string", - "default": "IJulia", - "description": "Specify what Julia dependencies to install." - } + "pythonDeps": { + "type": "string", + "default": "jupyter,papermill", + "description": "Specify what Python dependencies to install." + }, + "juliaDeps": { + "type": "string", + "default": "IJulia", + "description": "Specify what Julia dependencies to install." + } }, "dependsOn": { - "ghcr.io/rocker-org/devcontainer-features/r-rig:1": { - "version": "release", - "vscodeRSupport": "none", - "installDevTools": "false", - "installREnv": "true", - "installRMarkdown": "false" - }, - "ghcr.io/devcontainers/features/python:1": { - "version": "latest", - "enableShared": "true" - }, - "ghcr.io/julialang/devcontainer-features/julia:1": { - "channel": "release" - } + "ghcr.io/rocker-org/devcontainer-features/r-rig:1": { + "version": "release", + "vscodeRSupport": "none", + "installDevTools": "false", + "installREnv": "true", + "installRMarkdown": "false" + }, + "ghcr.io/devcontainers/features/python:1": { + "version": "latest", + "enableShared": "true" + }, + "ghcr.io/julialang/devcontainer-features/julia:1": { + "channel": "release" + } }, "installsAfter": [ "ghcr.io/rocker-org/devcontainer-features/r-rig", "ghcr.io/devcontainers/features/python", "ghcr.io/julialang/devcontainer-features/julia" - ] + ] } diff --git a/.devcontainer/universal/uv/devcontainer-feature.json b/.devcontainer/universal/uv/devcontainer-feature.json index 8e1c05b..fd8a204 100644 --- a/.devcontainer/universal/uv/devcontainer-feature.json +++ b/.devcontainer/universal/uv/devcontainer-feature.json @@ -11,7 +11,5 @@ "type": "string" } }, - "installsAfter": [ - "./quarto-computing-dependencies" - ] + "installsAfter": ["./quarto-computing-dependencies"] } diff --git a/.github/.devcontainer/devcontainer.json b/.github/.devcontainer/devcontainer.json index 53016f7..667b96d 100644 --- a/.github/.devcontainer/devcontainer.json +++ b/.github/.devcontainer/devcontainer.json @@ -1,48 +1,55 @@ { - "name": "Quarto", - "build": { - "dockerfile": "./Dockerfile", - "context": ".", - "args": { - "IMAGE": "${localEnv:IMAGE}" - // "IMAGE": "buildpack-deps:jammy-curl" - }, - "options": [ - "--label", "org.opencontainers.image.title=Quarto Codespaces", - "--label", "org.opencontainers.image.description=Quarto Codespaces / Dev Containers setup for quick online testing.", - "--label", "org.opencontainers.image.authors=Mickaël CANOUIL ", - "--label", "org.opencontainers.image.url=https://github.com/mcanouil/quarto-codespaces", - "--label", "org.opencontainers.image.source=https://github.com/mcanouil/quarto-codespaces", - // "--label", "org.opencontainers.image.ref.name=", - "--label", "org.opencontainers.image.version=${localEnv:QUARTO_VERSION}", - "--label", "org.opencontainers.image.licenses=MIT" - ] - }, - "remoteUser": "${localEnv:USER}", - "features": { + "name": "Quarto", + "build": { + "dockerfile": "./Dockerfile", + "context": ".", + "args": { + "IMAGE": "${localEnv:IMAGE}" + // "IMAGE": "buildpack-deps:jammy-curl" + }, + "options": [ + "--label", + "org.opencontainers.image.title=Quarto Codespaces", + "--label", + "org.opencontainers.image.description=Quarto Codespaces / Dev Containers setup for quick online testing.", + "--label", + "org.opencontainers.image.authors=Mickaël CANOUIL ", + "--label", + "org.opencontainers.image.url=https://github.com/mcanouil/quarto-codespaces", + "--label", + "org.opencontainers.image.source=https://github.com/mcanouil/quarto-codespaces", + // "--label", "org.opencontainers.image.ref.name=", + "--label", + "org.opencontainers.image.version=${localEnv:QUARTO_VERSION}", + "--label", + "org.opencontainers.image.licenses=MIT" + ] + }, + "remoteUser": "${localEnv:USER}", + "features": { "ghcr.io/devcontainers/features/common-utils:2": { - "installZsh": "true", - "username": "${localEnv:USER}", - // "userUid": "1000", - // "userGid": "1000", - "upgradePackages": "true" - }, - "ghcr.io/devcontainers/features/git:1": { - "version": "latest", - "ppa": "false" - }, - "./quarto-computing-dependencies": { - "rDeps": "rmarkdown,languageserver,nx10/httpgd@v2.0.3,prompt,lintr", - "pythonDeps": "jupyter,papermill", - "juliaDeps": "IJulia" - }, - "./uv": { - "version": "latest" - }, - "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { - "version": "${localEnv:QUARTO_VERSION}" - }, - "./tinytex": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} - } + "installZsh": "true", + "username": "${localEnv:USER}", + // "userUid": "1000", + // "userGid": "1000", + "upgradePackages": "true" + }, + "ghcr.io/devcontainers/features/git:1": { + "version": "latest", + "ppa": "false" + }, + "./quarto-computing-dependencies": { + "rDeps": "rmarkdown,languageserver,nx10/httpgd@v2.0.3,prompt,lintr", + "pythonDeps": "jupyter,papermill", + "juliaDeps": "IJulia" + }, + "./uv": { + "version": "latest" + }, + "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": { + "version": "${localEnv:QUARTO_VERSION}" + }, + "./tinytex": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} + } } diff --git a/.github/.devcontainer/quarto-computing-dependencies/devcontainer-feature.json b/.github/.devcontainer/quarto-computing-dependencies/devcontainer-feature.json index 02a500d..0c91add 100644 --- a/.github/.devcontainer/quarto-computing-dependencies/devcontainer-feature.json +++ b/.github/.devcontainer/quarto-computing-dependencies/devcontainer-feature.json @@ -9,38 +9,38 @@ "default": "rmarkdown", "description": "Specify what R dependencies to install." }, - "pythonDeps": { - "type": "string", - "default": "jupyter,papermill", - "description": "Specify what Python dependencies to install." - }, - "juliaDeps": { - "type": "string", - "default": "IJulia", - "description": "Specify what Julia dependencies to install." - } + "pythonDeps": { + "type": "string", + "default": "jupyter,papermill", + "description": "Specify what Python dependencies to install." + }, + "juliaDeps": { + "type": "string", + "default": "IJulia", + "description": "Specify what Julia dependencies to install." + } }, "dependsOn": { - "ghcr.io/rocker-org/devcontainer-features/r-rig:1": { - "version": "release", - "vscodeRSupport": "none", - "installDevTools": "false", - "installREnv": "true", - "installRMarkdown": "false" - }, - "ghcr.io/devcontainers/features/python:1": { - "version": "latest", - "enableShared": "true" - }, - "ghcr.io/julialang/devcontainer-features/julia:1": { - "channel": "release" - } + "ghcr.io/rocker-org/devcontainer-features/r-rig:1": { + "version": "release", + "vscodeRSupport": "none", + "installDevTools": "false", + "installREnv": "true", + "installRMarkdown": "false" + }, + "ghcr.io/devcontainers/features/python:1": { + "version": "latest", + "enableShared": "true" + }, + "ghcr.io/julialang/devcontainer-features/julia:1": { + "channel": "release" + } }, "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils", - "ghcr.io/devcontainers/features/git", + "ghcr.io/devcontainers/features/common-utils", + "ghcr.io/devcontainers/features/git", "ghcr.io/rocker-org/devcontainer-features/r-rig", "ghcr.io/devcontainers/features/python", "ghcr.io/julialang/devcontainer-features/julia" - ] + ] } diff --git a/.github/.devcontainer/tinytex/devcontainer-feature.json b/.github/.devcontainer/tinytex/devcontainer-feature.json index 46b5729..548956b 100644 --- a/.github/.devcontainer/tinytex/devcontainer-feature.json +++ b/.github/.devcontainer/tinytex/devcontainer-feature.json @@ -4,7 +4,7 @@ "name": "TinyTeX", "description": "Install TinyTeX, a lightweight LaTeX distribution.", "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils", + "ghcr.io/devcontainers/features/common-utils", "ghcr.io/rocker-org/devcontainer-features/quarto-cli" ] } diff --git a/.github/.devcontainer/uv/devcontainer-feature.json b/.github/.devcontainer/uv/devcontainer-feature.json index 690cad9..a252922 100644 --- a/.github/.devcontainer/uv/devcontainer-feature.json +++ b/.github/.devcontainer/uv/devcontainer-feature.json @@ -12,7 +12,7 @@ } }, "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils", + "ghcr.io/devcontainers/features/common-utils", "./quarto-computing-dependencies" ] } From 7696966ef908b542b043634e3e0c57d3126319ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 15 Jun 2025 20:15:15 +0200 Subject: [PATCH 05/11] ci: set platforms --- .github/workflows/devcontainer.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml index 9d39405..6643f25 100644 --- a/.github/workflows/devcontainer.yml +++ b/.github/workflows/devcontainer.yml @@ -64,8 +64,7 @@ jobs: noCache: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }} imageTag: ${{ matrix.IMAGE_TAG }} push: always - platform: linux/amd64 - # platform: linux/amd64,linux/arm64 + platform: linux/amd64,linux/arm64 env: IMAGE: ${{ matrix.IMAGE }} QUARTO_VERSION: ${{ matrix.QUARTO_VERSION }} @@ -78,6 +77,8 @@ jobs: name: Build - Quarto ${{ matrix.QUARTO_VERSION }} strategy: matrix: + PLATFORM: + - "linux/amd64,linux/arm64" QUARTO_VERSION: - "1.0" - "1.1" @@ -87,6 +88,13 @@ jobs: - "1.5" - "1.6" - "1.7" + include: + - QUARTO_VERSION: "1.0" + PLATFORM: "linux/amd64" + - QUARTO_VERSION: "1.1" + PLATFORM: "linux/amd64" + - QUARTO_VERSION: "1.2" + PLATFORM: "linux/amd64" steps: - uses: actions/checkout@v4 - name: Set up QEMU for multi-architecture builds @@ -108,7 +116,7 @@ jobs: noCache: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }} imageTag: ${{ matrix.QUARTO_VERSION }},${{ matrix.QUARTO_VERSION }}-jammy push: always - platform: linux/amd64 + platform: ${{ matrix.PLATFORM }} # platform: linux/amd64,linux/arm64 configFile: ${{ format('.devcontainer/mcanouil-{0}/devcontainer.json', matrix.QUARTO_VERSION) }} From 9e537c9f0271137b8cf48d595bfe795dfd86173e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Thu, 19 Jun 2025 11:24:17 +0200 Subject: [PATCH 06/11] feat: allow init-env to define dependences --- init-env.sh | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/init-env.sh b/init-env.sh index 0017c4e..aa7674d 100755 --- a/init-env.sh +++ b/init-env.sh @@ -12,39 +12,47 @@ show_help() { } initialise_r() { + local deps=$1 + deps=$(echo "${deps}" | sed 's/,/","/g') if [ "${FORCE}" = true ] || [ ! -f "renv.lock" ]; then if [ -f ".Rprofile" ] && grep -q 'source("renv/activate.R")' .Rprofile; then sed -i '' '/source("renv\/activate.R")/d' .Rprofile fi Rscript -e 'renv::init(bare = FALSE)' - Rscript -e 'renv::install(c("rmarkdown", "languageserver", "nx10/httpgd@v2.0.3", "prompt", "lintr", "cli"))' + Rscript -e "renv::install(c('${deps}'))" Rscript -e 'renv::snapshot(type = "all")' fi } initialise_python() { + local deps=$1 + deps=$(echo "${deps}" | sed 's/,/ /g') if [ "${FORCE}" = true ] || [ ! -f "requirements.txt" ]; then python3 -m venv .venv source .venv/bin/activate - python3 -m pip install jupyter papermill + python3 -m pip install ${deps} python3 -m pip freeze > requirements.txt fi } initialise_uv() { + local deps=$1 + deps=$(echo "${deps}" | sed 's/,/ /g') if [ "${FORCE}" = true ] || [ ! -f "uv.lock" ]; then uv init --no-package --vcs none --bare --no-readme --author-from none uv venv source .venv/bin/activate - uv add jupyter papermill + uv add ${deps} uv sync fi } initialise_julia() { + local deps=$1 + deps=$(echo "${deps}" | sed 's/,/","/g') if [ "${FORCE}" = true ] || [ ! -f "Project.toml" ]; then julia -e 'using Pkg; Pkg.activate("."); Pkg.instantiate()' - julia --project=. -e 'using Pkg; Pkg.add("IJulia")' + julia --project=. -e "using Pkg; Pkg.add([\"${deps}\"])" fi } @@ -73,23 +81,23 @@ while [[ "$#" -gt 0 ]]; do shift done -case $WHAT in +case ${WHAT} in all) - initialise_r - initialise_uv - initialise_julia + initialise_r "rmarkdown,languageserver,nx10/httpgd@v2.0.4" + initialise_uv "jupyter,papermill" + initialise_julia "IJulia" ;; r) - initialise_r + initialise_r "rmarkdown,languageserver,nx10/httpgd@v2.0.4" ;; python) - initialise_uv + initialise_uv "jupyter,papermill" ;; julia) - initialise_julia + initialise_julia "IJulia" ;; *) - echo "Unknown option for --what: $WHAT" + echo "Unknown option for --what: ${WHAT}" show_help exit 1 ;; From 1c1f93d42de30800f84b21f68c7f6e49e3772cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Thu, 19 Jun 2025 11:24:38 +0200 Subject: [PATCH 07/11] fix: don't install languages dependencies for arm64 --- .github/.devcontainer/devcontainer.json | 3 ++- .../quarto-computing-dependencies/install.sh | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/.devcontainer/devcontainer.json b/.github/.devcontainer/devcontainer.json index 667b96d..f785048 100644 --- a/.github/.devcontainer/devcontainer.json +++ b/.github/.devcontainer/devcontainer.json @@ -39,7 +39,8 @@ "ppa": "false" }, "./quarto-computing-dependencies": { - "rDeps": "rmarkdown,languageserver,nx10/httpgd@v2.0.3,prompt,lintr", + "installOnPlatforms": "amd64", + "rDeps": "rmarkdown,languageserver,nx10/httpgd@v2.0.4", "pythonDeps": "jupyter,papermill", "juliaDeps": "IJulia" }, diff --git a/.github/.devcontainer/quarto-computing-dependencies/install.sh b/.github/.devcontainer/quarto-computing-dependencies/install.sh index 357cb53..d00dd04 100755 --- a/.github/.devcontainer/quarto-computing-dependencies/install.sh +++ b/.github/.devcontainer/quarto-computing-dependencies/install.sh @@ -6,6 +6,8 @@ export DEBIAN_FRONTEND=noninteractive USERNAME=${USERNAME:-${_REMOTE_USER:-"automatic"}} +PLATFORMS=${INSTALL_ON_PLATFORMS:-"amd64,arm64"} + R_DEPS=${RDEPS:-"rmarkdown"} PYTHON_DEPS=${PYTHONDEPS:-"jupyter,papermill"} JULIA_DEPS=${JULIADEPS:-"IJulia"} @@ -56,9 +58,13 @@ quarto_julia_deps() { su "${USERNAME}" -c "~/.juliaup/bin/julia -e 'using Pkg; Pkg.add.([\"${deps}\"])'" } -quarto_r_deps ${R_DEPS} -quarto_python_deps ${PYTHON_DEPS} -quarto_julia_deps ${JULIA_DEPS} +if [[ ",${PLATFORMS}," == *",${architecture},"* ]]; then + quarto_r_deps ${R_DEPS} + quarto_python_deps ${PYTHON_DEPS} + quarto_julia_deps ${JULIA_DEPS} +else + echo "(!) Skipping R, Python, and Julia dependencies for ${architecture} architecture" +fi apt-get clean && rm -rf /var/lib/apt/lists/* From db44b2687630e30dda9b26354035f9da023932e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Thu, 19 Jun 2025 11:38:09 +0200 Subject: [PATCH 08/11] ci: add pr trigger --- .github/workflows/devcontainer.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml index 6643f25..76e5c25 100644 --- a/.github/workflows/devcontainer.yml +++ b/.github/workflows/devcontainer.yml @@ -6,6 +6,7 @@ on: types: [published] schedule: - cron: "0 6 * * sun" + pull_request: concurrency: group: ${{ github.workflow }}-${{ github.event_name }} @@ -63,7 +64,7 @@ jobs: cacheFrom: ghcr.io/${{ github.repository }} noCache: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }} imageTag: ${{ matrix.IMAGE_TAG }} - push: always + push: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' && 'always' || 'never' }} platform: linux/amd64,linux/arm64 env: IMAGE: ${{ matrix.IMAGE }} @@ -72,6 +73,7 @@ jobs: build-versions: runs-on: ubuntu-latest + if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }} needs: - "build" name: Build - Quarto ${{ matrix.QUARTO_VERSION }} From f65553ed3d5f33b143d821ca08abed5d696d80d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Thu, 19 Jun 2025 11:40:00 +0200 Subject: [PATCH 09/11] ci: tweak trigger condition for jobs --- .github/workflows/devcontainer.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml index 76e5c25..bc620ef 100644 --- a/.github/workflows/devcontainer.yml +++ b/.github/workflows/devcontainer.yml @@ -20,6 +20,7 @@ jobs: build: runs-on: ubuntu-latest name: Build - Quarto ${{ matrix.QUARTO_VERSION }} (${{ matrix.IMAGE }}) + if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request' }} strategy: matrix: include: @@ -73,7 +74,7 @@ jobs: build-versions: runs-on: ubuntu-latest - if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }} + if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }} needs: - "build" name: Build - Quarto ${{ matrix.QUARTO_VERSION }} @@ -123,10 +124,10 @@ jobs: configFile: ${{ format('.devcontainer/mcanouil-{0}/devcontainer.json', matrix.QUARTO_VERSION) }} clean: + runs-on: ubuntu-latest needs: - - "build" - "build-versions" - runs-on: ubuntu-latest + if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }} continue-on-error: true steps: - name: Delete obsolete/untagged versions From bbb5551af3a8d87509fcdd50f9d7123c47e01a3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 22 Jun 2025 12:03:51 +0200 Subject: [PATCH 10/11] ci: only amd64 --- .github/workflows/devcontainer.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml index bc620ef..d9ccb92 100644 --- a/.github/workflows/devcontainer.yml +++ b/.github/workflows/devcontainer.yml @@ -81,7 +81,7 @@ jobs: strategy: matrix: PLATFORM: - - "linux/amd64,linux/arm64" + - "linux/amd64" QUARTO_VERSION: - "1.0" - "1.1" @@ -120,7 +120,6 @@ jobs: imageTag: ${{ matrix.QUARTO_VERSION }},${{ matrix.QUARTO_VERSION }}-jammy push: always platform: ${{ matrix.PLATFORM }} - # platform: linux/amd64,linux/arm64 configFile: ${{ format('.devcontainer/mcanouil-{0}/devcontainer.json', matrix.QUARTO_VERSION) }} clean: From fdf50347a0a9555d663fdb8a885eba934588baf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Sun, 22 Jun 2025 12:36:55 +0200 Subject: [PATCH 11/11] chore: format --- .github/.devcontainer/chrome/devcontainer-feature.json | 4 ++-- .github/.devcontainer/decktape/devcontainer-feature.json | 4 ++-- .github/.devcontainer/decktape/install.sh | 2 +- .github/.devcontainer/uv/install.sh | 2 +- .github/workflows/devcontainer.yml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/.devcontainer/chrome/devcontainer-feature.json b/.github/.devcontainer/chrome/devcontainer-feature.json index 34b6a2f..e78f5d3 100644 --- a/.github/.devcontainer/chrome/devcontainer-feature.json +++ b/.github/.devcontainer/chrome/devcontainer-feature.json @@ -4,7 +4,7 @@ "name": "Chrome", "description": "Install Google Chrome web browser.", "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils", - "ghcr.io/devcontainers/features/git" + "ghcr.io/devcontainers/features/common-utils", + "ghcr.io/devcontainers/features/git" ] } diff --git a/.github/.devcontainer/decktape/devcontainer-feature.json b/.github/.devcontainer/decktape/devcontainer-feature.json index fccd394..e123b93 100644 --- a/.github/.devcontainer/decktape/devcontainer-feature.json +++ b/.github/.devcontainer/decktape/devcontainer-feature.json @@ -12,8 +12,8 @@ } }, "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils", - "ghcr.io/devcontainers/features/git", + "ghcr.io/devcontainers/features/common-utils", + "ghcr.io/devcontainers/features/git", "./chrome" ] } diff --git a/.github/.devcontainer/decktape/install.sh b/.github/.devcontainer/decktape/install.sh index 429ed83..029844a 100755 --- a/.github/.devcontainer/decktape/install.sh +++ b/.github/.devcontainer/decktape/install.sh @@ -34,7 +34,7 @@ install_decktape() { local version=$1 local url="https://deb.nodesource.com/setup_${version}.x " check_packages curl ca-certificates - curl --proto '=https' --tlsv1.2 -LsSf ${url} | sudo -E bash - + curl --proto '=https' --tlsv1.2 -LsSf ${url} | sudo -E bash - check_packages nodejs npm install -g decktape } diff --git a/.github/.devcontainer/uv/install.sh b/.github/.devcontainer/uv/install.sh index 4ecb1cd..7844db4 100644 --- a/.github/.devcontainer/uv/install.sh +++ b/.github/.devcontainer/uv/install.sh @@ -59,7 +59,7 @@ install_uv() { } enable_autocompletion() { - echo 'eval "$(uv generate-shell-completion zsh)"' >> /usr/share/zsh/vendor-completions/_uv + echo 'eval "$(uv generate-shell-completion zsh)"' >>/usr/share/zsh/vendor-completions/_uv } install_uv ${VERSION} diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml index d9ccb92..c3e1d56 100644 --- a/.github/workflows/devcontainer.yml +++ b/.github/workflows/devcontainer.yml @@ -121,7 +121,7 @@ jobs: push: always platform: ${{ matrix.PLATFORM }} configFile: ${{ format('.devcontainer/mcanouil-{0}/devcontainer.json', matrix.QUARTO_VERSION) }} - + clean: runs-on: ubuntu-latest needs: