#!/usr/bin/env python
import sys
import pydump
import linecache
from optparse import OptionParser

def cache_files(files):
    for name, data in files.iteritems():
        lines = [line+'\n' for line in data.splitlines()]
        linecache.cache[name] = (len(data), None, lines, name)

def patch_linecache_checkcache():
    linecache.checkcache = lambda filename=None: None

if __name__ == '__main__':
    
    parser = OptionParser(usage="%prog <filename.dump> [options]", description="pydump v%s: post-mortem debugging for Python programs" % pydump.__version__)
    parser.add_option("--pdb",  action="append_const", const="pdb",  dest="debuggers", help="Use builtin pdb or pdb++")
    parser.add_option("--pudb", action="append_const", const="pudb", dest="debuggers", help="Use pudb visual debugger")
    parser.add_option("--ipdb", action="append_const", const="ipdb", dest="debuggers", help="Use ipdb IPython debugger")
    (options, args) = parser.parse_args()

    if len(args) < 1:
        parser.print_help()
        sys.exit(1)

    dump = pydump.load_dump(args[0])
    cache_files(dump['files'])
    patch_linecache_checkcache()
    tb = dump['traceback']

    if not options.debuggers:
        options.debuggers = ["pdb"]

    for debugger in options.debuggers:
        try:
            dbg = __import__(debugger)
        except ImportError, e:
            print >>sys.stderr, str(e)
            continue
        else:
            print >>sys.stderr, "Starting %s..." % debugger
            if debugger == "pudb":
                dbg.post_mortem((None, None, tb))
            else:
                dbg.post_mortem(tb)
            break
