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)