mirror of
https://github.com/arsenetar/dupeguru.git
synced 2026-01-22 14:41:39 +00:00
Refactoring: Path API compatibility with pathlib
Refactored dupeGuru to make hscommon.path's API a bit close to pathlib's API. It's not 100% compatible yet, but it's much better than before. This is more of a hscommon refactoring than a dupeguru one, but since duepGuru is the main user of Path, it was the driver behind the refactoring. This refactoring also see the introduction of @pathify, which ensure Path arguments. Previously, we were often unsure of whether the caller of a function was passing a Path or a str. This problem is now solved and this allows us to remove hscommon.io, an ill-conceived attempt to solve that same ambiguity problem. Fixes #235.
This commit is contained in:
@@ -7,7 +7,10 @@
|
||||
# http://www.hardcoded.net/licenses/bsd_license
|
||||
|
||||
import re
|
||||
from . import io
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from .path import Path, pathify
|
||||
|
||||
#This matches [123], but not [12] (3 digits being the minimum).
|
||||
#It also matches [1234] [12345] etc..
|
||||
@@ -36,27 +39,28 @@ def get_unconflicted_name(name):
|
||||
def is_conflicted(name):
|
||||
return re_conflict.match(name) is not None
|
||||
|
||||
def _smart_move_or_copy(operation, source_path, dest_path):
|
||||
@pathify
|
||||
def _smart_move_or_copy(operation, source_path: Path, dest_path: Path):
|
||||
''' Use move() or copy() to move and copy file with the conflict management, but without the
|
||||
slowness of the fs system.
|
||||
'''
|
||||
if io.isdir(dest_path) and not io.isdir(source_path):
|
||||
dest_path = dest_path + source_path[-1]
|
||||
if io.exists(dest_path):
|
||||
filename = dest_path[-1]
|
||||
dest_dir_path = dest_path[:-1]
|
||||
newname = get_conflicted_name(io.listdir(dest_dir_path), filename)
|
||||
dest_path = dest_dir_path + newname
|
||||
operation(source_path, dest_path)
|
||||
if dest_path.isdir() and not source_path.isdir():
|
||||
dest_path = dest_path[source_path.name]
|
||||
if dest_path.exists():
|
||||
filename = dest_path.name
|
||||
dest_dir_path = dest_path.parent()
|
||||
newname = get_conflicted_name(os.listdir(str(dest_dir_path)), filename)
|
||||
dest_path = dest_dir_path[newname]
|
||||
operation(str(source_path), str(dest_path))
|
||||
|
||||
def smart_move(source_path, dest_path):
|
||||
_smart_move_or_copy(io.move, source_path, dest_path)
|
||||
_smart_move_or_copy(shutil.move, source_path, dest_path)
|
||||
|
||||
def smart_copy(source_path, dest_path):
|
||||
try:
|
||||
_smart_move_or_copy(io.copy, source_path, dest_path)
|
||||
_smart_move_or_copy(shutil.copy, source_path, dest_path)
|
||||
except IOError as e:
|
||||
if e.errno in {21, 13}: # it's a directory, code is 21 on OS X / Linux and 13 on Windows
|
||||
_smart_move_or_copy(io.copytree, source_path, dest_path)
|
||||
_smart_move_or_copy(shutil.copytree, source_path, dest_path)
|
||||
else:
|
||||
raise
|
||||
Reference in New Issue
Block a user