github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/fstest/test_all/clean.go (about)

     1  // Clean the left over test files
     2  
     3  package main
     4  
     5  import (
     6  	"context"
     7  	"log"
     8  	"regexp"
     9  
    10  	"github.com/pkg/errors"
    11  	"github.com/rclone/rclone/fs"
    12  	"github.com/rclone/rclone/fs/list"
    13  	"github.com/rclone/rclone/fs/operations"
    14  )
    15  
    16  // MatchTestRemote matches the remote names used for testing (copied
    17  // from fstest/fstest.go so we don't have to import that and get all
    18  // its flags)
    19  var MatchTestRemote = regexp.MustCompile(`^rclone-test-[abcdefghijklmnopqrstuvwxyz0123456789]{24}(_segments)?$`)
    20  
    21  // cleanFs runs a single clean fs for left over directories
    22  func cleanFs(ctx context.Context, remote string, cleanup bool) error {
    23  	f, err := fs.NewFs(remote)
    24  	if err != nil {
    25  		return err
    26  	}
    27  	var lastErr error
    28  	if cleanup {
    29  		log.Printf("%q - running cleanup", remote)
    30  		err = operations.CleanUp(ctx, f)
    31  		if err != nil {
    32  			lastErr = err
    33  			fs.Errorf(f, "Cleanup failed: %v", err)
    34  		}
    35  	}
    36  	entries, err := list.DirSorted(ctx, f, true, "")
    37  	if err != nil {
    38  		return err
    39  	}
    40  	err = entries.ForDirError(func(dir fs.Directory) error {
    41  		dirPath := dir.Remote()
    42  		fullPath := remote + dirPath
    43  		if MatchTestRemote.MatchString(dirPath) {
    44  			if *dryRun {
    45  				log.Printf("Not Purging %s - -dry-run", fullPath)
    46  				return nil
    47  			}
    48  			log.Printf("Purging %s", fullPath)
    49  			dir, err := fs.NewFs(fullPath)
    50  			if err != nil {
    51  				err = errors.Wrap(err, "NewFs failed")
    52  				lastErr = err
    53  				fs.Errorf(fullPath, "%v", err)
    54  				return nil
    55  			}
    56  			err = operations.Purge(ctx, dir, "")
    57  			if err != nil {
    58  				err = errors.Wrap(err, "Purge failed")
    59  				lastErr = err
    60  				fs.Errorf(dir, "%v", err)
    61  				return nil
    62  			}
    63  		}
    64  		return nil
    65  	})
    66  	if err != nil {
    67  		return err
    68  	}
    69  	return lastErr
    70  }
    71  
    72  // cleanRemotes cleans the list of remotes passed in
    73  func cleanRemotes(conf *Config) error {
    74  	var lastError error
    75  	for _, backend := range conf.Backends {
    76  		remote := backend.Remote
    77  		log.Printf("%q - Cleaning", remote)
    78  		err := cleanFs(context.Background(), remote, backend.CleanUp)
    79  		if err != nil {
    80  			lastError = err
    81  			log.Printf("Failed to purge %q: %v", remote, err)
    82  		}
    83  	}
    84  	return lastError
    85  }