temp_dir.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package runner
  2. import (
  3. "os"
  4. "os/exec"
  5. "path"
  6. "github.com/google/uuid"
  7. )
  8. type TempDirRunner struct{}
  9. func (s *TempDirRunner) WithTempDir(basedir string, paths []string, closures func(path string) error) error {
  10. uuid, err := uuid.NewRandom()
  11. if err != nil {
  12. return err
  13. }
  14. // create a tmp dir
  15. tmp_dir := path.Join(basedir, "tmp", "sandbox-"+uuid.String())
  16. err = os.Mkdir(tmp_dir, 0755)
  17. if err != nil {
  18. return err
  19. }
  20. // copy files to tmp dir
  21. for _, file_path := range paths {
  22. // create path in tmp dir
  23. // check if it's a dir
  24. file_info, err := os.Stat(file_path)
  25. if err != nil {
  26. continue
  27. }
  28. if file_info.IsDir() {
  29. err = os.MkdirAll(path.Join(tmp_dir, file_path), 0755)
  30. if err != nil {
  31. return err
  32. }
  33. } else {
  34. err = os.MkdirAll(path.Join(tmp_dir, path.Dir(file_path)), 0755)
  35. if err != nil {
  36. return err
  37. }
  38. }
  39. err = exec.Command("cp", "-r", file_path, path.Join(tmp_dir, file_path)).Run()
  40. if err != nil {
  41. return err
  42. }
  43. }
  44. // chdir
  45. err = os.Chdir(tmp_dir)
  46. if err != nil {
  47. return err
  48. }
  49. err = closures(tmp_dir)
  50. if err != nil {
  51. return err
  52. }
  53. return nil
  54. }