libpgdump 1.0.0

A Rust library for reading and writing PostgreSQL dump files
Documentation
# Default recipe: run checks
default: check

# Run all checks (format, lint, test)
check: fmt-check lint test

# Build the library
build:
    cargo build

# Run tests
test:
    cargo test

# Run clippy lints
lint:
    cargo clippy -- -D warnings

# Check formatting
fmt-check:
    cargo fmt --check

# Auto-format code
fmt:
    cargo fmt

# Run all checks then build in release mode
release-build: check
    cargo build --release

# Set the release version in Cargo.toml
set-version version:
    #!/usr/bin/env bash
    set -euo pipefail
    current=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/')
    if [ "{{version}}" = "$current" ]; then
        echo "Version is already {{version}}"
        exit 1
    fi
    # Use a temp file for portability (BSD sed -i requires arg, GNU doesn't)
    tmp=$(mktemp)
    sed 's/^version = ".*"/version = "{{version}}"/' Cargo.toml > "$tmp"
    mv "$tmp" Cargo.toml
    cargo check
    echo "Updated version: $current -> {{version}}"

# Tag a release (sets version, commits, tags, pushes)
release version: (set-version version)
    git add Cargo.toml Cargo.lock
    git commit -m "Release v{{version}}"
    git tag -a "v{{version}}" -m "v{{version}}"
    git push origin main --tags

# Publish to crates.io (dry run)
publish-dry:
    cargo publish --dry-run

# Publish to crates.io
publish:
    cargo publish

# Clean build artifacts
clean:
    cargo clean

# Bootstrap test environment (start postgres, load schema, generate fixtures)
bootstrap:
    #!/usr/bin/env bash
    set -euo pipefail
    export COMPOSE_DISABLE_ENV_FILE=1
    TEST_HOST=${TEST_HOST:-127.0.0.1}

    docker_exec() {
        if [ "${CI:-}" = 'true' ]; then
            docker exec -t postgres "$@"
        else
            docker compose exec postgres "$@"
        fi
    }

    get_exposed_port() {
        local port
        port=$(docker compose port "$1" --protocol "${3:-tcp}" "$2")
        echo "${port#*:}"
    }

    mkdir -p build/data

    # Set up Python venv for data generation
    if [ "${CI:-}" != 'true' ]; then
        if [ -e ./.venv/bin/activate ]; then
            source ./.venv/bin/activate
        else
            python3 -m venv .venv
            source ./.venv/bin/activate
        fi
    fi
    pip install --quiet faker psycopg

    # Start postgres (local only)
    if [ "${CI:-}" != 'true' ]; then
        printf 'Cleaning environment...'
        docker compose down --remove-orphans --volumes
        echo ' done.'

        printf 'Starting environment...'
        docker compose up --wait --wait-timeout 120
        echo ' done.'
    fi

    if [ "${CI:-}" = 'true' ]; then
        PGPORT=5432
    else
        PGPORT="$(get_exposed_port postgres 5432)"
    fi

    echo "Running pgbench..."
    docker_exec /usr/bin/pgbench -i -U postgres postgres

    printf "Loading fixture schema..."
    docker_exec /usr/bin/psql -U postgres -d postgres -q -o /dev/null -f /fixtures/schema.sql
    echo ' done.'

    printf "Generating fixture data..."
    if [ "${CI:-}" = 'true' ]; then
        PGPASSWORD=postgres python bin/generate-fixture-data.py -U postgres -h localhost -p 5432 -d postgres
    else
        python bin/generate-fixture-data.py -U postgres -h "${TEST_HOST}" -p "${PGPORT}" -d postgres
    fi
    echo ' done.'

    printf "Creating test backups..."
    docker_exec /usr/bin/pg_dump -Fc -U postgres -f /data/dump.not-compressed -d postgres --compress=0
    docker_exec /usr/bin/pg_dump -Fc -U postgres -f /data/dump.compressed -d postgres --compress=9
    docker_exec /usr/bin/pg_dump -Fc -U postgres -f /data/dump.no-data -d postgres --compress=0 -s
    docker_exec /usr/bin/pg_dump -Fc -U postgres -f /data/dump.data-only -d postgres --compress=0 -a
    docker_exec /usr/bin/pg_dump -Fc -U postgres -f /data/dump.inserts -d postgres --compress=0 --inserts
    docker_exec rm -rf /data/dump.directory /data/dump.directory-compressed
    docker_exec /usr/bin/pg_dump -Fd -U postgres -f /data/dump.directory -d postgres --compress=0
    docker_exec /usr/bin/pg_dump -Fd -U postgres -f /data/dump.directory-compressed -d postgres --compress=9
    echo ' done.'

    printf "Fixing permissions..."
    docker_exec chmod -R a+rX /data
    echo ' done.'

# Generate test fixture dumps only (requires running postgres)
fixtures:
    #!/usr/bin/env bash
    set -euo pipefail
    export COMPOSE_DISABLE_ENV_FILE=1

    docker_exec() {
        if [ "${CI:-}" = 'true' ]; then
            docker exec -t postgres "$@"
        else
            docker compose exec postgres "$@"
        fi
    }

    mkdir -p build/data

    printf "Creating test backups..."
    docker_exec /usr/bin/pg_dump -Fc -U postgres -f /data/dump.not-compressed -d postgres --compress=0
    docker_exec /usr/bin/pg_dump -Fc -U postgres -f /data/dump.compressed -d postgres --compress=9
    docker_exec /usr/bin/pg_dump -Fc -U postgres -f /data/dump.no-data -d postgres --compress=0 -s
    docker_exec /usr/bin/pg_dump -Fc -U postgres -f /data/dump.data-only -d postgres --compress=0 -a
    docker_exec /usr/bin/pg_dump -Fc -U postgres -f /data/dump.inserts -d postgres --compress=0 --inserts
    docker_exec rm -rf /data/dump.directory /data/dump.directory-compressed
    docker_exec /usr/bin/pg_dump -Fd -U postgres -f /data/dump.directory -d postgres --compress=0
    docker_exec /usr/bin/pg_dump -Fd -U postgres -f /data/dump.directory-compressed -d postgres --compress=9
    echo ' done.'

    printf "Fixing permissions..."
    docker_exec chmod -R a+rX /data
    echo ' done.'