difftreelog
feat parse store paths
in: trunk
1 file changed
crates/nix-eval/src/lib.rsdiffbeforeafterboth2use std::borrow::Cow;2use std::borrow::Cow;3use std::cell::RefCell;3use std::cell::RefCell;4use std::ffi::{CStr, CString, c_char, c_int, c_uint, c_void};4use std::ffi::{CStr, CString, c_char, c_int, c_uint, c_void};5use std::mem::forget;6use std::ptr::null_mut;5use std::ptr::null_mut;7use std::sync::LazyLock;6use std::sync::LazyLock;8use std::{collections::HashMap, path::PathBuf};7use std::{collections::HashMap, path::PathBuf};13use serde::de::DeserializeOwned;12use serde::de::DeserializeOwned;141315pub use anyhow::Result;14pub use anyhow::Result;16use tracing::{info, instrument};15use tracing::instrument;171618use self::logging::nix_logging_cxx;17use self::logging::nix_logging_cxx;19use self::nix_cxx::set_fetcher_setting;18use self::nix_cxx::set_fetcher_setting;20use self::nix_raw::{19use self::nix_raw::{21 BindingsBuilder as c_bindings_builder, EvalState as c_eval_state, GC_SUCCESS,20 BindingsBuilder as c_bindings_builder, EvalState as c_eval_state, GC_SUCCESS,22 GC_allow_register_threads, GC_free, GC_get_stack_base, GC_init, GC_malloc, GC_realloc,21 GC_allow_register_threads, GC_get_stack_base, GC_register_my_thread, GC_stack_base,23 GC_register_my_thread, GC_stack_base, GC_thread_is_registered, GC_unregister_my_thread,22 GC_thread_is_registered, GC_unregister_my_thread, ListBuilder as c_list_builder,24 Store as c_store, alloc_value, bindings_builder_free, bindings_builder_insert, c_context,23 Store as c_store, StorePath as c_store_path, alloc_value, bindings_builder_free,25 c_context_create, c_context_free, clear_err, err_code, err_info_msg, err_msg, eval_state_build,24 bindings_builder_insert, c_context, c_context_create, c_context_free, clear_err, err_code,26 eval_state_builder_load, eval_state_builder_new, eval_state_builder_set_eval_setting,25 err_info_msg, err_msg, eval_state_build, eval_state_builder_load, eval_state_builder_new,27 expr_eval_from_string, fetchers_settings, fetchers_settings_free, fetchers_settings_new,26 eval_state_builder_set_eval_setting, expr_eval_from_string, fetchers_settings,28 flake_lock, flake_lock_flags, flake_lock_flags_free, flake_lock_flags_new, flake_reference,27 fetchers_settings_free, fetchers_settings_new, flake_lock, flake_lock_flags,28 flake_lock_flags_free, flake_lock_flags_new, flake_reference,29 flake_reference_and_fragment_from_string, flake_reference_parse_flags,29 flake_reference_and_fragment_from_string, flake_reference_parse_flags,30 flake_reference_parse_flags_free, flake_reference_parse_flags_new,30 flake_reference_parse_flags_free, flake_reference_parse_flags_new,31 flake_reference_parse_flags_set_base_directory, flake_settings, flake_settings_free,31 flake_reference_parse_flags_set_base_directory, flake_settings, flake_settings_free,32 flake_settings_new, get_attr_byname, get_attr_name_byidx, get_attrs_size, get_list_byidx,32 flake_settings_new, gc_now as gc_now_raw, get_attr_byname, get_attr_name_byidx, get_attrs_size,33 get_list_size, get_string, get_type, has_attr_byname, init_bool, init_int, init_string,33 get_list_byidx, get_list_size, get_string, get_type, has_attr_byname, init_bool, init_int,34 libexpr_init, libstore_init, libutil_init, locked_flake, locked_flake_free,34 init_string, libexpr_init, libstore_init, libutil_init, list_builder_free, list_builder_insert,35 locked_flake_get_output_attrs, make_attrs, make_bindings_builder, realised_string,35 locked_flake, locked_flake_free, locked_flake_get_output_attrs, make_attrs,36 realised_string_free, realised_string_get_buffer_size, realised_string_get_buffer_start,36 make_bindings_builder, make_list, make_list_builder, realised_string, realised_string_free,37 realised_string_get_buffer_size, realised_string_get_buffer_start,37 realised_string_get_store_path, realised_string_get_store_path_count, set_err_msg, setting_set,38 realised_string_get_store_path, realised_string_get_store_path_count, set_err_msg, setting_set,38 state_free, store_open, store_path_name, string_realise, value, value_call, value_decref,39 state_free, store_open, store_parse_path, store_path_free, store_path_name, string_realise,39 value_incref,40 value, value_call, value_decref, value_incref,40};41};4142131}132}132133133pub fn gc_now() {134pub fn gc_now() {134 unsafe { nix_raw::gc_now() };135 unsafe { gc_now_raw() };135}136}136137137pub fn gc_register_my_thread() {138pub fn gc_register_my_thread() {400unsafe impl Send for Store {}401unsafe impl Send for Store {}401unsafe impl Sync for Store {}402unsafe impl Sync for Store {}403404impl Store {405 fn parse_path(&self, path: &CStr) -> Result<StorePath> {406 with_default_context(|c, _| {407 StorePath(unsafe { store_parse_path(c, self.0, path.as_ptr()) })408 })409 }410}402411403struct EvalState(*mut c_eval_state);412struct EvalState(*mut c_eval_state);404unsafe impl Send for EvalState {}413unsafe impl Send for EvalState {}866 nix_logging_cxx::apply_tracing_logger();875 nix_logging_cxx::apply_tracing_logger();867}876}877878struct StorePath(*mut c_store_path);879impl StorePath {}880881impl Drop for StorePath {882 fn drop(&mut self) {883 unsafe { store_path_free(self.0) }884 }885}868886869#[test_log::test]887#[test_log::test]870fn test_native() -> Result<()> {888fn test_native() -> Result<()> {873 let mut fetch_settings = FetchSettings::new();891 let mut fetch_settings = FetchSettings::new();874 fetch_settings.set(c"warn-dirty", c"false");892 fetch_settings.set(c"warn-dirty", c"false");875893876 let manifest = format!("{}/../../", env!("CARGO_MANIFEST_DIR"));894 let manifest = format!("git+file://{}/../../", env!("CARGO_MANIFEST_DIR"));877 let flake = FlakeSettings::new()?;895 let flake = FlakeSettings::new()?;878 let parse = FlakeReferenceParseFlags::new(&flake)?;896 let parse = FlakeReferenceParseFlags::new(&flake)?;879 let (mut r, _) = FlakeReference::new(&manifest, &flake, &parse, &fetch_settings)?;897 let (mut r, _) = FlakeReference::new(&manifest, &flake, &parse, &fetch_settings)?;890 let test_string: String = nix_go_json!(test_data.testString);908 let test_string: String = nix_go_json!(test_data.testString);891 assert_eq!(test_string, "hello");909 assert_eq!(test_string, "hello");910911 let s = nix_go!(attrs.packages["x86_64-linux"].fleet.drvPath);912 let s = CString::new(s.to_string()?).expect("path str is cstring");913914 let nix_ctx = NixContext::new();915 let store = GLOBAL_STATE.store.parse_path(s.as_c_str())?;916917 nix_raw::store_get_fs_closure(1);892918893 Ok(())919 Ok(())894}920}