Fix iterating over nested directories of depth > 1

This commit is contained in:
Kovid Goyal 2021-11-16 20:50:09 +05:30
parent d936ede790
commit 67a92d7dc2
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -12,7 +12,7 @@ from dataclasses import Field, dataclass, field, fields
from enum import Enum, auto from enum import Enum, auto
from functools import partial from functools import partial
from gettext import gettext as _ from gettext import gettext as _
from itertools import chain, count from itertools import count
from time import monotonic from time import monotonic
from typing import ( from typing import (
IO, Any, Callable, DefaultDict, Deque, Dict, Iterable, Iterator, List, IO, Any, Callable, DefaultDict, Deque, Dict, Iterable, Iterator, List,
@ -93,6 +93,19 @@ def iter_file_metadata(file_specs: Iterable[Tuple[str, str]]) -> Iterator[Union[
file_map[skey(sr)].append(ans) file_map[skey(sr)].append(ans)
return ans return ans
def add_dir(ftc: FileTransmissionCommand) -> None:
try:
lr = os.listdir(ftc.name)
except OSError:
return
for entry in lr:
try:
child_ftc = make_ftc(os.path.join(ftc.name, entry), spec_id, parent=ftc.status)
except (ValueError, OSError):
continue
if child_ftc.ftype is FileType.directory:
add_dir(child_ftc)
for spec_id, spec in file_specs: for spec_id, spec in file_specs:
path = spec path = spec
if not os.path.isabs(path): if not os.path.isabs(path):
@ -115,18 +128,7 @@ def iter_file_metadata(file_specs: Iterable[Tuple[str, str]]) -> Iterator[Union[
yield TransmissionError(file_id=spec_id, code='EINVAL', msg='Not a valid filetype') yield TransmissionError(file_id=spec_id, code='EINVAL', msg='Not a valid filetype')
continue continue
if ftc.ftype is FileType.directory: if ftc.ftype is FileType.directory:
try: add_dir(ftc)
x_ok = os.access(path, os.X_OK)
di = os.walk(path)
except OSError:
x_ok = False
if x_ok:
for dirpath, dirnames, filenames in di:
for dname in chain(dirnames, filenames):
try:
make_ftc(os.path.join(dirpath, dname), spec_id, parent=ftc.status)
except (ValueError, OSError):
continue
def resolve_symlink(ftc: FileTransmissionCommand) -> FileTransmissionCommand: def resolve_symlink(ftc: FileTransmissionCommand) -> FileTransmissionCommand:
if ftc.ftype is FileType.symlink: if ftc.ftype is FileType.symlink: