#!/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() { info "Running jspg tests..." cargo pgrx test "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\t\tRun pgrx 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) test "${@:2}"; return $?;; clean) clean; return $?;; *) return 1 ;; esac } register-flow "jspg-usage" "jspg-flow" dispatch "$@"