#!/usr/bin/env bash set -euo pipefail DRY_RUN=false while [[ $# -gt 0 ]]; do case $1 in --dry-run|-n) DRY_RUN=true shift ;; --help|-h) echo "Usage: $0 [OPTIONS]" echo "" echo "Options:" echo " --dry-run, -n Show what would be updated without making changes" echo " --help, -h Show this help message" exit 0 ;; *) echo "Unknown option: $1" echo "Use --help for usage information" exit 1 ;; esac done RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}" NIX_FILE="$REPO_ROOT/packages/opencode/default.nix" echo "Fetching latest opencode version from GitHub API..." RELEASE_INFO=$(curl -fsSL https://api.github.com/repos/anomalyco/opencode/releases/latest) NEW_VERSION=$(echo "$RELEASE_INFO" | jq -r '.tag_name' | sed 's/^v//') if [ -z "$NEW_VERSION" ] || [ "$NEW_VERSION" = "null" ]; then echo -e "${RED}Error: Failed to fetch version from GitHub API${NC}" exit 1 fi CURRENT_VERSION=$(grep -m1 'version = ' "$NIX_FILE" | sed -E 's/.*version = "([^"]+)".*/\1/') if [ "$CURRENT_VERSION" = "$NEW_VERSION" ]; then echo -e "${GREEN}Already up to date: $CURRENT_VERSION${NC}" exit 0 fi echo -e "${YELLOW}Updating from $CURRENT_VERSION to $NEW_VERSION${NC}" # Compute SHA256 hashes for each platform # fetchzip hashes the unpacked directory, so we need to extract and hash compute_unpacked_hash() { local url="$1" local ext="$2" local tmpdir=$(mktemp -d) local archive="/tmp/opencode-archive.$ext" curl -fsSL "$url" -o "$archive" if [ "$ext" = "zip" ]; then (cd "$tmpdir" && unzip -q "$archive") else (cd "$tmpdir" && tar xzf "$archive") fi local sri_hash=$(nix hash path "$tmpdir") local nix32_hash=$(nix hash convert --hash-algo sha256 --to nix32 "$sri_hash") rm -rf "$tmpdir" "$archive" echo "$nix32_hash" } echo "Computing SHA256 hashes (this may take a moment)..." SHA_DARWIN_ARM=$(compute_unpacked_hash "https://github.com/anomalyco/opencode/releases/download/v${NEW_VERSION}/opencode-darwin-arm64.zip" "zip") echo " aarch64-darwin: $SHA_DARWIN_ARM" SHA_DARWIN_X64=$(compute_unpacked_hash "https://github.com/anomalyco/opencode/releases/download/v${NEW_VERSION}/opencode-darwin-x64.zip" "zip") echo " x86_64-darwin: $SHA_DARWIN_X64" SHA_LINUX_X64=$(compute_unpacked_hash "https://github.com/anomalyco/opencode/releases/download/v${NEW_VERSION}/opencode-linux-x64.tar.gz" "tar.gz") echo " x86_64-linux: $SHA_LINUX_X64" SHA_LINUX_ARM64=$(compute_unpacked_hash "https://github.com/anomalyco/opencode/releases/download/v${NEW_VERSION}/opencode-linux-arm64.tar.gz" "tar.gz") echo " aarch64-linux: $SHA_LINUX_ARM64" if [ "$DRY_RUN" = true ]; then echo -e "${YELLOW}DRY RUN - No changes will be made${NC}" echo "" echo "Would update:" echo " Version: $CURRENT_VERSION -> $NEW_VERSION" echo " aarch64-darwin SHA: $SHA_DARWIN_ARM" echo " x86_64-darwin SHA: $SHA_DARWIN_X64" echo " x86_64-linux SHA: $SHA_LINUX_X64" echo " aarch64-linux SHA: $SHA_LINUX_ARM64" exit 0 fi # Update version sed -i.tmp "s/version = \".*\";/version = \"$NEW_VERSION\";/" "$NIX_FILE" # Update SHA256 hashes using awk awk -v sha_arm="$SHA_DARWIN_ARM" -v sha_x64="$SHA_DARWIN_X64" -v sha_linux_x64="$SHA_LINUX_X64" -v sha_linux_arm="$SHA_LINUX_ARM64" ' /aarch64-darwin = {/ { in_arm = 1 } /x86_64-darwin = {/ { in_x64 = 1; in_arm = 0 } /x86_64-linux = {/ { in_linux_x64 = 1; in_x64 = 0 } /aarch64-linux = {/ { in_linux_arm = 1; in_linux_x64 = 0 } /};/ { in_arm = 0 in_x64 = 0 in_linux_x64 = 0 in_linux_arm = 0 } /sha256 = / { if (in_arm) { sub(/sha256 = ".*";/, "sha256 = \"" sha_arm "\";") } else if (in_x64) { sub(/sha256 = ".*";/, "sha256 = \"" sha_x64 "\";") } else if (in_linux_x64) { sub(/sha256 = ".*";/, "sha256 = \"" sha_linux_x64 "\";") } else if (in_linux_arm) { sub(/sha256 = ".*";/, "sha256 = \"" sha_linux_arm "\";") } } { print } ' "$NIX_FILE" > "$NIX_FILE.new" mv "$NIX_FILE.new" "$NIX_FILE" rm -f "$NIX_FILE.tmp" echo -e "${GREEN}Successfully updated to version $NEW_VERSION${NC}" echo "" echo "Updated SHA256 hashes:" echo " aarch64-darwin: $SHA_DARWIN_ARM" echo " x86_64-darwin: $SHA_DARWIN_X64" echo " x86_64-linux: $SHA_LINUX_X64" echo " aarch64-linux: $SHA_LINUX_ARM64" echo "" echo "Next steps:" echo " 1. Review changes: git diff $NIX_FILE" echo " 2. Test build: nix build .#custom-opencode" echo " 3. Verify version: ./result/bin/opencode --version" echo " 4. Commit: git add $NIX_FILE && git commit -m 'opencode: Update to version $NEW_VERSION'"