From fbb0ee7747b8e3657c9c50d26b728eb4c75d1899 Mon Sep 17 00:00:00 2001 From: ClosedPort22 <44864697+ClosedPort22@users.noreply.github.com> Date: Mon, 7 Nov 2022 23:24:30 +0800 Subject: [PATCH] [compat] Fix `shutils.move` in restricted ACL mode on BSD (#5309) Authored by: ClosedPort22, pukkandan --- yt_dlp/compat/shutil.py | 30 +++++++++++++++++++ .../postprocessor/movefilesafterdownload.py | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 yt_dlp/compat/shutil.py diff --git a/yt_dlp/compat/shutil.py b/yt_dlp/compat/shutil.py new file mode 100644 index 000000000..23239d5ce --- /dev/null +++ b/yt_dlp/compat/shutil.py @@ -0,0 +1,30 @@ +# flake8: noqa: F405 +from shutil import * # noqa: F403 + +from .compat_utils import passthrough_module + +passthrough_module(__name__, 'shutil') +del passthrough_module + + +import sys + +if sys.platform.startswith('freebsd'): + import errno + import os + import shutil + + # Workaround for PermissionError when using restricted ACL mode on FreeBSD + def copy2(src, dst, *args, **kwargs): + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + shutil.copyfile(src, dst, *args, **kwargs) + try: + shutil.copystat(src, dst, *args, **kwargs) + except PermissionError as e: + if e.errno != getattr(errno, 'EPERM', None): + raise + return dst + + def move(*args, copy_function=copy2, **kwargs): + return shutil.move(*args, copy_function=copy_function, **kwargs) diff --git a/yt_dlp/postprocessor/movefilesafterdownload.py b/yt_dlp/postprocessor/movefilesafterdownload.py index 436d13227..23b09248c 100644 --- a/yt_dlp/postprocessor/movefilesafterdownload.py +++ b/yt_dlp/postprocessor/movefilesafterdownload.py @@ -1,7 +1,7 @@ import os -import shutil from .common import PostProcessor +from ..compat import shutil from ..utils import ( PostProcessingError, decodeFilename,