From ae126c47bfbfdaef1704458f28f4c0e3e7017710 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Tue, 6 Apr 2010 19:54:10 +0200 Subject: [PATCH] In plat_other, added support for sending to trash on external volumes. --- send2trash/plat_other.py | 45 +++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/send2trash/plat_other.py b/send2trash/plat_other.py index 40d85a5..6a72d4b 100644 --- a/send2trash/plat_other.py +++ b/send2trash/plat_other.py @@ -18,17 +18,48 @@ else: logging.warning("Can't find path for Trash") TRASH_PATH = op.expanduser('~/.Trash') -# XXX Make this work on external volumes +EXTERNAL_CANDIDATES = [ + '.Trash-1000/files', + '.Trash/files', + '.Trash-1000', + '.Trash', +] -def send2trash(path): - if not isinstance(path, unicode): - path = unicode(path, sys.getfilesystemencoding()) - filename = op.basename(path) - destpath = op.join(TRASH_PATH, filename) +def find_mount_point(path): + # Even if something's wrong, "/" is a mount point, so the loop will exit. + while not op.ismount(path): + path = op.join(*op.split(path)[:-1]) + return path + +def find_ext_volume_trash(volume_root): + for candidate in EXTERNAL_CANDIDATES: + candidate_path = op.join(volume_root, candidate) + if op.exists(candidate_path): + return candidate_path + else: + # Something's wrong here. Screw that, just create a .Trash folder + trash_path = op.join(volume_root, '.Trash') + os.mkdir(trash_path) + return trash_path + +def move_without_conflict(src, dst): + filename = op.basename(src) + destpath = op.join(dst, filename) counter = 0 while op.exists(destpath): counter += 1 base_name, ext = op.splitext(filename) new_filename = '{0} {1}{2}'.format(base_name, counter, ext) destpath = op.join(TRASH_PATH, new_filename) - os.rename(path, destpath) + os.rename(src, destpath) + +def send2trash(path): + if not isinstance(path, unicode): + path = unicode(path, sys.getfilesystemencoding()) + try: + move_without_conflict(path, TRASH_PATH) + except OSError: + # We're probably on an external volume + mount_point = find_mount_point(path) + dest_trash = find_ext_volume_trash(mount_point) + move_without_conflict(path, dest_trash)