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:
parent
c8d5606f2c
commit
7a1cab57b6
@ -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()
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user