Skip to content

Commit

Permalink
Use shutil.move() to move files.
Browse files Browse the repository at this point in the history
  • Loading branch information
aereaux committed Feb 25, 2024
1 parent dae5257 commit 485bb49
Showing 1 changed file with 2 additions and 36 deletions.
38 changes: 2 additions & 36 deletions beets/util/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import shutil
import subprocess
import sys
import tempfile
import traceback
from collections import Counter, namedtuple
from enum import Enum
Expand Down Expand Up @@ -503,10 +502,7 @@ def copy(path: bytes, dest: bytes, replace: bool = False):
def move(path: bytes, dest: bytes, replace: bool = False):
"""Rename a file. `dest` may not be a directory. If `dest` already
exists, raises an OSError unless `replace` is True. Has no effect if
`path` is the same as `dest`. If the paths are on different
filesystems (or the rename otherwise fails), a copy is attempted
instead, in which case metadata will *not* be preserved. Paths are
translated to system paths.
`path` is the same as `dest`. Paths are translated to system paths.
"""
if os.path.isdir(syspath(path)):
raise FilesystemError("source is directory", "move", (path, dest))
Expand All @@ -517,37 +513,7 @@ def move(path: bytes, dest: bytes, replace: bool = False):
if os.path.exists(syspath(dest)) and not replace:
raise FilesystemError("file exists", "rename", (path, dest))

# First, try renaming the file.
try:
os.replace(syspath(path), syspath(dest))
except OSError:
# Copy the file to a temporary destination.
basename = os.path.basename(bytestring_path(dest))
dirname = os.path.dirname(bytestring_path(dest))
tmp = tempfile.NamedTemporaryFile(
suffix=syspath(b".beets", prefix=False),
prefix=syspath(b"." + basename, prefix=False),
dir=syspath(dirname),
delete=False,
)
try:
with open(syspath(path), "rb") as f:
shutil.copyfileobj(f, tmp)
finally:
tmp.close()

# Move the copied file into place.
try:
os.replace(tmp.name, syspath(dest))
tmp = None
os.remove(syspath(path))
except OSError as exc:
raise FilesystemError(
exc, "move", (path, dest), traceback.format_exc()
)
finally:
if tmp is not None:
os.remove(tmp)
shutil.move(syspath(path), syspath(dest))


def link(path: bytes, dest: bytes, replace: bool = False):
Expand Down

0 comments on commit 485bb49

Please sign in to comment.