forked from exercism/cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpaths.go
More file actions
115 lines (101 loc) · 2.7 KB
/
paths.go
File metadata and controls
115 lines (101 loc) · 2.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package paths
import (
"errors"
"os"
"path/filepath"
"runtime"
"strings"
)
const (
// File is the default name of the JSON file where the config written.
// The user can pass an alternate filename when using the CLI.
File = "exercism.json"
// DirExercises is the default name of the directory for active users.
// Make this non-exported when handlers.Login is deleted.
DirExercises = "exercism"
)
var (
// Home by default will contact the location of your home directory.
Home string
// ConfigHome will contain $XDG_CONFIG_HOME if it is set or default config home directory.
ConfigHome string
// DefaultConfig will contain default path to config, according to Home
DefaultConfig string
errHomeNotFound = errors.New("unable to locate home directory")
)
func init() {
var err error
Home, err = findHome()
if err != nil {
panic(err)
}
ConfigHome = os.Getenv("XDG_CONFIG_HOME")
if ConfigHome == "" {
ConfigHome = filepath.Join(Home, ".config")
}
DefaultConfig = filepath.Join(Home, "." + File)
}
// Config will return the correct input path given any input.
// Blank input will return the default configuration location based
// on ConfigHome.
// Non-blank input will expand home to be an absolute path.
// If the target is known to be a directory, the config filename
// will be appended.
func Config(path string) string {
if path == "" {
return filepath.Join(ConfigHome, File)
}
expandedPath := expandPath(path)
if IsDir(path) {
expandedPath = filepath.Join(expandedPath, File)
}
return expandedPath
}
// Exercises will return the correct exercises path given any input.
// Blank input will return the default location for exercises.
// Non-blank input will expand home to be an absolute path.
func Exercises(path string) string {
if path == "" {
return filepath.Join(Home, DirExercises)
}
return expandPath(path)
}
// IsDir determines whether the given path is a valid directory path.
func IsDir(path string) bool {
fi, _ := os.Stat(path)
return fi != nil && fi.IsDir()
}
func expandPath(path string) string {
return makeAbsolute(expandHome(strings.TrimSpace(path)))
}
func findHome() (string, error) {
var dir string
if runtime.GOOS == "windows" {
dir = os.Getenv("USERPROFILE")
if dir == "" {
dir = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
}
} else {
dir = os.Getenv("HOME")
}
if dir == "" {
return "", errHomeNotFound
}
return dir, nil
}
func makeAbsolute(path string) string {
if !filepath.IsAbs(path) {
wd, err := os.Getwd()
if err != nil {
panic(err)
}
return filepath.Join(wd, path)
}
return path
}
func expandHome(path string) string {
if strings.HasPrefix(path, "~"+string(os.PathSeparator)) {
return strings.Replace(path, "~", Home, 1)
}
return path
}