forked from TrueCloudLab/rclone
config/hash: rename more symbols after factoring into own package
This commit is contained in:
parent
71722b5b95
commit
97c414f025
30 changed files with 181 additions and 181 deletions
|
@ -881,7 +881,7 @@ func (f *Fs) Precision() time.Duration {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashMD5)
|
return hash.Set(hash.MD5)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy src to this remote using server side copy operations.
|
// Copy src to this remote using server side copy operations.
|
||||||
|
@ -938,8 +938,8 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns the Md5sum of an object returning a lowercase hex string
|
// Hash returns the Md5sum of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashMD5 {
|
if t != hash.MD5 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
if o.info.ContentProperties != nil && o.info.ContentProperties.Md5 != nil {
|
if o.info.ContentProperties != nil && o.info.ContentProperties.Md5 != nil {
|
||||||
return *o.info.ContentProperties.Md5, nil
|
return *o.info.ContentProperties.Md5, nil
|
||||||
|
|
|
@ -629,7 +629,7 @@ func (f *Fs) Precision() time.Duration {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashMD5)
|
return hash.Set(hash.MD5)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Purge deletes all the files and directories including the old versions.
|
// Purge deletes all the files and directories including the old versions.
|
||||||
|
@ -697,8 +697,8 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns the MD5 of an object returning a lowercase hex string
|
// Hash returns the MD5 of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashMD5 {
|
if t != hash.MD5 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
// Convert base64 encoded md5 into lower case hex
|
// Convert base64 encoded md5 into lower case hex
|
||||||
if o.md5 == "" {
|
if o.md5 == "" {
|
||||||
|
@ -1065,7 +1065,7 @@ func (o *Object) Update(in io.Reader, src fs.ObjectInfo, options ...fs.OpenOptio
|
||||||
size := src.Size()
|
size := src.Size()
|
||||||
blob := o.getBlobWithModTime(src.ModTime())
|
blob := o.getBlobWithModTime(src.ModTime())
|
||||||
blob.Properties.ContentType = fs.MimeType(o)
|
blob.Properties.ContentType = fs.MimeType(o)
|
||||||
if sourceMD5, _ := src.Hash(hash.HashMD5); sourceMD5 != "" {
|
if sourceMD5, _ := src.Hash(hash.MD5); sourceMD5 != "" {
|
||||||
sourceMD5bytes, err := hex.DecodeString(sourceMD5)
|
sourceMD5bytes, err := hex.DecodeString(sourceMD5)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
blob.Properties.ContentMD5 = base64.StdEncoding.EncodeToString(sourceMD5bytes)
|
blob.Properties.ContentMD5 = base64.StdEncoding.EncodeToString(sourceMD5bytes)
|
||||||
|
|
|
@ -922,7 +922,7 @@ func (f *Fs) CleanUp() error {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashSHA1)
|
return hash.Set(hash.SHA1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -947,8 +947,8 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns the Sha-1 of an object returning a lowercase hex string
|
// Hash returns the Sha-1 of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashSHA1 {
|
if t != hash.SHA1 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
if o.sha1 == "" {
|
if o.sha1 == "" {
|
||||||
// Error is logged in readMetaData
|
// Error is logged in readMetaData
|
||||||
|
@ -1286,7 +1286,7 @@ func (o *Object) Update(in io.Reader, src fs.ObjectInfo, options ...fs.OpenOptio
|
||||||
|
|
||||||
modTime := src.ModTime()
|
modTime := src.ModTime()
|
||||||
|
|
||||||
calculatedSha1, _ := src.Hash(hash.HashSHA1)
|
calculatedSha1, _ := src.Hash(hash.SHA1)
|
||||||
if calculatedSha1 == "" {
|
if calculatedSha1 == "" {
|
||||||
calculatedSha1 = "hex_digits_at_end"
|
calculatedSha1 = "hex_digits_at_end"
|
||||||
har := newHashAppendingReader(in, sha1.New())
|
har := newHashAppendingReader(in, sha1.New())
|
||||||
|
|
|
@ -115,7 +115,7 @@ func (f *Fs) newLargeUpload(o *Object, in io.Reader, src fs.ObjectInfo) (up *lar
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
// Set the SHA1 if known
|
// Set the SHA1 if known
|
||||||
if calculatedSha1, err := src.Hash(hash.HashSHA1); err == nil && calculatedSha1 != "" {
|
if calculatedSha1, err := src.Hash(hash.SHA1); err == nil && calculatedSha1 != "" {
|
||||||
request.Info[sha1Key] = calculatedSha1
|
request.Info[sha1Key] = calculatedSha1
|
||||||
}
|
}
|
||||||
var response api.StartLargeFileResponse
|
var response api.StartLargeFileResponse
|
||||||
|
|
|
@ -831,7 +831,7 @@ func (f *Fs) DirCacheFlush() {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashSHA1)
|
return hash.Set(hash.SHA1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -861,8 +861,8 @@ func (o *Object) srvPath() string {
|
||||||
|
|
||||||
// Hash returns the SHA-1 of an object returning a lowercase hex string
|
// Hash returns the SHA-1 of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashSHA1 {
|
if t != hash.SHA1 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
return o.sha1, nil
|
return o.sha1, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,7 +310,7 @@ func (f *Fs) PutStream(in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashNone)
|
return hash.Set(hash.None)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mkdir makes the directory (container, bucket)
|
// Mkdir makes the directory (container, bucket)
|
||||||
|
@ -563,7 +563,7 @@ func (o *Object) Size() int64 {
|
||||||
// Hash returns the selected checksum of the file
|
// Hash returns the selected checksum of the file
|
||||||
// If no checksum is available it returns ""
|
// If no checksum is available it returns ""
|
||||||
func (o *Object) Hash(ht hash.Type) (string, error) {
|
func (o *Object) Hash(ht hash.Type) (string, error) {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnWrap returns the wrapped Object
|
// UnWrap returns the wrapped Object
|
||||||
|
|
|
@ -1194,7 +1194,7 @@ func (f *Fs) DirCacheFlush() {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashMD5)
|
return hash.Set(hash.MD5)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -1219,8 +1219,8 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns the Md5sum of an object returning a lowercase hex string
|
// Hash returns the Md5sum of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashMD5 {
|
if t != hash.MD5 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
return o.md5sum, nil
|
return o.md5sum, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -685,7 +685,7 @@ func (f *Fs) DirMove(src fs.Fs, srcRemote, dstRemote string) error {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashDropbox)
|
return hash.Set(hash.Dropbox)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -710,8 +710,8 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns the dropbox special hash
|
// Hash returns the dropbox special hash
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashDropbox {
|
if t != hash.Dropbox {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
err := o.readMetaData()
|
err := o.readMetaData()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -569,7 +569,7 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns the hash of an object returning a lowercase hex string
|
// Hash returns the hash of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
|
|
||||||
// Size returns the size of an object in bytes
|
// Size returns the size of an object in bytes
|
||||||
|
|
|
@ -676,7 +676,7 @@ func (f *Fs) Copy(src fs.Object, remote string) (fs.Object, error) {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashMD5)
|
return hash.Set(hash.MD5)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -701,8 +701,8 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns the Md5sum of an object returning a lowercase hex string
|
// Hash returns the Md5sum of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashMD5 {
|
if t != hash.MD5 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
return o.md5sum, nil
|
return o.md5sum, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -367,7 +367,7 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns "" since HTTP (in Go or OpenSSH) doesn't support remote calculation of hashes
|
// Hash returns "" since HTTP (in Go or OpenSSH) doesn't support remote calculation of hashes
|
||||||
func (o *Object) Hash(r hash.Type) (string, error) {
|
func (o *Object) Hash(r hash.Type) (string, error) {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
|
|
||||||
// Size returns the size in bytes of the remote http file
|
// Size returns the size in bytes of the remote http file
|
||||||
|
@ -439,7 +439,7 @@ func (o *Object) Open(options ...fs.OpenOption) (in io.ReadCloser, err error) {
|
||||||
|
|
||||||
// Hashes returns hash.HashNone to indicate remote hashing is unavailable
|
// Hashes returns hash.HashNone to indicate remote hashing is unavailable
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashNone)
|
return hash.Set(hash.None)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mkdir makes the root directory of the Fs object
|
// Mkdir makes the root directory of the Fs object
|
||||||
|
|
|
@ -539,7 +539,7 @@ func (f *Fs) DirMove(src fs.Fs, srcRemote, dstRemote string) error {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.SupportedHashes
|
return hash.Supported
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -676,7 +676,7 @@ func (file *localOpenFile) Close() (err error) {
|
||||||
// Open an object for read
|
// Open an object for read
|
||||||
func (o *Object) Open(options ...fs.OpenOption) (in io.ReadCloser, err error) {
|
func (o *Object) Open(options ...fs.OpenOption) (in io.ReadCloser, err error) {
|
||||||
var offset int64
|
var offset int64
|
||||||
hashes := hash.SupportedHashes
|
hashes := hash.Supported
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
switch x := option.(type) {
|
switch x := option.(type) {
|
||||||
case *fs.SeekOption:
|
case *fs.SeekOption:
|
||||||
|
@ -721,7 +721,7 @@ func (o *Object) mkdirAll() error {
|
||||||
|
|
||||||
// Update the object from in with modTime and size
|
// Update the object from in with modTime and size
|
||||||
func (o *Object) Update(in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error {
|
func (o *Object) Update(in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error {
|
||||||
hashes := hash.SupportedHashes
|
hashes := hash.Supported
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
switch x := option.(type) {
|
switch x := option.(type) {
|
||||||
case *fs.HashesOption:
|
case *fs.HashesOption:
|
||||||
|
|
|
@ -917,7 +917,7 @@ func (f *Fs) DirCacheFlush() {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashSHA1)
|
return hash.Set(hash.SHA1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -947,8 +947,8 @@ func (o *Object) srvPath() string {
|
||||||
|
|
||||||
// Hash returns the SHA-1 of an object returning a lowercase hex string
|
// Hash returns the SHA-1 of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashSHA1 {
|
if t != hash.SHA1 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
return o.sha1, nil
|
return o.sha1, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -813,7 +813,7 @@ func (f *Fs) DirCacheFlush() {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashMD5 | hash.HashSHA1)
|
return hash.Set(hash.MD5 | hash.SHA1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -860,8 +860,8 @@ func (o *Object) getHashes() (err error) {
|
||||||
|
|
||||||
// Hash returns the SHA-1 of an object returning a lowercase hex string
|
// Hash returns the SHA-1 of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashMD5 && t != hash.HashSHA1 {
|
if t != hash.MD5 && t != hash.SHA1 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
if o.md5 == "" && o.sha1 == "" {
|
if o.md5 == "" && o.sha1 == "" {
|
||||||
err := o.getHashes()
|
err := o.getHashes()
|
||||||
|
@ -869,7 +869,7 @@ func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
return "", errors.Wrap(err, "failed to get hash")
|
return "", errors.Wrap(err, "failed to get hash")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if t == hash.HashMD5 {
|
if t == hash.MD5 {
|
||||||
return o.md5, nil
|
return o.md5, nil
|
||||||
}
|
}
|
||||||
return o.sha1, nil
|
return o.sha1, nil
|
||||||
|
|
|
@ -307,7 +307,7 @@ func (f *Fs) Precision() time.Duration {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashMD5)
|
return hash.Set(hash.MD5)
|
||||||
//return hash.HashSet(hash.HashNone)
|
//return hash.HashSet(hash.HashNone)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -930,8 +930,8 @@ var matchMd5 = regexp.MustCompile(`^[0-9a-f]{32}$`)
|
||||||
// Hash returns the selected checksum of the file
|
// Hash returns the selected checksum of the file
|
||||||
// If no checksum is available it returns ""
|
// If no checksum is available it returns ""
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashMD5 {
|
if t != hash.MD5 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
etag := strings.Trim(strings.ToLower(o.etag), `"`)
|
etag := strings.Trim(strings.ToLower(o.etag), `"`)
|
||||||
// Check the etag is a valid md5sum
|
// Check the etag is a valid md5sum
|
||||||
|
|
|
@ -810,7 +810,7 @@ func (f *Fs) Copy(src fs.Object, remote string) (fs.Object, error) {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashMD5)
|
return hash.Set(hash.MD5)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -837,8 +837,8 @@ var matchMd5 = regexp.MustCompile(`^[0-9a-f]{32}$`)
|
||||||
|
|
||||||
// Hash returns the Md5sum of an object returning a lowercase hex string
|
// Hash returns the Md5sum of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashMD5 {
|
if t != hash.MD5 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
hash := strings.Trim(strings.ToLower(o.etag), `"`)
|
hash := strings.Trim(strings.ToLower(o.etag), `"`)
|
||||||
// Check the etag is a valid md5sum
|
// Check the etag is a valid md5sum
|
||||||
|
@ -1032,7 +1032,7 @@ func (o *Object) Update(in io.Reader, src fs.ObjectInfo, options ...fs.OpenOptio
|
||||||
}
|
}
|
||||||
|
|
||||||
if size > uploader.PartSize {
|
if size > uploader.PartSize {
|
||||||
hash, err := src.Hash(hash.HashMD5)
|
hash, err := src.Hash(hash.MD5)
|
||||||
|
|
||||||
if err == nil && matchMd5.MatchString(hash) {
|
if err == nil && matchMd5.MatchString(hash) {
|
||||||
hashBytes, err := hex.DecodeString(hash)
|
hashBytes, err := hex.DecodeString(hash)
|
||||||
|
|
|
@ -642,18 +642,18 @@ func (f *Fs) Hashes() hash.Set {
|
||||||
|
|
||||||
hashcheckDisabled := config.FileGetBool(f.name, "disable_hashcheck")
|
hashcheckDisabled := config.FileGetBool(f.name, "disable_hashcheck")
|
||||||
if hashcheckDisabled {
|
if hashcheckDisabled {
|
||||||
return hash.Set(hash.HashNone)
|
return hash.Set(hash.None)
|
||||||
}
|
}
|
||||||
|
|
||||||
c, err := f.getSftpConnection()
|
c, err := f.getSftpConnection()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fs.Errorf(f, "Couldn't get SSH connection to figure out Hashes: %v", err)
|
fs.Errorf(f, "Couldn't get SSH connection to figure out Hashes: %v", err)
|
||||||
return hash.Set(hash.HashNone)
|
return hash.Set(hash.None)
|
||||||
}
|
}
|
||||||
defer f.putSftpConnection(&c, err)
|
defer f.putSftpConnection(&c, err)
|
||||||
session, err := c.sshClient.NewSession()
|
session, err := c.sshClient.NewSession()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hash.Set(hash.HashNone)
|
return hash.Set(hash.None)
|
||||||
}
|
}
|
||||||
sha1Output, _ := session.Output("echo 'abc' | sha1sum")
|
sha1Output, _ := session.Output("echo 'abc' | sha1sum")
|
||||||
expectedSha1 := "03cfd743661f07975fa2f1220c5194cbaff48451"
|
expectedSha1 := "03cfd743661f07975fa2f1220c5194cbaff48451"
|
||||||
|
@ -661,7 +661,7 @@ func (f *Fs) Hashes() hash.Set {
|
||||||
|
|
||||||
session, err = c.sshClient.NewSession()
|
session, err = c.sshClient.NewSession()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return hash.Set(hash.HashNone)
|
return hash.Set(hash.None)
|
||||||
}
|
}
|
||||||
md5Output, _ := session.Output("echo 'abc' | md5sum")
|
md5Output, _ := session.Output("echo 'abc' | md5sum")
|
||||||
expectedMd5 := "0bee89b07a248e27c83fc3d5951213c1"
|
expectedMd5 := "0bee89b07a248e27c83fc3d5951213c1"
|
||||||
|
@ -672,13 +672,13 @@ func (f *Fs) Hashes() hash.Set {
|
||||||
|
|
||||||
set := hash.NewHashSet()
|
set := hash.NewHashSet()
|
||||||
if !sha1Works && !md5Works {
|
if !sha1Works && !md5Works {
|
||||||
set.Add(hash.HashNone)
|
set.Add(hash.None)
|
||||||
}
|
}
|
||||||
if sha1Works {
|
if sha1Works {
|
||||||
set.Add(hash.HashSHA1)
|
set.Add(hash.SHA1)
|
||||||
}
|
}
|
||||||
if md5Works {
|
if md5Works {
|
||||||
set.Add(hash.HashMD5)
|
set.Add(hash.MD5)
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = session.Close()
|
_ = session.Close()
|
||||||
|
@ -707,9 +707,9 @@ func (o *Object) Remote() string {
|
||||||
// Hash returns the selected checksum of the file
|
// Hash returns the selected checksum of the file
|
||||||
// If no checksum is available it returns ""
|
// If no checksum is available it returns ""
|
||||||
func (o *Object) Hash(r hash.Type) (string, error) {
|
func (o *Object) Hash(r hash.Type) (string, error) {
|
||||||
if r == hash.HashMD5 && o.md5sum != nil {
|
if r == hash.MD5 && o.md5sum != nil {
|
||||||
return *o.md5sum, nil
|
return *o.md5sum, nil
|
||||||
} else if r == hash.HashSHA1 && o.sha1sum != nil {
|
} else if r == hash.SHA1 && o.sha1sum != nil {
|
||||||
return *o.sha1sum, nil
|
return *o.sha1sum, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -721,29 +721,29 @@ func (o *Object) Hash(r hash.Type) (string, error) {
|
||||||
o.fs.putSftpConnection(&c, err)
|
o.fs.putSftpConnection(&c, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
o.fs.cachedHashes = nil // Something has changed on the remote system
|
o.fs.cachedHashes = nil // Something has changed on the remote system
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
|
|
||||||
err = hash.ErrHashUnsupported
|
err = hash.ErrUnsupported
|
||||||
var outputBytes []byte
|
var outputBytes []byte
|
||||||
escapedPath := shellEscape(o.path())
|
escapedPath := shellEscape(o.path())
|
||||||
if r == hash.HashMD5 {
|
if r == hash.MD5 {
|
||||||
outputBytes, err = session.Output("md5sum " + escapedPath)
|
outputBytes, err = session.Output("md5sum " + escapedPath)
|
||||||
} else if r == hash.HashSHA1 {
|
} else if r == hash.SHA1 {
|
||||||
outputBytes, err = session.Output("sha1sum " + escapedPath)
|
outputBytes, err = session.Output("sha1sum " + escapedPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
o.fs.cachedHashes = nil // Something has changed on the remote system
|
o.fs.cachedHashes = nil // Something has changed on the remote system
|
||||||
_ = session.Close()
|
_ = session.Close()
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = session.Close()
|
_ = session.Close()
|
||||||
str := parseHash(outputBytes)
|
str := parseHash(outputBytes)
|
||||||
if r == hash.HashMD5 {
|
if r == hash.MD5 {
|
||||||
o.md5sum = &str
|
o.md5sum = &str
|
||||||
} else if r == hash.HashSHA1 {
|
} else if r == hash.SHA1 {
|
||||||
o.sha1sum = &str
|
o.sha1sum = &str
|
||||||
}
|
}
|
||||||
return str, nil
|
return str, nil
|
||||||
|
|
|
@ -604,7 +604,7 @@ func (f *Fs) Copy(src fs.Object, remote string) (fs.Object, error) {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashMD5)
|
return hash.Set(hash.MD5)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -629,8 +629,8 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns the Md5sum of an object returning a lowercase hex string
|
// Hash returns the Md5sum of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashMD5 {
|
if t != hash.MD5 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
isDynamicLargeObject, err := o.isDynamicLargeObject()
|
isDynamicLargeObject, err := o.isDynamicLargeObject()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -768,7 +768,7 @@ func (f *Fs) DirMove(src fs.Fs, srcRemote, dstRemote string) error {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashNone)
|
return hash.Set(hash.None)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -793,8 +793,8 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns the SHA-1 of an object returning a lowercase hex string
|
// Hash returns the SHA-1 of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashSHA1 {
|
if t != hash.SHA1 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
return o.sha1, nil
|
return o.sha1, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -491,7 +491,7 @@ func (f *Fs) CleanUp() error {
|
||||||
|
|
||||||
// Hashes returns the supported hash sets.
|
// Hashes returns the supported hash sets.
|
||||||
func (f *Fs) Hashes() hash.Set {
|
func (f *Fs) Hashes() hash.Set {
|
||||||
return hash.Set(hash.HashMD5)
|
return hash.Set(hash.MD5)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
@ -516,8 +516,8 @@ func (o *Object) Remote() string {
|
||||||
|
|
||||||
// Hash returns the Md5sum of an object returning a lowercase hex string
|
// Hash returns the Md5sum of an object returning a lowercase hex string
|
||||||
func (o *Object) Hash(t hash.Type) (string, error) {
|
func (o *Object) Hash(t hash.Type) (string, error) {
|
||||||
if t != hash.HashMD5 {
|
if t != hash.MD5 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
return o.md5sum, nil
|
return o.md5sum, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ func cryptCheck(fdst, fsrc fs.Fs) error {
|
||||||
// Find a hash to use
|
// Find a hash to use
|
||||||
funderlying := fcrypt.UnWrap()
|
funderlying := fcrypt.UnWrap()
|
||||||
hashType := funderlying.Hashes().GetOne()
|
hashType := funderlying.Hashes().GetOne()
|
||||||
if hashType == hash.HashNone {
|
if hashType == hash.None {
|
||||||
return errors.Errorf("%s:%s does not support any hashes", funderlying.Name(), funderlying.Root())
|
return errors.Errorf("%s:%s does not support any hashes", funderlying.Name(), funderlying.Root())
|
||||||
}
|
}
|
||||||
fs.Infof(nil, "Using %v for hash comparisons", hashType)
|
fs.Infof(nil, "Using %v for hash comparisons", hashType)
|
||||||
|
|
|
@ -20,7 +20,7 @@ var (
|
||||||
separator string
|
separator string
|
||||||
dirSlash bool
|
dirSlash bool
|
||||||
recurse bool
|
recurse bool
|
||||||
hashType = hash.HashMD5
|
hashType = hash.MD5
|
||||||
filesOnly bool
|
filesOnly bool
|
||||||
dirsOnly bool
|
dirsOnly bool
|
||||||
)
|
)
|
||||||
|
|
|
@ -17,49 +17,49 @@ import (
|
||||||
// Type indicates a standard hashing algorithm
|
// Type indicates a standard hashing algorithm
|
||||||
type Type int
|
type Type int
|
||||||
|
|
||||||
// ErrHashUnsupported should be returned by filesystem,
|
// ErrUnsupported should be returned by filesystem,
|
||||||
// if it is requested to deliver an unsupported hash type.
|
// if it is requested to deliver an unsupported hash type.
|
||||||
var ErrHashUnsupported = errors.New("hash type not supported")
|
var ErrUnsupported = errors.New("hash type not supported")
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// HashMD5 indicates MD5 support
|
// MD5 indicates MD5 support
|
||||||
HashMD5 Type = 1 << iota
|
MD5 Type = 1 << iota
|
||||||
|
|
||||||
// HashSHA1 indicates SHA-1 support
|
// SHA1 indicates SHA-1 support
|
||||||
HashSHA1
|
SHA1
|
||||||
|
|
||||||
// HashDropbox indicates Dropbox special hash
|
// Dropbox indicates Dropbox special hash
|
||||||
// https://www.dropbox.com/developers/reference/content-hash
|
// https://www.dropbox.com/developers/reference/content-hash
|
||||||
HashDropbox
|
Dropbox
|
||||||
|
|
||||||
// HashNone indicates no hashes are supported
|
// None indicates no hashes are supported
|
||||||
HashNone Type = 0
|
None Type = 0
|
||||||
)
|
)
|
||||||
|
|
||||||
// SupportedHashes returns a set of all the supported hashes by
|
// Supported returns a set of all the supported hashes by
|
||||||
// HashStream and MultiHasher.
|
// HashStream and MultiHasher.
|
||||||
var SupportedHashes = NewHashSet(HashMD5, HashSHA1, HashDropbox)
|
var Supported = NewHashSet(MD5, SHA1, Dropbox)
|
||||||
|
|
||||||
// HashWidth returns the width in characters for any HashType
|
// Width returns the width in characters for any HashType
|
||||||
var HashWidth = map[Type]int{
|
var Width = map[Type]int{
|
||||||
HashMD5: 32,
|
MD5: 32,
|
||||||
HashSHA1: 40,
|
SHA1: 40,
|
||||||
HashDropbox: 64,
|
Dropbox: 64,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stream will calculate hashes of all supported hash types.
|
// Stream will calculate hashes of all supported hash types.
|
||||||
func Stream(r io.Reader) (map[Type]string, error) {
|
func Stream(r io.Reader) (map[Type]string, error) {
|
||||||
return StreamTypes(r, SupportedHashes)
|
return StreamTypes(r, Supported)
|
||||||
}
|
}
|
||||||
|
|
||||||
// StreamTypes will calculate hashes of the requested hash types.
|
// StreamTypes will calculate hashes of the requested hash types.
|
||||||
func StreamTypes(r io.Reader, set Set) (map[Type]string, error) {
|
func StreamTypes(r io.Reader, set Set) (map[Type]string, error) {
|
||||||
hashers, err := hashFromTypes(set)
|
hashers, err := fromTypes(set)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = io.Copy(hashToMultiWriter(hashers), r)
|
_, err = io.Copy(toMultiWriter(hashers), r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -74,13 +74,13 @@ func StreamTypes(r io.Reader, set Set) (map[Type]string, error) {
|
||||||
// The function will panic if the hash type is unknown.
|
// The function will panic if the hash type is unknown.
|
||||||
func (h Type) String() string {
|
func (h Type) String() string {
|
||||||
switch h {
|
switch h {
|
||||||
case HashNone:
|
case None:
|
||||||
return "None"
|
return "None"
|
||||||
case HashMD5:
|
case MD5:
|
||||||
return "MD5"
|
return "MD5"
|
||||||
case HashSHA1:
|
case SHA1:
|
||||||
return "SHA-1"
|
return "SHA-1"
|
||||||
case HashDropbox:
|
case Dropbox:
|
||||||
return "DropboxHash"
|
return "DropboxHash"
|
||||||
default:
|
default:
|
||||||
err := fmt.Sprintf("internal error: unknown hash type: 0x%x", int(h))
|
err := fmt.Sprintf("internal error: unknown hash type: 0x%x", int(h))
|
||||||
|
@ -88,17 +88,17 @@ func (h Type) String() string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set a HashType from a flag
|
// Set a Type from a flag
|
||||||
func (h *Type) Set(s string) error {
|
func (h *Type) Set(s string) error {
|
||||||
switch s {
|
switch s {
|
||||||
case "None":
|
case "None":
|
||||||
*h = HashNone
|
*h = None
|
||||||
case "MD5":
|
case "MD5":
|
||||||
*h = HashMD5
|
*h = MD5
|
||||||
case "SHA-1":
|
case "SHA-1":
|
||||||
*h = HashSHA1
|
*h = SHA1
|
||||||
case "DropboxHash":
|
case "DropboxHash":
|
||||||
*h = HashDropbox
|
*h = Dropbox
|
||||||
default:
|
default:
|
||||||
return errors.Errorf("Unknown hash type %q", s)
|
return errors.Errorf("Unknown hash type %q", s)
|
||||||
}
|
}
|
||||||
|
@ -113,22 +113,22 @@ func (h Type) Type() string {
|
||||||
// Check it satisfies the interface
|
// Check it satisfies the interface
|
||||||
var _ pflag.Value = (*Type)(nil)
|
var _ pflag.Value = (*Type)(nil)
|
||||||
|
|
||||||
// hashFromTypes will return hashers for all the requested types.
|
// fromTypes will return hashers for all the requested types.
|
||||||
// The types must be a subset of SupportedHashes,
|
// The types must be a subset of SupportedHashes,
|
||||||
// and this function must support all types.
|
// and this function must support all types.
|
||||||
func hashFromTypes(set Set) (map[Type]hash.Hash, error) {
|
func fromTypes(set Set) (map[Type]hash.Hash, error) {
|
||||||
if !set.SubsetOf(SupportedHashes) {
|
if !set.SubsetOf(Supported) {
|
||||||
return nil, errors.Errorf("requested set %08x contains unknown hash types", int(set))
|
return nil, errors.Errorf("requested set %08x contains unknown hash types", int(set))
|
||||||
}
|
}
|
||||||
var hashers = make(map[Type]hash.Hash)
|
var hashers = make(map[Type]hash.Hash)
|
||||||
types := set.Array()
|
types := set.Array()
|
||||||
for _, t := range types {
|
for _, t := range types {
|
||||||
switch t {
|
switch t {
|
||||||
case HashMD5:
|
case MD5:
|
||||||
hashers[t] = md5.New()
|
hashers[t] = md5.New()
|
||||||
case HashSHA1:
|
case SHA1:
|
||||||
hashers[t] = sha1.New()
|
hashers[t] = sha1.New()
|
||||||
case HashDropbox:
|
case Dropbox:
|
||||||
hashers[t] = dbhash.New()
|
hashers[t] = dbhash.New()
|
||||||
default:
|
default:
|
||||||
err := fmt.Sprintf("internal error: Unsupported hash type %v", t)
|
err := fmt.Sprintf("internal error: Unsupported hash type %v", t)
|
||||||
|
@ -138,10 +138,10 @@ func hashFromTypes(set Set) (map[Type]hash.Hash, error) {
|
||||||
return hashers, nil
|
return hashers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// hashToMultiWriter will return a set of hashers into a
|
// toMultiWriter will return a set of hashers into a
|
||||||
// single multiwriter, where one write will update all
|
// single multiwriter, where one write will update all
|
||||||
// the hashers.
|
// the hashers.
|
||||||
func hashToMultiWriter(h map[Type]hash.Hash) io.Writer {
|
func toMultiWriter(h map[Type]hash.Hash) io.Writer {
|
||||||
// Convert to to slice
|
// Convert to to slice
|
||||||
var w = make([]io.Writer, 0, len(h))
|
var w = make([]io.Writer, 0, len(h))
|
||||||
for _, v := range h {
|
for _, v := range h {
|
||||||
|
@ -161,7 +161,7 @@ type MultiHasher struct {
|
||||||
// NewMultiHasher will return a hash writer that will write all
|
// NewMultiHasher will return a hash writer that will write all
|
||||||
// supported hash types.
|
// supported hash types.
|
||||||
func NewMultiHasher() *MultiHasher {
|
func NewMultiHasher() *MultiHasher {
|
||||||
h, err := NewMultiHasherTypes(SupportedHashes)
|
h, err := NewMultiHasherTypes(Supported)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("internal error: could not create multihasher")
|
panic("internal error: could not create multihasher")
|
||||||
}
|
}
|
||||||
|
@ -171,11 +171,11 @@ func NewMultiHasher() *MultiHasher {
|
||||||
// NewMultiHasherTypes will return a hash writer that will write
|
// NewMultiHasherTypes will return a hash writer that will write
|
||||||
// the requested hash types.
|
// the requested hash types.
|
||||||
func NewMultiHasherTypes(set Set) (*MultiHasher, error) {
|
func NewMultiHasherTypes(set Set) (*MultiHasher, error) {
|
||||||
hashers, err := hashFromTypes(set)
|
hashers, err := fromTypes(set)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
m := MultiHasher{h: hashers, w: hashToMultiWriter(hashers)}
|
m := MultiHasher{h: hashers, w: toMultiWriter(hashers)}
|
||||||
return &m, nil
|
return &m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,7 +205,7 @@ type Set int
|
||||||
|
|
||||||
// NewHashSet will create a new hash set with the hash types supplied
|
// NewHashSet will create a new hash set with the hash types supplied
|
||||||
func NewHashSet(t ...Type) Set {
|
func NewHashSet(t ...Type) Set {
|
||||||
h := Set(HashNone)
|
h := Set(None)
|
||||||
return h.Add(t...)
|
return h.Add(t...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +247,7 @@ func (h Set) GetOne() Type {
|
||||||
i++
|
i++
|
||||||
v >>= 1
|
v >>= 1
|
||||||
}
|
}
|
||||||
return Type(HashNone)
|
return Type(None)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Array returns an array of all hash types in the set
|
// Array returns an array of all hash types in the set
|
||||||
|
|
|
@ -18,42 +18,42 @@ func TestHashSet(t *testing.T) {
|
||||||
a := h.Array()
|
a := h.Array()
|
||||||
assert.Len(t, a, 0)
|
assert.Len(t, a, 0)
|
||||||
|
|
||||||
h = h.Add(hash.HashMD5)
|
h = h.Add(hash.MD5)
|
||||||
assert.Equal(t, 1, h.Count())
|
assert.Equal(t, 1, h.Count())
|
||||||
assert.Equal(t, hash.HashMD5, h.GetOne())
|
assert.Equal(t, hash.MD5, h.GetOne())
|
||||||
a = h.Array()
|
a = h.Array()
|
||||||
assert.Len(t, a, 1)
|
assert.Len(t, a, 1)
|
||||||
assert.Equal(t, a[0], hash.HashMD5)
|
assert.Equal(t, a[0], hash.MD5)
|
||||||
|
|
||||||
// Test overlap, with all hashes
|
// Test overlap, with all hashes
|
||||||
h = h.Overlap(hash.SupportedHashes)
|
h = h.Overlap(hash.Supported)
|
||||||
assert.Equal(t, 1, h.Count())
|
assert.Equal(t, 1, h.Count())
|
||||||
assert.Equal(t, hash.HashMD5, h.GetOne())
|
assert.Equal(t, hash.MD5, h.GetOne())
|
||||||
assert.True(t, h.SubsetOf(hash.SupportedHashes))
|
assert.True(t, h.SubsetOf(hash.Supported))
|
||||||
assert.True(t, h.SubsetOf(hash.NewHashSet(hash.HashMD5)))
|
assert.True(t, h.SubsetOf(hash.NewHashSet(hash.MD5)))
|
||||||
|
|
||||||
h = h.Add(hash.HashSHA1)
|
h = h.Add(hash.SHA1)
|
||||||
assert.Equal(t, 2, h.Count())
|
assert.Equal(t, 2, h.Count())
|
||||||
one := h.GetOne()
|
one := h.GetOne()
|
||||||
if !(one == hash.HashMD5 || one == hash.HashSHA1) {
|
if !(one == hash.MD5 || one == hash.SHA1) {
|
||||||
t.Fatalf("expected to be either MD5 or SHA1, got %v", one)
|
t.Fatalf("expected to be either MD5 or SHA1, got %v", one)
|
||||||
}
|
}
|
||||||
assert.True(t, h.SubsetOf(hash.SupportedHashes))
|
assert.True(t, h.SubsetOf(hash.Supported))
|
||||||
assert.False(t, h.SubsetOf(hash.NewHashSet(hash.HashMD5)))
|
assert.False(t, h.SubsetOf(hash.NewHashSet(hash.MD5)))
|
||||||
assert.False(t, h.SubsetOf(hash.NewHashSet(hash.HashSHA1)))
|
assert.False(t, h.SubsetOf(hash.NewHashSet(hash.SHA1)))
|
||||||
assert.True(t, h.SubsetOf(hash.NewHashSet(hash.HashMD5, hash.HashSHA1)))
|
assert.True(t, h.SubsetOf(hash.NewHashSet(hash.MD5, hash.SHA1)))
|
||||||
a = h.Array()
|
a = h.Array()
|
||||||
assert.Len(t, a, 2)
|
assert.Len(t, a, 2)
|
||||||
|
|
||||||
ol := h.Overlap(hash.NewHashSet(hash.HashMD5))
|
ol := h.Overlap(hash.NewHashSet(hash.MD5))
|
||||||
assert.Equal(t, 1, ol.Count())
|
assert.Equal(t, 1, ol.Count())
|
||||||
assert.True(t, ol.Contains(hash.HashMD5))
|
assert.True(t, ol.Contains(hash.MD5))
|
||||||
assert.False(t, ol.Contains(hash.HashSHA1))
|
assert.False(t, ol.Contains(hash.SHA1))
|
||||||
|
|
||||||
ol = h.Overlap(hash.NewHashSet(hash.HashMD5, hash.HashSHA1))
|
ol = h.Overlap(hash.NewHashSet(hash.MD5, hash.SHA1))
|
||||||
assert.Equal(t, 2, ol.Count())
|
assert.Equal(t, 2, ol.Count())
|
||||||
assert.True(t, ol.Contains(hash.HashMD5))
|
assert.True(t, ol.Contains(hash.MD5))
|
||||||
assert.True(t, ol.Contains(hash.HashSHA1))
|
assert.True(t, ol.Contains(hash.SHA1))
|
||||||
}
|
}
|
||||||
|
|
||||||
type hashTest struct {
|
type hashTest struct {
|
||||||
|
@ -65,18 +65,18 @@ var hashTestSet = []hashTest{
|
||||||
{
|
{
|
||||||
input: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
|
input: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
|
||||||
output: map[hash.Type]string{
|
output: map[hash.Type]string{
|
||||||
hash.HashMD5: "bf13fc19e5151ac57d4252e0e0f87abe",
|
hash.MD5: "bf13fc19e5151ac57d4252e0e0f87abe",
|
||||||
hash.HashSHA1: "3ab6543c08a75f292a5ecedac87ec41642d12166",
|
hash.SHA1: "3ab6543c08a75f292a5ecedac87ec41642d12166",
|
||||||
hash.HashDropbox: "214d2fcf3566e94c99ad2f59bd993daca46d8521a0c447adf4b324f53fddc0c7",
|
hash.Dropbox: "214d2fcf3566e94c99ad2f59bd993daca46d8521a0c447adf4b324f53fddc0c7",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// Empty data set
|
// Empty data set
|
||||||
{
|
{
|
||||||
input: []byte{},
|
input: []byte{},
|
||||||
output: map[hash.Type]string{
|
output: map[hash.Type]string{
|
||||||
hash.HashMD5: "d41d8cd98f00b204e9800998ecf8427e",
|
hash.MD5: "d41d8cd98f00b204e9800998ecf8427e",
|
||||||
hash.HashSHA1: "da39a3ee5e6b4b0d3255bfef95601890afd80709",
|
hash.SHA1: "da39a3ee5e6b4b0d3255bfef95601890afd80709",
|
||||||
hash.HashDropbox: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
hash.Dropbox: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ func TestMultiHasher(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMultiHasherTypes(t *testing.T) {
|
func TestMultiHasherTypes(t *testing.T) {
|
||||||
h := hash.HashSHA1
|
h := hash.SHA1
|
||||||
for _, test := range hashTestSet {
|
for _, test := range hashTestSet {
|
||||||
mh, err := hash.NewMultiHasherTypes(hash.NewHashSet(h))
|
mh, err := hash.NewMultiHasherTypes(hash.NewHashSet(h))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -137,7 +137,7 @@ func TestHashStream(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHashStreamTypes(t *testing.T) {
|
func TestHashStreamTypes(t *testing.T) {
|
||||||
h := hash.HashSHA1
|
h := hash.SHA1
|
||||||
for _, test := range hashTestSet {
|
for _, test := range hashTestSet {
|
||||||
sums, err := hash.StreamTypes(bytes.NewBuffer(test.input), hash.NewHashSet(h))
|
sums, err := hash.StreamTypes(bytes.NewBuffer(test.input), hash.NewHashSet(h))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -147,17 +147,17 @@ func TestHashStreamTypes(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHashSetStringer(t *testing.T) {
|
func TestHashSetStringer(t *testing.T) {
|
||||||
h := hash.NewHashSet(hash.HashSHA1, hash.HashMD5, hash.HashDropbox)
|
h := hash.NewHashSet(hash.SHA1, hash.MD5, hash.Dropbox)
|
||||||
assert.Equal(t, h.String(), "[MD5, SHA-1, DropboxHash]")
|
assert.Equal(t, h.String(), "[MD5, SHA-1, DropboxHash]")
|
||||||
h = hash.NewHashSet(hash.HashSHA1)
|
h = hash.NewHashSet(hash.SHA1)
|
||||||
assert.Equal(t, h.String(), "[SHA-1]")
|
assert.Equal(t, h.String(), "[SHA-1]")
|
||||||
h = hash.NewHashSet()
|
h = hash.NewHashSet()
|
||||||
assert.Equal(t, h.String(), "[]")
|
assert.Equal(t, h.String(), "[]")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHashStringer(t *testing.T) {
|
func TestHashStringer(t *testing.T) {
|
||||||
h := hash.HashMD5
|
h := hash.MD5
|
||||||
assert.Equal(t, h.String(), "MD5")
|
assert.Equal(t, h.String(), "MD5")
|
||||||
h = hash.HashNone
|
h = hash.None
|
||||||
assert.Equal(t, h.String(), "None")
|
assert.Equal(t, h.String(), "None")
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,12 +51,12 @@ func (i *staticObjectInfo) Size() int64 { return i.size }
|
||||||
func (i *staticObjectInfo) Storable() bool { return i.storable }
|
func (i *staticObjectInfo) Storable() bool { return i.storable }
|
||||||
func (i *staticObjectInfo) Hash(h hash.Type) (string, error) {
|
func (i *staticObjectInfo) Hash(h hash.Type) (string, error) {
|
||||||
if len(i.hashes) == 0 {
|
if len(i.hashes) == 0 {
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
if hash, ok := i.hashes[h]; ok {
|
if hash, ok := i.hashes[h]; ok {
|
||||||
return hash, nil
|
return hash, nil
|
||||||
}
|
}
|
||||||
return "", hash.ErrHashUnsupported
|
return "", hash.ErrUnsupported
|
||||||
}
|
}
|
||||||
|
|
||||||
// MemoryFs is an in memory Fs, it only supports FsInfo and Put
|
// MemoryFs is an in memory Fs, it only supports FsInfo and Put
|
||||||
|
@ -78,7 +78,7 @@ func (memoryFs) String() string { return "memory" }
|
||||||
func (memoryFs) Precision() time.Duration { return time.Nanosecond }
|
func (memoryFs) Precision() time.Duration { return time.Nanosecond }
|
||||||
|
|
||||||
// Returns the supported hash types of the filesystem
|
// Returns the supported hash types of the filesystem
|
||||||
func (memoryFs) Hashes() hash.Set { return hash.SupportedHashes }
|
func (memoryFs) Hashes() hash.Set { return hash.Supported }
|
||||||
|
|
||||||
// Features returns the optional features of this Fs
|
// Features returns the optional features of this Fs
|
||||||
func (memoryFs) Features() *fs.Features { return &fs.Features{} }
|
func (memoryFs) Features() *fs.Features { return &fs.Features{} }
|
||||||
|
|
|
@ -27,23 +27,23 @@ func TestStaticObject(t *testing.T) {
|
||||||
assert.Equal(t, size, o.Size())
|
assert.Equal(t, size, o.Size())
|
||||||
assert.Equal(t, true, o.Storable())
|
assert.Equal(t, true, o.Storable())
|
||||||
|
|
||||||
Hash, err := o.Hash(hash.HashMD5)
|
Hash, err := o.Hash(hash.MD5)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "", Hash)
|
assert.Equal(t, "", Hash)
|
||||||
|
|
||||||
o = object.NewStaticObjectInfo(remote, now, size, true, nil, nil)
|
o = object.NewStaticObjectInfo(remote, now, size, true, nil, nil)
|
||||||
_, err = o.Hash(hash.HashMD5)
|
_, err = o.Hash(hash.MD5)
|
||||||
assert.Equal(t, hash.ErrHashUnsupported, err)
|
assert.Equal(t, hash.ErrUnsupported, err)
|
||||||
|
|
||||||
hs := map[hash.Type]string{
|
hs := map[hash.Type]string{
|
||||||
hash.HashMD5: "potato",
|
hash.MD5: "potato",
|
||||||
}
|
}
|
||||||
o = object.NewStaticObjectInfo(remote, now, size, true, hs, nil)
|
o = object.NewStaticObjectInfo(remote, now, size, true, hs, nil)
|
||||||
Hash, err = o.Hash(hash.HashMD5)
|
Hash, err = o.Hash(hash.MD5)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "potato", Hash)
|
assert.Equal(t, "potato", Hash)
|
||||||
_, err = o.Hash(hash.HashSHA1)
|
_, err = o.Hash(hash.SHA1)
|
||||||
assert.Equal(t, hash.ErrHashUnsupported, err)
|
assert.Equal(t, hash.ErrUnsupported, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMemoryFs(t *testing.T) {
|
func TestMemoryFs(t *testing.T) {
|
||||||
|
@ -52,7 +52,7 @@ func TestMemoryFs(t *testing.T) {
|
||||||
assert.Equal(t, "", f.Root())
|
assert.Equal(t, "", f.Root())
|
||||||
assert.Equal(t, "memory", f.String())
|
assert.Equal(t, "memory", f.String())
|
||||||
assert.Equal(t, time.Nanosecond, f.Precision())
|
assert.Equal(t, time.Nanosecond, f.Precision())
|
||||||
assert.Equal(t, hash.SupportedHashes, f.Hashes())
|
assert.Equal(t, hash.Supported, f.Hashes())
|
||||||
assert.Equal(t, &fs.Features{}, f.Features())
|
assert.Equal(t, &fs.Features{}, f.Features())
|
||||||
|
|
||||||
entries, err := f.List("")
|
entries, err := f.List("")
|
||||||
|
@ -68,7 +68,7 @@ func TestMemoryFs(t *testing.T) {
|
||||||
src := object.NewStaticObjectInfo("remote", now, int64(buf.Len()), true, nil, nil)
|
src := object.NewStaticObjectInfo("remote", now, int64(buf.Len()), true, nil, nil)
|
||||||
o, err = f.Put(buf, src)
|
o, err = f.Put(buf, src)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
hash, err := o.Hash(hash.HashSHA1)
|
hash, err := o.Hash(hash.SHA1)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "3e2e95f5ad970eadfa7e17eaf73da97024aa5359", hash)
|
assert.Equal(t, "3e2e95f5ad970eadfa7e17eaf73da97024aa5359", hash)
|
||||||
|
|
||||||
|
@ -95,11 +95,11 @@ func TestMemoryObject(t *testing.T) {
|
||||||
assert.Equal(t, int64(len(content)), o.Size())
|
assert.Equal(t, int64(len(content)), o.Size())
|
||||||
assert.Equal(t, true, o.Storable())
|
assert.Equal(t, true, o.Storable())
|
||||||
|
|
||||||
Hash, err := o.Hash(hash.HashMD5)
|
Hash, err := o.Hash(hash.MD5)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "8ee2027983915ec78acc45027d874316", Hash)
|
assert.Equal(t, "8ee2027983915ec78acc45027d874316", Hash)
|
||||||
|
|
||||||
Hash, err = o.Hash(hash.HashSHA1)
|
Hash, err = o.Hash(hash.SHA1)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "3e2e95f5ad970eadfa7e17eaf73da97024aa5359", Hash)
|
assert.Equal(t, "3e2e95f5ad970eadfa7e17eaf73da97024aa5359", Hash)
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ func CheckHashes(src fs.ObjectInfo, dst fs.Object) (equal bool, ht hash.Type, er
|
||||||
common := src.Fs().Hashes().Overlap(dst.Fs().Hashes())
|
common := src.Fs().Hashes().Overlap(dst.Fs().Hashes())
|
||||||
// fs.Debugf(nil, "Shared hashes: %v", common)
|
// fs.Debugf(nil, "Shared hashes: %v", common)
|
||||||
if common.Count() == 0 {
|
if common.Count() == 0 {
|
||||||
return true, hash.HashNone, nil
|
return true, hash.None, nil
|
||||||
}
|
}
|
||||||
ht = common.GetOne()
|
ht = common.GetOne()
|
||||||
srcHash, err := src.Hash(ht)
|
srcHash, err := src.Hash(ht)
|
||||||
|
@ -56,7 +56,7 @@ func CheckHashes(src fs.ObjectInfo, dst fs.Object) (equal bool, ht hash.Type, er
|
||||||
return false, ht, err
|
return false, ht, err
|
||||||
}
|
}
|
||||||
if srcHash == "" {
|
if srcHash == "" {
|
||||||
return true, hash.HashNone, nil
|
return true, hash.None, nil
|
||||||
}
|
}
|
||||||
dstHash, err := dst.Hash(ht)
|
dstHash, err := dst.Hash(ht)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -65,7 +65,7 @@ func CheckHashes(src fs.ObjectInfo, dst fs.Object) (equal bool, ht hash.Type, er
|
||||||
return false, ht, err
|
return false, ht, err
|
||||||
}
|
}
|
||||||
if dstHash == "" {
|
if dstHash == "" {
|
||||||
return true, hash.HashNone, nil
|
return true, hash.None, nil
|
||||||
}
|
}
|
||||||
if srcHash != dstHash {
|
if srcHash != dstHash {
|
||||||
fs.Debugf(src, "%v = %s (%v)", ht, srcHash, src.Fs())
|
fs.Debugf(src, "%v = %s (%v)", ht, srcHash, src.Fs())
|
||||||
|
@ -118,7 +118,7 @@ func equal(src fs.ObjectInfo, dst fs.Object, sizeOnly, checkSum bool) bool {
|
||||||
fs.Debugf(src, "%v differ", ht)
|
fs.Debugf(src, "%v differ", ht)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if ht == hash.HashNone {
|
if ht == hash.None {
|
||||||
fs.Debugf(src, "Size of src and dst objects identical")
|
fs.Debugf(src, "Size of src and dst objects identical")
|
||||||
} else {
|
} else {
|
||||||
fs.Debugf(src, "Size and %v of src and dst objects identical", ht)
|
fs.Debugf(src, "Size and %v of src and dst objects identical", ht)
|
||||||
|
@ -148,7 +148,7 @@ func equal(src fs.ObjectInfo, dst fs.Object, sizeOnly, checkSum bool) bool {
|
||||||
fs.Debugf(src, "%v differ", ht)
|
fs.Debugf(src, "%v differ", ht)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if ht == hash.HashNone {
|
if ht == hash.None {
|
||||||
// if couldn't check hash, return that they differ
|
// if couldn't check hash, return that they differ
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,7 @@ func Copy(f fs.Fs, dst fs.Object, remote string, src fs.Object) (newDst fs.Objec
|
||||||
doUpdate := dst != nil
|
doUpdate := dst != nil
|
||||||
// work out which hash to use - limit to 1 hash in common
|
// work out which hash to use - limit to 1 hash in common
|
||||||
var common hash.Set
|
var common hash.Set
|
||||||
hashType := hash.HashNone
|
hashType := hash.None
|
||||||
if !fs.Config.SizeOnly {
|
if !fs.Config.SizeOnly {
|
||||||
common = src.Fs().Hashes().Overlap(f.Hashes())
|
common = src.Fs().Hashes().Overlap(f.Hashes())
|
||||||
if common.Count() > 0 {
|
if common.Count() > 0 {
|
||||||
|
@ -321,7 +321,7 @@ func Copy(f fs.Fs, dst fs.Object, remote string, src fs.Object) (newDst fs.Objec
|
||||||
// Verify hashes are the same after transfer - ignoring blank hashes
|
// Verify hashes are the same after transfer - ignoring blank hashes
|
||||||
// TODO(klauspost): This could be extended, so we always create a hash type matching
|
// TODO(klauspost): This could be extended, so we always create a hash type matching
|
||||||
// the destination, and calculate it while sending.
|
// the destination, and calculate it while sending.
|
||||||
if hashType != hash.HashNone {
|
if hashType != hash.None {
|
||||||
var srcSum string
|
var srcSum string
|
||||||
srcSum, err = src.Hash(hashType)
|
srcSum, err = src.Hash(hashType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -533,7 +533,7 @@ func checkIdentical(dst, src fs.Object) (differ bool, noHash bool) {
|
||||||
// CheckHashes will log and count errors
|
// CheckHashes will log and count errors
|
||||||
return true, false
|
return true, false
|
||||||
}
|
}
|
||||||
if ht == hash.HashNone {
|
if ht == hash.None {
|
||||||
return false, true
|
return false, true
|
||||||
}
|
}
|
||||||
if !same {
|
if !same {
|
||||||
|
@ -817,7 +817,7 @@ func ListLong(f fs.Fs, w io.Writer) error {
|
||||||
//
|
//
|
||||||
// Lists in parallel which may get them out of order
|
// Lists in parallel which may get them out of order
|
||||||
func Md5sum(f fs.Fs, w io.Writer) error {
|
func Md5sum(f fs.Fs, w io.Writer) error {
|
||||||
return hashLister(hash.HashMD5, f, w)
|
return hashLister(hash.MD5, f, w)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sha1sum list the Fs to the supplied writer
|
// Sha1sum list the Fs to the supplied writer
|
||||||
|
@ -826,7 +826,7 @@ func Md5sum(f fs.Fs, w io.Writer) error {
|
||||||
//
|
//
|
||||||
// Lists in parallel which may get them out of order
|
// Lists in parallel which may get them out of order
|
||||||
func Sha1sum(f fs.Fs, w io.Writer) error {
|
func Sha1sum(f fs.Fs, w io.Writer) error {
|
||||||
return hashLister(hash.HashSHA1, f, w)
|
return hashLister(hash.SHA1, f, w)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DropboxHashSum list the Fs to the supplied writer
|
// DropboxHashSum list the Fs to the supplied writer
|
||||||
|
@ -835,7 +835,7 @@ func Sha1sum(f fs.Fs, w io.Writer) error {
|
||||||
//
|
//
|
||||||
// Lists in parallel which may get them out of order
|
// Lists in parallel which may get them out of order
|
||||||
func DropboxHashSum(f fs.Fs, w io.Writer) error {
|
func DropboxHashSum(f fs.Fs, w io.Writer) error {
|
||||||
return hashLister(hash.HashDropbox, f, w)
|
return hashLister(hash.Dropbox, f, w)
|
||||||
}
|
}
|
||||||
|
|
||||||
// hashSum returns the human readable hash for ht passed in. This may
|
// hashSum returns the human readable hash for ht passed in. This may
|
||||||
|
@ -844,7 +844,7 @@ func hashSum(ht hash.Type, o fs.Object) string {
|
||||||
accounting.Stats.Checking(o.Remote())
|
accounting.Stats.Checking(o.Remote())
|
||||||
sum, err := o.Hash(ht)
|
sum, err := o.Hash(ht)
|
||||||
accounting.Stats.DoneChecking(o.Remote())
|
accounting.Stats.DoneChecking(o.Remote())
|
||||||
if err == hash.ErrHashUnsupported {
|
if err == hash.ErrUnsupported {
|
||||||
sum = "UNSUPPORTED"
|
sum = "UNSUPPORTED"
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
fs.Debugf(o, "Failed to read %v: %v", ht, err)
|
fs.Debugf(o, "Failed to read %v: %v", ht, err)
|
||||||
|
@ -856,7 +856,7 @@ func hashSum(ht hash.Type, o fs.Object) string {
|
||||||
func hashLister(ht hash.Type, f fs.Fs, w io.Writer) error {
|
func hashLister(ht hash.Type, f fs.Fs, w io.Writer) error {
|
||||||
return ListFn(f, func(o fs.Object) {
|
return ListFn(f, func(o fs.Object) {
|
||||||
sum := hashSum(ht, o)
|
sum := hashSum(ht, o)
|
||||||
syncFprintf(w, "%*s %s\n", hash.HashWidth[ht], sum, o.Remote())
|
syncFprintf(w, "%*s %s\n", hash.Width[ht], sum, o.Remote())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1022,7 +1022,7 @@ func dedupeDeleteIdentical(remote string, objs []fs.Object) []fs.Object {
|
||||||
// See how many of these duplicates are identical
|
// See how many of these duplicates are identical
|
||||||
byHash := make(map[string][]fs.Object, len(objs))
|
byHash := make(map[string][]fs.Object, len(objs))
|
||||||
for _, o := range objs {
|
for _, o := range objs {
|
||||||
md5sum, err := o.Hash(hash.HashMD5)
|
md5sum, err := o.Hash(hash.MD5)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
byHash[md5sum] = append(byHash[md5sum], o)
|
byHash[md5sum] = append(byHash[md5sum], o)
|
||||||
}
|
}
|
||||||
|
@ -1047,7 +1047,7 @@ func dedupeDeleteIdentical(remote string, objs []fs.Object) []fs.Object {
|
||||||
func dedupeInteractive(remote string, objs []fs.Object) {
|
func dedupeInteractive(remote string, objs []fs.Object) {
|
||||||
fmt.Printf("%s: %d duplicates remain\n", remote, len(objs))
|
fmt.Printf("%s: %d duplicates remain\n", remote, len(objs))
|
||||||
for i, o := range objs {
|
for i, o := range objs {
|
||||||
md5sum, err := o.Hash(hash.HashMD5)
|
md5sum, err := o.Hash(hash.MD5)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
md5sum = err.Error()
|
md5sum = err.Error()
|
||||||
}
|
}
|
||||||
|
|
|
@ -308,7 +308,7 @@ func skipIfCantDedupe(t *testing.T, f fs.Fs) {
|
||||||
if !f.Features().DuplicateFiles {
|
if !f.Features().DuplicateFiles {
|
||||||
t.Skip("Can't test deduplicate - no duplicate files possible")
|
t.Skip("Can't test deduplicate - no duplicate files possible")
|
||||||
}
|
}
|
||||||
if !f.Hashes().Contains(hash.HashMD5) {
|
if !f.Hashes().Contains(hash.MD5) {
|
||||||
t.Skip("Can't test deduplicate - MD5 not supported")
|
t.Skip("Can't test deduplicate - MD5 not supported")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -892,9 +892,9 @@ func TestListFormat(t *testing.T) {
|
||||||
ht hash.Type
|
ht hash.Type
|
||||||
want string
|
want string
|
||||||
}{
|
}{
|
||||||
{hash.HashMD5, "0cc175b9c0f1b6a831c399e269772661"},
|
{hash.MD5, "0cc175b9c0f1b6a831c399e269772661"},
|
||||||
{hash.HashSHA1, "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8"},
|
{hash.SHA1, "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8"},
|
||||||
{hash.HashDropbox, "bf5d3affb73efd2ec6c36ad3112dd933efed63c4e1cbffcfa88e2759c144f2d8"},
|
{hash.Dropbox, "bf5d3affb73efd2ec6c36ad3112dd933efed63c4e1cbffcfa88e2759c144f2d8"},
|
||||||
} {
|
} {
|
||||||
list.SetOutput(nil)
|
list.SetOutput(nil)
|
||||||
list.AddHash(test.ht)
|
list.AddHash(test.ht)
|
||||||
|
|
|
@ -87,7 +87,7 @@ func newSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, de
|
||||||
fs.Errorf(fdst, "Ignoring --track-renames as the destination does not support server-side move or copy")
|
fs.Errorf(fdst, "Ignoring --track-renames as the destination does not support server-side move or copy")
|
||||||
s.trackRenames = false
|
s.trackRenames = false
|
||||||
}
|
}
|
||||||
if s.commonHash == hash.HashNone {
|
if s.commonHash == hash.None {
|
||||||
fs.Errorf(fdst, "Ignoring --track-renames as the source and destination do not have a common hash")
|
fs.Errorf(fdst, "Ignoring --track-renames as the source and destination do not have a common hash")
|
||||||
s.trackRenames = false
|
s.trackRenames = false
|
||||||
}
|
}
|
||||||
|
|
|
@ -751,7 +751,7 @@ func TestSyncWithTrackRenames(t *testing.T) {
|
||||||
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
haveHash := r.Fremote.Hashes().Overlap(r.Flocal.Hashes()).GetOne() != hash.HashNone
|
haveHash := r.Fremote.Hashes().Overlap(r.Flocal.Hashes()).GetOne() != hash.None
|
||||||
canTrackRenames := haveHash && operations.CanServerSideMove(r.Fremote)
|
canTrackRenames := haveHash && operations.CanServerSideMove(r.Fremote)
|
||||||
t.Logf("Can track renames: %v", canTrackRenames)
|
t.Logf("Can track renames: %v", canTrackRenames)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue