feat: Store.parse_store_path()
(cherry picked from commit 6b92d4164b94d5030929dfb56577b1fd8d62e067)
This commit is contained in:
parent
c9d54ccbc6
commit
c986c09b8c
2 changed files with 55 additions and 0 deletions
|
|
@ -71,3 +71,17 @@ impl Drop for StorePath {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
#[cfg(nix_at_least = "2.26" /* get_storedir */)]
|
||||||
|
fn store_path_name() {
|
||||||
|
let mut store = crate::store::Store::open("dummy://", []).unwrap();
|
||||||
|
let store_dir = store.get_storedir().unwrap();
|
||||||
|
let store_path_string =
|
||||||
|
format!("{store_dir}/rdd4pnr4x9rqc9wgbibhngv217w2xvxl-bash-interactive-5.2p26");
|
||||||
|
let store_path = store.parse_store_path(store_path_string.as_str()).unwrap();
|
||||||
|
assert_eq!(store_path.name().unwrap(), "bash-interactive-5.2p26");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ use std::ptr::null_mut;
|
||||||
use std::ptr::NonNull;
|
use std::ptr::NonNull;
|
||||||
use std::sync::{Arc, Mutex, Weak};
|
use std::sync::{Arc, Mutex, Weak};
|
||||||
|
|
||||||
|
use crate::path::StorePath;
|
||||||
|
|
||||||
/* TODO make Nix itself thread safe */
|
/* TODO make Nix itself thread safe */
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref INIT: Result<()> = unsafe {
|
static ref INIT: Result<()> = unsafe {
|
||||||
|
|
@ -187,6 +189,21 @@ impl Store {
|
||||||
r
|
r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[doc(alias = "nix_store_parse_path")]
|
||||||
|
pub fn parse_store_path(&mut self, path: &str) -> Result<StorePath> {
|
||||||
|
let path = CString::new(path)?;
|
||||||
|
unsafe {
|
||||||
|
let store_path = check_call!(raw::store_parse_path(
|
||||||
|
&mut self.context,
|
||||||
|
self.inner.ptr(),
|
||||||
|
path.as_ptr()
|
||||||
|
))?;
|
||||||
|
let store_path =
|
||||||
|
NonNull::new(store_path).expect("nix_store_parse_path returned a null pointer");
|
||||||
|
Ok(StorePath::new_raw(store_path))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn weak_ref(&self) -> StoreWeak {
|
pub fn weak_ref(&self) -> StoreWeak {
|
||||||
StoreWeak {
|
StoreWeak {
|
||||||
inner: Arc::downgrade(&self.inner),
|
inner: Arc::downgrade(&self.inner),
|
||||||
|
|
@ -240,6 +257,30 @@ mod tests {
|
||||||
assert_eq!(uri, "https://cache.nixos.org");
|
assert_eq!(uri, "https://cache.nixos.org");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg(nix_at_least = "2.26" /* get_storedir */)]
|
||||||
|
fn parse_store_path_ok() {
|
||||||
|
let mut store = crate::store::Store::open("dummy://", []).unwrap();
|
||||||
|
let store_dir = store.get_storedir().unwrap();
|
||||||
|
let store_path_string =
|
||||||
|
format!("{store_dir}/rdd4pnr4x9rqc9wgbibhngv217w2xvxl-bash-interactive-5.2p26");
|
||||||
|
let store_path = store.parse_store_path(store_path_string.as_str()).unwrap();
|
||||||
|
assert_eq!(store_path.name().unwrap(), "bash-interactive-5.2p26");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_store_path_fail() {
|
||||||
|
let mut store = crate::store::Store::open("dummy://", []).unwrap();
|
||||||
|
let store_path_string = format!("bash-interactive-5.2p26");
|
||||||
|
let r = store.parse_store_path(store_path_string.as_str());
|
||||||
|
match r {
|
||||||
|
Err(e) => {
|
||||||
|
assert!(e.to_string().contains("bash-interactive-5.2p26"));
|
||||||
|
}
|
||||||
|
_ => panic!("Expected error"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn weak_ref() {
|
fn weak_ref() {
|
||||||
let mut store = Store::open("auto", HashMap::new()).unwrap();
|
let mut store = Store::open("auto", HashMap::new()).unwrap();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue