diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/linecache.py | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/Lib/linecache.py b/Lib/linecache.py index 4355f19..b981869 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -1,5 +1,9 @@ # Cache lines from files. +# This is intended to read lines from modules imported -- hence if a filename +# is not found, it will look down the module search path for a file by +# that name. +import sys import os from stat import * @@ -34,12 +38,13 @@ def getlines(filename): # Discard cache entries that are out of date. -# (This is not checked upon each call +# (This is not checked upon each call!) def checkcache(): for filename in cache.keys(): - size, mtime, lines = cache[filename] - try: stat = os.stat(filename) + size, mtime, lines, fullname = cache[filename] + try: + stat = os.stat(fullname) except os.error: del cache[filename] continue @@ -52,20 +57,34 @@ def checkcache(): # and return an empty list. def updatecache(filename): - try: del cache[filename] - except KeyError: pass - try: stat = os.stat(filename) + if cache.has_key(filename): + del cache[filename] + if filename[0] + filename[-1] == '<>': + return [] + fullname = filename + try: + stat = os.stat(fullname) except os.error, msg: - if filename[0] + filename[-1] <> '<>': + # Try looking through the module search path + basename = os.path.split(filename)[1] + for dirname in sys.path: + fullname = os.path.join(dirname, basename) + try: + stat = os.stat(fullname) + break + except os.error: + pass + else: + # No luck print '*** Cannot stat', filename, ':', msg - return [] + return [] try: - fp = open(filename, 'r') + fp = open(fullname, 'r') lines = fp.readlines() fp.close() except IOError, msg: - print '*** Cannot open', filename, ':', msg + print '*** Cannot open', fullname, ':', msg return [] size, mtime = stat[ST_SIZE], stat[ST_MTIME] - cache[filename] = size, mtime, lines + cache[filename] = size, mtime, lines, fullname return lines |