@@ -616,43 +616,12 @@ fn prepare_dirs(opts: &cli::Options) -> Result<VpDirs, Box<dyn std::error::Error
616616 . ok_or ( "The installation directory must be an absolute path" ) ?;
617617 // Safety: called in main() before any threads are spawned (or under
618618 // EnvConfig::with_vars in tests, which serializes env mutation).
619- unsafe { std:: env:: set_var ( " VP_HOME" , abs. as_path ( ) ) } ;
619+ unsafe { std:: env:: set_var ( vp_shared :: env_vars :: VP_HOME , abs. as_path ( ) ) } ;
620620 }
621- validate_dir_env ( ) ?;
621+ vp_shared :: validate_vp_dir_env ( ) ?;
622622 Ok ( vp_shared:: EnvConfig :: get ( ) . dirs . clone ( ) )
623623}
624624
625- fn validate_dir_env ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
626- use vp_shared:: env_vars;
627-
628- let env_path = |name| std:: env:: var_os ( name) . filter ( |value| !value. is_empty ( ) ) ;
629- if let Some ( home) = env_path ( env_vars:: VP_HOME )
630- && !std:: path:: Path :: new ( & home) . is_absolute ( )
631- {
632- return Err ( format ! ( "{} must be an absolute path." , env_vars:: VP_HOME ) . into ( ) ) ;
633- }
634-
635- let split_dirs = [
636- ( env_vars:: VP_BIN_DIR , env_path ( env_vars:: VP_BIN_DIR ) ) ,
637- ( env_vars:: VP_DATA_DIR , env_path ( env_vars:: VP_DATA_DIR ) ) ,
638- ( env_vars:: VP_CACHE_DIR , env_path ( env_vars:: VP_CACHE_DIR ) ) ,
639- ] ;
640- let configured_count = split_dirs. iter ( ) . filter ( |( _, value) | value. is_some ( ) ) . count ( ) ;
641- if configured_count != 0 && configured_count != split_dirs. len ( ) {
642- return Err (
643- "Set VP_BIN_DIR, VP_DATA_DIR, and VP_CACHE_DIR together, or leave all three unset."
644- . into ( ) ,
645- ) ;
646- }
647- for ( name, value) in split_dirs {
648- if value. is_some_and ( |path| !std:: path:: Path :: new ( & path) . is_absolute ( ) ) {
649- return Err ( format ! ( "{name} must be an absolute path." ) . into ( ) ) ;
650- }
651- }
652-
653- Ok ( ( ) )
654- }
655-
656625#[ allow( clippy:: print_stdout) ]
657626fn modify_path ( bin_dir : & str , quiet : bool ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
658627 #[ cfg( windows) ]
@@ -961,11 +930,9 @@ mod tests {
961930 }
962931
963932 #[ test]
964- fn incomplete_vp_dir_groups_are_rejected_without_creating_roots ( ) {
933+ fn invalid_vp_dir_env_is_rejected_without_creating_roots ( ) {
965934 let tmp = tempfile:: tempdir ( ) . unwrap ( ) ;
966- let bin = tmp. path ( ) . join ( "requested-bin" ) ;
967935 let data = tmp. path ( ) . join ( "requested-data" ) ;
968- let cache = tmp. path ( ) . join ( "requested-cache" ) ;
969936
970937 with_clean_home ( tmp. path ( ) , || {
971938 let default_dirs = EnvConfig :: get ( ) . dirs . clone ( ) ;
@@ -977,91 +944,28 @@ mod tests {
977944 default_dirs. state . as_path ( ) . to_path_buf ( ) ,
978945 ] ;
979946 let default_existed = default_roots. each_ref ( ) . map ( |root| root. exists ( ) ) ;
980- let paths = [ bin. as_os_str ( ) , data. as_os_str ( ) , cache. as_os_str ( ) ] ;
981- let cases = [
982- [ Some ( paths[ 0 ] ) , None , None ] ,
983- [ None , Some ( paths[ 1 ] ) , None ] ,
984- [ None , None , Some ( paths[ 2 ] ) ] ,
985- [ Some ( paths[ 0 ] ) , Some ( paths[ 1 ] ) , None ] ,
986- [ Some ( paths[ 0 ] ) , None , Some ( paths[ 2 ] ) ] ,
987- [ None , Some ( paths[ 1 ] ) , Some ( paths[ 2 ] ) ] ,
988- ] ;
989-
990- for values in cases {
991- EnvConfig :: with_vars (
992- [
993- ( env_vars:: VP_HOME , None ) ,
994- ( env_vars:: VP_BIN_DIR , values[ 0 ] ) ,
995- ( env_vars:: VP_DATA_DIR , values[ 1 ] ) ,
996- ( env_vars:: VP_CACHE_DIR , values[ 2 ] ) ,
997- ] ,
998- |_| {
999- let error = prepare_dirs ( & opts ( None ) ) . unwrap_err ( ) . to_string ( ) ;
1000- assert_eq ! (
1001- error,
1002- "Set VP_BIN_DIR, VP_DATA_DIR, and VP_CACHE_DIR together, or leave all three unset."
1003- ) ;
1004- } ,
1005- ) ;
1006- }
1007-
1008- for requested in [ & bin, & data, & cache] {
1009- assert ! ( !requested. exists( ) , "validation created {}" , requested. display( ) ) ;
1010- }
1011- for ( root, existed) in default_roots. iter ( ) . zip ( default_existed) {
1012- if !existed {
1013- assert ! ( !root. exists( ) , "validation created default root {}" , root. display( ) ) ;
1014- }
1015- }
1016- } ) ;
1017- }
1018-
1019- #[ test]
1020- fn relative_directory_overrides_are_rejected ( ) {
1021- let tmp = tempfile:: tempdir ( ) . unwrap ( ) ;
1022- with_clean_home ( tmp. path ( ) , || {
1023947 EnvConfig :: with_vars (
1024948 [
1025- ( env_vars:: VP_HOME , Some ( std :: ffi :: OsStr :: new ( "relative-home" ) ) ) ,
949+ ( env_vars:: VP_HOME , None ) ,
1026950 ( env_vars:: VP_BIN_DIR , None ) ,
1027- ( env_vars:: VP_DATA_DIR , None ) ,
951+ ( env_vars:: VP_DATA_DIR , Some ( data . as_os_str ( ) ) ) ,
1028952 ( env_vars:: VP_CACHE_DIR , None ) ,
1029953 ] ,
1030954 |_| {
1031955 let error = prepare_dirs ( & opts ( None ) ) . unwrap_err ( ) . to_string ( ) ;
1032- assert_eq ! ( error, "VP_HOME must be an absolute path." ) ;
956+ assert_eq ! (
957+ error,
958+ "Set VP_BIN_DIR, VP_DATA_DIR, and VP_CACHE_DIR together, or leave all three unset."
959+ ) ;
1033960 } ,
1034961 ) ;
1035962
1036- let bin = tmp. path ( ) . join ( "bin" ) ;
1037- let data = tmp. path ( ) . join ( "data" ) ;
1038- let cache = tmp. path ( ) . join ( "cache" ) ;
1039- let relative = std:: ffi:: OsStr :: new ( "relative-dir" ) ;
1040- let cases = [
1041- ( env_vars:: VP_BIN_DIR , [ relative, data. as_os_str ( ) , cache. as_os_str ( ) ] ) ,
1042- ( env_vars:: VP_DATA_DIR , [ bin. as_os_str ( ) , relative, cache. as_os_str ( ) ] ) ,
1043- ( env_vars:: VP_CACHE_DIR , [ bin. as_os_str ( ) , data. as_os_str ( ) , relative] ) ,
1044- ] ;
1045- for ( name, values) in cases {
1046- EnvConfig :: with_vars (
1047- [
1048- ( env_vars:: VP_HOME , None ) ,
1049- ( env_vars:: VP_BIN_DIR , Some ( values[ 0 ] ) ) ,
1050- ( env_vars:: VP_DATA_DIR , Some ( values[ 1 ] ) ) ,
1051- ( env_vars:: VP_CACHE_DIR , Some ( values[ 2 ] ) ) ,
1052- ] ,
1053- |_| {
1054- let error = prepare_dirs ( & opts ( None ) ) . unwrap_err ( ) . to_string ( ) ;
1055- assert_eq ! ( error, format!( "{name} must be an absolute path." ) ) ;
1056- } ,
1057- ) ;
1058- }
1059-
1060- for root in [ & bin, & data, & cache] {
1061- assert ! ( !root. exists( ) , "validation created {}" , root. display( ) ) ;
963+ assert ! ( !data. exists( ) , "validation created {}" , data. display( ) ) ;
964+ for ( root, existed) in default_roots. iter ( ) . zip ( default_existed) {
965+ if !existed {
966+ assert ! ( !root. exists( ) , "validation created default root {}" , root. display( ) ) ;
967+ }
1062968 }
1063- assert ! ( !tmp. path( ) . join( "relative-home" ) . exists( ) ) ;
1064- assert ! ( !tmp. path( ) . join( "relative-dir" ) . exists( ) ) ;
1065969 } ) ;
1066970 }
1067971
0 commit comments