diff options
-rwxr-xr-x | ranger/config/commands.py | 39 | ||||
-rw-r--r-- | ranger/core/fm.py | 37 |
2 files changed, 38 insertions, 38 deletions
diff --git a/ranger/config/commands.py b/ranger/config/commands.py index 499bf3ef..0105c171 100755 --- a/ranger/config/commands.py +++ b/ranger/config/commands.py @@ -728,7 +728,7 @@ class trash(Command): if self.rest(1): file_names = shlex.split(self.rest(1)) - files = self.paths_to_filesystem_objects(file_names) + files = self.fm.get_filesystem_objects(file_names) if files is None: return many_files = (len(files) > 1 or is_directory_with_files(files[0].path)) @@ -755,43 +755,6 @@ class trash(Command): # no need for a confirmation, just delete self._trash_files_catch_arg_list_error(files) - @staticmethod - def group_paths_by_dirname(paths): - """ - Groups the paths into a dictionary with their dirnames as keys and a set of - basenames as entries. - """ - groups = dict() - for path in paths: - abspath = os.path.abspath(os.path.expanduser(path)) - dirname, basename = os.path.split(abspath) - groups.setdefault(dirname, set()).add(basename) - return groups - - def paths_to_filesystem_objects(self, paths): - """ - Find FileSystemObjects corresponding to the paths if they are already in - memory and load those that are not. - """ - result = [] - # Grouping the files by dirname avoids the potentially quadratic running time of doing - # a linear search in the directory for each entry name that is supposed to be deleted. - groups = trash.group_paths_by_dirname(paths) - for dirname, basenames in groups.items(): - directory = self.fm.get_directory(dirname) - directory.load_content_if_outdated() - for entry in directory.files_all: - if entry.basename in basenames: - result.append(entry) - basenames.remove(entry.basename) - if basenames != set(): - # Abort the operation with an error message if there are entries - # that weren't found. - names = ', '.join(basenames) - self.fm.notify('Error: No such file or directory: {}'.format(names), bad=True) - return None - return result - def tab(self, tabnum): return self._tab_directory_content() diff --git a/ranger/core/fm.py b/ranger/core/fm.py index 7d23c9b6..77aa2260 100644 --- a/ranger/core/fm.py +++ b/ranger/core/fm.py @@ -329,6 +329,43 @@ class FM(Actions, # pylint: disable=too-many-instance-attributes self.directories[path] = obj return obj + @staticmethod + def group_paths_by_dirname(paths): + """ + Groups the paths into a dictionary with their dirnames as keys and a set of + basenames as entries. + """ + groups = dict() + for path in paths: + abspath = os.path.abspath(os.path.expanduser(path)) + dirname, basename = os.path.split(abspath) + groups.setdefault(dirname, set()).add(basename) + return groups + + def get_filesystem_objects(self, paths): + """ + Find FileSystemObjects corresponding to the paths if they are already in + memory and load those that are not. + """ + result = [] + # Grouping the files by dirname avoids the potentially quadratic running time of doing + # a linear search in the directory for each entry name that is supposed to be deleted. + groups = self.group_paths_by_dirname(paths) + for dirname, basenames in groups.items(): + directory = self.fm.get_directory(dirname) + directory.load_content_if_outdated() + for entry in directory.files_all: + if entry.basename in basenames: + result.append(entry) + basenames.remove(entry.basename) + if basenames != set(): + # Abort the operation with an error message if there are entries + # that weren't found. + names = ', '.join(basenames) + self.fm.notify('Error: No such file or directory: {}'.format(names), bad=True) + return None + return result + def garbage_collect( self, age, tabs=None): # tabs=None is for COMPATibility pylint: disable=unused-argument |