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  }