From 8553313c814d4073fa8487448583e822660bb652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Thu, 2 Oct 2025 22:50:42 +0200 Subject: [PATCH 1/2] Cache archives --- postgresql_embedded/build/bundle.rs | 41 +++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/postgresql_embedded/build/bundle.rs b/postgresql_embedded/build/bundle.rs index 1feda94..8241fe9 100644 --- a/postgresql_embedded/build/bundle.rs +++ b/postgresql_embedded/build/bundle.rs @@ -3,8 +3,9 @@ use anyhow::Result; use postgresql_archive::configuration::{custom, theseus}; use postgresql_archive::repository::github::repository::GitHub; -use postgresql_archive::{VersionReq, matcher}; +use postgresql_archive::{ExactVersion, VersionReq, matcher}; use postgresql_archive::{get_archive, repository}; +use std::env::home_dir; use std::fs::File; use std::io::Write; use std::path::PathBuf; @@ -53,7 +54,43 @@ pub(crate) async fn stage_postgresql_archive() -> Result<()> { return Ok(()); } - let (asset_version, archive) = get_archive(&releases_url, &version_req).await?; + let (asset_version, archive); + + // Only works when exact version is specified and with the `bundled` feature + // In runtime, the archive seems to be cached + if cfg!(feature = "bundled") && let Some(exact_version) = version_req.exact_version() { + println!("Using existing version: {exact_version:?}"); + let ver = exact_version.to_string(); + let target_os = if cfg!(target_os = "windows") { + "windows" + } else if cfg!(target_os = "linux") { + "linux" + } else { + panic!("Unsupported target OS: only windows and linux are supported"); + }; + let cached_file_name = home_dir() + .unwrap_or_else(|| env::current_dir().unwrap_or_default()) + .join(".theseus") + .join("postgresql") + .join(format!("postgresql-{}-{}.tar.gz", ver, target_os)); + + println!( + "Cached file name: {cached_file_name:?} - exists: {}", + cached_file_name.exists() + ); + if !cached_file_name.is_file() { + (asset_version, archive) = get_archive(&releases_url, &version_req).await?; + fs::create_dir_all(cached_file_name.parent().unwrap())?; + fs::write(&cached_file_name, &archive)?; + println!("Cached PostgreSQL archive to: {cached_file_name:?}"); + } else { + asset_version = exact_version; + archive = fs::read(&cached_file_name)?; + println!("Using cached PostgreSQL archive: {cached_file_name:?}"); + } + } else { + (asset_version, archive) = get_archive(&releases_url, &version_req).await?; + } fs::write(archive_version_file.clone(), asset_version.to_string())?; let mut file = File::create(archive_file.clone())?; From 4fe2937bab9c85f4972fb38f9e60b71e3fa62bb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Sun, 5 Oct 2025 09:00:41 +0200 Subject: [PATCH 2/2] Target --- postgresql_embedded/build/bundle.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/postgresql_embedded/build/bundle.rs b/postgresql_embedded/build/bundle.rs index 8241fe9..4c0d11e 100644 --- a/postgresql_embedded/build/bundle.rs +++ b/postgresql_embedded/build/bundle.rs @@ -61,9 +61,9 @@ pub(crate) async fn stage_postgresql_archive() -> Result<()> { if cfg!(feature = "bundled") && let Some(exact_version) = version_req.exact_version() { println!("Using existing version: {exact_version:?}"); let ver = exact_version.to_string(); - let target_os = if cfg!(target_os = "windows") { + let target_os = if target_triple::TARGET.contains("windows") { "windows" - } else if cfg!(target_os = "linux") { + } else if target_triple::TARGET.contains("linux") { "linux" } else { panic!("Unsupported target OS: only windows and linux are supported");