From c0914664cf35ea0f06cb4c24f983d62096594d0c Mon Sep 17 00:00:00 2001 From: hut Date: Mon, 12 Apr 2010 11:26:12 +0200 Subject: cleanup --- ranger/api/apps.py | 7 ++++--- ranger/core/fm.py | 6 ++---- ranger/defaults/apps.py | 3 ++- ranger/ext/get_all_modules.py | 23 ----------------------- ranger/ext/get_executables.py | 33 +++++++++++++++++++++++++-------- ranger/ext/waitpid_no_intr.py | 9 +++++---- ranger/gui/widgets/console.py | 7 ++++--- 7 files changed, 42 insertions(+), 46 deletions(-) delete mode 100644 ranger/ext/get_all_modules.py diff --git a/ranger/api/apps.py b/ranger/api/apps.py index a17a6601..309c0db6 100644 --- a/ranger/api/apps.py +++ b/ranger/api/apps.py @@ -20,6 +20,7 @@ This module provides helper functions/classes for ranger.apps. import os, sys, re from subprocess import Popen, PIPE from ranger.ext.iter_tools import flatten +from ranger.ext.get_executables import get_executables from ranger.shared import FileManagerAware @@ -68,7 +69,7 @@ class Applications(FileManagerAware): if hasattr(dep, 'dependencies') \ and not self._meets_dependencies(dep): return False - if dep not in self.fm.executables: + if dep not in get_executables(): return False return True @@ -78,7 +79,7 @@ class Applications(FileManagerAware): try: application_handler = getattr(self, 'app_' + app) except AttributeError: - if app in self.fm.executables: + if app in get_executables(): return tup(app, *context) continue if self._meets_dependencies(application_handler): @@ -101,7 +102,7 @@ class Applications(FileManagerAware): try: handler = getattr(self, 'app_' + app) except AttributeError: - if app in self.fm.executables: + if app in get_executables(): return tup(app, *context) # generic app handler = self.app_default return handler(context) diff --git a/ranger/core/fm.py b/ranger/core/fm.py index 25e66407..626ce838 100644 --- a/ranger/core/fm.py +++ b/ranger/core/fm.py @@ -51,7 +51,6 @@ class FM(Actions, SignalDispatcher): self.tabs = {} self.current_tab = 1 self.loader = Loader() - self._executables = None self.apps = self.settings.apps.CustomApplications() def mylogfunc(text): @@ -68,9 +67,8 @@ class FM(Actions, SignalDispatcher): @property def executables(self): - if self._executables is None: - self._executables = sorted(get_executables()) - return self._executables + """For compatibility. Calls get_executables()""" + return get_executables() def initialize(self): """If ui/bookmarks are None, they will be initialized here.""" diff --git a/ranger/defaults/apps.py b/ranger/defaults/apps.py index b3500c0d..45f2ace3 100644 --- a/ranger/defaults/apps.py +++ b/ranger/defaults/apps.py @@ -46,6 +46,7 @@ This example modifies the behaviour of "feh" and adds a custom media player: """ from ranger.api.apps import * +from ranger.ext.get_executables import get_executables INTERPRETED_LANGUAGES = re.compile(r''' ^(text|application)\/x-( @@ -103,7 +104,7 @@ class CustomApplications(Applications): else: parts = default_editor.split() exe_name = os.path.basename(parts[0]) - if exe_name in self.fm.executables: + if exe_name in get_executables(): return tuple(parts) + tuple(c) return self.either(c, 'vim', 'emacs', 'nano') diff --git a/ranger/ext/get_all_modules.py b/ranger/ext/get_all_modules.py deleted file mode 100644 index 62c81437..00000000 --- a/ranger/ext/get_all_modules.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) 2009, 2010 Roman Zimbelmann -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -def get_all_modules(dirname): - """returns a list of strings containing the names of modules in a directory""" - import os - result = [] - for filename in os.listdir(dirname): - if filename.endswith('.py') and not filename.startswith('_'): - result.append(filename[0:filename.index('.')]) - return result diff --git a/ranger/ext/get_executables.py b/ranger/ext/get_executables.py index 9eeb3345..22c08eb9 100644 --- a/ranger/ext/get_executables.py +++ b/ranger/ext/get_executables.py @@ -13,12 +13,28 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import stat -import os -from os.path import isfile, join, exists +from stat import S_IXOTH, S_IFREG from ranger.ext.iter_tools import unique +from os import listdir, environ, stat +from os.path import join -def get_executables(*paths): + +_cached_executables = None + + +def get_executables(): + """ + Return all executable files in each of the given directories. + + Looks in $PATH by default. + """ + global _cached_executables + if _cached_executables is None: + _cached_executables = sorted(get_executables_uncached()) + return _cached_executables + + +def get_executables_uncached(*paths): """ Return all executable files in each of the given directories. @@ -26,7 +42,7 @@ def get_executables(*paths): """ if not paths: try: - pathstring = os.environ['PATH'] + pathstring = environ['PATH'] except KeyError: return () paths = unique(pathstring.split(':')) @@ -34,15 +50,16 @@ def get_executables(*paths): executables = set() for path in paths: try: - content = os.listdir(path) + content = listdir(path) except: continue for item in content: abspath = join(path, item) try: - filestat = os.stat(abspath) + filestat = stat(abspath) except: continue - if filestat.st_mode & (stat.S_IXOTH | stat.S_IFREG): + if filestat.st_mode & (S_IXOTH | S_IFREG): executables.add(item) return executables + diff --git a/ranger/ext/waitpid_no_intr.py b/ranger/ext/waitpid_no_intr.py index c14fa5b9..12fbcbce 100644 --- a/ranger/ext/waitpid_no_intr.py +++ b/ranger/ext/waitpid_no_intr.py @@ -13,17 +13,18 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +from errno import EINTR +from os import waitpid + def waitpid_no_intr(pid): """catch interrupts which occur while using os.waitpid""" - import os, errno - while True: try: - return os.waitpid(pid, 0) + return waitpid(pid, 0) except KeyboardInterrupt: continue except OSError as e: - if e.errno == errno.EINTR: + if e.errno == EINTR: continue else: raise diff --git a/ranger/gui/widgets/console.py b/ranger/gui/widgets/console.py index d7040a4f..3f00c3c5 100644 --- a/ranger/gui/widgets/console.py +++ b/ranger/gui/widgets/console.py @@ -27,6 +27,7 @@ from ranger.defaults import commands from ranger.gui.widgets.console_mode import is_valid_mode, mode_to_class from ranger import log, relpath_conf from ranger.ext.shell_escape import shell_quote +from ranger.ext.get_executables import get_executables from ranger.ext.direction import Direction import ranger @@ -445,8 +446,8 @@ class OpenConsole(ConsoleWithTab): try: position_of_last_space = line.rindex(" ") except ValueError: - return (start + program + ' ' for program in self.fm.executables \ - if program.startswith(line)) + return (start + program + ' ' for program \ + in get_executables() if program.startswith(line)) if position_of_last_space == len(line) - 1: return self.line + '%s ' else: @@ -615,7 +616,7 @@ class QuickOpenConsole(ConsoleWithTab): def _is_app(self, arg): return self.fm.apps.has(arg) or \ - (not self._is_flags(arg) and arg in self.fm.executables) + (not self._is_flags(arg) and arg in get_executables()) def _is_flags(self, arg): from ranger.core.runner import ALLOWED_FLAGS -- cgit 1.4.1-2-gfad0