Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Jun 2015 18:25:00 +0000 (UTC)
From:      Antoine Brodin <antoine@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r390980 - in head/devel/py-ply: . files
Message-ID:  <201506301825.t5UIP0Rl046166@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: antoine
Date: Tue Jun 30 18:24:59 2015
New Revision: 390980
URL: https://svnweb.freebsd.org/changeset/ports/390980

Log:
  Add patches from upstream to fix issue 63:
  https://github.com/dabeaz/ply/issues/63
  This unbreaks www/chromium
  
  Reported by:	pkg-fallout
  With hat:	portmgr

Added:
  head/devel/py-ply/files/
  head/devel/py-ply/files/patch-CHANGES   (contents, props changed)
  head/devel/py-ply/files/patch-ply_lex.py   (contents, props changed)
  head/devel/py-ply/files/patch-ply_yacc.py   (contents, props changed)
Modified:
  head/devel/py-ply/Makefile

Modified: head/devel/py-ply/Makefile
==============================================================================
--- head/devel/py-ply/Makefile	Tue Jun 30 18:13:50 2015	(r390979)
+++ head/devel/py-ply/Makefile	Tue Jun 30 18:24:59 2015	(r390980)
@@ -3,6 +3,7 @@
 
 PORTNAME=	ply
 PORTVERSION=	3.6
+PORTREVISION=	1
 CATEGORIES=	devel python
 MASTER_SITES=	http://www.dabeaz.com/ply/
 PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}

Added: head/devel/py-ply/files/patch-CHANGES
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/py-ply/files/patch-CHANGES	Tue Jun 30 18:24:59 2015	(r390980)
@@ -0,0 +1,12 @@
+--- CHANGES.orig	2015-04-25 14:15:57 UTC
++++ CHANGES
+@@ -1,3 +1,9 @@
++Version 3.7
++---------------------
++05/07/15: beazley
++          Fixed regression in handling of table modules if specified as module
++          objects.   See https://github.com/dabeaz/ply/issues/63
++
+ Version 3.6
+ ---------------------
+ 04/25/15: beazley

Added: head/devel/py-ply/files/patch-ply_lex.py
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/py-ply/files/patch-ply_lex.py	Tue Jun 30 18:24:59 2015	(r390980)
@@ -0,0 +1,82 @@
+--- ply/lex.py.orig	2015-04-26 21:17:41 UTC
++++ ply/lex.py
+@@ -171,7 +171,10 @@ class Lexer:
+     # ------------------------------------------------------------
+     # writetab() - Write lexer information to a table file
+     # ------------------------------------------------------------
+-    def writetab(self, basetabmodule, outputdir=''):
++    def writetab(self, lextab, outputdir=''):
++        if isinstance(lextab, types.ModuleType):
++            raise IOError("Won't overwrite existing lextab module")
++        basetabmodule = lextab.split('.')[-1]
+         filename = os.path.join(outputdir, basetabmodule) + '.py'
+         with open(filename, 'w') as tf:
+             tf.write('# %s.py. This file automatically created by PLY (version %s). Don\'t edit!\n' % (basetabmodule, __version__))
+@@ -856,6 +859,10 @@ class LexerReflect(object):
+ # -----------------------------------------------------------------------------
+ def lex(module=None, object=None, debug=False, optimize=False, lextab='lextab',
+         reflags=0, nowarn=False, outputdir=None, debuglog=None, errorlog=None):
++
++    if lextab is None:
++        lextab = 'lextab'
++
+     global lexer
+ 
+     ldict = None
+@@ -885,29 +892,13 @@ def lex(module=None, object=None, debug=
+     else:
+         ldict = get_caller_module_dict(2)
+ 
+-    if outputdir is None:
+-        # If no output directory is set, the location of the output files
+-        # is determined according to the following rules:
+-        #     - If lextab specifies a package, files go into that package directory
+-        #     - Otherwise, files go in the same directory as the specifying module
+-        if '.' not in lextab:
+-            srcfile = ldict['__file__']
+-        else:
+-            parts = lextab.split('.')
+-            pkgname = '.'.join(parts[:-1])
+-            exec('import %s' % pkgname)
+-            srcfile = getattr(sys.modules[pkgname], '__file__', '')
+-        outputdir = os.path.dirname(srcfile)
+-
+     # Determine if the module is package of a package or not.
+     # If so, fix the tabmodule setting so that tables load correctly
+     pkg = ldict.get('__package__')
+-    if pkg:
++    if pkg and isinstance(lextab, str):
+         if '.' not in lextab:
+             lextab = pkg + '.' + lextab
+ 
+-    baselextab = lextab.split('.')[-1]
+-
+     # Collect parser information from the dictionary
+     linfo = LexerReflect(ldict, log=errorlog, reflags=reflags)
+     linfo.get_all()
+@@ -1029,8 +1020,24 @@ def lex(module=None, object=None, debug=
+ 
+     # If in optimize mode, we write the lextab
+     if lextab and optimize:
++        if outputdir is None:
++            # If no output directory is set, the location of the output files
++            # is determined according to the following rules:
++            #     - If lextab specifies a package, files go into that package directory
++            #     - Otherwise, files go in the same directory as the specifying module
++            if isinstance(lextab, types.ModuleType):
++                srcfile = lextab.__file__
++            else:
++                if '.' not in lextab:
++                    srcfile = ldict['__file__']
++                else:
++                    parts = lextab.split('.')
++                    pkgname = '.'.join(parts[:-1])
++                    exec('import %s' % pkgname)
++                    srcfile = getattr(sys.modules[pkgname], '__file__', '')
++            outputdir = os.path.dirname(srcfile)
+         try:
+-            lexobj.writetab(baselextab, outputdir)
++            lexobj.writetab(lextab, outputdir)
+         except IOError as e:
+             errorlog.warning("Couldn't write lextab module %r. %s" % (lextab, e))
+ 

Added: head/devel/py-ply/files/patch-ply_yacc.py
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/py-ply/files/patch-ply_yacc.py	Tue Jun 30 18:24:59 2015	(r390980)
@@ -0,0 +1,79 @@
+--- ply/yacc.py.orig	2015-04-26 21:19:12 UTC
++++ ply/yacc.py
+@@ -2692,7 +2692,11 @@ class LRGeneratedTable(LRTable):
+     # This function writes the LR parsing tables to a file
+     # -----------------------------------------------------------------------------
+ 
+-    def write_table(self, basemodulename, outputdir='', signature=''):
++    def write_table(self, tabmodule, outputdir='', signature=''):
++        if isinstance(tabmodule, types.ModuleType):
++            raise IOError("Won't overwrite existing tabmodule")
++
++        basemodulename = tabmodule.split('.')[-1]
+         filename = os.path.join(outputdir, basemodulename) + '.py'
+         try:
+             f = open(filename, 'w')
+@@ -2705,7 +2709,7 @@ _tabversion = %r
+ _lr_method = %r
+ 
+ _lr_signature = %r
+-    ''' % (filename, __tabversion__, self.lr_method, signature))
++    ''' % (os.path.basename(filename), __tabversion__, self.lr_method, signature))
+ 
+             # Change smaller to 0 to go back to original tables
+             smaller = 1
+@@ -3179,6 +3183,9 @@ def yacc(method='LALR', debug=yaccdebug,
+          check_recursion=True, optimize=False, write_tables=True, debugfile=debug_file,
+          outputdir=None, debuglog=None, errorlog=None, picklefile=None):
+ 
++    if tabmodule is None:
++        tabmodule = tab_module
++
+     # Reference to the parsing method of the last built parser
+     global parse
+ 
+@@ -3204,22 +3211,26 @@ def yacc(method='LALR', debug=yaccdebug,
+         # is determined according to the following rules:
+         #     - If tabmodule specifies a package, files go into that package directory
+         #     - Otherwise, files go in the same directory as the specifying module
+-        if '.' not in tabmodule:
+-            srcfile = pdict['__file__']
++        if isinstance(tabmodule, types.ModuleType):
++            srcfile = tabmodule.__file__
+         else:
+-            parts = tabmodule.split('.')
+-            pkgname = '.'.join(parts[:-1])
+-            exec('import %s' % pkgname)
+-            srcfile = getattr(sys.modules[pkgname], '__file__', '')
++            if '.' not in tabmodule:
++                srcfile = pdict['__file__']
++            else:
++                parts = tabmodule.split('.')
++                pkgname = '.'.join(parts[:-1])
++                exec('import %s' % pkgname)
++                srcfile = getattr(sys.modules[pkgname], '__file__', '')
+         outputdir = os.path.dirname(srcfile)
+ 
+     # Determine if the module is package of a package or not.
+     # If so, fix the tabmodule setting so that tables load correctly
+     pkg = pdict.get('__package__')
+-    if pkg and '.' not in tabmodule:
+-        tabmodule = pkg + '.' + tabmodule
++    if pkg and isinstance(tabmodule, str):
++        if '.' not in tabmodule:
++            tabmodule = pkg + '.' + tabmodule
++
+ 
+-    basetabmodule = tabmodule.split('.')[-1]
+ 
+     # Set start symbol if it's specified directly using an argument
+     if start is not None:
+@@ -3432,7 +3443,7 @@ def yacc(method='LALR', debug=yaccdebug,
+     # Write the table file if requested
+     if write_tables:
+         try:
+-            lr.write_table(basetabmodule, outputdir, signature)
++            lr.write_table(tabmodule, outputdir, signature)
+         except IOError as e:
+             errorlog.warning("Couldn't create %r. %s" % (tabmodule, e))
+ 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201506301825.t5UIP0Rl046166>