github.com/tilt-dev/wat@v0.0.2-0.20180626175338-9349b638e250/os/temp/temp.go (about) 1 package temp 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 8 "github.com/windmilleng/wat/errors" 9 "github.com/windmilleng/wat/os/env" 10 ) 11 12 // TempDir holds a temp directory and allows easy access to new temp directories. 13 type TempDir struct { 14 dir string 15 } 16 17 // NewDir creates a new TempDir in the default location (typically $TMPDIR) 18 func NewDir(prefix string) (*TempDir, error) { 19 return NewDirAtRoot("", prefix) 20 } 21 22 // NewDir creates a new TempDir at the given root. 23 func NewDirAtRoot(root, prefix string) (*TempDir, error) { 24 tmpDir, err := ioutil.TempDir(root, prefix) 25 if err != nil { 26 return nil, errors.Propagatef(err, "temp.NewDir: couldn't ioutil.TempDir") 27 } 28 29 realTmpDir, err := filepath.EvalSymlinks(tmpDir) 30 if err != nil { 31 return nil, errors.Propagatef(err, "temp.NewDir: couldn't filepath.EvalSymlinks") 32 } 33 34 return &TempDir{dir: realTmpDir}, nil 35 } 36 37 // NewDirAtSlashTmp creates a new TempDir at /tmp 38 func NewDirAtSlashTmp(prefix string) (*TempDir, error) { 39 fullyResolvedPath, err := filepath.EvalSymlinks("/tmp") 40 if err != nil { 41 return nil, err 42 } 43 return NewDirAtRoot(fullyResolvedPath, prefix) 44 } 45 46 // d.NewDir creates a new TempDir under d 47 func (d *TempDir) NewDir(prefix string) (*TempDir, error) { 48 d2, err := ioutil.TempDir(d.dir, prefix) 49 if err != nil { 50 return nil, err 51 } 52 return &TempDir{d2}, nil 53 } 54 55 func (d *TempDir) NewDeterministicDir(name string) (*TempDir, error) { 56 d2 := filepath.Join(d.dir, name) 57 err := os.Mkdir(d2, 0700) 58 if os.IsExist(err) { 59 return nil, err 60 } else if err != nil { 61 return nil, err 62 } 63 return &TempDir{d2}, nil 64 } 65 66 func (d *TempDir) TearDown() error { 67 if env.IsDebug() { 68 return nil 69 } 70 return os.RemoveAll(d.dir) 71 } 72 73 func (d *TempDir) Path() string { 74 return d.dir 75 } 76 77 // Possible extensions: 78 // temp file 79 // named directories or files (e.g., we know we want one git repo for our object, but it should be temporary)