cmd/hashsum: dont put ERROR or UNSUPPORTED in output
This commit is contained in:
parent
c8d5606f2c
commit
7a1cab57b6
2 changed files with 42 additions and 12 deletions
|
@ -1000,9 +1000,10 @@ func hashSum(ctx context.Context, ht hash.Type, downloadFlag bool, o fs.Object)
|
||||||
|
|
||||||
sum, err = o.Hash(ctx, ht)
|
sum, err = o.Hash(ctx, ht)
|
||||||
if err == hash.ErrUnsupported {
|
if err == hash.ErrUnsupported {
|
||||||
return "UNSUPPORTED", errors.Wrap(err, "Hash unsupported")
|
return "", errors.Wrap(err, "Hash unsupported")
|
||||||
} else if err != nil {
|
}
|
||||||
return "ERROR", errors.Wrapf(err, "Failed to get hash %v from backed: %v", ht, err)
|
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 handle both standard hex encoding and base64
|
||||||
// Updated to perform multiple hashes concurrently
|
// 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 {
|
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)
|
concurrencyControl := make(chan struct{}, fs.GetConfig(ctx).Transfers)
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
err := ListFn(ctx, f, func(o fs.Object) {
|
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()
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
sum, err := hashSum(ctx, ht, downloadFlag, o)
|
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)
|
hexBytes, _ := hex.DecodeString(sum)
|
||||||
sum = base64.URLEncoding.EncodeToString(hexBytes)
|
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()
|
wg.Wait()
|
||||||
|
|
|
@ -43,6 +43,7 @@ import (
|
||||||
"github.com/rclone/rclone/fs/hash"
|
"github.com/rclone/rclone/fs/hash"
|
||||||
"github.com/rclone/rclone/fs/operations"
|
"github.com/rclone/rclone/fs/operations"
|
||||||
"github.com/rclone/rclone/fstest"
|
"github.com/rclone/rclone/fstest"
|
||||||
|
"github.com/rclone/rclone/fstest/fstests"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"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) {
|
func TestSuffixName(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
ctx, ci := fs.AddConfig(ctx)
|
ctx, ci := fs.AddConfig(ctx)
|
||||||
|
|
Loading…
Reference in a new issue