From dd9850cdad54846168151adc06f625df293ccddf Mon Sep 17 00:00:00 2001 From: wisp3rwind <17089248+wisp3rwind@users.noreply.github.com> Date: Tue, 19 Nov 2024 23:31:58 +0100 Subject: [PATCH] add release workflow and packaging script adapted from https://github.com/typst-community/typst-package-template, which in turns is adapted from CeTZ --- .github/workflows/release.yml | 77 +++++++++++++++++++++++++++++++++++ scripts/install | 30 ++++++++++++++ scripts/setup | 37 +++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100755 scripts/install create mode 100644 scripts/setup diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..87e4c45 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,77 @@ +name: Package and push to registry repo +on: + push: + tags: [ v* ] + +env: + # the repository to which to push the release version + # usually a fork of typst/packages (https://github.com/typst/packages/) + # that you have push privileges to + REGISTRY_REPO: wisp3rwind/typst-packages + # the path within that repo where the "/" directory should be put + # for the Typst package registry, keep this as is + PATH_PREFIX: packages/preview + +jobs: + release: + runs-on: ubuntu-latest + environment: release # grants access to the REGISTRY_TOKEN + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Probe runner package cache + uses: awalsh128/cache-apt-pkgs-action@v1 + with: + packages: cargo + version: 1.0 + + - name: Install just from crates.io + uses: baptiste0928/cargo-install@v3 + with: + crate: just + + - name: Setup typst + uses: typst-community/setup-typst@v3 + with: + typst-version: latest + + - name: Determine and check package metadata + run: | + . scripts/setup + echo "PKG_NAME=${PKG_PREFIX}" >> "${GITHUB_ENV}" + echo "PKG_VERSION=${VERSION}" >> "${GITHUB_ENV}" + + if [[ "${GITHUB_REF_NAME}" != "v${VERSION}" ]]; then + echo "package version ${VERSION} does not match release tag ${GITHUB_REF_NAME}" >&2 + exit 1 + fi + + - name: Build package + run: | + just package out + + - name: Checkout package registry + uses: actions/checkout@v4 + with: + repository: ${{ env.REGISTRY_REPO }} + token: ${{ secrets.REGISTRY_TOKEN }} + path: typst-packages + + - name: Release package + run: | + mkdir -p "typst-packages/${{ env.PATH_PREFIX }}/$PKG_NAME" + mv "out/${PKG_NAME}/${PKG_VERSION}" "typst-packages/${{ env.PATH_PREFIX }}/${PKG_NAME}" + rmdir "out/${PKG_NAME}" + rmdir out + + GIT_USER_NAME="$(git log -1 --pretty=format:'%an')" + GIT_USER_EMAIL="$(git log -1 --pretty=format:'%ae')" + + cd typst-packages + git config user.name "${GIT_USER_NAME}" + git config user.email "${GIT_USER_EMAIL}" + git checkout -b "${PKG_NAME}-${PKG_VERSION}" + git add . + git commit -m "${PKG_NAME}:${PKG_VERSION}" + git push --set-upstream origin "${PKG_NAME}-${PKG_VERSION}" diff --git a/scripts/install b/scripts/install new file mode 100755 index 0000000..a23030b --- /dev/null +++ b/scripts/install @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -eu + +# adapted from https://github.com/johannes-wolf/cetz/blob/35c0868378cea5ad323cc0d9c2f76de8ed9ba5bd/scripts/package +# licensed under Apache License 2.0 + +. "$(dirname "${BASH_SOURCE[0]}")/setup" + +TARGET="$(resolve-target "${1:?Missing target path, @local or @preview}")" +echo "Install dir: $TARGET" + +# Copy all included files to a temporary directory +TMP="$(mktemp -d)" +for f in src/*.typ CHANGELOG.md README.md LICENSE typst.toml; do + mkdir -p "$TMP/$(dirname "$f")" 2>/dev/null + cp -r "$ROOT/$f" "$TMP/$f" +done + +# Remove and re-create the target directory +TARGET="${TARGET:?}/${PKG_PREFIX:?}/${VERSION:?}" +echo "Packaged to: $TARGET" +if rm -r "${TARGET:?}" 2>/dev/null; then + echo "Overwriting existing version." +fi +mkdir -p "$TARGET" + +# Move from temporary to target dir +# include hidden files by setting dotglob +shopt -s dotglob +mv "$TMP"/* "$TARGET" diff --git a/scripts/setup b/scripts/setup new file mode 100644 index 0000000..9fe1c85 --- /dev/null +++ b/scripts/setup @@ -0,0 +1,37 @@ +# source this script to prepare some common environment variables + +# adapted from https://github.com/johannes-wolf/cetz/blob/35c0868378cea5ad323cc0d9c2f76de8ed9ba5bd/scripts/package +# licensed under Apache License 2.0 + +# Local package directories per platform +if [[ "$OSTYPE" == "linux"* ]]; then + DATA_DIR="${XDG_DATA_HOME:-$HOME/.local/share}" +elif [[ "$OSTYPE" == "darwin"* ]]; then + DATA_DIR="$HOME/Library/Application Support" +else + DATA_DIR="${APPDATA}" +fi + +function read-toml() { + local file="$1" + local key="$2" + # Read a key value pair in the format: = "" + # stripping surrounding quotes. + perl -lne "print \"\$1\" if /^${key}\\s*=\\s*\"(.*)\"/" < "$file" +} + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")"; pwd -P)/.." # macOS has no realpath +PKG_PREFIX="$(read-toml "$ROOT/typst.toml" "name")" +VERSION="$(read-toml "$ROOT/typst.toml" "version")" + +function resolve-target() { + local target="$1" + + if [[ "$target" == "@local" ]]; then + echo "${DATA_DIR}/typst/packages/local" + elif [[ "$target" == "@preview" ]]; then + echo "${DATA_DIR}/typst/packages/preview" + else + echo "$target" + fi +}