github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/shell/paths.go (about)

     1  package shell
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  
     7  	"github.com/markusbkk/elvish/pkg/daemon/daemondefs"
     8  	"github.com/markusbkk/elvish/pkg/fsutil"
     9  	"github.com/markusbkk/elvish/pkg/prog"
    10  )
    11  
    12  func rcPath() (string, error) {
    13  	if legacyRC, exists := legacyDataPath("rc.elv", false); exists {
    14  		return legacyRC, nil
    15  	}
    16  	return newRCPath()
    17  }
    18  
    19  func libPaths() ([]string, error) {
    20  	paths, err := newLibPaths()
    21  	if legacyLib, exists := legacyDataPath("lib", true); exists {
    22  		paths = append(paths, legacyLib)
    23  	}
    24  	return paths, err
    25  }
    26  
    27  // Returns a SpawnConfig containing all the paths needed by the daemon. It
    28  // respects overrides of sock and db from CLI flags.
    29  func daemonPaths(p *prog.DaemonPaths) (*daemondefs.SpawnConfig, error) {
    30  	runDir, err := secureRunDir()
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  	sock := p.Sock
    35  	if sock == "" {
    36  		sock = filepath.Join(runDir, "sock")
    37  	}
    38  
    39  	db := p.DB
    40  	if db == "" {
    41  		var err error
    42  		db, err = dbPath()
    43  		if err != nil {
    44  			return nil, err
    45  		}
    46  		err = os.MkdirAll(filepath.Dir(db), 0700)
    47  		if err != nil {
    48  			return nil, err
    49  		}
    50  	}
    51  	return &daemondefs.SpawnConfig{DbPath: db, SockPath: sock, RunDir: runDir}, nil
    52  }
    53  
    54  func dbPath() (string, error) {
    55  	if legacyDB, exists := legacyDataPath("db", false); exists {
    56  		return legacyDB, nil
    57  	}
    58  	return newDBPath()
    59  }
    60  
    61  // Returns a path in the legacy data directory path, and whether it exists and
    62  // matches the expected file/directory property.
    63  func legacyDataPath(name string, dir bool) (string, bool) {
    64  	home, err := fsutil.GetHome("")
    65  	if err != nil {
    66  		return "", false
    67  	}
    68  	p := filepath.Join(home, ".elvish", name)
    69  	info, err := os.Stat(p)
    70  	if err != nil || info.IsDir() != dir {
    71  		return "", false
    72  	}
    73  	return p, true
    74  }