git.delta.rocks / jrsonnet / refs/commits / d581a0296376

difftreelog

feat parse store paths

tomnunvlYaroslav Bolyukin2025-10-18parent: #d602c06.patch.diff
in: trunk

1 file changed

modifiedcrates/nix-eval/src/lib.rsdiffbeforeafterboth
2use 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;
1413
15pub use anyhow::Result;14pub use anyhow::Result;
16use tracing::{info, instrument};15use tracing::instrument;
1716
18use 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};
4142
131}132}
132133
133pub fn gc_now() {134pub fn gc_now() {
134 unsafe { nix_raw::gc_now() };135 unsafe { gc_now_raw() };
135}136}
136137
137pub 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 {}
403
404impl 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}
402411
403struct 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}
877
878struct StorePath(*mut c_store_path);
879impl StorePath {}
880
881impl Drop for StorePath {
882 fn drop(&mut self) {
883 unsafe { store_path_free(self.0) }
884 }
885}
868886
869#[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");
875893
876 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");
910
911 let s = nix_go!(attrs.packages["x86_64-linux"].fleet.drvPath);
912 let s = CString::new(s.to_string()?).expect("path str is cstring");
913
914 let nix_ctx = NixContext::new();
915 let store = GLOBAL_STATE.store.parse_path(s.as_c_str())?;
916
917 nix_raw::store_get_fs_closure(1);
892918
893 Ok(())919 Ok(())
894}920}