cpython-withatomic / Lib / linecache.py

"""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

__all__ = ["getline", "clearcache", "checkcache"]

def getline(filename, lineno):
    lines = getlines(filename)
    if 1 <= lineno <= len(lines):
        return lines[lineno-1]
        return ''

# The cache

cache = {} # The cache

def clearcache():
    """Clear the cache entirely."""

    global cache
    cache = {}

def getlines(filename):
    """Get the lines for a file from the cache.
    Update the cache if it doesn't contain an entry for this file already."""

    if filename in cache:
        return cache[filename][2]
        return updatecache(filename)

def checkcache():
    """Discard cache entries that are out of date.
    (This is not checked upon each call!)"""

    for filename in cache.keys():
        size, mtime, lines, fullname = cache[filename]
            stat = os.stat(fullname)
        except os.error:
            del cache[filename]
        if size != stat.st_size or mtime != stat.st_mtime:
            del cache[filename]

def updatecache(filename):
    """Update a cache entry and return its list of lines.
    If something's wrong, print a message, discard the cache entry,
    and return an empty list."""

    if filename in cache:
        del cache[filename]
    if not filename or filename[0] + filename[-1] == '<>':
        return []
    fullname = filename
        stat = os.stat(fullname)
    except os.error, msg:
        # Try looking through the module search path.
        basename = os.path.split(filename)[1]
        for dirname in sys.path:
            # When using imputil, sys.path may contain things other than
            # strings; ignore them when it happens.
                fullname = os.path.join(dirname, basename)
            except (TypeError, AttributeError):
                # Not sufficiently string-like to do anything useful with.
                    stat = os.stat(fullname)
                except os.error:
            # No luck
##          print '*** Cannot stat', filename, ':', msg
            return []
        fp = open(fullname, 'rU')
        lines = fp.readlines()
    except IOError, msg:
##      print '*** Cannot open', fullname, ':', msg
        return []
    size, mtime = stat.st_size, stat.st_mtime
    cache[filename] = size, mtime, lines, fullname
    return lines
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.