1
mirror of https://github.com/rclone/rclone synced 2024-12-24 15:43:45 +01:00

test_all: optionally run Cleanup before cleaning a remote

Add this to the QingStor remote to stop it running out of buckets
This commit is contained in:
Nick Craig-Wood 2020-03-31 15:56:58 +01:00
parent 66e08e0cc8
commit 9a5178be7a
4 changed files with 19 additions and 21 deletions

View File

@ -19,16 +19,24 @@ import (
var MatchTestRemote = regexp.MustCompile(`^rclone-test-[abcdefghijklmnopqrstuvwxyz0123456789]{24}(_segments)?$`) var MatchTestRemote = regexp.MustCompile(`^rclone-test-[abcdefghijklmnopqrstuvwxyz0123456789]{24}(_segments)?$`)
// cleanFs runs a single clean fs for left over directories // cleanFs runs a single clean fs for left over directories
func cleanFs(remote string) error { func cleanFs(ctx context.Context, remote string, cleanup bool) error {
f, err := fs.NewFs(remote) f, err := fs.NewFs(remote)
if err != nil { if err != nil {
return err return err
} }
entries, err := list.DirSorted(context.Background(), f, true, "") var lastErr error
if cleanup {
log.Printf("%q - running cleanup", remote)
err = operations.CleanUp(ctx, f)
if err != nil {
lastErr = err
fs.Errorf(f, "Cleanup failed: %v", err)
}
}
entries, err := list.DirSorted(ctx, f, true, "")
if err != nil { if err != nil {
return err return err
} }
var lastErr error
err = entries.ForDirError(func(dir fs.Directory) error { err = entries.ForDirError(func(dir fs.Directory) error {
dirPath := dir.Remote() dirPath := dir.Remote()
fullPath := remote + dirPath fullPath := remote + dirPath
@ -45,7 +53,7 @@ func cleanFs(remote string) error {
fs.Errorf(fullPath, "%v", err) fs.Errorf(fullPath, "%v", err)
return nil return nil
} }
err = operations.Purge(context.Background(), dir, "") err = operations.Purge(ctx, dir, "")
if err != nil { if err != nil {
err = errors.Wrap(err, "Purge failed") err = errors.Wrap(err, "Purge failed")
lastErr = err lastErr = err
@ -62,11 +70,12 @@ func cleanFs(remote string) error {
} }
// cleanRemotes cleans the list of remotes passed in // cleanRemotes cleans the list of remotes passed in
func cleanRemotes(remotes []string) error { func cleanRemotes(conf *Config) error {
var lastError error var lastError error
for _, remote := range remotes { for _, backend := range conf.Backends {
remote := backend.Remote
log.Printf("%q - Cleaning", remote) log.Printf("%q - Cleaning", remote)
err := cleanFs(remote) err := cleanFs(context.Background(), remote, backend.CleanUp)
if err != nil { if err != nil {
lastError = err lastError = err
log.Printf("Failed to purge %q: %v", remote, err) log.Printf("Failed to purge %q: %v", remote, err)

View File

@ -33,6 +33,7 @@ type Backend struct {
Short bool // set to test with -short Short bool // set to test with -short
OneOnly bool // set to run only one backend test at once OneOnly bool // set to run only one backend test at once
MaxFile string // file size limit MaxFile string // file size limit
CleanUp bool // when running clean, run cleanup first
Ignore []string // test names to ignore the failure of Ignore []string // test names to ignore the failure of
Tests []string // paths of tests to run, blank for all Tests []string // paths of tests to run, blank for all
} }
@ -184,16 +185,3 @@ func (c *Config) filterTests(paths []string) {
} }
c.Tests = newTests c.Tests = newTests
} }
// Remotes returns the unique remotes
func (c *Config) Remotes() (remotes []string) {
found := map[string]struct{}{}
for _, backend := range c.Backends {
if _, ok := found[backend.Remote]; ok {
continue
}
remotes = append(remotes, backend.Remote)
found[backend.Remote] = struct{}{}
}
return remotes
}

View File

@ -205,6 +205,7 @@ backends:
remote: "TestQingStor:" remote: "TestQingStor:"
fastlist: false fastlist: false
oneonly: true oneonly: true
cleanup: true
- backend: "azureblob" - backend: "azureblob"
remote: "TestAzureBlob:" remote: "TestAzureBlob:"
fastlist: true fastlist: true

View File

@ -86,7 +86,7 @@ func main() {
// Just clean the directories if required // Just clean the directories if required
if *clean { if *clean {
err := cleanRemotes(conf.Remotes()) err := cleanRemotes(conf)
if err != nil { if err != nil {
log.Fatalf("Failed to clean: %v", err) log.Fatalf("Failed to clean: %v", err)
} }