patch_modpython.py

changeset 0
de9c2efb9d02
child 12
1d8dd9706f46
diff -r 000000000000 -r de9c2efb9d02 patch_modpython.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patch_modpython.py	Mon Dec 28 16:03:33 2009 +0000
@@ -0,0 +1,157 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2003-2009 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+# This is a  script to patch mod_python for eric4. 
+
+"""
+Script to patch mod_python for usage with the eric4 IDE.
+"""
+
+import sys
+import os
+import shutil
+import py_compile
+import distutils.sysconfig
+
+# Define the globals.
+progName = None
+modDir = None
+
+def usage(rcode = 2):
+    """
+    Display a usage message and exit.
+
+    rcode is the return code passed back to the calling process.
+    """
+    global progName, modDir
+    
+    print "Usage:"
+    print "    %s [-h] [-d dir]" % (progName)
+    print "where:"
+    print "    -h             display this help message"
+    print "    -d dir         where Mod_python files are installed [default %s]" % \
+        (modDir)
+    print
+    print "This script patches the file apache.py of the Mod_python distribution"
+    print "so that it will work with the eric4 debugger instead of pdb."
+    print "Please see mod_python.html for more details."
+    print
+
+    sys.exit(rcode)
+
+
+def initGlobals():
+    """
+    Sets the values of globals that need more than a simple assignment.
+    """
+    global modDir
+
+    modDir = os.path.join(distutils.sysconfig.get_python_lib(True), "mod_python")
+
+def main(argv):
+    """The main function of the script.
+
+    argv is the list of command line arguments.
+    """
+    import getopt
+
+    # Parse the command line.
+    global progName, modDir
+    progName = os.path.basename(argv[0])
+
+    initGlobals()
+
+    try:
+        optlist, args = getopt.getopt(argv[1:],"hd:")
+    except getopt.GetoptError:
+        usage()
+
+    for opt, arg in optlist:
+        if opt == "-h":
+            usage(0)
+        elif opt == "-d":
+            global modDir
+            modDir = arg
+    
+    try:
+        filename = os.path.join(modDir, "apache.py")
+        f = open(filename, "r")
+    except EnvironmentError:
+        print "The file %s does not exist. Aborting." % filename
+        sys.exit(1)
+    
+    lines = f.readlines()
+    f.close()
+    
+    pdbFound = False
+    ericFound = False
+    
+    sn = "apache.py"
+    s = open(sn, "w")
+    for line in lines:
+        if not pdbFound and line.startswith("import pdb"):
+            s.write("import eric4.DebugClients.Python.eric4dbgstub as pdb\n")
+            pdbFound = True
+        else:
+            s.write(line)
+            if line.startswith("import eric4"):
+                ericFound = True
+    
+    if not ericFound:
+        s.write("\n")
+        s.write('def initDebugger(name):\n')
+        s.write('    """\n')
+        s.write('    Initialize the debugger and set the script name to be reported \n')
+        s.write('    by the debugger. This is a patch for eric4.\n')
+        s.write('    """\n')
+        s.write('    if not pdb.initDebugger("standard"):\n')
+        s.write('        raise ImportError("Could not initialize debugger")\n')
+        s.write('    pdb.setScriptname(name)\n')
+        s.write("\n")
+    s.close()
+    
+    if ericFound:
+        print "Mod_python is already patched for eric4."
+        os.remove(sn)
+    else:
+        try:
+            py_compile.compile(sn)
+        except py_compile.PyCompileError, e:
+            print "Error compiling %s. Aborting" % sn
+            print e
+            os.remove(sn)
+            sys.exit(1)
+        except SyntaxError, e:
+            print "Error compiling %s. Aborting" % sn
+            print e
+            os.remove(sn)
+            sys.exit(1)
+        
+        shutil.copy(os.path.join(modDir, "apache.py"),
+                    os.path.join(modDir, "apache.py.orig"))
+        shutil.copy(sn, modDir)
+        os.remove(sn)
+        if os.path.exists("%sc" % sn):
+            shutil.copy("%sc" % sn, modDir)
+            os.remove("%sc" % sn)
+        if os.path.exists("%so" % sn):
+            shutil.copy("%so" % sn, modDir)
+            os.remove("%so" % sn)
+            
+        print "Mod_python patched successfully."
+        print "Unpatched file copied to %s." % os.path.join(modDir, "apache.py.orig")
+    
+    
+if __name__ == "__main__":
+    try:
+        main(sys.argv)
+    except SystemExit:
+        raise
+    except:
+        print \
+"""An internal error occured.  Please report all the output of the program,
+including the following traceback, to eric-bugs@die-offenbachs.de.
+"""
+        raise
+

eric ide

mercurial