[52427] trunk/dports/lang/python26

blb at macports.org blb at macports.org
Mon Jun 15 23:10:57 PDT 2009


Revision: 52427
          http://trac.macports.org/changeset/52427
Author:   blb at macports.org
Date:     2009-06-15 23:10:56 -0700 (Mon, 15 Jun 2009)
Log Message:
-----------
lang/python26 - fix readline 6 issues; ticket #19700

Modified Paths:
--------------
    trunk/dports/lang/python26/Portfile

Added Paths:
-----------
    trunk/dports/lang/python26/files/patch-readlinefix.diff

Modified: trunk/dports/lang/python26/Portfile
===================================================================
--- trunk/dports/lang/python26/Portfile	2009-06-16 05:56:43 UTC (rev 52426)
+++ trunk/dports/lang/python26/Portfile	2009-06-16 06:10:56 UTC (rev 52427)
@@ -32,6 +32,8 @@
 # Setting PYTHONHOME with patch-Mac-IDLE-Makefile.in.diff,
 # patch-Mac-Makefile.in.diff, and patch-Mac-PythonLauncher-Makefile.in.diff
 # is to work around http://bugs.python.org/issue5766
+# patch-readlinefix.diff comes from
+# <http://bugs.python.org/issue5833>
 patchfiles              patch-Makefile.pre.in.diff \
                         patch-setup.py.diff \
                         patch-Lib-cgi.py.diff \
@@ -39,7 +41,8 @@
                         patch-Mac-IDLE-Makefile.in.diff \
                         patch-Mac-Makefile.in.diff \
                         patch-Mac-PythonLauncher-Makefile.in.diff \
-                        patch-Mac-Tools-Doc-setup.py.diff
+                        patch-Mac-Tools-Doc-setup.py.diff \
+                        patch-readlinefix.diff
 
 depends_lib             port:gettext port:zlib port:openssl port:tk \
                         port:sqlite3 port:db46 port:ncurses port:gdbm \

Added: trunk/dports/lang/python26/files/patch-readlinefix.diff
===================================================================
--- trunk/dports/lang/python26/files/patch-readlinefix.diff	                        (rev 0)
+++ trunk/dports/lang/python26/files/patch-readlinefix.diff	2009-06-16 06:10:56 UTC (rev 52427)
@@ -0,0 +1,162 @@
+--- Modules/readline.c	2008-11-04 12:43:31.000000000 -0800
++++ Modules/readline.c	2009-04-22 15:50:49.000000000 -0700
+@@ -759,6 +759,10 @@
+ static char **
+ flex_complete(char *text, int start, int end)
+ {
++#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
++	rl_completion_append_character ='\0';
++	rl_completion_suppress_append = 0;
++#endif
+ 	Py_XDECREF(begidx);
+ 	Py_XDECREF(endidx);
+ 	begidx = PyInt_FromLong((long) start);
+@@ -799,11 +803,8 @@
+ 	rl_attempted_completion_function = (CPPFunction *)flex_complete;
+ 	/* Set Python word break characters */
+ 	rl_completer_word_break_characters =
+-		strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
++		strdup(" \t\n`!@#%^&*()=+[{]}\\|;:,<>?");
+ 		/* All nonalphanums except '.' */
+-#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
+-	rl_completion_append_character ='\0';
+-#endif
+ 
+ 	begidx = PyInt_FromLong(0L);
+ 	endidx = PyInt_FromLong(0L);
+--- Lib/rlcompleter.py	2009-04-22 15:42:38.000000000 -0700
++++ Lib/rlcompleter.py	2009-04-22 15:43:00.000000000 -0700
+@@ -1,9 +1,10 @@
+ """Word completion for GNU readline 2.0.
+ 
+ This requires the latest extension to the readline module. The completer
+-completes keywords, built-ins and globals in a selectable namespace (which
+-defaults to __main__); when completing NAME.NAME..., it evaluates (!) the
+-expression up to the last dot and completes its attributes.
++completes keywords, built-ins, globals, and file names in a selectable
++namespace (which defaults to __main__); when completing NAME.NAME...,
++it evaluates (!) the expression up to the last dot and completes its
++attributes.
+ 
+ It's very cool to do "import sys" type "sys.", hit the
+ completion key (twice), and see the list of names defined by the
+@@ -72,24 +73,34 @@
+             self.use_main_ns = 0
+             self.namespace = namespace
+ 
++        # The cache of matches for a particular text fragment.
++        self.matches = []
++
+     def complete(self, text, state):
+         """Return the next possible completion for 'text'.
+ 
+         This is called successively with state == 0, 1, 2, ... until it
+-        returns None.  The completion should begin with 'text'.
++        returns None.  The completion should begin with 'text'.  Any text
++        with a period (.) will match as an attribute.  Any text that begins
++        with a single or double quote will match using file name expansion.
+ 
+         """
+         if self.use_main_ns:
+             self.namespace = __main__.__dict__
+ 
++        # For the first call with this set of text, compute all possible
++        # matches and store them in a member variable.  Subsequent calls
++        # will then iterate through this set of matches.
+         if state == 0:
+-            if "." in text:
++            if ('"' in text) or ("'" in text):
++                self.matches = self.file_matches(text)
++            elif "." in text:
+                 self.matches = self.attr_matches(text)
+             else:
+                 self.matches = self.global_matches(text)
+-        try:
++        if state < len(self.matches):
+             return self.matches[state]
+-        except IndexError:
++        else:
+             return None
+ 
+     def _callable_postfix(self, val, word):
+@@ -129,9 +140,14 @@
+ 
+         """
+         import re
++        import types
++
++        # Setup the regular expression for attributes
+         m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text)
+         if not m:
+             return []
++
++        # Group 1 is the class name, group 3 is the attribute text
+         expr, attr = m.group(1, 3)
+         try:
+             thisobject = eval(expr, self.namespace)
+@@ -143,9 +159,18 @@
+         if "__builtins__" in words:
+             words.remove("__builtins__")
+ 
+-        if hasattr(thisobject, '__class__'):
+-            words.append('__class__')
+-            words.extend(get_class_members(thisobject.__class__))
++        # If this type is a class instance, use the __class__ member to
++        # get the dictionary of attributes
++        if type(thisobject) == types.InstanceType:
++            if hasattr(thisobject, '__class__'):
++                words.append('__class__')
++                words.extend(get_class_members(thisobject.__class__))
++        elif type(thisobject) == types.ClassType:
++            words.extend(get_class_members(thisobject))
++        else:
++            words.extend(dir(thisobject))
++
++        # Build the full matching text from class.attribute matches
+         matches = []
+         n = len(attr)
+         for word in words:
+@@ -155,6 +180,43 @@
+                 matches.append(word)
+         return matches
+ 
++    def file_matches(self, text):
++        """Compute matches when text is a file name.
++
++        Expects a leading single or double quote character in the text.
++        Will expand a leading ~ or ~user to a valid home directory.
++        Will expand a leading $VAR to an environment variable name."""
++        import glob
++        import os
++
++        # save the leading quote character so we can re-add it later
++        quote = text[0]
++        # strip the leading quote character
++        path = text[1:]
++
++        # expand a tilde (~) or a leading environment variable in the text
++        path = os.path.expanduser( path )
++        path = os.path.expandvars( path )
++
++        # append the any match character to send to the glob routine
++        path = path + "*"
++
++        # use the glob module to get all of the matches
++        rawMatches = glob.glob( path )
++
++        # re-prefix the text with the quoting character and append the correct
++        # terminating character depending on the type of match that was found.
++        # Directories are terminated with '/' and files with an ending quote.
++        matches = []
++        for entry in rawMatches:
++            if os.path.isdir( entry ):
++                matches.append( quote + entry + os.sep )
++            elif os.path.isfile( entry ):
++                matches.append( quote + entry + quote )
++            else:
++                matches.append( quote + entry )
++        return matches
++
+ def get_class_members(klass):
+     ret = dir(klass)
+     if hasattr(klass,'__bases__'):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20090615/6739919b/attachment.html>


More information about the macports-changes mailing list