From 43f6044f030d665bc6a7b9483d760b8696279c11 Mon Sep 17 00:00:00 2001 From: Yvan Sraka Date: Mon, 16 Jun 2025 10:26:20 +0200 Subject: [PATCH 1/2] feat: multiple versions for the timescaledb-apache extension --- .gitignore | 2 + flake.nix | 19 +++--- nix/ext/timescaledb-2.9.1.nix | 50 -------------- nix/ext/timescaledb.nix | 125 ++++++++++++++++++++++++---------- nix/ext/versions.json | 16 +++++ nix/tests/timescaledb.nix | 59 ++++++++++++++++ 6 files changed, 175 insertions(+), 96 deletions(-) delete mode 100644 nix/ext/timescaledb-2.9.1.nix create mode 100644 nix/ext/versions.json create mode 100644 nix/tests/timescaledb.nix diff --git a/.gitignore b/.gitignore index d32cc8f60..9f7b68818 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ result* db/schema.sql common-nix.vars.pkr.hcl + +.envrc diff --git a/flake.nix b/flake.nix index a7f48d58c..6445eec0a 100644 --- a/flake.nix +++ b/flake.nix @@ -111,7 +111,7 @@ /*"postgis"*/ ]; - #FIXME for now, timescaledb is not included in the orioledb version of supabase extensions, as there is an issue + # FIXME for now, timescaledb is not included in the orioledb version of supabase extensions, as there is an issue # with building timescaledb with the orioledb patched version of postgresql orioledbPsqlExtensions = [ /* pljava */ @@ -130,7 +130,6 @@ ourExtensions = [ ./nix/ext/rum.nix ./nix/ext/timescaledb.nix - ./nix/ext/timescaledb-2.9.1.nix ./nix/ext/pgroonga.nix ./nix/ext/index_advisor.nix ./nix/ext/wal2json.nix @@ -161,16 +160,13 @@ ./nix/ext/plv8.nix ]; - #Where we import and build the orioledb extension, we add on our custom extensions - # plus the orioledb option - #we're not using timescaledb or plv8 in the orioledb-17 version or pg 17 of supabase extensions + # Where we import and build the orioledb extension, we add on our + # custom extensions plus the orioledb option. We're not using + # timescaledb or plv8 in the orioledb-17 version or pg 17 of supabase + # extensions orioleFilteredExtensions = builtins.filter - ( - x: - x != ./nix/ext/timescaledb.nix && - x != ./nix/ext/timescaledb-2.9.1.nix && - x != ./nix/ext/plv8.nix - ) ourExtensions; + (x: x != ./nix/ext/timescaledb.nix && x != ./nix/ext/plv8.nix) + ourExtensions; orioledbExtensions = orioleFilteredExtensions ++ [ ./nix/ext/orioledb.nix ]; dbExtensions17 = orioleFilteredExtensions; @@ -1377,6 +1373,7 @@ # The list of exported 'checks' that are run with every run of 'nix # flake check'. This is run in the CI system, as well. checks = { + timescaledb = import ./nix/tests/timescaledb.nix { inherit self; inherit pkgs; }; psql_15 = makeCheckHarness basePackages.psql_15.bin; psql_17 = makeCheckHarness basePackages.psql_17.bin; psql_orioledb-17 = makeCheckHarness basePackages.psql_orioledb-17.bin; diff --git a/nix/ext/timescaledb-2.9.1.nix b/nix/ext/timescaledb-2.9.1.nix deleted file mode 100644 index 92d5d73fe..000000000 --- a/nix/ext/timescaledb-2.9.1.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ lib, stdenv, fetchFromGitHub, cmake, postgresql, openssl, libkrb5 }: - -stdenv.mkDerivation rec { - pname = "timescaledb-apache"; - version = "2.9.1"; - - nativeBuildInputs = [ cmake ]; - buildInputs = [ postgresql openssl libkrb5 ]; - - src = fetchFromGitHub { - owner = "timescale"; - repo = "timescaledb"; - rev = version; - hash = "sha256-fvVSxDiGZAewyuQ2vZDb0I6tmlDXl6trjZp8+qDBtb8="; - }; - - cmakeFlags = [ "-DSEND_TELEMETRY_DEFAULT=OFF" "-DREGRESS_CHECKS=OFF" "-DTAP_CHECKS=OFF" "-DAPACHE_ONLY=1" ] - ++ lib.optionals stdenv.isDarwin [ "-DLINTER=OFF" ]; - - # Fix the install phase which tries to install into the pgsql extension dir, - # and cannot be manually overridden. This is rather fragile but works OK. - postPatch = '' - for x in CMakeLists.txt sql/CMakeLists.txt; do - substituteInPlace "$x" \ - --replace 'DESTINATION "''${PG_SHAREDIR}/extension"' "DESTINATION \"$out/share/postgresql/extension\"" - done - - for x in src/CMakeLists.txt src/loader/CMakeLists.txt tsl/src/CMakeLists.txt; do - substituteInPlace "$x" \ - --replace 'DESTINATION ''${PG_PKGLIBDIR}' "DESTINATION \"$out/lib\"" - done - ''; - - - # timescaledb-2.9.1.so already exists in the lib directory - # we have no need for the timescaledb.so or control file - postInstall = '' - rm $out/lib/timescaledb.so - rm $out/share/postgresql/extension/timescaledb.control - ''; - - meta = with lib; { - description = "Scales PostgreSQL for time-series data via automatic partitioning across time and space"; - homepage = "https://www.timescale.com/"; - changelog = "https://github.com/timescale/timescaledb/blob/${version}/CHANGELOG.md"; - platforms = postgresql.meta.platforms; - license = licenses.asl20; - broken = versionOlder postgresql.version "13"; - }; -} diff --git a/nix/ext/timescaledb.nix b/nix/ext/timescaledb.nix index 1d7360762..204ce5451 100644 --- a/nix/ext/timescaledb.nix +++ b/nix/ext/timescaledb.nix @@ -1,42 +1,97 @@ -{ lib, stdenv, fetchFromGitHub, cmake, postgresql, openssl, libkrb5 }: +{ pkgs, lib, stdenv, fetchFromGitHub, cmake, postgresql, openssl, libkrb5 }: -stdenv.mkDerivation rec { - pname = "timescaledb-apache"; - version = "2.16.1"; +let + pname = "timescaledb"; + build = version: hash: revision: + stdenv.mkDerivation rec { + inherit pname version; - nativeBuildInputs = [ cmake ]; - buildInputs = [ postgresql openssl libkrb5 ]; + nativeBuildInputs = [ cmake ]; + buildInputs = [ postgresql openssl libkrb5 ]; - src = fetchFromGitHub { - owner = "timescale"; - repo = "timescaledb"; - rev = version; - hash = "sha256-sLxWdBmih9mgiO51zLLxn9uwJVYc5JVHJjSWoADoJ+w="; - }; + src = fetchFromGitHub { + owner = "timescale"; + repo = "timescaledb"; + rev = version; + inherit hash; + }; - cmakeFlags = [ "-DSEND_TELEMETRY_DEFAULT=OFF" "-DREGRESS_CHECKS=OFF" "-DTAP_CHECKS=OFF" "-DAPACHE_ONLY=1" ] - ++ lib.optionals stdenv.isDarwin [ "-DLINTER=OFF" ]; - - # Fix the install phase which tries to install into the pgsql extension dir, - # and cannot be manually overridden. This is rather fragile but works OK. - postPatch = '' - for x in CMakeLists.txt sql/CMakeLists.txt; do - substituteInPlace "$x" \ - --replace 'DESTINATION "''${PG_SHAREDIR}/extension"' "DESTINATION \"$out/share/postgresql/extension\"" - done - - for x in src/CMakeLists.txt src/loader/CMakeLists.txt tsl/src/CMakeLists.txt; do - substituteInPlace "$x" \ - --replace 'DESTINATION ''${PG_PKGLIBDIR}' "DESTINATION \"$out/lib\"" - done - ''; + cmakeFlags = [ + "-DSEND_TELEMETRY_DEFAULT=OFF" + "-DREGRESS_CHECKS=OFF" + "-DTAP_CHECKS=OFF" + "-DAPACHE_ONLY=1" + ] ++ lib.optionals stdenv.isDarwin [ "-DLINTER=OFF" ]; + + postPatch = '' + for x in CMakeLists.txt sql/CMakeLists.txt; do + if [ -f "$x" ]; then + substituteInPlace "$x" \ + --replace 'DESTINATION "''${PG_SHAREDIR}/extension"' "DESTINATION \"$out/share/postgresql/extension\"" + fi + done + + for x in src/CMakeLists.txt src/loader/CMakeLists.txt tsl/src/CMakeLists.txt; do + if [ -f "$x" ]; then + substituteInPlace "$x" \ + --replace 'DESTINATION ''${PG_PKGLIBDIR}' "DESTINATION \"$out/lib\"" + fi + done + ''; - meta = with lib; { - description = "Scales PostgreSQL for time-series data via automatic partitioning across time and space"; - homepage = "https://www.timescale.com/"; - changelog = "https://github.com/timescale/timescaledb/blob/${version}/CHANGELOG.md"; - platforms = postgresql.meta.platforms; - license = licenses.asl20; - broken = versionOlder postgresql.version "13"; + postInstall = '' + if [ -f $out/lib/timescaledb.so ]; then + mv $out/lib/timescaledb.so $out/lib/timescaledb-${version}.so + fi + if [ -f $out/share/postgresql/extension/timescaledb.control ]; then + mv $out/share/postgresql/extension/timescaledb.control $out/share/postgresql/extension/timescaledb--${version}.control + fi + ''; + + meta = with lib; { + description = + "Scales PostgreSQL for time-series data via automatic partitioning across time and space"; + homepage = "https://www.timescale.com/"; + changelog = + "https://github.com/timescale/timescaledb/blob/${version}/CHANGELOG.md"; + license = licenses.postgresql; + inherit (postgresql.meta) platforms; + }; + }; + + allVersions = + (builtins.fromJSON (builtins.readFile ./versions.json)).timescaledb; + supportedVersions = lib.filterAttrs (_: value: + builtins.elem (lib.versions.major postgresql.version) value.postgresql) + allVersions; + versions = lib.naturalSort (lib.attrNames supportedVersions); + latestVersion = lib.last versions; + numberOfVersions = builtins.length versions; + packages = builtins.attrValues + (lib.mapAttrs (name: value: build name value.hash (value.revision or name)) + supportedVersions); +in pkgs.buildEnv { + name = pname; + paths = packages; + postBuild = '' + { + echo "default_version = '${latestVersion}'" + cat $out/share/postgresql/extension/${pname}--${latestVersion}.control + } > $out/share/postgresql/extension/${pname}.control + ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix} + + # checks + (set -x + test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${ + toString (numberOfVersions + 1) + }" + ) + ''; + pathsToLink = [ "/lib" "/share/postgresql/extension" ]; + passthru = { + inherit versions numberOfVersions; + pname = "${pname}-all"; + version = "multi-" + lib.concatStringsSep "-" + (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions); }; } diff --git a/nix/ext/versions.json b/nix/ext/versions.json new file mode 100644 index 000000000..742e2f4af --- /dev/null +++ b/nix/ext/versions.json @@ -0,0 +1,16 @@ +{ + "timescaledb": { + "2.9.1": { + "postgresql": [ + "15" + ], + "hash": "sha256-fvVSxDiGZAewyuQ2vZDb0I6tmlDXl6trjZp8+qDBtb8=" + }, + "2.16.1": { + "postgresql": [ + "15" + ], + "hash": "sha256-sLxWdBmih9mgiO51zLLxn9uwJVYc5JVHJjSWoADoJ+w=" + } + } +} diff --git a/nix/tests/timescaledb.nix b/nix/tests/timescaledb.nix new file mode 100644 index 000000000..c66ffae01 --- /dev/null +++ b/nix/tests/timescaledb.nix @@ -0,0 +1,59 @@ +{ self, pkgs }: +let + inherit (pkgs) lib; + installedExtension = postgresMajorVersion: + self.packages.${pkgs.system}."psql_${postgresMajorVersion}/exts/timescaledb-all"; + versions = (installedExtension "15").versions; + firstVersion = lib.head versions; + latestVersion = lib.last versions; + postgresqlWithExtension = postgresql: + let + majorVersion = lib.versions.major postgresql.version; + pkg = pkgs.buildEnv { + name = "postgresql-${majorVersion}-timescaledb"; + paths = [ postgresql postgresql.lib (installedExtension majorVersion) ]; + passthru = { + inherit (postgresql) version psqlSchema; + lib = pkg; + withPackages = _: pkg; + }; + nativeBuildInputs = [ pkgs.makeWrapper ]; + pathsToLink = [ "/" "/bin" "/lib" ]; + postBuild = '' + wrapProgram $out/bin/postgres --set NIX_PGLIBDIR $out/lib + wrapProgram $out/bin/pg_ctl --set NIX_PGLIBDIR $out/lib + wrapProgram $out/bin/pg_upgrade --set NIX_PGLIBDIR $out/lib + ''; + }; + in pkg; +in self.inputs.nixpkgs.lib.nixos.runTest { + name = "timescaledb"; + hostPkgs = pkgs; + nodes.server = { config, ... }: { + virtualisation = { + forwardPorts = [{ + from = "host"; + host.port = 13022; + guest.port = 22; + }]; + }; + services.openssh = { enable = true; }; + users.users.root.openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIArkmq6Th79Z4klW6Urgi4phN8yq769/l/10jlE00tU9" + ]; + + services.postgresql = { + enable = true; + package = + postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15; + settings = { shared_preload_libraries = "timescaledb"; }; + }; + + specialisation.postgresql15.configuration = { + services.postgresql = { + package = lib.mkForce + (postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15); + }; + }; + }; +} From de5c654f69662bb855534932a2e99d4c0f60adaa Mon Sep 17 00:00:00 2001 From: Yvan Sraka Date: Mon, 16 Jun 2025 18:22:46 +0200 Subject: [PATCH 2/2] chore: add script to update versions.json --- nix/ext/timescaledb.nix | 5 +- nix/ext/update_versions_json.py | 90 +++++++ nix/ext/versions.json | 414 ++++++++++++++++++++++++++++++++ 3 files changed, 507 insertions(+), 2 deletions(-) create mode 100755 nix/ext/update_versions_json.py diff --git a/nix/ext/timescaledb.nix b/nix/ext/timescaledb.nix index 204ce5451..cc80fc5ae 100644 --- a/nix/ext/timescaledb.nix +++ b/nix/ext/timescaledb.nix @@ -62,8 +62,9 @@ let allVersions = (builtins.fromJSON (builtins.readFile ./versions.json)).timescaledb; supportedVersions = lib.filterAttrs (_: value: - builtins.elem (lib.versions.major postgresql.version) value.postgresql) - allVersions; + (!value ? ignore || value.ignore != true) && + builtins.elem (lib.versions.major postgresql.version) value.postgresql + ) allVersions; versions = lib.naturalSort (lib.attrNames supportedVersions); latestVersion = lib.last versions; numberOfVersions = builtins.length versions; diff --git a/nix/ext/update_versions_json.py b/nix/ext/update_versions_json.py new file mode 100755 index 000000000..85d25d6b1 --- /dev/null +++ b/nix/ext/update_versions_json.py @@ -0,0 +1,90 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i python3 -p python3 git nix-prefetch-git python3Packages.packaging + +import subprocess +import json +import argparse +from pathlib import Path +from typing import Dict, List, Union +from packaging.version import parse as parse_version, InvalidVersion + +Schema = Dict[str, Dict[str, Dict[str, Union[List[str], str, bool]]]] + +POSTGRES_VERSIONS: List[str] = ["15", "17"] +VERSIONS_JSON_PATH = "versions.json" + + +def run(cmd: List[str]) -> str: + result = subprocess.run(cmd, capture_output=True, text=True, check=True) + return result.stdout.strip() + + +def get_tags(url: str) -> Dict[str, str]: + output = run(["git", "ls-remote", "--tags", url]) + tags: Dict[str, str] = {} + for line in output.splitlines(): + if "^{}" not in line: + parts = line.split("\t") + if len(parts) == 2: + commit_hash, ref = parts + if ref.startswith("refs/tags/"): + tag = ref.removeprefix("refs/tags/") + try: + parse_version(tag) + except InvalidVersion: + continue + tags[tag] = commit_hash + return tags + + +def get_sri_hash(url: str, commit_hash: str) -> str: + output = run(["nix-prefetch-git", "--quiet", "--url", url, "--rev", commit_hash]) + nix_hash = json.loads(output)["sha256"] + return "sha256-" + run(["nix", "hash", "to-base64", "--type", "sha256", nix_hash]) + + +def load() -> Schema: + if not Path(VERSIONS_JSON_PATH).exists(): + return {} + with open(VERSIONS_JSON_PATH, "r", encoding="utf-8") as f: + return json.load(f) + + +def build(name: str, url: str, data: Schema, ignore: bool = False) -> Schema: + tags = get_tags(url) + versions = data.get(name, {}) + for tag, commit_hash in tags.items(): + if tag in versions: + continue + if ignore: + versions[tag] = {"ignore": True} + else: + sri_hash = get_sri_hash(url, commit_hash) + versions[tag] = {"postgresql": POSTGRES_VERSIONS, "hash": sri_hash} + data[name] = versions + return data + + +def save(data: Schema) -> None: + sorted_data = {} + for name, versions in data.items(): + sorted_data[name] = dict( + sorted(versions.items(), key=lambda item: parse_version(item[0])) + ) + with open(VERSIONS_JSON_PATH, "w", encoding="utf-8") as f: + json.dump(sorted_data, f, indent=2) + f.write("\n") + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("extension_name") + parser.add_argument("git_repo_url") + parser.add_argument("--ignore", action="store_true") + args = parser.parse_args() + + save(build(args.extension_name, args.git_repo_url, load(), ignore=args.ignore)) + + +if __name__ == "__main__": + main() diff --git a/nix/ext/versions.json b/nix/ext/versions.json index 742e2f4af..d2356e7d4 100644 --- a/nix/ext/versions.json +++ b/nix/ext/versions.json @@ -1,16 +1,430 @@ { "timescaledb": { + "0.0.1-beta": { + "ignore": true + }, + "0.0.2-beta": { + "ignore": true + }, + "0.0.3-beta": { + "ignore": true + }, + "0.0.4-beta": { + "ignore": true + }, + "0.0.5-beta": { + "ignore": true + }, + "0.0.6-beta": { + "ignore": true + }, + "0.0.7-beta": { + "ignore": true + }, + "0.0.8-beta": { + "ignore": true + }, + "0.0.9-beta": { + "ignore": true + }, + "0.0.10-beta": { + "ignore": true + }, + "0.0.11-beta": { + "ignore": true + }, + "0.0.12-beta": { + "ignore": true + }, + "0.1.0": { + "ignore": true + }, + "0.2.0": { + "ignore": true + }, + "0.3.0": { + "ignore": true + }, + "0.4.0": { + "ignore": true + }, + "0.4.1": { + "ignore": true + }, + "0.4.2": { + "ignore": true + }, + "0.5.0": { + "ignore": true + }, + "0.6.0": { + "ignore": true + }, + "0.6.1": { + "ignore": true + }, + "0.7.0": { + "ignore": true + }, + "0.7.1": { + "ignore": true + }, + "0.8.0": { + "ignore": true + }, + "0.9.0": { + "ignore": true + }, + "0.9.1": { + "ignore": true + }, + "0.9.2": { + "ignore": true + }, + "0.10.0": { + "ignore": true + }, + "0.10.1": { + "ignore": true + }, + "0.11.0": { + "ignore": true + }, + "0.12.0": { + "ignore": true + }, + "0.12.1": { + "ignore": true + }, + "1.0.0-rc1": { + "ignore": true + }, + "1.0.0-rc2": { + "ignore": true + }, + "1.0.0-rc3": { + "ignore": true + }, + "1.0.0": { + "ignore": true + }, + "1.0.1": { + "ignore": true + }, + "1.1.0": { + "ignore": true + }, + "1.1.1": { + "ignore": true + }, + "1.2.0": { + "ignore": true + }, + "1.2.1": { + "ignore": true + }, + "1.2.2": { + "ignore": true + }, + "1.3.0": { + "ignore": true + }, + "1.3.1": { + "ignore": true + }, + "1.3.2": { + "ignore": true + }, + "1.4.0": { + "ignore": true + }, + "1.4.1": { + "ignore": true + }, + "1.4.2": { + "ignore": true + }, + "1.5.0": { + "ignore": true + }, + "1.5.1": { + "ignore": true + }, + "1.6.0": { + "ignore": true + }, + "1.6.1": { + "ignore": true + }, + "1.7.0": { + "ignore": true + }, + "1.7.1": { + "ignore": true + }, + "1.7.2": { + "ignore": true + }, + "1.7.3": { + "ignore": true + }, + "1.7.4": { + "ignore": true + }, + "1.7.5": { + "ignore": true + }, + "2.0.0-beta1": { + "ignore": true + }, + "2.0.0-beta2": { + "ignore": true + }, + "2.0.0-beta3": { + "ignore": true + }, + "2.0.0-beta4": { + "ignore": true + }, + "2.0.0-beta5": { + "ignore": true + }, + "2.0.0-beta6": { + "ignore": true + }, + "2.0.0-rc1": { + "ignore": true + }, + "2.0.0-rc2": { + "ignore": true + }, + "2.0.0-rc3": { + "ignore": true + }, + "2.0.0-rc4": { + "ignore": true + }, + "2.0.0": { + "ignore": true + }, + "2.0.1": { + "ignore": true + }, + "2.0.2": { + "ignore": true + }, + "2.1.0": { + "ignore": true + }, + "2.1.1": { + "ignore": true + }, + "2.2.0": { + "ignore": true + }, + "2.2.1": { + "ignore": true + }, + "2.3.0": { + "ignore": true + }, + "2.3.1": { + "ignore": true + }, + "2.4.0": { + "ignore": true + }, + "2.4.1": { + "ignore": true + }, + "2.4.2": { + "ignore": true + }, + "2.5.0": { + "ignore": true + }, + "2.5.1": { + "ignore": true + }, + "2.5.2": { + "ignore": true + }, + "2.6.0": { + "ignore": true + }, + "2.6.1": { + "ignore": true + }, + "2.7.0": { + "ignore": true + }, + "2.7.1": { + "ignore": true + }, + "2.7.2": { + "ignore": true + }, + "2.8.0": { + "ignore": true + }, + "2.8.1": { + "ignore": true + }, + "2.9.0": { + "ignore": true + }, "2.9.1": { "postgresql": [ "15" ], "hash": "sha256-fvVSxDiGZAewyuQ2vZDb0I6tmlDXl6trjZp8+qDBtb8=" }, + "2.9.2": { + "ignore": true + }, + "2.9.3": { + "ignore": true + }, + "2.10.0": { + "ignore": true + }, + "2.10.1": { + "ignore": true + }, + "2.10.2-rc1": { + "ignore": true + }, + "2.10.2": { + "ignore": true + }, + "2.10.3-rc1": { + "ignore": true + }, + "2.10.3": { + "ignore": true + }, + "2.11.0": { + "ignore": true + }, + "2.11.1-rc1": { + "ignore": true + }, + "2.11.1": { + "ignore": true + }, + "2.11.2-rc1": { + "ignore": true + }, + "2.11.2-rc2": { + "ignore": true + }, + "2.11.2": { + "ignore": true + }, + "2.12.0-rc1": { + "ignore": true + }, + "2.12.0-rc2": { + "ignore": true + }, + "2.12.0": { + "ignore": true + }, + "2.12.1-rc1": { + "ignore": true + }, + "2.12.1": { + "ignore": true + }, + "2.12.2-rc1": { + "ignore": true + }, + "2.12.2": { + "ignore": true + }, + "2.13.0-dev": { + "ignore": true + }, + "2.13.0-dev1": { + "ignore": true + }, + "2.13.0": { + "ignore": true + }, + "2.13.1": { + "ignore": true + }, + "2.14.0": { + "ignore": true + }, + "2.14.1": { + "ignore": true + }, + "2.14.2": { + "ignore": true + }, + "2.15.0": { + "ignore": true + }, + "2.15.1": { + "ignore": true + }, + "2.15.2": { + "ignore": true + }, + "2.15.3": { + "ignore": true + }, + "2.16.0": { + "ignore": true + }, "2.16.1": { "postgresql": [ "15" ], "hash": "sha256-sLxWdBmih9mgiO51zLLxn9uwJVYc5JVHJjSWoADoJ+w=" + }, + "2.17.0": { + "ignore": true + }, + "2.17.1": { + "ignore": true + }, + "2.17.2": { + "ignore": true + }, + "2.18.0": { + "ignore": true + }, + "2.18.1": { + "ignore": true + }, + "2.18.2": { + "ignore": true + }, + "2.19.0": { + "ignore": true + }, + "2.19.1": { + "ignore": true + }, + "2.19.2": { + "ignore": true + }, + "2.19.3": { + "ignore": true + }, + "2.20.0": { + "ignore": true + }, + "2.20.1": { + "ignore": true + }, + "2.20.2": { + "ignore": true + }, + "2.20.3": { + "ignore": true } } }