#!/usr/bin/env bash set -euo pipefail # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" # Check if commit SHA is provided if [ $# -ne 1 ]; then echo -e "${RED}Error: Git commit SHA required${NC}" echo "Usage: $0 " echo "Example: $0 e5fe7038f3e116d878c58059323b682e426f9c84" echo "" echo "To find the latest commit:" echo " Visit: https://github.com/pyload/pyload/commits/main" exit 1 fi COMMIT_SHA="$1" # Validate commit SHA format (40 character hex string) if ! [[ "$COMMIT_SHA" =~ ^[0-9a-f]{40}$ ]]; then echo -e "${RED}Error: Invalid commit SHA format${NC}" echo "Commit SHA must be a 40-character hexadecimal string" exit 1 fi echo -e "${GREEN}==> Updating pyload-ng to commit: ${COMMIT_SHA}${NC}" # File to update PKG_FILE="$REPO_ROOT/utils/pkgs/pyload-ng-updated.nix" if [ ! -f "$PKG_FILE" ]; then echo -e "${RED}Error: Package file not found: $PKG_FILE${NC}" exit 1 fi # Step 1: Update commit SHA in package file echo -e "${YELLOW}Step 1: Updating commit SHA in package file...${NC}" sed -i "s/rev = \"[0-9a-f]*\";/rev = \"$COMMIT_SHA\";/" "$PKG_FILE" echo " ✓ Updated commit SHA in $PKG_FILE" # Step 2: Set hash to a fake value to trigger hash discovery echo -e "${YELLOW}Step 2: Setting hash to fake value...${NC}" sed -i 's/hash = "sha256-[^"]*";/hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";/' "$PKG_FILE" echo " ✓ Updated hash in $PKG_FILE" # Step 3: Build package to discover the correct hash echo -e "${YELLOW}Step 3: Building package to discover hash...${NC}" BUILD_OUTPUT=$(nix-build --impure -E "with import { overlays = [ (import $REPO_ROOT/utils/overlays/packages.nix) ]; }; callPackage $PKG_FILE { }" 2>&1 || true) # Extract hash from error message HASH=$(echo "$BUILD_OUTPUT" | grep -oP '\s+got:\s+\Ksha256-[A-Za-z0-9+/=]+' | head -1) if [ -z "$HASH" ]; then echo -e "${RED}Error: Failed to extract hash from build output${NC}" echo "Build output:" echo "$BUILD_OUTPUT" exit 1 fi echo " ✓ Discovered hash: $HASH" # Step 4: Update package file with the correct hash echo -e "${YELLOW}Step 4: Updating hash in package file...${NC}" sed -i "s|hash = \"sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\";|hash = \"$HASH\";|" "$PKG_FILE" echo " ✓ Updated hash in $PKG_FILE" # Step 5: Verify the build succeeds echo -e "${YELLOW}Step 5: Verifying build with correct hash...${NC}" if nix-build --impure -E "with import { overlays = [ (import $REPO_ROOT/utils/overlays/packages.nix) ]; }; callPackage $PKG_FILE { }" > /dev/null 2>&1; then echo " ✓ Build verification successful" else echo -e "${RED}Error: Build verification failed${NC}" exit 1 fi # Step 6: Test configuration for fw host (which uses pyload) echo -e "${YELLOW}Step 6: Testing fw configuration...${NC}" cd "$REPO_ROOT" if ./scripts/test-configuration fw > /dev/null 2>&1; then echo " ✓ Configuration test passed" else echo -e "${RED}Warning: Configuration test failed${NC}" echo "This may be due to missing secrets or other issues unrelated to the hash update." fi # Success summary echo -e "${GREEN}" echo "======================================" echo "✓ pyload-ng updated successfully!" echo "======================================" echo "Commit: $COMMIT_SHA" echo "Hash: $HASH" echo -e "${NC}" echo "Next steps:" echo " 1. Review changes: git diff $PKG_FILE" echo " 2. Test locally if needed" echo " 3. Commit changes: git add $PKG_FILE && git commit -m 'update: pyload-ng to commit ${COMMIT_SHA:0:8}'" echo " 4. Push to trigger automatic deployment"