summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorhut <hut@lavabit.com>2010-04-12 11:29:05 +0200
committerhut <hut@lavabit.com>2010-04-12 11:29:05 +0200
commitbd0ede8de02eb47625464c1b48b11a68517c9232 (patch)
treec1ce266edd4962f6d8fef19370aaab5597f46821
parent444f836128a96ec877d1a4a7412be5d185cc6464 (diff)
downloadranger-bd0ede8de02eb47625464c1b48b11a68517c9232.tar.gz
cleanup
Conflicts:

	ranger/gui/widgets/console.py
-rw-r--r--ranger/api/apps.py7
-rw-r--r--ranger/core/fm.py6
-rw-r--r--ranger/defaults/apps.py3
-rw-r--r--ranger/ext/get_all_modules.py23
-rw-r--r--ranger/ext/get_executables.py33
-rw-r--r--ranger/ext/waitpid_no_intr.py9
-rw-r--r--ranger/gui/widgets/console.py8
7 files changed, 43 insertions, 46 deletions
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 <romanz@lavabit.com>
-#
-# 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 <http://www.gnu.org/licenses/>.
-
-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 <http://www.gnu.org/licenses/>.
 
-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 <http://www.gnu.org/licenses/>.
 
+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 777ef3f6..7a3546e9 100644
--- a/ranger/gui/widgets/console.py
+++ b/ranger/gui/widgets/console.py
@@ -27,6 +27,8 @@ 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
 
 DEFAULT_HISTORY = 0
@@ -442,8 +444,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:
@@ -612,7 +614,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