sftp: don't stat directories before listing them

Before this change we ran stat on the directory to see if it existed.

Not only is this inefficient it isn't allowed by some SFTP servers.

See: https://forum.rclone.org/t/stat-failed-error-on-sftp/38045
This commit is contained in:
Nick Craig-Wood 2023-05-10 11:34:20 +01:00
parent fcf47a8393
commit e6e6069ecf

View File

@ -1169,13 +1169,6 @@ func (f *Fs) dirExists(ctx context.Context, dir string) (bool, error) {
// found. // found.
func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err error) { func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err error) {
root := path.Join(f.absRoot, dir) root := path.Join(f.absRoot, dir)
ok, err := f.dirExists(ctx, root)
if err != nil {
return nil, fmt.Errorf("List failed: %w", err)
}
if !ok {
return nil, fs.ErrorDirNotFound
}
sftpDir := root sftpDir := root
if sftpDir == "" { if sftpDir == "" {
sftpDir = "." sftpDir = "."
@ -1187,6 +1180,9 @@ func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err e
infos, err := c.sftpClient.ReadDir(sftpDir) infos, err := c.sftpClient.ReadDir(sftpDir)
f.putSftpConnection(&c, err) f.putSftpConnection(&c, err)
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) {
return nil, fs.ErrorDirNotFound
}
return nil, fmt.Errorf("error listing %q: %w", dir, err) return nil, fmt.Errorf("error listing %q: %w", dir, err)
} }
for _, info := range infos { for _, info := range infos {