77 postgresql ,
88 libuv ,
99 writeShellApplication ,
10+ makeWrapper ,
1011} :
1112
1213let
14+ enableOverlayOnPackage = writeShellApplication {
15+ name = "enable_overlay_on_package" ;
16+ runtimeInputs = [ pkgs . coreutils ] ;
17+ text = ''
18+ # This script enable overlayfs on a specific nix store path
19+ set -euo pipefail
20+
21+ if [ $# -ne 1 ]; then
22+ echo "Usage: $0 <path>"
23+ exit 1
24+ fi
25+
26+ PACKAGE_PATH="$1"
27+ PACKAGE_NAME=$(basename "$1"|cut -c 34-)
28+
29+ # Nixos compatibility: use systemd mount unit
30+ #shellcheck disable=SC1091
31+ source /etc/os-release || true
32+ if [[ "$ID" == "nixos" ]]; then
33+ # This script is used in NixOS test only for the moment
34+ SYSTEMD_DIR="/run/systemd/system"
35+ else
36+ SYSTEMD_DIR="/etc/systemd/system"
37+ fi
38+
39+ # Create required directories for overlay
40+ echo "$PACKAGE_NAME"
41+ mkdir -p "/var/lib/overlay/$PACKAGE_NAME/"{upper,work}
42+
43+ PACKAGE_MOUNT_PATH=$(systemd-escape -p --suffix=mount "$PACKAGE_PATH")
44+
45+ cat > "$SYSTEMD_DIR/$PACKAGE_MOUNT_PATH" <<EOF
46+ [Unit]
47+ Description=Overlay mount for PostgreSQL extension $PACKAGE_NAME
48+
49+ [Mount]
50+ What=overlay
51+ Type=overlay
52+ Options=lowerdir=$PACKAGE_PATH,upperdir=/var/lib/overlay/$PACKAGE_NAME/upper,workdir=/var/lib/overlay/$PACKAGE_NAME/work
53+
54+ [Install]
55+ WantedBy=multi-user.target
56+ EOF
57+
58+ systemctl daemon-reload
59+ systemctl start "$PACKAGE_MOUNT_PATH"
60+ '' ;
61+ } ;
1362 switchPgNetVersion = writeShellApplication {
1463 name = "switch_pg_net_version" ;
1564 runtimeInputs = [ pkgs . coreutils ] ;
1665 text = ''
1766 # Create version switcher script
18- set -e
67+ set -euo pipefail
68+
69+ # Check if the required environment variables are set
70+ if [ -z "'' ${EXT_WRAPPER:-}" ]; then
71+ echo "Error: EXT_WRAPPER environment variable is not set."
72+ exit 1
73+ fi
1974
2075 if [ $# -ne 1 ]; then
2176 echo "Usage: $0 <version>"
2883 exit 1
2984 fi
3085
31- VERSION=$1
32-
33- # Set defaults, allow environment variable overrides
34- : "'' ${NIX_PROFILE:="/var/lib/postgresql/.nix-profile"}"
35- : "'' ${LIB_DIR:=""}"
36- : "'' ${EXTENSION_DIR:=""}"
37-
38- # If LIB_DIR not explicitly set, auto-detect it
39- if [ -z "$LIB_DIR" ]; then
40- # Follow the complete chain of symlinks to find the multi-version directory
41- CURRENT_LINK="$NIX_PROFILE/lib/pg_net-$VERSION${ postgresql . dlSuffix } "
42- echo "Starting with link: $CURRENT_LINK"
43-
44- # Follow first two symlinks to get to the multi-version directory
45- for _ in 1 2; do
46- if [ -L "$CURRENT_LINK" ]; then
47- NEXT_LINK=$(readlink "$CURRENT_LINK")
48- echo "Following link: $NEXT_LINK"
49- if echo "$NEXT_LINK" | grep -q '^/'; then
50- CURRENT_LINK="$NEXT_LINK"
51- else
52- CURRENT_LINK="$(dirname "$CURRENT_LINK")/$NEXT_LINK"
53- fi
54- echo "Current link is now: $CURRENT_LINK"
55- fi
56- done
57-
58- # The multi-version directory should be the parent of the current link
59- MULTI_VERSION_DIR=$(dirname "$CURRENT_LINK")
60- echo "Found multi-version directory: $MULTI_VERSION_DIR"
61- LIB_DIR="$MULTI_VERSION_DIR"
62- else
63- echo "Using provided LIB_DIR: $LIB_DIR"
64- fi
86+ VERSION="$1"
87+ echo "$VERSION"
6588
66- # If EXTENSION_DIR not explicitly set, use default
67- if [ -z "$EXTENSION_DIR" ]; then
68- EXTENSION_DIR="$NIX_PROFILE/share/postgresql/extension"
69- fi
70- echo "Using EXTENSION_DIR: $EXTENSION_DIR"
71-
72- echo "Looking for file: $LIB_DIR/pg_net-$VERSION${ postgresql . dlSuffix } "
73- ls -la "$LIB_DIR" || true
89+ # Enable overlay on the wrapper package to be able to switch version
90+ ${ lib . getExe enableOverlayOnPackage } "$EXT_WRAPPER"
7491
7592 # Check if version exists
76- if [ ! -f "$LIB_DIR/pg_net-$VERSION${ postgresql . dlSuffix } " ]; then
77- echo "Error: Version $VERSION not found in $LIB_DIR"
93+ EXT_WRAPPER_LIB="$EXT_WRAPPER/lib"
94+ PG_NET_LIB_TO_USE="$EXT_WRAPPER_LIB/pg_net-$VERSION${ postgresql . dlSuffix } "
95+ if [ ! -f "$PG_NET_LIB_TO_USE" ]; then
96+ echo "Error: Version $VERSION not found in $EXT_WRAPPER_LIB"
7897 echo "Available versions:"
7998 #shellcheck disable=SC2012
80- ls "$LIB_DIR "/pg_net-*${ postgresql . dlSuffix } 2>/dev/null | sed 's/.*pg_net-/ /' | sed 's/${ postgresql . dlSuffix } $//' || echo " No versions found"
99+ ls "$EXT_WRAPPER_LIB "/pg_net-*${ postgresql . dlSuffix } 2>/dev/null | sed 's/.*pg_net-/ /' | sed 's/${ postgresql . dlSuffix } $//' || echo " No versions found"
81100 exit 1
82101 fi
83102
84103 # Update library symlink
85- ln -sfnv "pg_net-$VERSION ${ postgresql . dlSuffix } " "$LIB_DIR /pg_net${ postgresql . dlSuffix } "
104+ ln -sfnv "$PG_NET_LIB_TO_USE " "$EXT_WRAPPER_LIB /pg_net${ postgresql . dlSuffix } "
86105
87106 # Update control file
88- echo "default_version = '$VERSION'" > "$EXTENSION_DIR/pg_net.control"
89- cat "$EXTENSION_DIR/pg_net--$VERSION.control" >> "$EXTENSION_DIR/pg_net.control"
107+ EXT_WRAPPER_SHARE="$EXT_WRAPPER/share/postgresql/extension"
108+ echo "default_version = '$VERSION'" > "$EXT_WRAPPER_SHARE/pg_net.control"
109+ cat "$EXT_WRAPPER_SHARE/pg_net--$VERSION.control" >> "$EXT_WRAPPER_SHARE/pg_net.control"
90110
91111 echo "Successfully switched pg_net to version $VERSION"
92- EOF
93112 '' ;
94113 } ;
95114 pname = "pg_net" ;
175194in
176195pkgs . buildEnv {
177196 name = pname ;
178- paths = packages ++ [ switchPgNetVersion ] ;
197+ paths = packages ;
198+ nativeBuildInputs = [ makeWrapper ] ;
179199 postBuild = ''
180200 {
181201 echo "default_version = '${ latestVersion } '"
@@ -190,6 +210,9 @@ pkgs.buildEnv {
190210 toString ( numberOfVersions + 1 )
191211 } "
192212 )
213+
214+ makeWrapper ${ lib . getExe switchPgNetVersion } $out/bin/switch_pg_net_version \
215+ --prefix EXT_WRAPPER : "$out"
193216 '' ;
194217
195218 passthru = {
0 commit comments