You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

remove.go 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package util
  5. import (
  6. "os"
  7. "syscall"
  8. "time"
  9. )
  10. // Remove removes the named file or (empty) directory with at most 5 attempts.
  11. func Remove(name string) error {
  12. var err error
  13. for i := 0; i < 5; i++ {
  14. err = os.Remove(name)
  15. if err == nil {
  16. break
  17. }
  18. unwrapped := err.(*os.PathError).Err
  19. if unwrapped == syscall.EBUSY || unwrapped == syscall.ENOTEMPTY || unwrapped == syscall.EPERM || unwrapped == syscall.EMFILE || unwrapped == syscall.ENFILE {
  20. // try again
  21. <-time.After(100 * time.Millisecond)
  22. continue
  23. }
  24. if unwrapped == syscall.ENOENT {
  25. // it's already gone
  26. return nil
  27. }
  28. }
  29. return err
  30. }
  31. // RemoveAll removes the named file or (empty) directory with at most 5 attempts.
  32. func RemoveAll(name string) error {
  33. var err error
  34. for i := 0; i < 5; i++ {
  35. err = os.RemoveAll(name)
  36. if err == nil {
  37. break
  38. }
  39. unwrapped := err.(*os.PathError).Err
  40. if unwrapped == syscall.EBUSY || unwrapped == syscall.ENOTEMPTY || unwrapped == syscall.EPERM || unwrapped == syscall.EMFILE || unwrapped == syscall.ENFILE {
  41. // try again
  42. <-time.After(100 * time.Millisecond)
  43. continue
  44. }
  45. if unwrapped == syscall.ENOENT {
  46. // it's already gone
  47. return nil
  48. }
  49. }
  50. return err
  51. }
  52. // Rename renames (moves) oldpath to newpath with at most 5 attempts.
  53. func Rename(oldpath, newpath string) error {
  54. var err error
  55. for i := 0; i < 5; i++ {
  56. err = os.Rename(oldpath, newpath)
  57. if err == nil {
  58. break
  59. }
  60. unwrapped := err.(*os.PathError).Err
  61. if unwrapped == syscall.EBUSY || unwrapped == syscall.ENOTEMPTY || unwrapped == syscall.EPERM || unwrapped == syscall.EMFILE || unwrapped == syscall.ENFILE {
  62. // try again
  63. <-time.After(100 * time.Millisecond)
  64. continue
  65. }
  66. if i == 0 && os.IsNotExist(err) {
  67. return err
  68. }
  69. if unwrapped == syscall.ENOENT {
  70. // it's already gone
  71. return nil
  72. }
  73. }
  74. return err
  75. }