Fix iterating over nested directories of depth > 1
This commit is contained in:
parent
d936ede790
commit
67a92d7dc2
@ -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:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user