Skip to content

Commit b04f107

Browse files
committed
Add XDG_BIN_HOME support
1 parent 94dba3f commit b04f107

File tree

6 files changed

+71
-19
lines changed

6 files changed

+71
-19
lines changed

base_dirs.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ const (
1111
envStateHome = "XDG_STATE_HOME"
1212
envCacheHome = "XDG_CACHE_HOME"
1313
envRuntimeDir = "XDG_RUNTIME_DIR"
14+
15+
// Non-standard.
16+
envBinHome = "XDG_BIN_HOME"
1417
)
1518

1619
type baseDirectories struct {
@@ -22,7 +25,8 @@ type baseDirectories struct {
2225
cacheHome string
2326
runtime string
2427

25-
// Non-standard directories.
28+
// Non-standard.
29+
binHome string
2630
fonts []string
2731
applications []string
2832
}

paths_darwin.go

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ func initBaseDirs(home string) {
3030
baseDirs.runtime = pathutil.EnvPath(envRuntimeDir, homeAppSupport)
3131

3232
// Initialize non-standard directories.
33+
baseDirs.binHome = pathutil.EnvPath(envBinHome, filepath.Join(home, ".local", "bin"))
34+
3335
baseDirs.applications = []string{
3436
"/Applications",
3537
}

paths_plan9.go

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ func initBaseDirs(home string) {
2626
baseDirs.runtime = pathutil.EnvPath(envRuntimeDir, "/tmp")
2727

2828
// Initialize non-standard directories.
29+
baseDirs.binHome = pathutil.EnvPath(envBinHome, filepath.Join(home, "bin"))
30+
2931
baseDirs.applications = []string{
3032
filepath.Join(home, "bin"),
3133
"/bin",

paths_unix.go

+2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ func initBaseDirs(home string) {
2727
baseDirs.runtime = pathutil.EnvPath(envRuntimeDir, filepath.Join("/run/user", strconv.Itoa(os.Getuid())))
2828

2929
// Initialize non-standard directories.
30+
baseDirs.binHome = pathutil.EnvPath(envBinHome, filepath.Join(home, ".local", "bin"))
31+
3032
appDirs := []string{
3133
filepath.Join(baseDirs.dataHome, "applications"),
3234
filepath.Join(home, ".local/share/applications"),

paths_windows.go

+53-18
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,17 @@ func initBaseDirs(home string, kf *knownFolders) {
2525
baseDirs.runtime = pathutil.EnvPath(envRuntimeDir, kf.localAppData)
2626

2727
// Initialize non-standard directories.
28+
baseDirs.binHome = pathutil.EnvPath(envBinHome, kf.userProgramFiles)
29+
2830
baseDirs.applications = []string{
2931
kf.programs,
3032
kf.commonPrograms,
33+
kf.programFiles,
34+
kf.programFilesCommon,
35+
kf.userProgramFiles,
36+
kf.userProgramFilesCommon,
3137
}
38+
3239
baseDirs.fonts = []string{
3340
kf.fonts,
3441
filepath.Join(kf.localAppData, "Microsoft", "Windows", "Fonts"),
@@ -47,24 +54,28 @@ func initUserDirs(home string, kf *knownFolders) {
4754
}
4855

4956
type knownFolders struct {
50-
systemDrive string
51-
systemRoot string
52-
programData string
53-
userProfile string
54-
userProfiles string
55-
roamingAppData string
56-
localAppData string
57-
desktop string
58-
downloads string
59-
documents string
60-
music string
61-
pictures string
62-
videos string
63-
templates string
64-
public string
65-
fonts string
66-
programs string
67-
commonPrograms string
57+
systemDrive string
58+
systemRoot string
59+
programData string
60+
userProfile string
61+
userProfiles string
62+
roamingAppData string
63+
localAppData string
64+
desktop string
65+
downloads string
66+
documents string
67+
music string
68+
pictures string
69+
videos string
70+
templates string
71+
public string
72+
fonts string
73+
programs string
74+
commonPrograms string
75+
programFiles string
76+
programFilesCommon string
77+
userProgramFiles string
78+
userProgramFilesCommon string
6879
}
6980

7081
func initKnownFolders(home string) *knownFolders {
@@ -156,6 +167,30 @@ func initKnownFolders(home string) *knownFolders {
156167
nil,
157168
[]string{filepath.Join(kf.programData, "Microsoft", "Windows", "Start Menu", "Programs")},
158169
)
170+
kf.programFiles = pathutil.KnownFolder(
171+
windows.FOLDERID_ProgramFiles,
172+
[]string{"ProgramFiles"},
173+
[]string{filepath.Join(kf.systemDrive, "Program Files")},
174+
)
175+
kf.programFilesCommon = pathutil.KnownFolder(
176+
windows.FOLDERID_ProgramFilesCommon,
177+
nil,
178+
[]string{filepath.Join(kf.programFiles, "Common Files")},
179+
)
180+
kf.userProgramFiles = pathutil.KnownFolder(
181+
windows.FOLDERID_UserProgramFiles,
182+
nil,
183+
[]string{
184+
filepath.Join(kf.localAppData, "Programs"),
185+
},
186+
)
187+
kf.userProgramFilesCommon = pathutil.KnownFolder(
188+
windows.FOLDERID_UserProgramFilesCommon,
189+
nil,
190+
[]string{
191+
filepath.Join(kf.userProgramFiles, "Common"),
192+
},
193+
)
159194

160195
return kf
161196
}

xdg.go

+7
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ var (
6767
// swapped out to disk.
6868
RuntimeDir string
6969

70+
// BinHome defines the base directory relative to which user-specific
71+
// binary files should be written. This directory is defined by
72+
// the non-standard $XDG_BIN_HOME environment variable. If the variable is
73+
// not set, a default equal to $HOME/.local/bin should be used.
74+
BinHome string
75+
7076
// UserDirs defines the locations of well known user directories.
7177
UserDirs UserDirectories
7278

@@ -104,6 +110,7 @@ func Reload() {
104110
RuntimeDir = baseDirs.runtime
105111

106112
// Set non-standard directories.
113+
BinHome = baseDirs.binHome
107114
FontDirs = baseDirs.fonts
108115
ApplicationDirs = baseDirs.applications
109116
}

0 commit comments

Comments
 (0)