mirror of
https://github.com/rclone/rclone.git
synced 2025-08-18 09:30:03 +02:00
fs: add Fingerprint to detect changes in an object
This commit is contained in:
54
fs/fingerprint.go
Normal file
54
fs/fingerprint.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package fs
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/rclone/rclone/fs/hash"
|
||||
)
|
||||
|
||||
// Fingerprint produces a unique-ish string for an object.
|
||||
//
|
||||
// This is for detecting whether an object has changed since we last
|
||||
// saw it, not for checking object identity between two different
|
||||
// remotes - operations.Equal should be used for that.
|
||||
//
|
||||
// If fast is set then Fingerprint will only include attributes where
|
||||
// usually another operation is not required to fetch them. For
|
||||
// example if fast is set then this won't include hashes on the local
|
||||
// backend.
|
||||
func Fingerprint(ctx context.Context, o ObjectInfo, fast bool) string {
|
||||
var (
|
||||
out strings.Builder
|
||||
f = o.Fs()
|
||||
features = f.Features()
|
||||
)
|
||||
fmt.Fprintf(&out, "%d", o.Size())
|
||||
// Whether we want to do a slow operation or not
|
||||
//
|
||||
// fast true false true false
|
||||
// opIsSlow true true false false
|
||||
// do Op false true true true
|
||||
//
|
||||
// If !fast (slow) do the operation or if !OpIsSlow ==
|
||||
// OpIsFast do the operation.
|
||||
//
|
||||
// Eg don't do this for S3 where modtimes are expensive
|
||||
if !fast || !features.SlowModTime {
|
||||
if f.Precision() != ModTimeNotSupported {
|
||||
fmt.Fprintf(&out, ",%v", o.ModTime(ctx).UTC())
|
||||
}
|
||||
}
|
||||
// Eg don't do this for SFTP/local where hashes are expensive?
|
||||
if !fast || !features.SlowHash {
|
||||
hashType := f.Hashes().GetOne()
|
||||
if hashType != hash.None {
|
||||
hash, err := o.Hash(ctx, hashType)
|
||||
if err == nil {
|
||||
fmt.Fprintf(&out, ",%v", hash)
|
||||
}
|
||||
}
|
||||
}
|
||||
return out.String()
|
||||
}
|
Reference in New Issue
Block a user