2018-09-29 21:48:29 +08:00
|
|
|
// Clean the left over test files
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2019-06-17 16:34:30 +08:00
|
|
|
"context"
|
2021-11-04 18:12:57 +08:00
|
|
|
"fmt"
|
2018-09-29 21:48:29 +08:00
|
|
|
"log"
|
|
|
|
"regexp"
|
|
|
|
|
2019-07-29 01:47:38 +08:00
|
|
|
"github.com/rclone/rclone/fs"
|
2022-06-18 22:05:12 +08:00
|
|
|
"github.com/rclone/rclone/fs/fspath"
|
2019-07-29 01:47:38 +08:00
|
|
|
"github.com/rclone/rclone/fs/list"
|
|
|
|
"github.com/rclone/rclone/fs/operations"
|
2018-09-29 21:48:29 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
// MatchTestRemote matches the remote names used for testing (copied
|
|
|
|
// from fstest/fstest.go so we don't have to import that and get all
|
|
|
|
// its flags)
|
2019-02-07 19:29:52 +08:00
|
|
|
var MatchTestRemote = regexp.MustCompile(`^rclone-test-[abcdefghijklmnopqrstuvwxyz0123456789]{24}(_segments)?$`)
|
2018-09-29 21:48:29 +08:00
|
|
|
|
|
|
|
// cleanFs runs a single clean fs for left over directories
|
2020-03-31 22:56:58 +08:00
|
|
|
func cleanFs(ctx context.Context, remote string, cleanup bool) error {
|
2020-11-05 23:18:51 +08:00
|
|
|
f, err := fs.NewFs(context.Background(), remote)
|
2018-09-29 21:48:29 +08:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-03-31 22:56:58 +08:00
|
|
|
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, "")
|
2018-09-29 21:48:29 +08:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-02-07 19:29:52 +08:00
|
|
|
err = entries.ForDirError(func(dir fs.Directory) error {
|
2018-09-29 21:48:29 +08:00
|
|
|
dirPath := dir.Remote()
|
2022-06-18 22:05:12 +08:00
|
|
|
fullPath := fspath.JoinRootPath(remote, dirPath)
|
2018-09-29 21:48:29 +08:00
|
|
|
if MatchTestRemote.MatchString(dirPath) {
|
|
|
|
if *dryRun {
|
|
|
|
log.Printf("Not Purging %s - -dry-run", fullPath)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
log.Printf("Purging %s", fullPath)
|
2020-11-05 23:18:51 +08:00
|
|
|
dir, err := fs.NewFs(context.Background(), fullPath)
|
2018-09-29 21:48:29 +08:00
|
|
|
if err != nil {
|
2021-11-04 18:12:57 +08:00
|
|
|
err = fmt.Errorf("NewFs failed: %w", err)
|
2019-02-07 19:29:52 +08:00
|
|
|
lastErr = err
|
|
|
|
fs.Errorf(fullPath, "%v", err)
|
|
|
|
return nil
|
|
|
|
}
|
2020-03-31 22:56:58 +08:00
|
|
|
err = operations.Purge(ctx, dir, "")
|
2019-02-07 19:29:52 +08:00
|
|
|
if err != nil {
|
2022-06-09 04:54:39 +08:00
|
|
|
err = fmt.Errorf("purge failed: %w", err)
|
2019-02-07 19:29:52 +08:00
|
|
|
lastErr = err
|
|
|
|
fs.Errorf(dir, "%v", err)
|
|
|
|
return nil
|
2018-09-29 21:48:29 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
2019-02-07 19:29:52 +08:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return lastErr
|
2018-09-29 21:48:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// cleanRemotes cleans the list of remotes passed in
|
2020-03-31 22:56:58 +08:00
|
|
|
func cleanRemotes(conf *Config) error {
|
2018-09-29 21:48:29 +08:00
|
|
|
var lastError error
|
2020-03-31 22:56:58 +08:00
|
|
|
for _, backend := range conf.Backends {
|
|
|
|
remote := backend.Remote
|
2018-09-29 21:48:29 +08:00
|
|
|
log.Printf("%q - Cleaning", remote)
|
2020-03-31 22:56:58 +08:00
|
|
|
err := cleanFs(context.Background(), remote, backend.CleanUp)
|
2018-09-29 21:48:29 +08:00
|
|
|
if err != nil {
|
|
|
|
lastError = err
|
|
|
|
log.Printf("Failed to purge %q: %v", remote, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return lastError
|
|
|
|
}
|