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)