1
mirror of https://github.com/rclone/rclone synced 2024-12-23 14:23:44 +01:00

cmd/hashsum: dont put ERROR or UNSUPPORTED in output

This commit is contained in:
Ivan Andreev 2021-10-07 15:37:31 +03:00
parent c8d5606f2c
commit 7a1cab57b6
2 changed files with 42 additions and 12 deletions

View File

@ -1000,9 +1000,10 @@ func hashSum(ctx context.Context, ht hash.Type, downloadFlag bool, o fs.Object)
sum, err = o.Hash(ctx, ht)
if err == hash.ErrUnsupported {
return "UNSUPPORTED", errors.Wrap(err, "Hash unsupported")
} else if err != nil {
return "ERROR", errors.Wrapf(err, "Failed to get hash %v from backed: %v", ht, err)
return "", errors.Wrap(err, "Hash unsupported")
}
if err != nil {
return "", errors.Wrapf(err, "Failed to get hash %v from backend: %v", ht, err)
}
}
@ -1013,6 +1014,10 @@ func hashSum(ctx context.Context, ht hash.Type, downloadFlag bool, o fs.Object)
// Updated to handle both standard hex encoding and base64
// Updated to perform multiple hashes concurrently
func HashLister(ctx context.Context, ht hash.Type, outputBase64 bool, downloadFlag bool, f fs.Fs, w io.Writer) error {
width := hash.Width(ht)
if outputBase64 {
width = base64.URLEncoding.EncodedLen(width / 2)
}
concurrencyControl := make(chan struct{}, fs.GetConfig(ctx).Transfers)
var wg sync.WaitGroup
err := ListFn(ctx, f, func(o fs.Object) {
@ -1024,18 +1029,15 @@ func HashLister(ctx context.Context, ht hash.Type, outputBase64 bool, downloadFl
wg.Done()
}()
sum, err := hashSum(ctx, ht, downloadFlag, o)
if outputBase64 && err == nil {
if err != nil {
fs.Errorf(o, "%v", fs.CountError(err))
return
}
if outputBase64 {
hexBytes, _ := hex.DecodeString(sum)
sum = base64.URLEncoding.EncodeToString(hexBytes)
width := base64.URLEncoding.EncodedLen(hash.Width(ht) / 2)
syncFprintf(w, "%*s %s\n", width, sum, o.Remote())
} else {
syncFprintf(w, "%*s %s\n", hash.Width(ht), sum, o.Remote())
}
if err != nil {
err = fs.CountError(err)
fs.Errorf(o, "%v", err)
}
syncFprintf(w, "%*s %s\n", width, sum, o.Remote())
}()
})
wg.Wait()

View File

@ -43,6 +43,7 @@ import (
"github.com/rclone/rclone/fs/hash"
"github.com/rclone/rclone/fs/operations"
"github.com/rclone/rclone/fstest"
"github.com/rclone/rclone/fstest/fstests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@ -330,6 +331,33 @@ func TestHashSums(t *testing.T) {
}
}
func TestHashSumsWithErrors(t *testing.T) {
ctx := context.Background()
memFs, err := fs.NewFs(ctx, ":memory:")
require.NoError(t, err)
// Make a test file
content := "-"
item1 := fstest.NewItem("file1", content, t1)
_, _ = fstests.PutTestContents(ctx, t, memFs, &item1, content, true)
// MemoryFS supports MD5
buf := &bytes.Buffer{}
err = operations.HashLister(ctx, hash.MD5, false, false, memFs, buf)
require.NoError(t, err)
assert.Contains(t, buf.String(), "336d5ebc5436534e61d16e63ddfca327 file1\n")
// MemoryFS can't do SHA1, but UNSUPPORTED must not appear in the output
buf.Reset()
err = operations.HashLister(ctx, hash.SHA1, false, false, memFs, buf)
require.NoError(t, err)
assert.NotContains(t, buf.String(), " UNSUPPORTED ")
// ERROR must not appear in the output either
assert.NotContains(t, buf.String(), " ERROR ")
// TODO mock an unreadable file
}
func TestSuffixName(t *testing.T) {
ctx := context.Background()
ctx, ci := fs.AddConfig(ctx)