refactor: retry file remove/rename when a file is busy and clean up os detection (#38588)

Rename functions "util.Remove" (remove.go) to "util.RemoveWithRetry"
(file_retry.go) and add comments to clarify their behaviors, also add
tests.

Refactor callers: when no concurrent access (cmd cli, migration, app
init, test), use "os.Xxx" directly.

More details are in `modules/util/file_retry.go`

By the way, clean up OS (windows) detection, make FileURLToPath test
always run
This commit is contained in:
wxiaoguang
2026-07-23 22:31:29 +08:00
committed by GitHub
parent c4fc4d363b
commit e992b0a7cc
32 changed files with 225 additions and 225 deletions
+44
View File
@@ -0,0 +1,44 @@
// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package util
import (
"io"
"os"
"syscall"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestRetryWhenFileBusy(t *testing.T) {
var callCount int
testErrPath := &os.PathError{Op: "test", Path: "test", Err: syscall.EBUSY}
fn := func() error {
if callCount == 2 {
return nil
}
callCount++
return testErrPath
}
callCount = 0
err := retryWhenFileBusyInternal(1, time.Millisecond, fn)
assert.Equal(t, testErrPath, err)
assert.Equal(t, 1, callCount)
callCount = 0
err = retryWhenFileBusyInternal(10, time.Millisecond, fn)
assert.NoError(t, err)
assert.Equal(t, 2, callCount)
callCount = 0
err = retryWhenFileBusyInternal(10, time.Millisecond, func() error {
callCount++
return io.ErrUnexpectedEOF
})
assert.Equal(t, io.ErrUnexpectedEOF, err)
assert.Equal(t, 1, callCount)
}