1
1
//! Enable loading the magic database files at runtime rather than embedding the GPLed database
2
2
3
- use std:: env;
3
+ use std:: env:: { split_paths, var_os} ;
4
+ use std:: ffi:: OsString ;
4
5
use std:: fs:: { read, read_to_string} ;
5
- use std:: path:: PathBuf ;
6
+ use std:: path:: { Path , PathBuf } ;
6
7
7
8
use fnv:: FnvHashMap ;
8
9
use once_cell:: sync:: OnceCell ;
@@ -12,31 +13,31 @@ use super::MagicRule;
12
13
use crate :: fdo_magic:: ruleset;
13
14
use crate :: Mime ;
14
15
15
- fn paths_from_env_var ( var : & str , filename : & str , buffer : & mut Vec < PathBuf > ) {
16
- for dir in var. split ( ':' ) {
17
- buffer. push ( PathBuf :: from ( dir) . join ( "mime" ) . join ( filename) ) ;
18
- }
16
+ fn mime_path ( base : & Path , filename : & str ) -> PathBuf {
17
+ base. join ( "mime" ) . join ( filename)
19
18
}
20
19
21
20
fn search_paths ( filename : & str ) -> Vec < PathBuf > {
22
- let mut search_paths: Vec < PathBuf > = Vec :: new ( ) ;
23
- let dirs = env:: var ( "XDG_DATA_DIRS" ) . unwrap_or ( "/usr/local/share/:/usr/share/" . to_string ( ) ) ;
24
- paths_from_env_var ( & dirs, filename, & mut search_paths) ;
21
+ let mut paths = Vec :: new ( ) ;
22
+
23
+ let data_dirs = match var_os ( "XDG_DATA_DIRS" ) {
24
+ Some ( dirs) if !dirs. is_empty ( ) => dirs,
25
+ _ => OsString :: from ( "/usr/local/share/:/usr/share/" ) ,
26
+ } ;
27
+ paths. extend ( split_paths ( & data_dirs) . map ( |base| mime_path ( & base, filename) ) ) ;
25
28
26
- let dirs = env:: var ( "XDG_DATA_HOME" ) . or_else ( |_| {
27
- env:: var ( "HOME" ) . map ( |home| {
28
- PathBuf :: from ( home)
29
- . join ( ".local/share" )
30
- . to_string_lossy ( )
31
- . to_string ( )
32
- } )
33
- } ) ;
34
- if let Ok ( dirs) = dirs {
35
- paths_from_env_var ( & dirs, filename, & mut search_paths) ;
29
+ let data_home = match var_os ( "XDG_DATA_HOME" ) {
30
+ Some ( data_home) if !data_home. is_empty ( ) => Some ( PathBuf :: from ( data_home) ) ,
31
+ _ => var_os ( "HOME" ) . map ( |home| Path :: new ( & home) . join ( ".local/share" ) ) ,
32
+ } ;
33
+ if let Some ( data_home) = data_home {
34
+ paths. push ( mime_path ( & data_home, filename) ) ;
36
35
}
36
+
37
37
#[ cfg( target_os = "macos" ) ]
38
- paths_from_env_var ( "/opt/homebrew/share" , filename, & mut search_paths) ;
39
- search_paths
38
+ paths. push ( mime_path ( Path :: new ( "/opt/homebrew/share" ) , filename) ) ;
39
+
40
+ paths
40
41
}
41
42
42
43
/// Load the magic database from the predefined locations in the XDG standard
0 commit comments