github.com/windmilleng/wat@v0.0.2-0.20180626175338-9349b638e250/cli/dirs/dirs.go (about) 1 package dirs 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "os/user" 8 "path/filepath" 9 ) 10 11 func CurrentHomeDir() (string, error) { 12 home := os.Getenv("HOME") 13 if home != "" { 14 return home, nil 15 } 16 17 current, err := user.Current() 18 if err != nil { 19 return "", err 20 } 21 return current.HomeDir, nil 22 } 23 24 // WindmillDir returns the root Windmill directory; by default ~/.windmill 25 func GetWindmillDir() (string, error) { 26 dir := os.Getenv("WMDAEMON_HOME") 27 if dir == "" { 28 dir = os.Getenv("WINDMILL_DIR") 29 } 30 if dir == "" { 31 homedir, err := CurrentHomeDir() 32 if err != nil { 33 return "", err 34 } 35 36 if homedir == "" { 37 return "", fmt.Errorf("Cannot find home directory; $HOME unset") 38 } 39 dir = filepath.Join(homedir, ".windmill") 40 } 41 42 dir, err := filepath.Abs(dir) 43 if err != nil { 44 return "", err 45 } 46 47 if _, err := os.Stat(dir); err != nil { 48 if os.IsNotExist(err) { 49 os.Mkdir(dir, os.FileMode(0755)) 50 } else { 51 return "", err 52 } 53 } 54 55 return dir, nil 56 } 57 58 func UseWindmillDir() (*WindmillDir, error) { 59 dir, err := GetWindmillDir() 60 if err != nil { 61 return nil, err 62 } 63 64 return &WindmillDir{dir: dir}, nil 65 } 66 67 type WindmillDir struct { 68 dir string 69 } 70 71 func (d *WindmillDir) Root() string { 72 return d.dir 73 } 74 75 func (d *WindmillDir) WriteFile(p, text string) error { 76 if filepath.IsAbs(p) { 77 return fmt.Errorf("WindmillDir.WriteFile: p must be relative to .windmill root: %v", p) 78 } 79 80 abs := filepath.Join(d.dir, p) 81 os.MkdirAll(filepath.Dir(abs), os.FileMode(0700)) 82 83 return ioutil.WriteFile(abs, []byte(text), os.FileMode(0700)) 84 } 85 86 func (d *WindmillDir) ReadFile(p string) (string, error) { 87 if filepath.IsAbs(p) { 88 return "", fmt.Errorf("WindmillDir.ReadFile: p must be relative to .windmill root: %v", p) 89 } 90 91 abs := filepath.Join(d.dir, p) 92 bs, err := ioutil.ReadFile(abs) 93 if err != nil { 94 return "", err 95 } 96 97 return string(bs), nil 98 } 99 100 func (d *WindmillDir) MkdirAll(p string) error { 101 if filepath.IsAbs(p) { 102 return fmt.Errorf("WindmillDir.MkdirAll: p must be relative to .windmill root: %v", p) 103 } 104 105 return os.MkdirAll(filepath.Join(d.dir, p), os.FileMode(0700)) 106 } 107 108 func (d *WindmillDir) Abs(p string) (string, error) { 109 if filepath.IsAbs(p) { 110 return "", fmt.Errorf("WindmillDir.Abs: p must be relative to .windmill root: %v", p) 111 } 112 113 return filepath.Join(d.dir, p), nil 114 }