Unverified Commit 565e4d68 authored by Ben Siraphob's avatar Ben Siraphob Committed by GitHub
Browse files

nix-prefetch-scripts: add nix-prefetch-fossil (#407091)

parents 31e89728 d12ba662
Loading
Loading
Loading
Loading
+125 −0
Original line number Diff line number Diff line
#!/bin/sh -e

url=
rev=
expHash=
hashType="${NIX_HASH_ALGO:-sha256}"

# Parse command line arguments
argi=0
argfun=""
for arg; do
    if test -z "$argfun"; then
        case $arg in
            --url) argfun=set_url;;
            --rev) argfun=set_rev;;
            --hash) argfun=set_expHash;;
            --help|-h)
                echo "Usage: nix-prefetch-fossil [options] [URL [REVISION [EXPECTED-HASH]]]"
                echo ""
                echo "Options:"
                echo "  --url URL       Fossil repository URL"
                echo "  --rev REV       Fossil revision/tag/branch (default: trunk)"
                echo "  --hash HASH     Expected hash"
                echo "  --help          Show this help message"
                exit 0
                ;;
            *)
                argi=$((argi + 1))
                case $argi in
                    1) url=$arg;;
                    2) rev=$arg;;
                    3) expHash=$arg;;
                    *) echo "Too many arguments" >&2; exit 1;;
                esac
                ;;
        esac
    else
        case $argfun in
            set_*)
                var=${argfun#set_}
                eval "$var='$arg'"
                ;;
        esac
        argfun=""
    fi
done

if test -z "$url"; then
    echo "error: URL is required" >&2
    echo "Usage: nix-prefetch-fossil [URL [REVISION [EXPECTED-HASH]]]" >&2
    exit 1
fi

# Default to trunk if no revision specified
if test -z "$rev"; then
    rev="trunk"
fi

# If the hash was given, check if we already have it in store
if test -n "$expHash"; then
    finalPath=$(nix-store --print-fixed-path --recursive "$hashType" "$expHash" fossil-archive)
    if nix-store --check-validity "$finalPath" 2> /dev/null; then
        echo "$expHash"
        exit 0
    fi
fi

# Create temporary directory for cloning
tmpPath="$(mktemp -d --tmpdir fossil-checkout-tmp-XXXXXXXX)"
cleanup() { rm -rf "$tmpPath"; }
trap cleanup EXIT

# Fossil wants to write global configuration to $HOME/.fossil
# We'll let it write to the temp directory instead
export HOME="$tmpPath"

echo "Fetching Fossil repository $url at revision $rev..." >&2

# Clone the repository
fossil clone -A nobody "$url" "$tmpPath/fossil-clone.fossil" >&2

# Create directory for checkout
checkoutDir="$tmpPath/checkout"
mkdir -p "$checkoutDir"

# Open the repository at the specified revision
cd "$checkoutDir"
fossil open "$tmpPath/fossil-clone.fossil" "$rev" >&2

# Get the actual commit hash and date
checkoutLine=$(fossil info | grep ^checkout:)
# Remove 'checkout:' prefix and squeeze multiple spaces, then extract fields
actualRev=$(echo "$checkoutLine" | sed 's/^checkout:[[:space:]]*//' | tr -s ' ' | cut -d' ' -f1)
# Extract date (format: checkout:     HASH YYYY-MM-DD HH:MM:SS UTC)
actualDate=$(echo "$checkoutLine" | sed 's/^checkout:[[:space:]]*//' | tr -s ' ' | cut -d' ' -f2)
cd - >/dev/null

# Remove the fossil checkout file
rm -f "$checkoutDir/.fslckout"

# Calculate the hash
hash=$(nix-hash --type "$hashType" --base32 "$checkoutDir")
echo "hash is $hash" >&2

# Add to store if we don't have an expected hash or if it matches
if test -z "$expHash" || test "$expHash" = "$hash"; then
    finalPath=$(nix-store --add-fixed --recursive "$hashType" "$checkoutDir")
    echo "path is $finalPath" >&2
elif test -n "$expHash" && test "$expHash" != "$hash"; then
    echo "error: hash mismatch for Fossil repository $url" >&2
    echo "  expected: $expHash" >&2
    echo "  actual:   $hash" >&2
    exit 1
fi

# Output JSON result
cat <<EOF
{
  "url": "$url",
  "rev": "$actualRev",
  "date": "$actualDate",
  "$hashType": "$hash",
  "hash": "$(nix-hash --to-sri --type $hashType $hash)"
}
EOF
+6 −3
Original line number Diff line number Diff line
@@ -3,16 +3,17 @@
  stdenv,
  fetchfossil,
  openssl,
  nix-update-script,
}:

stdenv.mkDerivation {
  pname = "althttpd";
  version = "0-unstable-2023-08-12";
  version = "0-unstable-2025-08-22";

  src = fetchfossil {
    url = "https://sqlite.org/althttpd/";
    rev = "c0bdc68e6c56ef25";
    hash = "sha256-VoDR5MlVlvar9wYA0kUhvDQVjxDwsZlqrNR3u4Tqw5c=";
    rev = "e9bf26f78e1f5792";
    hash = "sha256-Q16tqhnPzYrFkrHTC8NBrdpsbrpjPUkdxLwmyYqUHZo=";
  };

  buildInputs = [ openssl ];
@@ -23,6 +24,8 @@ stdenv.mkDerivation {
    install -Dm755 -t $out/bin althttpd
  '';

  passthru.updateScript = ./update.sh;

  meta = {
    description = "Althttpd webserver";
    homepage = "https://sqlite.org/althttpd/";
+40 −0
Original line number Diff line number Diff line
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p common-updater-scripts jq gawk

set -euo pipefail

nixpkgs="$(git rev-parse --show-toplevel)"
cd "$(dirname "${BASH_SOURCE[0]}")"

# Build and run nix-prefetch-fossil from the local nixpkgs
prefetch_fossil="$(nix-build "$nixpkgs" -A nix-prefetch-scripts --no-out-link 2>/dev/null)/bin/nix-prefetch-fossil"

echo "Fetching latest althttpd revision..." >&2

# Run nix-prefetch-fossil and capture output
output=$("$prefetch_fossil" https://sqlite.org/althttpd trunk 2>&1)

# Extract JSON from output (it's at the end after the blank line)
json_output=$(echo "$output" | gawk '/^{/{p=1} p')

# Extract revision, hash, and date
full_rev=$(echo "$json_output" | jq -r '.rev')
new_rev="${full_rev:0:16}"  # Use 16-char prefix for consistency
new_hash=$(echo "$json_output" | jq -r '.hash')
commit_date=$(echo "$json_output" | jq -r '.date')

# Fallback to current date if extraction fails
if [ -z "$commit_date" ] || [ "$commit_date" = "null" ]; then
    commit_date=$(date +%Y-%m-%d)
fi
new_version="unstable-$commit_date"

echo "Updating althttpd to $new_version (rev $new_rev)" >&2

# Use update-source-version from the nixpkgs root
(
    cd "$nixpkgs"
    update-source-version althttpd "$new_version" "$new_hash" \
        --file="pkgs/by-name/al/althttpd/package.nix" \
        --rev="$new_rev"
)
+5 −3
Original line number Diff line number Diff line
@@ -10,12 +10,12 @@
stdenv.mkDerivation {
  pname = "pikchr";
  # To update, use the last check-in in https://pikchr.org/home/timeline?r=trunk
  version = "0-unstable-2025-02-28";
  version = "0-unstable-2025-05-12";

  src = fetchfossil {
    url = "https://pikchr.org/home";
    rev = "b7fbd56c4eb82ab9";
    hash = "sha256-7oW1IYYk3YKPjOUPP6qYIdR0oGo9pRDDlyu30J4B3bI=";
    rev = "2972d1d24849d4c3";
    hash = "sha256-IZ9m1xa2bO9Sd6XYROkNz6PloLEbR3d3JpSSYyDJR8I=";
  };

  # can't open generated html files
@@ -48,6 +48,8 @@ stdenv.mkDerivation {

  doCheck = true;

  passthru.updateScript = ./update.sh;

  meta = {
    description = "PIC-like markup language for diagrams in technical documentation";
    homepage = "https://pikchr.org";
+40 −0
Original line number Diff line number Diff line
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p common-updater-scripts jq gawk

set -euo pipefail

nixpkgs="$(git rev-parse --show-toplevel)"
cd "$(dirname "${BASH_SOURCE[0]}")"

# Build and run nix-prefetch-fossil from the local nixpkgs
prefetch_fossil="$(nix-build "$nixpkgs" -A nix-prefetch-scripts --no-out-link 2>/dev/null)/bin/nix-prefetch-fossil"

echo "Fetching latest pikchr revision..." >&2

# Run nix-prefetch-fossil and capture output
output=$("$prefetch_fossil" https://pikchr.org/home trunk 2>&1)

# Extract JSON from output (it's at the end after the blank line)
json_output=$(echo "$output" | gawk '/^{/{p=1} p')

# Extract revision, hash, and date
full_rev=$(echo "$json_output" | jq -r '.rev')
new_rev="${full_rev:0:16}"  # Use 16-char prefix for consistency
new_hash=$(echo "$json_output" | jq -r '.hash')
commit_date=$(echo "$json_output" | jq -r '.date')

# Fallback to current date if extraction fails
if [ -z "$commit_date" ] || [ "$commit_date" = "null" ]; then
    commit_date=$(date +%Y-%m-%d)
fi
new_version="0-unstable-$commit_date"

echo "Updating pikchr to $new_version (rev $new_rev)" >&2

# Use update-source-version from the nixpkgs root
(
    cd "$nixpkgs"
    update-source-version pikchr "$new_version" "$new_hash" \
        --file="pkgs/by-name/pi/pikchr/package.nix" \
        --rev="$new_rev"
)
Loading