#!/usr/bin/env bash # Flows source ./flows/base source ./flows/git source ./flows/kube source ./flows/packaging source ./flows/rust # Vars POSTGRES_VERSION="17" POSTGRES_CONFIG_PATH="/opt/homebrew/opt/postgresql@${POSTGRES_VERSION}/bin/pg_config" DEPENDENCIES+=(icu4c pkg-config "postgresql@${POSTGRES_VERSION}") CARGO_DEPENDENCIES=(cargo-pgrx==0.15.0) GITEA_ORGANIZATION="cellular" GITEA_REPOSITORY="jspg" pgrx-prepare() { info "Initializing pgrx..." # Explicitly point to the postgresql@${POSTGRES_VERSION} pg_config, don't rely on 'which' local POSTGRES_CONFIG_PATH="/opt/homebrew/opt/postgresql@${POSTGRES_VERSION}/bin/pg_config" if [ ! -x "$POSTGRES_CONFIG_PATH" ]; then error "pg_config not found or not executable at $POSTGRES_CONFIG_PATH." warning "Ensure postgresql@${POSTGRES_VERSION} is installed correctly via Homebrew." return 2 fi if cargo pgrx init --pg"$POSTGRES_VERSION"="$POSTGRES_CONFIG_PATH"; then success "pgrx initialized successfully." else error "Failed to initialize pgrx. Check PostgreSQL development packages are installed and $POSTGRES_CONFIG_PATH is valid." return 2 fi } build() { local version version=$(get-version) || return $? local package_dir="./package" local tarball_name="${GITEA_REPOSITORY}.tar.gz" local tarball_path="${package_dir}/${tarball_name}" info "Creating source tarball v$version for ${GITEA_REPOSITORY} in $package_dir..." # Clean previous package dir rm -rf "${package_dir}" mkdir -p "${package_dir}" # Create the source tarball excluding specified patterns info "Creating tarball: ${tarball_path}" if tar --exclude='.git*' --exclude='./target' --exclude='./package' --exclude='./flows' --exclude='./flow' -czf "${tarball_path}" .; then success "Successfully created source tarball: ${tarball_path}" else error "Failed to create source tarball." return 2 fi } install() { local version version=$(get-version) || return $? # Propagate error info "Building and installing PGRX extension v$version into local PostgreSQL..." # Run the pgrx install command if ! cargo pgrx install; then error "cargo pgrx install command failed." return 2 fi success "PGRX extension v$version successfully built and installed." # Post-install modification to allow non-superuser usage local pg_sharedir pg_sharedir=$("$POSTGRES_CONFIG_PATH" --sharedir) local pg_config_status=$? if [ $pg_config_status -ne 0 ] || [ -z "$pg_sharedir" ]; then error "Failed to determine PostgreSQL shared directory using pg_config." return 2 fi local installed_control_path="${pg_sharedir}/extension/jspg.control" # Modify the control file if [ ! -f "$installed_control_path" ]; then error "Installed control file not found: '$installed_control_path'" return 2 fi info "Modifying control file for non-superuser access: ${installed_control_path}" # Use sed -i '' for macOS compatibility if sed -i '' '/^superuser = false/d' "$installed_control_path" && \ echo 'trusted = true' >> "$installed_control_path"; then success "Control file modified successfully." else error "Failed to modify control file: ${installed_control_path}" return 2 fi } test-jspg() { info "Running jspg tests..." cargo pgrx test "pg${POSTGRES_VERSION}" "$@" || return $? } test-validator() { info "Running validator tests..." cargo test -p boon --features "pgrx/pg${POSTGRES_VERSION}" "$@" || return $? } clean() { info "Cleaning build artifacts..." cargo clean || return $? } jspg-usage() { printf "prepare\tCheck OS, Cargo, and PGRX dependencies.\n" printf "install\tBuild and install the extension locally (after prepare).\n" printf "reinstall\tClean, build, and install the extension locally (after prepare).\n" printf "test-jspg\t\tRun pgrx integration tests.\n" printf "test-validator\t\tRun validator integration tests.\n" printf "clean\t\tRemove pgrx build artifacts.\n" } jspg-flow() { case "$1" in prepare) prepare && cargo-prepare && pgrx-prepare; return $?;; build) build; return $?;; install) install; return $?;; reinstall) clean && install; return $?;; test-jspg) test-jspg "${@:2}"; return $?;; test-validator) test-validator "${@:2}"; return $?;; clean) clean; return $?;; *) return 1 ;; esac } register-flow "jspg-usage" "jspg-flow" dispatch "$@"