From 1a53f1bfa7890da76ac23ec61542d99ad396df8c Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Thu, 1 May 2025 15:03:57 -0700 Subject: [PATCH] feat: multi-ext-versions-pgvector --- nix/ext/pgvector.nix | 107 +++++++++++++++++++++++++++++++++---------- 1 file changed, 84 insertions(+), 23 deletions(-) diff --git a/nix/ext/pgvector.nix b/nix/ext/pgvector.nix index a7d58ec61..feed22b23 100644 --- a/nix/ext/pgvector.nix +++ b/nix/ext/pgvector.nix @@ -1,31 +1,92 @@ -{ lib, stdenv, fetchFromGitHub, postgresql }: +{ + lib, + stdenv, + fetchFromGitHub, + postgresql, + runCommand, +}: -stdenv.mkDerivation rec { +let pname = "pgvector"; - version = "0.8.0"; - buildInputs = [ postgresql ]; + meta = { + description = "Open-source vector similarity search for Postgres"; + homepage = "https://github.com/${pname}/${pname}"; + maintainers = with lib.maintainers; [ olirice ]; + inherit (postgresql.meta) platforms; + license = lib.licenses.postgresql; + }; - src = fetchFromGitHub { - owner = "pgvector"; - repo = pname; - rev = "refs/tags/v${version}"; - hash = "sha256-JsZV+I4eRMypXTjGmjCtMBXDVpqTIPHQa28ogXncE/Q="; + versions = { + "0.8.0" = "sha256-JsZV+I4eRMypXTjGmjCtMBXDVpqTIPHQa28ogXncE/Q="; + "0.7.4" = "sha256-qwPaguQUdDHV8q6GDneLq5MuhVroPizpbqt7f08gKJI="; }; - installPhase = '' - mkdir -p $out/{lib,share/postgresql/extension} + mkPackage = + version: hash: + stdenv.mkDerivation (finalAttrs: { + inherit pname version meta; - cp *${postgresql.dlSuffix} $out/lib - cp sql/*.sql $out/share/postgresql/extension - cp *.control $out/share/postgresql/extension - ''; + src = fetchFromGitHub { + owner = pname; + repo = pname; + rev = "refs/tags/v${finalAttrs.version}"; + inherit hash; + }; - meta = with lib; { - description = "Open-source vector similarity search for Postgres"; - homepage = "https://github.com/${src.owner}/${src.repo}"; - maintainers = with maintainers; [ olirice ]; - platforms = postgresql.meta.platforms; - license = licenses.postgresql; - }; -} + buildInputs = [ postgresql ]; + + postBuild = '' + cp sql/vector.sql vector--$version.sql + + sed -e "/^default_version =/d" \ + -e "s|^module_pathname = .*|module_pathname = '\$libdir/vector'|" \ + vector.control > vector--$version.control + ''; + + installPhase = '' + mkdir -p $out/{lib,share/postgresql/extension} + + install -Dm755 vector${postgresql.dlSuffix} $out/lib/vector-$version${postgresql.dlSuffix} + install -Dm644 vector--$version.sql $out/share/postgresql/extension/ + install -Dm644 vector--$version.control $out/share/postgresql/extension/ + ''; + }); + + packages = lib.listToAttrs ( + lib.attrValues ( + lib.mapAttrs (version: hash: lib.nameValuePair "v${version}" (mkPackage version hash)) versions + ) + ); +in +runCommand "${pname}-all" + { + inherit pname meta; + version = "multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings ["."] ["-"] v) (lib.attrNames versions)); + + buildInputs = lib.attrValues packages; + + passthru = { + inherit packages; + }; + } + '' + mkdir -p $out/{lib,share/postgresql/extension,bin} + + # Install all versions + for drv in ''${buildInputs[@]}; do + ln -sv $drv/lib/* $out/lib/ + cp -v --no-clobber $drv/share/postgresql/extension/* $out/share/postgresql/extension/ || true + done + + # Create default symlinks + latest_control=$(ls -v $out/share/postgresql/extension/vector--*.control | tail -n1) + latest_version=$(basename "$latest_control" | sed -E 's/vector--([0-9.]+).control/\1/') + + # Create main control file with default_version + echo "default_version = '$latest_version'" > $out/share/postgresql/extension/vector.control + cat "$latest_control" >> $out/share/postgresql/extension/vector.control + + # Library symlink + ln -sfnv vector$latest_version${postgresql.dlSuffix} $out/lib/vector${postgresql.dlSuffix} + ''