[prev in list] [next in list] [prev in thread] [next in thread]
List: lyx-devel
Subject: [RFC] [PATCH] Fix configuration problems with python3 on the Mac
From: Jürgen_Spitzmüller <spitz () lyx ! org>
Date: 2017-11-02 8:51:11
Message-ID: 1509612671.2969.7.camel () lyx ! org
[Download RAW message or body]
[Attachment #2 (multipart/mixed)]
The attached patch fixes the rather nasty problems Joel Kulesza
reported at http://www.lyx.org/trac/ticket/10671 (configure failed for
him on the Mac when LyX was launched from the finder or icon as opposed
to the terminal).
It turned out in the given case configure opened files (with open()) in
ascii encoding and bailed out at non ascii characters (my very name,
for that matter).
The patch basically extends Enrico's work at 8f70d551482a69b and uses
binary mode for reading files, rather than relying on an input
encoding.
The patch fixes the problems for Joel and it doesn't break anything
here. However, I'd appreciate double-checking from a Pythonist, since
the changes are non-trivial (to me).
Thanks
J=C3=BCrgen
["10671.diff" (10671.diff)]
diff --git a/lib/configure.py b/lib/configure.py
index 63b88f7bbb..e9df2e878c 100644
--- a/lib/configure.py
+++ b/lib/configure.py
@@ -1283,43 +1283,43 @@ def processLayoutFile(file, bool_docbook):
def checkForClassExtension(x):
'''if the extension for a latex class is not
provided, add .cls to the classname'''
- if not '.' in x:
- return x.strip() + '.cls'
+ if not b'.' in x:
+ return x.strip() + b'.cls'
else:
return x.strip()
classname = file.split(os.sep)[-1].split('.')[0]
# return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for \
\DeclareLaTeXClass[a,b,c]{article}
- p = re.compile(r'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
- q = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$')
- classdeclaration = ""
- categorydeclaration = '""'
- for line in open(file).readlines():
+ p = re.compile(b'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
+ q = re.compile(b'^\s*#\s*\\DeclareCategory{(.*)}\s*$')
+ classdeclaration = b""
+ categorydeclaration = b'""'
+ for line in open(file, 'rb').readlines():
res = p.search(line)
qres = q.search(line)
if res != None:
(classtype, optAll, opt, opt1, desc) = res.groups()
- avai = {'LaTeX':'false', 'DocBook':bool_docbook}[classtype]
+ avai = {b'LaTeX':b'false', \
b'DocBook':bool_docbook.encode('ascii')}[classtype] if opt == None:
- opt = classname
- prereq_latex = checkForClassExtension(classname)
+ opt = classname.encode('ascii')
+ prereq_latex = checkForClassExtension(classname.encode('ascii'))
else:
- prereq_list = optAll[1:-1].split(',')
+ prereq_list = optAll[1:-1].split(b',')
prereq_list = list(map(checkForClassExtension, prereq_list))
- prereq_latex = ','.join(prereq_list)
- prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook]
- prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype]
- classdeclaration = ('"%s" "%s" "%s" "%s" "%s"'
+ prereq_latex = b','.join(prereq_list)
+ prereq_docbook = {'true':b'', 'false':b'docbook'}[bool_docbook]
+ prereq = {b'LaTeX':prereq_latex, b'DocBook':prereq_docbook}[classtype]
+ classdeclaration = (b'"%s" "%s" "%s" "%s" "%s"'
% (classname, opt, desc, avai, prereq))
- if categorydeclaration != '""':
- return classdeclaration + " " + categorydeclaration
+ if categorydeclaration != b'""':
+ return classdeclaration + b" " + categorydeclaration
if qres != None:
- categorydeclaration = '"%s"' % (qres.groups()[0])
- if classdeclaration != "":
- return classdeclaration + " " + categorydeclaration
- if classdeclaration != "":
- return classdeclaration + " " + categorydeclaration
+ categorydeclaration = b'"%s"' % (qres.groups()[0])
+ if classdeclaration != b"":
+ return classdeclaration + b" " + categorydeclaration
+ if classdeclaration != b"":
+ return classdeclaration + b" " + categorydeclaration
logger.warning("Layout file " + file + " has no \DeclareXXClass line. ")
- return ""
+ return b""
def checkLatexConfig(check_config, bool_docbook):
@@ -1337,8 +1337,8 @@ def checkLatexConfig(check_config, bool_docbook):
# fails, we still have something to start lyx.
logger.info(msg + ' default values')
logger.info('+checking list of textclasses... ')
- tx = open('textclass.lst', 'w')
- tx.write('''
+ tx = open('textclass.lst', 'wb')
+ tx.write(b'''
# This file declares layouts and their associated definition files
# (include dir. relative to the place where this file is).
# It contains only default values, since chkconfig.ltx could not be run
@@ -1362,7 +1362,7 @@ def checkLatexConfig(check_config, bool_docbook):
if foundClasses.count(cleanclass) == 0: # not found before
foundClasses.append(cleanclass)
retval = processLayoutFile(file, bool_docbook)
- if retval != "":
+ if retval != b"":
tx.write(retval)
tx.close()
logger.info('\tdone')
@@ -1468,8 +1468,8 @@ def checkModulesConfig():
removeFiles(['lyxmodules.lst', 'chkmodules.tex'])
logger.info('+checking list of modules... ')
- tx = open('lyxmodules.lst', 'w')
- tx.write('''## This file declares modules and their associated definition files.
+ tx = open('lyxmodules.lst', 'wb')
+ tx.write(b'''## This file declares modules and their associated definition files.
## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a
## configuration change.
@@ -1493,8 +1493,8 @@ def checkModulesConfig():
continue
seen.append(filename)
- retval = processModuleFile(file, filename, bool_docbook)
- if retval != "":
+ retval = processModuleFile(file, filename.encode('ascii'), bool_docbook)
+ if retval != b"":
tx.write(retval)
tx.close()
logger.info('\tdone')
@@ -1515,25 +1515,25 @@ def processModuleFile(file, filename, bool_docbook):
We expect output:
"ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" \
"Category" '''
- remods = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}')
- rereqs = re.compile(r'#+\s*Requires: (.*)')
- reexcs = re.compile(r'#+\s*Excludes: (.*)')
- recaty = re.compile(r'#+\s*Category: (.*)')
- redbeg = re.compile(r'#+\s*DescriptionBegin\s*$')
- redend = re.compile(r'#+\s*DescriptionEnd\s*$')
-
- modname = desc = pkgs = req = excl = catgy = ""
+ remods = re.compile(b'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}')
+ rereqs = re.compile(b'#+\s*Requires: (.*)')
+ reexcs = re.compile(b'#+\s*Excludes: (.*)')
+ recaty = re.compile(b'#+\s*Category: (.*)')
+ redbeg = re.compile(b'#+\s*DescriptionBegin\s*$')
+ redend = re.compile(b'#+\s*DescriptionEnd\s*$')
+
+ modname = desc = pkgs = req = excl = catgy = b""
readingDescription = False
descLines = []
- for line in open(file).readlines():
+ for line in open(file, 'rb').readlines():
if readingDescription:
res = redend.search(line)
if res != None:
readingDescription = False
- desc = " ".join(descLines)
+ desc = b" ".join(descLines)
# Escape quotes.
- desc = desc.replace('"', '\\"')
+ desc = desc.replace(b'"', b'\\"')
continue
descLines.append(line[1:].strip())
continue
@@ -1545,50 +1545,50 @@ def processModuleFile(file, filename, bool_docbook):
if res != None:
(pkgs, modname) = res.groups()
if pkgs == None:
- pkgs = ""
+ pkgs = b""
else:
- tmp = [s.strip() for s in pkgs.split(",")]
- pkgs = ",".join(tmp)
+ tmp = [s.strip() for s in pkgs.split(b",")]
+ pkgs = b",".join(tmp)
continue
res = rereqs.search(line)
if res != None:
req = res.group(1)
- tmp = [s.strip() for s in req.split("|")]
- req = "|".join(tmp)
+ tmp = [s.strip() for s in req.split(b"|")]
+ req = b"|".join(tmp)
continue
res = reexcs.search(line)
if res != None:
excl = res.group(1)
- tmp = [s.strip() for s in excl.split("|")]
- excl = "|".join(tmp)
+ tmp = [s.strip() for s in excl.split(b"|")]
+ excl = b"|".join(tmp)
continue
res = recaty.search(line)
if res != None:
catgy = res.group(1)
continue
- if modname == "":
+ if modname == b"":
logger.warning("Module file without \DeclareLyXModule line. ")
- return ""
+ return b""
- if pkgs != "":
+ if pkgs != b"":
# this module has some latex dependencies:
# append the dependencies to chkmodules.tex,
# which is \input'ed by chkconfig.ltx
testpackages = list()
- for pkg in pkgs.split(","):
- if "->" in pkg:
+ for pkg in pkgs.split(b","):
+ if b"->" in pkg:
# this is a converter dependency: skip
continue
- if pkg.endswith(".sty"):
+ if pkg.endswith(b".sty"):
pkg = pkg[:-4]
- testpackages.append("\\TestPackage{%s}" % (pkg,))
+ testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),))
cm = open('chkmodules.tex', 'a')
for line in testpackages:
cm.write(line + '\n')
cm.close()
- return ('"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n'
+ return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n'
% (modname, filename, desc, pkgs, req, excl, catgy))
@@ -1596,8 +1596,8 @@ def checkCiteEnginesConfig():
removeFiles(['lyxciteengines.lst', 'chkciteengines.tex'])
logger.info('+checking list of cite engines... ')
- tx = open('lyxciteengines.lst', 'w')
- tx.write('''## This file declares cite engines and their associated definition \
files. + tx = open('lyxciteengines.lst', 'wb')
+ tx.write(b'''## This file declares cite engines and their associated definition \
files. ## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a
## configuration change.
@@ -1621,8 +1621,8 @@ def checkCiteEnginesConfig():
continue
seen.append(filename)
- retval = processCiteEngineFile(file, filename, bool_docbook)
- if retval != "":
+ retval = processCiteEngineFile(file, filename.encode('ascii'), bool_docbook)
+ if retval != b"":
tx.write(retval)
tx.close()
logger.info('\tdone')
@@ -1639,25 +1639,25 @@ def processCiteEngineFile(file, filename, bool_docbook):
We expect output:
"CiteEngineName" "filename" "CiteEngineType" "CiteFramework" \
"DefaultBiblio" "Description" "Packages" '''
- remods = re.compile(r'\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}')
- redbeg = re.compile(r'#+\s*DescriptionBegin\s*$')
- redend = re.compile(r'#+\s*DescriptionEnd\s*$')
- recet = re.compile(r'\s*CiteEngineType\s*(.*)')
- redb = re.compile(r'\s*DefaultBiblio\s*(.*)')
- resfm = re.compile(r'\s*CiteFramework\s*(.*)')
+ remods = re.compile(b'\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}')
+ redbeg = re.compile(b'#+\s*DescriptionBegin\s*$')
+ redend = re.compile(b'#+\s*DescriptionEnd\s*$')
+ recet = re.compile(b'\s*CiteEngineType\s*(.*)')
+ redb = re.compile(b'\s*DefaultBiblio\s*(.*)')
+ resfm = re.compile(b'\s*CiteFramework\s*(.*)')
modname = desc = pkgs = cet = db = cfm = ""
readingDescription = False
descLines = []
- for line in open(file).readlines():
+ for line in open(file, 'rb').readlines():
if readingDescription:
res = redend.search(line)
if res != None:
readingDescription = False
- desc = " ".join(descLines)
+ desc = b" ".join(descLines)
# Escape quotes.
- desc = desc.replace('"', '\\"')
+ desc = desc.replace(b'"', b'\\"')
continue
descLines.append(line[1:].strip())
continue
@@ -1669,10 +1669,10 @@ def processCiteEngineFile(file, filename, bool_docbook):
if res != None:
(pkgs, modname) = res.groups()
if pkgs == None:
- pkgs = ""
+ pkgs = b""
else:
- tmp = [s.strip() for s in pkgs.split(",")]
- pkgs = ",".join(tmp)
+ tmp = [s.strip() for s in pkgs.split(b",")]
+ pkgs = b",".join(tmp)
continue
res = recet.search(line)
if res != None:
@@ -1687,28 +1687,28 @@ def processCiteEngineFile(file, filename, bool_docbook):
cfm = res.group(1)
continue
- if modname == "":
+ if modname == b"":
logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ")
- return ""
+ return b""
- if pkgs != "":
+ if pkgs != b"":
# this cite engine has some latex dependencies:
# append the dependencies to chkciteengines.tex,
# which is \input'ed by chkconfig.ltx
testpackages = list()
- for pkg in pkgs.split(","):
- if "->" in pkg:
+ for pkg in pkgs.split(b","):
+ if b"->" in pkg:
# this is a converter dependency: skip
continue
- if pkg.endswith(".sty"):
+ if pkg.endswith(b".sty"):
pkg = pkg[:-4]
- testpackages.append("\\TestPackage{%s}" % (pkg,))
+ testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),))
cm = open('chkciteengines.tex', 'a')
for line in testpackages:
cm.write(line + '\n')
cm.close()
- return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, cet, cfm, \
db, desc, pkgs) + return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, \
filename, cet, cfm, db, desc, pkgs))
def checkXTemplates():
["signature.asc" (application/pgp-signature)]
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic