aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/build-parser.sh53
-rwxr-xr-xscripts/update-parser.sh64
2 files changed, 117 insertions, 0 deletions
diff --git a/scripts/build-parser.sh b/scripts/build-parser.sh
new file mode 100755
index 0000000..85a91a5
--- /dev/null
+++ b/scripts/build-parser.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+#
+# build-parser.sh — Compile the Nova-compatible tree-sitter-zig parser.
+#
+# Purpose:
+# Build vendor/tree-sitter-zig/src/parser.c into a universal macOS dylib
+# that Nova loads via its private SyntaxKit framework.
+#
+# What it does:
+# - clang -dynamiclib for arm64 + x86_64
+# - links against Nova’s SyntaxKit framework (from /Applications/Nova.app)
+# - sets rpath @loader_path/../Frameworks so the dylib finds SyntaxKit
+# when Nova loads it from the bundled extension
+# - ad-hoc codesigns the dylib (Gatekeeper requirement)
+# - writes the result to Zig.novaextension/Syntaxes/libtree-sitter-zig.dylib
+#
+# Usage:
+# ./scripts/build-parser.sh
+#
+# Environment overrides:
+# NOVA_APP Path to Nova.app (default: /Applications/Nova.app)
+# SDKROOT macOS SDK path (default: `xcrun --show-sdk-path`)
+#
+# Requirements:
+# macOS, Xcode Command Line Tools (clang + xcrun), Nova installed.
+
+set -eu
+
+ROOT="$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd)"
+VENDOR_DIR="$ROOT/vendor/tree-sitter-zig"
+BUILD_DIR="$ROOT/build"
+OUTPUT="$ROOT/Zig.novaextension/Syntaxes/libtree-sitter-zig.dylib"
+NOVA_APP="${NOVA_APP:-/Applications/Nova.app}"
+SDKROOT="${SDKROOT:-$(xcrun --show-sdk-path)}"
+
+mkdir -p "$BUILD_DIR"
+
+clang \
+ -dynamiclib \
+ -O2 \
+ -fPIC \
+ -arch arm64 \
+ -arch x86_64 \
+ -isysroot "$SDKROOT" \
+ -I"$VENDOR_DIR/src" \
+ -F"$NOVA_APP/Contents/Frameworks" \
+ -framework SyntaxKit \
+ -Wl,-rpath,@loader_path/../Frameworks \
+ -o "$BUILD_DIR/libtree-sitter-zig.dylib" \
+ "$VENDOR_DIR/src/parser.c"
+
+codesign --force --sign - "$BUILD_DIR/libtree-sitter-zig.dylib"
+cp "$BUILD_DIR/libtree-sitter-zig.dylib" "$OUTPUT"
diff --git a/scripts/update-parser.sh b/scripts/update-parser.sh
new file mode 100755
index 0000000..8a679e1
--- /dev/null
+++ b/scripts/update-parser.sh
@@ -0,0 +1,64 @@
+#!/bin/sh
+#
+# update-parser.sh — Bump vendored tree-sitter-zig and rebuild the dylib.
+#
+# Purpose:
+# Refresh the vendored snapshot under vendor/tree-sitter-zig/ to a newer
+# upstream commit, update VENDORING.md, and rebuild the parser dylib.
+#
+# What it does:
+# - clones tree-sitter-grammars/tree-sitter-zig into a temp dir
+# - checks out the requested ref (default: HEAD of the default branch)
+# - exits early if the upstream SHA matches the pinned SHA
+# - replaces src/, queries/, grammar.js, tree-sitter.json, LICENSE
+# with the upstream copies; leaves VENDORING.md and README.upstream.md
+# untouched
+# - rewrites the "Pinned commit:" line in VENDORING.md
+# - invokes build-parser.sh to rebuild Syntaxes/libtree-sitter-zig.dylib
+# - prints a GitHub compare link for the diff
+#
+# Usage:
+# ./scripts/update-parser.sh # bump to upstream HEAD
+# ./scripts/update-parser.sh <ref> # bump to a tag, branch, or SHA
+#
+# Caveats:
+# - any local edits inside the listed paths are overwritten — review
+# `git diff vendor/` afterwards before committing
+# - parses VENDORING.md by an exact "Pinned commit: <sha>" line prefix;
+# keep that line format intact
+#
+# Requirements:
+# git, plus everything build-parser.sh needs.
+
+set -eu
+
+ROOT="$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd)"
+VENDOR_DIR="$ROOT/vendor/tree-sitter-zig"
+UPSTREAM="https://github.com/tree-sitter-grammars/tree-sitter-zig.git"
+REF="${1:-HEAD}"
+
+TMP="$(mktemp -d)"
+trap 'rm -rf "$TMP"' EXIT
+
+git clone --quiet "$UPSTREAM" "$TMP/repo"
+git -C "$TMP/repo" checkout --quiet "$REF"
+SHA="$(git -C "$TMP/repo" rev-parse HEAD)"
+
+OLD_SHA="$(awk '/^Pinned commit:/ {print $3}' "$VENDOR_DIR/VENDORING.md")"
+if [ "$SHA" = "$OLD_SHA" ]; then
+ echo "Already at $SHA — nothing to do."
+ exit 0
+fi
+
+for path in src queries grammar.js tree-sitter.json LICENSE; do
+ rm -rf "$VENDOR_DIR/$path"
+ cp -R "$TMP/repo/$path" "$VENDOR_DIR/$path"
+done
+
+sed -i.bak "s/^Pinned commit: .*/Pinned commit: $SHA/" "$VENDOR_DIR/VENDORING.md"
+rm "$VENDOR_DIR/VENDORING.md.bak"
+
+"$ROOT/scripts/build-parser.sh"
+
+echo "Updated $OLD_SHA -> $SHA"
+echo "Compare: https://github.com/tree-sitter-grammars/tree-sitter-zig/compare/$OLD_SHA...$SHA"