123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // Copyright 2020 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package util
-
- import (
- "os"
- "runtime"
- "syscall"
- "time"
- )
-
- const windowsSharingViolationError syscall.Errno = 32
-
- // Remove removes the named file or (empty) directory with at most 5 attempts.
- func Remove(name string) error {
- var err error
- for i := 0; i < 5; i++ {
- err = os.Remove(name)
- if err == nil {
- break
- }
- unwrapped := err.(*os.PathError).Err
- if unwrapped == syscall.EBUSY || unwrapped == syscall.ENOTEMPTY || unwrapped == syscall.EPERM || unwrapped == syscall.EMFILE || unwrapped == syscall.ENFILE {
- // try again
- <-time.After(100 * time.Millisecond)
- continue
- }
-
- if unwrapped == windowsSharingViolationError && runtime.GOOS == "windows" {
- // try again
- <-time.After(100 * time.Millisecond)
- continue
- }
-
- if unwrapped == syscall.ENOENT {
- // it's already gone
- return nil
- }
- }
- return err
- }
-
- // RemoveAll removes the named file or (empty) directory with at most 5 attempts.
- func RemoveAll(name string) error {
- var err error
- for i := 0; i < 5; i++ {
- err = os.RemoveAll(name)
- if err == nil {
- break
- }
- unwrapped := err.(*os.PathError).Err
- if unwrapped == syscall.EBUSY || unwrapped == syscall.ENOTEMPTY || unwrapped == syscall.EPERM || unwrapped == syscall.EMFILE || unwrapped == syscall.ENFILE {
- // try again
- <-time.After(100 * time.Millisecond)
- continue
- }
-
- if unwrapped == windowsSharingViolationError && runtime.GOOS == "windows" {
- // try again
- <-time.After(100 * time.Millisecond)
- continue
- }
-
- if unwrapped == syscall.ENOENT {
- // it's already gone
- return nil
- }
- }
- return err
- }
-
- // Rename renames (moves) oldpath to newpath with at most 5 attempts.
- func Rename(oldpath, newpath string) error {
- var err error
- for i := 0; i < 5; i++ {
- err = os.Rename(oldpath, newpath)
- if err == nil {
- break
- }
- unwrapped := err.(*os.LinkError).Err
- if unwrapped == syscall.EBUSY || unwrapped == syscall.ENOTEMPTY || unwrapped == syscall.EPERM || unwrapped == syscall.EMFILE || unwrapped == syscall.ENFILE {
- // try again
- <-time.After(100 * time.Millisecond)
- continue
- }
-
- if unwrapped == windowsSharingViolationError && runtime.GOOS == "windows" {
- // try again
- <-time.After(100 * time.Millisecond)
- continue
- }
-
- if i == 0 && os.IsNotExist(err) {
- return err
- }
-
- if unwrapped == syscall.ENOENT {
- // it's already gone
- return nil
- }
- }
- return err
- }
|