mirror of https://github.com/Wox-launcher/Wox
200 lines
5.6 KiB
Go
200 lines
5.6 KiB
Go
package util
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/mitchellh/go-homedir"
|
|
)
|
|
|
|
var locationInstance *Location
|
|
var locationOnce sync.Once
|
|
|
|
type Location struct {
|
|
woxDataDirectory string
|
|
userDataDirectory string
|
|
userDataDirectoryShortcutPath string // A file named .wox.location that contains the user data directory path
|
|
}
|
|
|
|
func GetLocation() *Location {
|
|
locationOnce.Do(func() {
|
|
locationInstance = &Location{}
|
|
})
|
|
return locationInstance
|
|
}
|
|
|
|
func (l *Location) Init() error {
|
|
dirname, err := os.UserHomeDir()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get user home dir: %w", err)
|
|
}
|
|
|
|
// check if wox data directory exists, if not, create it
|
|
l.woxDataDirectory = path.Join(dirname, ".wox")
|
|
if directoryErr := l.EnsureDirectoryExist(l.woxDataDirectory); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
|
|
l.userDataDirectoryShortcutPath = path.Join(l.woxDataDirectory, ".userdata.location")
|
|
if _, statErr := os.Stat(l.userDataDirectoryShortcutPath); os.IsNotExist(statErr) {
|
|
// shortcut file does not exist, create and write default data directory path to it
|
|
file, createErr := os.Create(l.userDataDirectoryShortcutPath)
|
|
if createErr != nil {
|
|
return fmt.Errorf("failed to create shortcut file: %w", createErr)
|
|
}
|
|
defer file.Close()
|
|
|
|
// write data directory path to file
|
|
_, writeErr := file.WriteString(path.Join(l.woxDataDirectory, "wox-user"))
|
|
if writeErr != nil {
|
|
return fmt.Errorf("failed to write user data directory path to shortcut file: %w", writeErr)
|
|
}
|
|
}
|
|
|
|
// read data directory path from shortcut file
|
|
file, openErr := os.Open(l.userDataDirectoryShortcutPath)
|
|
if openErr != nil {
|
|
return fmt.Errorf("failed to open shortcut file: %w", openErr)
|
|
}
|
|
defer file.Close()
|
|
|
|
// read data directory path from file
|
|
readFile, readFileErr := os.ReadFile(l.userDataDirectoryShortcutPath)
|
|
if readFileErr != nil {
|
|
return fmt.Errorf("failed to read shortcut file: %w", readFileErr)
|
|
}
|
|
userDataDirectory, _ := homedir.Expand(string(readFile))
|
|
userDataDirectory = strings.ReplaceAll(userDataDirectory, "\n", "")
|
|
l.userDataDirectory = userDataDirectory
|
|
|
|
if directoryErr := l.EnsureDirectoryExist(l.userDataDirectory); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetLogDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetLogHostsDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetLogPluginDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetPluginDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetThemeDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetHostDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetPluginSettingDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetUIDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetCacheDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetImageCacheDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
if directoryErr := l.EnsureDirectoryExist(l.GetBackupDirectory()); directoryErr != nil {
|
|
return directoryErr
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (l *Location) EnsureDirectoryExist(directory string) error {
|
|
if _, statErr := os.Stat(directory); os.IsNotExist(statErr) {
|
|
mkdirErr := os.MkdirAll(directory, os.ModePerm)
|
|
if mkdirErr != nil {
|
|
return fmt.Errorf("failed to create directory [%s]: %w", directory, mkdirErr)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (l *Location) GetLogDirectory() string {
|
|
return path.Join(l.woxDataDirectory, "log")
|
|
}
|
|
|
|
func (l *Location) GetWoxDataDirectory() string {
|
|
return l.woxDataDirectory
|
|
}
|
|
|
|
func (l *Location) GetLogPluginDirectory() string {
|
|
return path.Join(l.GetLogDirectory(), "plugins")
|
|
}
|
|
|
|
func (l *Location) GetLogHostsDirectory() string {
|
|
return path.Join(l.GetLogDirectory(), "hosts")
|
|
}
|
|
|
|
func (l *Location) GetPluginDirectory() string {
|
|
return path.Join(l.userDataDirectory, "plugins")
|
|
}
|
|
|
|
func (l *Location) GetThemeDirectory() string {
|
|
return path.Join(l.userDataDirectory, "themes")
|
|
}
|
|
|
|
func (l *Location) GetPluginSettingDirectory() string {
|
|
return path.Join(l.userDataDirectory, "settings")
|
|
}
|
|
|
|
func (l *Location) GetUserDataDirectory() string {
|
|
return l.userDataDirectory
|
|
}
|
|
|
|
func (l *Location) GetWoxSettingPath() string {
|
|
return path.Join(l.GetPluginSettingDirectory(), "wox.json")
|
|
}
|
|
|
|
func (l *Location) GetWoxAppDataPath() string {
|
|
return path.Join(l.GetPluginSettingDirectory(), "wox.data.json")
|
|
}
|
|
|
|
func (l *Location) GetHostDirectory() string {
|
|
return path.Join(l.woxDataDirectory, "hosts")
|
|
}
|
|
|
|
func (l *Location) GetUIDirectory() string {
|
|
return path.Join(l.woxDataDirectory, "ui")
|
|
}
|
|
|
|
func (l *Location) GetCacheDirectory() string {
|
|
return path.Join(l.woxDataDirectory, "cache")
|
|
}
|
|
|
|
func (l *Location) GetImageCacheDirectory() string {
|
|
return path.Join(l.GetCacheDirectory(), "images")
|
|
}
|
|
|
|
func (l *Location) GetBackupDirectory() string {
|
|
return path.Join(l.woxDataDirectory, "backup")
|
|
}
|
|
|
|
func (l *Location) GetUIAppPath() string {
|
|
if IsWindows() {
|
|
return path.Join(l.GetUIDirectory(), "flutter", "wox", "wox.exe")
|
|
}
|
|
if IsLinux() {
|
|
return path.Join(l.GetUIDirectory(), "flutter", "wox", "wox")
|
|
}
|
|
if IsMacOS() {
|
|
return path.Join(l.GetUIDirectory(), "flutter", "wox.app", "Contents", "MacOS", "wox")
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (l *Location) GetAppLockPath() string {
|
|
return path.Join(l.GetWoxDataDirectory(), "wox.lock")
|
|
}
|