src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/shell/paths.go (about) 1 package shell 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 8 "src.elv.sh/pkg/daemon/daemondefs" 9 "src.elv.sh/pkg/env" 10 "src.elv.sh/pkg/prog" 11 ) 12 13 func rcPath() (string, error) { 14 if configHome := os.Getenv(env.XDG_CONFIG_HOME); configHome != "" { 15 return filepath.Join(configHome, "elvish", "rc.elv"), nil 16 } else if configHome, err := defaultConfigHome(); err == nil { 17 return filepath.Join(configHome, "elvish", "rc.elv"), nil 18 } else { 19 return "", fmt.Errorf("find rc.elv: %w", err) 20 } 21 } 22 23 func libPaths() ([]string, error) { 24 var paths []string 25 26 if configHome := os.Getenv(env.XDG_CONFIG_HOME); configHome != "" { 27 paths = append(paths, filepath.Join(configHome, "elvish", "lib")) 28 } else if configHome, err := defaultConfigHome(); err == nil { 29 paths = append(paths, filepath.Join(configHome, "elvish", "lib")) 30 } else { 31 return nil, fmt.Errorf("find roaming lib directory: %w", err) 32 } 33 34 if dataHome := os.Getenv(env.XDG_DATA_HOME); dataHome != "" { 35 paths = append(paths, filepath.Join(dataHome, "elvish", "lib")) 36 } else if dataHome, err := defaultDataHome(); err == nil { 37 paths = append(paths, filepath.Join(dataHome, "elvish", "lib")) 38 } else { 39 return nil, fmt.Errorf("find local lib directory: %w", err) 40 } 41 42 if dataDirs := os.Getenv(env.XDG_DATA_DIRS); dataDirs != "" { 43 // XDG requires the paths be joined with ":". However, on Windows ":" 44 // appear after the drive letter, so it's infeasible to use it to also 45 // join paths. 46 for _, dataDir := range filepath.SplitList(dataDirs) { 47 paths = append(paths, filepath.Join(dataDir, "elvish", "lib")) 48 } 49 } else { 50 paths = append(paths, defaultDataDirs...) 51 } 52 53 return paths, nil 54 } 55 56 // Returns a SpawnConfig containing all the paths needed by the daemon. It 57 // respects overrides of sock and db from CLI flags. 58 func daemonPaths(p *prog.DaemonPaths) (*daemondefs.SpawnConfig, error) { 59 runDir, err := secureRunDir() 60 if err != nil { 61 return nil, err 62 } 63 sock := p.Sock 64 if sock == "" { 65 sock = filepath.Join(runDir, "sock") 66 } 67 68 db := p.DB 69 if db == "" { 70 var err error 71 db, err = dbPath() 72 if err != nil { 73 return nil, err 74 } 75 err = os.MkdirAll(filepath.Dir(db), 0700) 76 if err != nil { 77 return nil, err 78 } 79 } 80 return &daemondefs.SpawnConfig{DbPath: db, SockPath: sock, RunDir: runDir}, nil 81 } 82 83 func dbPath() (string, error) { 84 if stateHome := os.Getenv(env.XDG_STATE_HOME); stateHome != "" { 85 return filepath.Join(stateHome, "elvish", "db.bolt"), nil 86 } else if stateHome, err := defaultStateHome(); err == nil { 87 return filepath.Join(stateHome, "elvish", "db.bolt"), nil 88 } else { 89 return "", fmt.Errorf("find db: %w", err) 90 } 91 }