#!/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" if (( $# < 1 )) || [[ "${1:-}" == "help" ]]; then echo "package TARGET" echo "" echo "Packages all relevant files into a directory named '/'" echo "at TARGET. If TARGET is set to @local or @preview, the local Typst package" echo "directory will be used so that the package gets installed for local use." echo "The name and version are read from 'typst.toml' in the project root." echo "" echo "Local package prefix: $DATA_DIR/typst/package/local" echo "Local preview package prefix: $DATA_DIR/typst/package/preview" exit 1 fi TARGET="$(resolve-target "${1:?Missing target path, @local or @preview}")" echo "Install dir: $TARGET" # ignore rules readarray -t ignores < <(grep -v '^#' .typstignore | grep '[^[:blank:]]') # recursively print all files that are not excluded via .typstignore function enumerate { local root="$1" if [[ -f "$root" ]]; then echo "$root" else local files readarray -t files < <(find "$root" \ -mindepth 1 -maxdepth 1 \ -not -name .git \ -not -name .typstignore) # declare -p files >&2 local f for f in "${files[@]}"; do local include include=1 local ignore for ignore in "${ignores[@]}"; do if [[ "$ignore" =~ ^! ]]; then ignore="${ignore:1}" if [[ "$f" == ./$ignore ]]; then # echo "\"$f\" matched \"!$ignore\"" >&2 include=1 fi elif [[ "$f" == ./$ignore ]]; then # echo "\"$f\" matched \"$ignore\"" >&2 include=0 fi done if [[ "$include" == 1 ]]; then enumerate "$f" fi done fi } # List of all files that get packaged readarray -t files < <(enumerate ".") # declare -p files >&2 TMP="$(mktemp -d)" for f in "${files[@]}"; do mkdir -p "$TMP/$(dirname "$f")" 2>/dev/null cp -r "$ROOT/$f" "$TMP/$f" done 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" # include hidden files by setting dotglob shopt -s dotglob mv "$TMP"/* "$TARGET"