-
-
Notifications
You must be signed in to change notification settings - Fork 369
Expand file tree
/
Copy pathpaths.go
More file actions
121 lines (104 loc) · 2.65 KB
/
paths.go
File metadata and controls
121 lines (104 loc) · 2.65 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
116
117
118
119
120
121
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
// XDGConfigHome will contain $XDG_CONFIG_HOME if it exists.
XDGConfigHome string
errHomeNotFound = errors.New("unable to locate home directory")
)
func init() {
// on startup set default values
Recalculate()
}
// Config will return the correct input path given any input.
// Blank input will return the default configuration location.
// 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 == "" {
if XDGConfigHome == "" {
return filepath.Join(Home, File)
}
return filepath.Join(XDGConfigHome, 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)
}
// Recalculate sets exercism paths based on Home.
func Recalculate() {
if Home == "" {
home, err := findHome()
if err != nil {
panic(err)
}
Home = home
}
XDGConfigHome = os.Getenv("XDG_CONFIG_HOME")
}
// 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 path[:2] == "~"+string(os.PathSeparator) {
return strings.Replace(path, "~", Home, 1)
}
return path
}