temp.go 1.6 KB

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