ci / api / api (push) Successful in 50s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Failing after 10s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Failing after 31m43s
ci / db / db (push) Failing after 19s
- Imported tracks are created directly under their final name with O_EXCL (never overwriting; " (2)" on conflict), fsync'ed and checked against SHA-256 — no hidden .pipu-tmp file next to them any more. - On any failure the agent removes its own partial file and the empty directories it created for it. - The write check uses access(W_OK) and the read-only mount flag instead of creating and deleting .pipu-write-test in the storage root. - Tests assert the storage tree holds only audio files after successful and failed writes and after the write check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
21 lines
409 B
Go
21 lines
409 B
Go
//go:build !unix
|
|
|
|
package storageagent
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
)
|
|
|
|
// canWrite — запасная проверка для не-Unix (только разработка): бит записи у каталога.
|
|
func canWrite(dir string) error {
|
|
info, err := os.Stat(dir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if info.Mode().Perm()&0o200 == 0 {
|
|
return errors.New("directory is not writable")
|
|
}
|
|
return nil
|
|
}
|