|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +# |
| 4 | +# Builds a database of all Spring Boot versions that ship with a starter for Spring Data Neo4j. |
| 5 | +# This script requires Maven, xidel and DuckDB on the path. |
| 6 | +# |
| 7 | + |
| 8 | +set -euo pipefail |
| 9 | +export LC_ALL=en_US.UTF-8 |
| 10 | + |
| 11 | +DB="$(pwd)/$1" |
| 12 | + |
| 13 | +# Support matrix from |
| 14 | +# https://spring.io/projects/spring-boot#support |
| 15 | +duckdb "$DB" \ |
| 16 | +-s " |
| 17 | +CREATE TABLE IF NOT EXISTS support_matrix AS SELECT * FROM VALUES |
| 18 | +('3.4', '2024-11-21'::date, '2025-11-21'::date, '2027-02-21'::date), |
| 19 | +('3.3', '2024-05-23'::date, '2025-05-23'::date, '2026-08-23'::date), |
| 20 | +('3.2', '2023-11-23'::date, '2024-11-23'::date, '2026-02-23'::date), |
| 21 | +('3.1', '2023-05-18'::date, '2024-05-18'::date, '2025-08-18'::date), |
| 22 | +('3.0', '2022-11-24'::date, '2023-11-24'::date, '2025-02-24'::date), |
| 23 | +('2.7', '2022-05-19'::date, '2023-11-24'::date, '2026-12-31'::date), |
| 24 | +('2.6', '2021-11-17'::date, '2022-11-24'::date, '2024-02-24'::date), |
| 25 | +('2.5', '2021-05-20'::date, '2022-05-19'::date, '2023-08-24'::date), |
| 26 | +('2.4', '2020-11-12'::date, '2021-11-18'::date, '2023-02-23'::date), |
| 27 | +('2.3', '2020-05-15'::date, '2021-05-20'::date, '2022-08-20'::date), |
| 28 | +('2.2', '2019-10-16'::date, '2020-10-16'::date, '2022-01-16'::date), |
| 29 | +('2.1', '2018-10-30'::date, '2019-10-30'::date, '2021-01-30'::date), |
| 30 | +('2.0', '2018-03-01'::date, '2019-03-01'::date, '2020-06-01'::date), |
| 31 | +('1.5', '2017-01-30'::date, '2019-08-06'::date, '2020-11-06'::date) |
| 32 | +src(spring_boot, initial_release, end_of_oss_support, end_of_commercial_support) |
| 33 | +" \ |
| 34 | +-s "CREATE SEQUENCE IF NOT EXISTS version_id" \ |
| 35 | +-s "CREATE TABLE IF NOT EXISTS versions ( |
| 36 | + id INTEGER PRIMARY KEY DEFAULT(nextval('version_id')), |
| 37 | + spring_boot VARCHAR(32) NOT NULL, |
| 38 | + release_date DATE, |
| 39 | + spring_data_neo4j VARCHAR(32), |
| 40 | + neo4j_ogm VARCHAR(32), |
| 41 | + neo4j_java_driver VARCHAR(32), |
| 42 | + CONSTRAINT spring_boot_unique UNIQUE(spring_boot) |
| 43 | + )" \ |
| 44 | +-s "CREATE OR REPLACE FUNCTION f_make_version(string) AS ( |
| 45 | + SELECT list_transform(string_split(string, '.'), x -> TRY_CAST (x AS INTEGER)) |
| 46 | + ) |
| 47 | +" \ |
| 48 | +-s " |
| 49 | +CREATE OR REPLACE VIEW v_versions AS ( |
| 50 | + SELECT v.* EXCLUDE(id, release_date), release_date, end_of_oss_support, end_of_commercial_support |
| 51 | + FROM versions v |
| 52 | + ASOF LEFT JOIN support_matrix sm ON f_make_version(v.spring_boot) >= f_make_version(sm.spring_boot) |
| 53 | + ORDER BY f_make_version(v.spring_boot) ASC |
| 54 | +)" \ |
| 55 | +-s " |
| 56 | +CREATE OR REPLACE VIEW v_oss_supported_versions AS ( |
| 57 | + SELECT * |
| 58 | + FROM v_versions v |
| 59 | + WHERE end_of_oss_support >= today() |
| 60 | + ORDER BY f_make_version(v.spring_boot) ASC |
| 61 | +)" \ |
| 62 | + -s " |
| 63 | +CREATE OR REPLACE VIEW v_commercially_supported_versions AS ( |
| 64 | + SELECT * |
| 65 | + FROM v_versions v |
| 66 | + WHERE end_of_commercial_support >= today() |
| 67 | + ORDER BY f_make_version(v.spring_boot) ASC |
| 68 | + )" |
| 69 | + |
| 70 | +mkdir -p .tmp |
| 71 | + |
| 72 | +# Create a helper pom |
| 73 | +# shellcheck disable=SC2016 |
| 74 | +echo '<?xml version="1.0" encoding="UTF-8"?> |
| 75 | +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 76 | + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| 77 | + <modelVersion>4.0.0</modelVersion> |
| 78 | + <groupId>org.neo4j</groupId> |
| 79 | + <artifactId>sdn-version-checker</artifactId> |
| 80 | + <version>0.0.1-SNAPSHOT</version> |
| 81 | + <name>demo</name> |
| 82 | + <description>Demo project for Spring Boot</description> |
| 83 | + <properties> |
| 84 | + <java.version>17</java.version> |
| 85 | + </properties> |
| 86 | + <dependencyManagement> |
| 87 | + <dependencies> |
| 88 | + <dependency> |
| 89 | + <groupId>org.springframework.boot</groupId> |
| 90 | + <artifactId>spring-boot-dependencies</artifactId> |
| 91 | + <version>${bootVersion}</version> |
| 92 | + <type>pom</type> |
| 93 | + <scope>import</scope> |
| 94 | + </dependency> |
| 95 | + </dependencies> |
| 96 | + </dependencyManagement> |
| 97 | + <dependencies> |
| 98 | + <dependency> |
| 99 | + <groupId>org.springframework.boot</groupId> |
| 100 | + <artifactId>spring-boot-starter-data-neo4j</artifactId> |
| 101 | + </dependency> |
| 102 | + </dependencies> |
| 103 | + <build> |
| 104 | + <plugins> |
| 105 | + <plugin> |
| 106 | + <groupId>org.apache.maven.plugins</groupId> |
| 107 | + <artifactId>maven-dependency-plugin</artifactId> |
| 108 | + <version>3.8.1</version> |
| 109 | + </plugin> |
| 110 | + </plugins> |
| 111 | + </build> |
| 112 | +</project> |
| 113 | +' > .tmp/pom.xml |
| 114 | + |
| 115 | + |
| 116 | +# Get all the dependencies |
| 117 | +for sb in $(\ |
| 118 | + xidel -se '/metadata/versioning/versions/version' https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/maven-metadata.xml | \ |
| 119 | + duckdb "$DB" -noheader -csv -s "SELECT * from read_csv('/dev/stdin', header=false, columns={'spring_boot': 'VARCHAR'}) ANTI JOIN versions USING (spring_boot) WHERE f_make_version(spring_boot) >= [1,4,0] "\ |
| 120 | +); do |
| 121 | + set +e |
| 122 | + mvn -B -q -f .tmp/pom.xml -DoutputFile="$sb".json -DoutputType=json -DbootVersion="$sb" dependency:tree >/dev/null 2>/dev/null |
| 123 | + set -e |
| 124 | +done |
| 125 | + |
| 126 | +# Get release dates from the maven index, might not be 100% accurate, but good enough |
| 127 | +curl -s https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/ | sed -nE 's/.*title="(.*)\/".*([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1,\2/p' > .tmp/release_dates.csv |
| 128 | + |
| 129 | +# Extract dependency information |
| 130 | +if compgen -G ".tmp/*.json" > /dev/null; |
| 131 | +then |
| 132 | +duckdb "$DB" \ |
| 133 | +-s " |
| 134 | + WITH parent AS ( |
| 135 | + SELECT unnest(children, recursive:=true) from read_json('.tmp/*.json') |
| 136 | + ), starter AS ( |
| 137 | + SELECT version AS spring_boot, unnest(children, recursive:=true) FROM parent |
| 138 | + ), ogm AS ( |
| 139 | + SELECT spring_boot, artifactId AS parent, version AS parentVersion, unnest(children, recursive:=true) FROM starter |
| 140 | + ), driver_via_ogm AS ( |
| 141 | + SELECT spring_boot, artifactId AS parent, version AS parentVersion, unnest(children, recursive:=true) FROM ogm |
| 142 | + ), driver_via_sdn AS ( |
| 143 | + SELECT spring_boot, artifactId AS parent, version AS parentVersion, unnest(children, recursive:=true) FROM starter |
| 144 | + WHERE starter.artifactId = 'spring-data-neo4j' |
| 145 | + ) |
| 146 | + INSERT INTO versions BY NAME |
| 147 | + SELECT starter.spring_boot, |
| 148 | + r.release_date, |
| 149 | + starter.version AS spring_data_neo4j, |
| 150 | + ogm.version AS neo4j_ogm, |
| 151 | + coalesce(driver_via_ogm.version, driver_via_sdn.version) AS neo4j_java_driver |
| 152 | + FROM starter |
| 153 | + NATURAL JOIN read_csv('.tmp/release_dates.csv', header=false, columns={'spring_boot': 'VARCHAR', 'release_date': 'DATE'}) r |
| 154 | + LEFT OUTER JOIN ogm ON |
| 155 | + ogm.parent = starter.artifactId AND |
| 156 | + ogm.parentVersion = starter.version AND |
| 157 | + ogm.spring_boot = starter.spring_boot AND |
| 158 | + ogm.artifactId = 'neo4j-ogm-core' |
| 159 | + LEFT OUTER JOIN driver_via_ogm ON |
| 160 | + driver_via_ogm.parent ='neo4j-ogm-bolt-driver' AND |
| 161 | + driver_via_ogm.parentVersion = ogm.version AND |
| 162 | + driver_via_ogm.spring_boot = starter.spring_boot AND |
| 163 | + driver_via_ogm.artifactId = 'neo4j-java-driver' |
| 164 | + LEFT OUTER JOIN driver_via_sdn ON |
| 165 | + driver_via_sdn.parent = starter.artifactId AND |
| 166 | + driver_via_sdn.parentVersion = starter.version AND |
| 167 | + driver_via_sdn.spring_boot = starter.spring_boot AND |
| 168 | + driver_via_sdn.artifactId = 'neo4j-java-driver' |
| 169 | + WHERE starter.artifactId = 'spring-data-neo4j' |
| 170 | + ON CONFLICT DO NOTHING |
| 171 | +" |
| 172 | +fi |
| 173 | + |
| 174 | +rm -rf .tmp |
0 commit comments