Skip to content

Commit 09cb3a9

Browse files
committed
tests: testing out building/installing multiple ext version for pg_cron
1 parent 79c663b commit 09cb3a9

File tree

1 file changed

+86
-18
lines changed

1 file changed

+86
-18
lines changed

nix/ext/pg_cron.nix

Lines changed: 86 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,100 @@
11
{ lib, stdenv, fetchFromGitHub, postgresql }:
22

3-
stdenv.mkDerivation rec {
4-
pname = "pg_cron";
5-
version = "1.6.4";
3+
let
4+
allVersions = {
5+
"1.6.4" = {
6+
rev = "v1.6.4";
7+
hash = "sha256-t1DpFkPiSfdoGG2NgNT7g1lkvSooZoRoUrix6cBID40=";
8+
};
9+
"1.5.2" = {
10+
rev = "v1.5.2";
11+
hash = "sha256-+quVWbKJy6wXpL/zwTk5FF7sYwHA7I97WhWmPO/HSZ4=";
12+
};
13+
};
14+
15+
mkPgCron = pgCronVersion: { rev, hash }: stdenv.mkDerivation {
16+
pname = "pg_cron";
17+
version = "${pgCronVersion}-pg${lib.versions.major postgresql.version}";
18+
19+
buildInputs = [ postgresql ];
620

7-
buildInputs = [ postgresql ];
21+
src = fetchFromGitHub {
22+
owner = "citusdata";
23+
repo = "pg_cron";
24+
inherit rev hash;
25+
};
826

9-
src = fetchFromGitHub {
10-
owner = "citusdata";
11-
repo = pname;
12-
rev = "v${version}";
13-
hash = "sha256-t1DpFkPiSfdoGG2NgNT7g1lkvSooZoRoUrix6cBID40=";
27+
buildPhase = ''
28+
make PG_CONFIG=${postgresql}/bin/pg_config
29+
30+
# Create version-specific SQL file
31+
cp pg_cron.sql pg_cron--${pgCronVersion}.sql
32+
33+
# Create versioned control file with modified module path
34+
sed -e "/^default_version =/d" \
35+
-e "s|^module_pathname = .*|module_pathname = '\$libdir/pg_cron'|" \
36+
pg_cron.control > pg_cron--${pgCronVersion}.control
37+
'';
38+
39+
installPhase = ''
40+
mkdir -p $out/{lib,share/postgresql/extension}
41+
42+
# Install versioned library
43+
install -Dm755 pg_cron${postgresql.dlSuffix} $out/lib/pg_cron-${pgCronVersion}${postgresql.dlSuffix}
44+
45+
# Install version-specific files
46+
install -Dm644 pg_cron--${pgCronVersion}.sql $out/share/postgresql/extension/
47+
install -Dm644 pg_cron--${pgCronVersion}.control $out/share/postgresql/extension/
48+
49+
# Install upgrade scripts
50+
find . -name 'pg_cron--*--*.sql' -exec install -Dm644 {} $out/share/postgresql/extension/ \;
51+
'';
1452
};
1553

54+
getVersions = pg:
55+
if lib.versionAtLeast pg.version "17"
56+
then { "1.6.4" = allVersions."1.6.4"; }
57+
else allVersions;
58+
59+
allVersionsForPg = lib.mapAttrs mkPgCron (getVersions postgresql);
60+
61+
in
62+
stdenv.mkDerivation {
63+
pname = "pg_cron-all";
64+
version = "multi";
65+
66+
buildInputs = lib.attrValues allVersionsForPg;
67+
68+
dontUnpack = true;
69+
dontConfigure = true;
70+
dontBuild = true;
71+
1672
installPhase = ''
1773
mkdir -p $out/{lib,share/postgresql/extension}
18-
19-
cp *${postgresql.dlSuffix} $out/lib
20-
cp *.sql $out/share/postgresql/extension
21-
cp *.control $out/share/postgresql/extension
74+
75+
# Install all versions
76+
for drv in ${lib.concatStringsSep " " (lib.attrValues allVersionsForPg)}; do
77+
ln -sv $drv/lib/* $out/lib/
78+
cp -v --no-clobber $drv/share/postgresql/extension/* $out/share/postgresql/extension/ || true
79+
done
80+
81+
# Create default symlinks
82+
latest_control=$(ls -v $out/share/postgresql/extension/pg_cron--*.control | tail -n1)
83+
latest_version=$(basename "$latest_control" | sed -E 's/pg_cron--([0-9.]+).control/\1/')
84+
85+
# Create main control file with default_version
86+
echo "default_version = '$latest_version'" > $out/share/postgresql/extension/pg_cron.control
87+
cat "$latest_control" >> $out/share/postgresql/extension/pg_cron.control
88+
89+
# Library symlink
90+
ln -sfnv pg_cron-$latest_version${postgresql.dlSuffix} $out/lib/pg_cron${postgresql.dlSuffix}
2291
'';
2392

2493
meta = with lib; {
25-
description = "Run Cron jobs through PostgreSQL";
26-
homepage = "https://github.com/citusdata/pg_cron";
27-
changelog = "https://github.com/citusdata/pg_cron/raw/v${version}/CHANGELOG.md";
94+
description = "Run Cron jobs through PostgreSQL (multi-version compatible)";
95+
homepage = "https://github.com/citusdata/pg_cron";
2896
maintainers = with maintainers; [ samrose ];
29-
platforms = postgresql.meta.platforms;
30-
license = licenses.postgresql;
97+
platforms = postgresql.meta.platforms;
98+
license = licenses.postgresql;
3199
};
32100
}

0 commit comments

Comments
 (0)