mirror of
https://github.com/rclone/rclone.git
synced 2025-07-01 23:31:35 +08:00
113 lines
2.3 KiB
Go
113 lines
2.3 KiB
Go
package filelu
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"path"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/rclone/rclone/fs"
|
|
"github.com/rclone/rclone/fs/fserrors"
|
|
"github.com/rclone/rclone/fs/hash"
|
|
)
|
|
|
|
// errFileNotFound represent file not found error
|
|
var errFileNotFound error = errors.New("file not found")
|
|
|
|
// getFileCode retrieves the file code for a given file path
|
|
func (f *Fs) getFileCode(ctx context.Context, filePath string) (string, error) {
|
|
// Prepare parent directory
|
|
parentDir := path.Dir(filePath)
|
|
|
|
// Call List to get all the files
|
|
result, err := f.getFolderList(ctx, parentDir)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
for _, file := range result.Result.Files {
|
|
filePathFromServer := parentDir + "/" + file.Name
|
|
if parentDir == "/" {
|
|
filePathFromServer = "/" + file.Name
|
|
}
|
|
if filePath == filePathFromServer {
|
|
return file.FileCode, nil
|
|
}
|
|
}
|
|
|
|
return "", errFileNotFound
|
|
}
|
|
|
|
// Features returns the optional features of this Fs
|
|
func (f *Fs) Features() *fs.Features {
|
|
return f.features
|
|
}
|
|
|
|
func (f *Fs) fromStandardPath(remote string) string {
|
|
return f.opt.Enc.FromStandardPath(remote)
|
|
}
|
|
|
|
func (f *Fs) toStandardPath(remote string) string {
|
|
return f.opt.Enc.ToStandardPath(remote)
|
|
}
|
|
|
|
// Hashes returns an empty hash set, indicating no hash support
|
|
func (f *Fs) Hashes() hash.Set {
|
|
return hash.NewHashSet() // Properly creates an empty hash set
|
|
}
|
|
|
|
// Name returns the remote name
|
|
func (f *Fs) Name() string {
|
|
return f.name
|
|
}
|
|
|
|
// Root returns the root path
|
|
func (f *Fs) Root() string {
|
|
return f.root
|
|
}
|
|
|
|
// Precision returns the precision of the remote
|
|
func (f *Fs) Precision() time.Duration {
|
|
return fs.ModTimeNotSupported
|
|
}
|
|
|
|
func (f *Fs) String() string {
|
|
return fmt.Sprintf("FileLu root '%s'", f.root)
|
|
}
|
|
|
|
// isFileCode checks if a string looks like a file code
|
|
func isFileCode(s string) bool {
|
|
if len(s) != 12 {
|
|
return false
|
|
}
|
|
for _, c := range s {
|
|
if !((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func shouldRetry(err error) bool {
|
|
return fserrors.ShouldRetry(err)
|
|
}
|
|
|
|
func shouldRetryHTTP(code int) bool {
|
|
return code == 429 || code >= 500
|
|
}
|
|
|
|
func rootSplit(absPath string) (bucket, bucketPath string) {
|
|
// No bucket
|
|
if absPath == "" {
|
|
return "", ""
|
|
}
|
|
slash := strings.IndexRune(absPath, '/')
|
|
// Bucket but no path
|
|
if slash < 0 {
|
|
return absPath, ""
|
|
}
|
|
return absPath[:slash], absPath[slash+1:]
|
|
}
|