From c9d54ccbc67b8b01cf8b7f54e80dc1566dd57a9c Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Mon, 16 Dec 2024 12:52:15 +0100 Subject: [PATCH] feat: Store.get_storedir() (cherry picked from commit 6f4ba636f1e563167e6456d42c9fb6f65c9ca504) --- flake.lock | 6 +++--- rust/Cargo.lock | 3 ++- rust/nix-store/Cargo.toml | 4 ++++ rust/nix-store/build.rs | 39 +++++++++++++++++++++++++++++++++++++ rust/nix-store/src/store.rs | 15 ++++++++++++++ 5 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 rust/nix-store/build.rs diff --git a/flake.lock b/flake.lock index 0c013f6..3dbb956 100644 --- a/flake.lock +++ b/flake.lock @@ -156,11 +156,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1732892090, - "narHash": "sha256-Ka/uNdaqpTAiVL++4MPHg8fG5o1tiJeY6G2t5UiKhd8=", + "lastModified": 1734340930, + "narHash": "sha256-BeyD6r1rQWaL+K7vLRSiCcZG4czEfmBYEL3kvBS2nGw=", "owner": "NixOS", "repo": "nix", - "rev": "64000481168d1da9d2519f055dd1fdee22275c21", + "rev": "2f32cf6d90df599d620eea5c48b9469f1c251025", "type": "github" }, "original": { diff --git a/rust/Cargo.lock b/rust/Cargo.lock index c6ce2f5..eaa0409 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "Inflector" @@ -346,6 +346,7 @@ dependencies = [ "lazy_static", "nix-c-raw", "nix-util", + "pkg-config", ] [[package]] diff --git a/rust/nix-store/Cargo.toml b/rust/nix-store/Cargo.toml index 2df0340..6c42ac9 100644 --- a/rust/nix-store/Cargo.toml +++ b/rust/nix-store/Cargo.toml @@ -2,6 +2,7 @@ name = "nix-store" version = "0.1.0" edition = "2021" +build = "build.rs" [lib] path = "src/lib.rs" @@ -11,3 +12,6 @@ anyhow = "1.0.79" nix-util = { path = "../nix-util" } nix-c-raw = { path = "../nix-c-raw" } lazy_static = "1.4.0" + +[build-dependencies] +pkg-config = "0.3.30" diff --git a/rust/nix-store/build.rs b/rust/nix-store/build.rs new file mode 100644 index 0000000..f573fe8 --- /dev/null +++ b/rust/nix-store/build.rs @@ -0,0 +1,39 @@ +fn main() { + // Get nix version + let nix_version = pkg_config::probe_library("nix-store-c").unwrap().version; + + // Generate version flags + // Unfortunately, Rust doesn't give us a "greater than" operator in conditional + // compilation, so we pre-evaluate the version comparisons here, making use + // of the multi-valued nature of Rust cfgs. + let relevant_versions = vec!["2.26"]; + let versions = relevant_versions + .iter() + .map(|v| format!("\"{}\"", v)) + .collect::>() + .join(","); + + // Declare the known versions, so that Rust can warn about unknown versions + // that aren't part of `relevant_versions` yet - feel free to add entries. + println!( + "cargo:rustc-check-cfg=cfg(nix_at_least,values({}))", + versions + ); + + let nix_version = nix_version.split('.').collect::>(); + let nix_version = ( + nix_version[0].parse::().unwrap(), + nix_version[1].parse::().unwrap(), + ); + + for version_str in relevant_versions { + let version = version_str.split('.').collect::>(); + let version = ( + version[0].parse::().unwrap(), + version[1].parse::().unwrap(), + ); + if nix_version >= version { + println!("cargo:rustc-cfg=nix_at_least=\"{}\"", version_str); + } + } +} diff --git a/rust/nix-store/src/store.rs b/rust/nix-store/src/store.rs index 87295d2..da4cbc9 100644 --- a/rust/nix-store/src/store.rs +++ b/rust/nix-store/src/store.rs @@ -172,6 +172,21 @@ impl Store { r } + #[cfg(nix_at_least = "2.26")] + #[doc(alias = "nix_store_get_storedir")] + pub fn get_storedir(&mut self) -> Result { + let mut r = result_string_init!(); + unsafe { + check_call!(raw::store_get_storedir( + &mut self.context, + self.inner.ptr(), + Some(callback_get_result_string), + callback_get_result_string_data(&mut r) + )) + }?; + r + } + pub fn weak_ref(&self) -> StoreWeak { StoreWeak { inner: Arc::downgrade(&self.inner),