github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/watch/temp.go (about)

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