-
Notifications
You must be signed in to change notification settings - Fork 9
/
userdirs.go
121 lines (110 loc) · 2.52 KB
/
userdirs.go
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 userdirs provides easy access to "well known" user
// directories. For more information, see:
// https://www.freedesktop.org/wiki/Software/xdg-user-dirs/
package userdirs
import (
"github.com/rkoesters/xdg/basedir"
"github.com/rkoesters/xdg/keyfile"
"io"
"os"
"path/filepath"
"strings"
)
// The default set of userdirs. Most people will only need to use this.
var (
Desktop string
Documents string
Download string
Music string
Pictures string
PublicShare string
Templates string
Videos string
)
func init() {
f, err := os.Open(filepath.Join(basedir.ConfigHome, "user-dirs.dirs"))
if err != nil {
return
}
defer f.Close()
dirs, err := New(f)
if err != nil {
return
}
Desktop = dirs.Desktop
Documents = dirs.Documents
Download = dirs.Download
Music = dirs.Music
Pictures = dirs.Pictures
PublicShare = dirs.PublicShare
Templates = dirs.Templates
Videos = dirs.Videos
}
// UserDirs is a set of user directories that are common in graphical
// environments.
type UserDirs struct {
Desktop string
Documents string
Download string
Music string
Pictures string
PublicShare string
Templates string
Videos string
}
// New creates a new UserDirs struct by reading from the given
// io.Reader.
func New(r io.Reader) (*UserDirs, error) {
kf, err := keyfile.New(r)
if err != nil {
return nil, err
}
dirs := new(UserDirs)
dirs.Desktop, err = parse(kf.String("", "XDG_DESKTOP_DIR"))
if err != nil {
return nil, err
}
dirs.Documents, err = parse(kf.String("", "XDG_DOCUMENTS_DIR"))
if err != nil {
return nil, err
}
dirs.Download, err = parse(kf.String("", "XDG_DOWNLOAD_DIR"))
if err != nil {
return nil, err
}
dirs.Music, err = parse(kf.String("", "XDG_MUSIC_DIR"))
if err != nil {
return nil, err
}
dirs.Pictures, err = parse(kf.String("", "XDG_PICTURES_DIR"))
if err != nil {
return nil, err
}
dirs.PublicShare, err = parse(kf.String("", "XDG_PUBLICSHARE_DIR"))
if err != nil {
return nil, err
}
dirs.Templates, err = parse(kf.String("", "XDG_TEMPLATES_DIR"))
if err != nil {
return nil, err
}
dirs.Videos, err = parse(kf.String("", "XDG_VIDEOS_DIR"))
if err != nil {
return nil, err
}
return dirs, nil
}
// parse takes a given string and returns it as a path.
func parse(s string, err error) (string, error) {
if err != nil {
return "", err
}
s = strings.Trim(s, "\"")
if strings.HasPrefix(s, "$HOME") {
s = filepath.Join(basedir.Home, strings.TrimPrefix(s, "$HOME"))
}
if s == "" {
s = basedir.Home
}
return s, nil
}