add DirLister interface

Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
Nicola Murino
2024-02-15 20:53:56 +01:00
parent c60eb050ef
commit 1ff55bbfa7
35 changed files with 1362 additions and 669 deletions

View File

@@ -384,47 +384,65 @@ func (c *scpCommand) handleRecursiveDownload(fs vfs.Fs, dirPath, virtualPath str
if err != nil {
return err
}
files, err := fs.ReadDir(dirPath)
// dirPath is a fs path, not a virtual path
lister, err := fs.ReadDir(dirPath)
if err != nil {
c.sendErrorMessage(fs, err)
return err
}
files = c.connection.User.FilterListDir(files, fs.GetRelativePath(dirPath))
defer lister.Close()
vdirs := c.connection.User.GetVirtualFoldersInfo(virtualPath)
var dirs []string
for _, file := range files {
filePath := fs.GetRelativePath(fs.Join(dirPath, file.Name()))
if file.Mode().IsRegular() || file.Mode()&os.ModeSymlink != 0 {
err = c.handleDownload(filePath)
if err != nil {
break
}
} else if file.IsDir() {
dirs = append(dirs, filePath)
for {
files, err := lister.Next(vfs.ListerBatchSize)
finished := errors.Is(err, io.EOF)
if err != nil && !finished {
c.sendErrorMessage(fs, err)
return err
}
}
if err != nil {
c.sendErrorMessage(fs, err)
return err
}
for _, dir := range dirs {
err = c.handleDownload(dir)
if err != nil {
files = c.connection.User.FilterListDir(files, fs.GetRelativePath(dirPath))
if len(vdirs) > 0 {
files = append(files, vdirs...)
vdirs = nil
}
for _, file := range files {
filePath := fs.GetRelativePath(fs.Join(dirPath, file.Name()))
if file.Mode().IsRegular() || file.Mode()&os.ModeSymlink != 0 {
err = c.handleDownload(filePath)
if err != nil {
c.sendErrorMessage(fs, err)
return err
}
} else if file.IsDir() {
dirs = append(dirs, filePath)
}
}
if finished {
break
}
}
if err != nil {
lister.Close()
return c.downloadDirs(fs, dirs)
}
err = errors.New("unable to send directory for non recursive copy")
c.sendErrorMessage(nil, err)
return err
}
func (c *scpCommand) downloadDirs(fs vfs.Fs, dirs []string) error {
for _, dir := range dirs {
if err := c.handleDownload(dir); err != nil {
c.sendErrorMessage(fs, err)
return err
}
err = c.sendProtocolMessage("E\n")
if err != nil {
return err
}
return c.readConfirmationMessage()
}
err = fmt.Errorf("unable to send directory for non recursive copy")
c.sendErrorMessage(nil, err)
return err
if err := c.sendProtocolMessage("E\n"); err != nil {
return err
}
return c.readConfirmationMessage()
}
func (c *scpCommand) sendDownloadFileData(fs vfs.Fs, filePath string, stat os.FileInfo, transfer *transfer) error {