1- use std:: path:: PathBuf ;
1+ use std:: { ffi :: OsString , path:: PathBuf } ;
22
33use etcetera:: BaseStrategy ;
44
@@ -20,19 +20,15 @@ use uv_static::EnvVars;
2020pub fn user_executable_directory ( override_variable : Option < & ' static str > ) -> Option < PathBuf > {
2121 override_variable
2222 . and_then ( std:: env:: var_os)
23- . and_then ( dirs_sys :: is_absolute_path )
24- . or_else ( || std:: env:: var_os ( EnvVars :: XDG_BIN_HOME ) . and_then ( dirs_sys :: is_absolute_path ) )
23+ . and_then ( parse_path )
24+ . or_else ( || std:: env:: var_os ( EnvVars :: XDG_BIN_HOME ) . and_then ( parse_path ) )
2525 . or_else ( || {
2626 std:: env:: var_os ( EnvVars :: XDG_DATA_HOME )
27- . and_then ( dirs_sys :: is_absolute_path )
27+ . and_then ( parse_path )
2828 . map ( |path| path. join ( "../bin" ) )
2929 } )
3030 . or_else ( || {
31- // See https://github.com/dirs-dev/dirs-rs/blob/50b50f31f3363b7656e5e63b3fa1060217cbc844/src/win.rs#L5C58-L5C78
32- #[ cfg( windows) ]
33- let home_dir = dirs_sys:: known_folder_profile ( ) ;
34- #[ cfg( not( windows) ) ]
35- let home_dir = dirs_sys:: home_dir ( ) ;
31+ let home_dir = etcetera:: home_dir ( ) . ok ( ) ;
3632 home_dir. map ( |path| path. join ( ".local" ) . join ( "bin" ) )
3733 } )
3834}
@@ -51,7 +47,16 @@ pub fn user_cache_dir() -> Option<PathBuf> {
5147/// Uses `/Users/user/Library/Application Support/uv` on macOS, in contrast to the new preference
5248/// for using the XDG directories on all Unix platforms.
5349pub fn legacy_user_cache_dir ( ) -> Option < PathBuf > {
54- directories:: ProjectDirs :: from ( "" , "" , "uv" ) . map ( |dirs| dirs. cache_dir ( ) . to_path_buf ( ) )
50+ etcetera:: base_strategy:: choose_native_strategy ( )
51+ . ok ( )
52+ . map ( |dirs| dirs. cache_dir ( ) . join ( "uv" ) )
53+ . map ( |dir| {
54+ if cfg ! ( windows) {
55+ dir. join ( "cache" )
56+ } else {
57+ dir
58+ }
59+ } )
5560}
5661
5762/// Returns an appropriate user-level directory for storing application state.
@@ -68,5 +73,18 @@ pub fn user_state_dir() -> Option<PathBuf> {
6873/// Uses `/Users/user/Library/Application Support/uv` on macOS, in contrast to the new preference
6974/// for using the XDG directories on all Unix platforms.
7075pub fn legacy_user_state_dir ( ) -> Option < PathBuf > {
71- directories:: ProjectDirs :: from ( "" , "" , "uv" ) . map ( |dirs| dirs. data_dir ( ) . to_path_buf ( ) )
76+ etcetera:: base_strategy:: choose_native_strategy ( )
77+ . ok ( )
78+ . map ( |dirs| dirs. data_dir ( ) . join ( "uv" ) )
79+ . map ( |dir| if cfg ! ( windows) { dir. join ( "data" ) } else { dir } )
80+ }
81+
82+ /// Return a [`PathBuf`] if the given [`OsString`] is an absolute path.
83+ fn parse_path ( path : OsString ) -> Option < PathBuf > {
84+ let path = PathBuf :: from ( path) ;
85+ if path. is_absolute ( ) {
86+ Some ( path)
87+ } else {
88+ None
89+ }
7290}
0 commit comments