Index: trac/mimeview/enscript.py =================================================================== --- trac/mimeview/enscript.py (revision 7601) +++ trac/mimeview/enscript.py (working copy) @@ -20,7 +20,7 @@ from trac.config import Option, ListOption from trac.core import * from trac.mimeview.api import IHTMLPreviewRenderer, Mimeview -from trac.util import NaivePopen +from trac.util import find_executable, NaivePopen from trac.util.html import escape, Deuglifier __all__ = ['EnscriptRenderer'] @@ -126,9 +126,10 @@ # Extend default MIME type to mode mappings with configured ones if not self._types: self._types = {} - self._types.update(types) - self._types.update( - Mimeview(self.env).configured_modes_mapping('enscript')) + if find_executable(self.path) != None: + self._types.update(types) + self._types.update( + Mimeview(self.env).configured_modes_mapping('enscript')) return self._types.get(mimetype, (None, 0))[1] def render(self, context, mimetype, content, filename=None, rev=None): Index: trac/util/__init__.py =================================================================== --- trac/util/__init__.py (revision 7601) +++ trac/util/__init__.py (working copy) @@ -84,6 +84,38 @@ raise Exception('Failed to create unique name: ' + path) path = '%s.%d%s' % (parts[0], idx, parts[1]) +def find_executable(executable, path=None): + """Try to find 'executable' in the directories listed in 'path' (a + string listing directories separated by 'os.pathsep'; defaults to + os.environ['PATH']). Returns the complete filename or None if not + found + """ + if path is None: + path = os.environ['PATH'] + paths = path.split(os.pathsep) + extlist = [''] + if os.name == 'os2': + (base, ext) = os.path.splitext(executable) + # executable files on OS/2 can have an arbitrary extension, but + # .exe is automatically appended if no dot is present in the name + if not ext: + executable = executable + ".exe" + elif sys.platform == 'win32': + pathext = os.environ['PATHEXT'].lower().split(os.pathsep) + (base, ext) = os.path.splitext(executable) + if ext.lower() not in pathext: + extlist = pathext + for ext in extlist: + execname = executable + ext + if os.path.isfile(execname): + return execname + else: + for p in paths: + f = os.path.join(p, execname) + if os.path.isfile(f): + return f + else: + return None class NaivePopen: """This is a deadlock-safe version of popen that returns an object with