configure.py: read layout and module files in binary mode

This prevents encoding issues with Python3 that manifested for a user
on the Mac.

Fixes: #10671
(cherry picked from commit 731c9fb401)
This commit is contained in:
Juergen Spitzmueller 2017-11-04 10:41:22 +01:00
parent 01cf79e04b
commit 576b941389

View File

@ -1279,43 +1279,43 @@ def processLayoutFile(file, bool_docbook):
def checkForClassExtension(x): def checkForClassExtension(x):
'''if the extension for a latex class is not '''if the extension for a latex class is not
provided, add .cls to the classname''' provided, add .cls to the classname'''
if not '.' in x: if not b'.' in x:
return x.strip() + '.cls' return x.strip() + b'.cls'
else: else:
return x.strip() return x.strip()
classname = file.split(os.sep)[-1].split('.')[0] classname = file.split(os.sep)[-1].split('.')[0]
# return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for \DeclareLaTeXClass[a,b,c]{article} # 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*$') p = re.compile(b'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
q = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$') q = re.compile(b'^\s*#\s*\\DeclareCategory{(.*)}\s*$')
classdeclaration = "" classdeclaration = b""
categorydeclaration = '""' categorydeclaration = b'""'
for line in open(file).readlines(): for line in open(file, 'rb').readlines():
res = p.search(line) res = p.search(line)
qres = q.search(line) qres = q.search(line)
if res != None: if res != None:
(classtype, optAll, opt, opt1, desc) = res.groups() (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: if opt == None:
opt = classname opt = classname.encode('ascii')
prereq_latex = checkForClassExtension(classname) prereq_latex = checkForClassExtension(classname.encode('ascii'))
else: else:
prereq_list = optAll[1:-1].split(',') prereq_list = optAll[1:-1].split(b',')
prereq_list = list(map(checkForClassExtension, prereq_list)) prereq_list = list(map(checkForClassExtension, prereq_list))
prereq_latex = ','.join(prereq_list) prereq_latex = b','.join(prereq_list)
prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook] prereq_docbook = {'true':b'', 'false':b'docbook'}[bool_docbook]
prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype] prereq = {b'LaTeX':prereq_latex, b'DocBook':prereq_docbook}[classtype]
classdeclaration = ('"%s" "%s" "%s" "%s" "%s"' classdeclaration = (b'"%s" "%s" "%s" "%s" "%s"'
% (classname, opt, desc, avai, prereq)) % (classname, opt, desc, avai, prereq))
if categorydeclaration != '""': if categorydeclaration != b'""':
return classdeclaration + " " + categorydeclaration return classdeclaration + b" " + categorydeclaration
if qres != None: if qres != None:
categorydeclaration = '"%s"' % (qres.groups()[0]) categorydeclaration = b'"%s"' % (qres.groups()[0])
if classdeclaration != "": if classdeclaration != b"":
return classdeclaration + " " + categorydeclaration return classdeclaration + b" " + categorydeclaration
if classdeclaration != "": if classdeclaration != b"":
return classdeclaration + " " + categorydeclaration return classdeclaration + b" " + categorydeclaration
logger.warning("Layout file " + file + " has no \DeclareXXClass line. ") logger.warning("Layout file " + file + " has no \DeclareXXClass line. ")
return "" return b""
def checkLatexConfig(check_config, bool_docbook): def checkLatexConfig(check_config, bool_docbook):
@ -1333,8 +1333,8 @@ def checkLatexConfig(check_config, bool_docbook):
# fails, we still have something to start lyx. # fails, we still have something to start lyx.
logger.info(msg + ' default values') logger.info(msg + ' default values')
logger.info('+checking list of textclasses... ') logger.info('+checking list of textclasses... ')
tx = open('textclass.lst', 'w') tx = open('textclass.lst', 'wb')
tx.write(''' tx.write(b'''
# This file declares layouts and their associated definition files # This file declares layouts and their associated definition files
# (include dir. relative to the place where this file is). # (include dir. relative to the place where this file is).
# It contains only default values, since chkconfig.ltx could not be run # It contains only default values, since chkconfig.ltx could not be run
@ -1358,7 +1358,7 @@ def checkLatexConfig(check_config, bool_docbook):
if foundClasses.count(cleanclass) == 0: # not found before if foundClasses.count(cleanclass) == 0: # not found before
foundClasses.append(cleanclass) foundClasses.append(cleanclass)
retval = processLayoutFile(file, bool_docbook) retval = processLayoutFile(file, bool_docbook)
if retval != "": if retval != b"":
tx.write(retval) tx.write(retval)
tx.close() tx.close()
logger.info('\tdone') logger.info('\tdone')
@ -1464,8 +1464,8 @@ def checkModulesConfig():
removeFiles(['lyxmodules.lst', 'chkmodules.tex']) removeFiles(['lyxmodules.lst', 'chkmodules.tex'])
logger.info('+checking list of modules... ') logger.info('+checking list of modules... ')
tx = open('lyxmodules.lst', 'w') tx = open('lyxmodules.lst', 'wb')
tx.write('''## This file declares modules and their associated definition files. tx.write(b'''## This file declares modules and their associated definition files.
## It has been automatically generated by configure ## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a ## Use "Options/Reconfigure" if you need to update it after a
## configuration change. ## configuration change.
@ -1489,8 +1489,8 @@ def checkModulesConfig():
continue continue
seen.append(filename) seen.append(filename)
retval = processModuleFile(file, filename, bool_docbook) retval = processModuleFile(file, filename.encode('ascii'), bool_docbook)
if retval != "": if retval != b"":
tx.write(retval) tx.write(retval)
tx.close() tx.close()
logger.info('\tdone') logger.info('\tdone')
@ -1511,25 +1511,25 @@ def processModuleFile(file, filename, bool_docbook):
We expect output: We expect output:
"ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category" "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category"
''' '''
remods = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}') remods = re.compile(b'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}')
rereqs = re.compile(r'#+\s*Requires: (.*)') rereqs = re.compile(b'#+\s*Requires: (.*)')
reexcs = re.compile(r'#+\s*Excludes: (.*)') reexcs = re.compile(b'#+\s*Excludes: (.*)')
recaty = re.compile(r'#+\s*Category: (.*)') recaty = re.compile(b'#+\s*Category: (.*)')
redbeg = re.compile(r'#+\s*DescriptionBegin\s*$') redbeg = re.compile(b'#+\s*DescriptionBegin\s*$')
redend = re.compile(r'#+\s*DescriptionEnd\s*$') redend = re.compile(b'#+\s*DescriptionEnd\s*$')
modname = desc = pkgs = req = excl = catgy = "" modname = desc = pkgs = req = excl = catgy = b""
readingDescription = False readingDescription = False
descLines = [] descLines = []
for line in open(file).readlines(): for line in open(file, 'rb').readlines():
if readingDescription: if readingDescription:
res = redend.search(line) res = redend.search(line)
if res != None: if res != None:
readingDescription = False readingDescription = False
desc = " ".join(descLines) desc = b" ".join(descLines)
# Escape quotes. # Escape quotes.
desc = desc.replace('"', '\\"') desc = desc.replace(b'"', b'\\"')
continue continue
descLines.append(line[1:].strip()) descLines.append(line[1:].strip())
continue continue
@ -1541,50 +1541,50 @@ def processModuleFile(file, filename, bool_docbook):
if res != None: if res != None:
(pkgs, modname) = res.groups() (pkgs, modname) = res.groups()
if pkgs == None: if pkgs == None:
pkgs = "" pkgs = b""
else: else:
tmp = [s.strip() for s in pkgs.split(",")] tmp = [s.strip() for s in pkgs.split(b",")]
pkgs = ",".join(tmp) pkgs = b",".join(tmp)
continue continue
res = rereqs.search(line) res = rereqs.search(line)
if res != None: if res != None:
req = res.group(1) req = res.group(1)
tmp = [s.strip() for s in req.split("|")] tmp = [s.strip() for s in req.split(b"|")]
req = "|".join(tmp) req = b"|".join(tmp)
continue continue
res = reexcs.search(line) res = reexcs.search(line)
if res != None: if res != None:
excl = res.group(1) excl = res.group(1)
tmp = [s.strip() for s in excl.split("|")] tmp = [s.strip() for s in excl.split(b"|")]
excl = "|".join(tmp) excl = b"|".join(tmp)
continue continue
res = recaty.search(line) res = recaty.search(line)
if res != None: if res != None:
catgy = res.group(1) catgy = res.group(1)
continue continue
if modname == "": if modname == b"":
logger.warning("Module file without \DeclareLyXModule line. ") logger.warning("Module file without \DeclareLyXModule line. ")
return "" return b""
if pkgs != "": if pkgs != b"":
# this module has some latex dependencies: # this module has some latex dependencies:
# append the dependencies to chkmodules.tex, # append the dependencies to chkmodules.tex,
# which is \input'ed by chkconfig.ltx # which is \input'ed by chkconfig.ltx
testpackages = list() testpackages = list()
for pkg in pkgs.split(","): for pkg in pkgs.split(b","):
if "->" in pkg: if b"->" in pkg:
# this is a converter dependency: skip # this is a converter dependency: skip
continue continue
if pkg.endswith(".sty"): if pkg.endswith(b".sty"):
pkg = pkg[:-4] pkg = pkg[:-4]
testpackages.append("\\TestPackage{%s}" % (pkg,)) testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),))
cm = open('chkmodules.tex', 'a') cm = open('chkmodules.tex', 'a')
for line in testpackages: for line in testpackages:
cm.write(line + '\n') cm.write(line + '\n')
cm.close() 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)) % (modname, filename, desc, pkgs, req, excl, catgy))
@ -1592,8 +1592,8 @@ def checkCiteEnginesConfig():
removeFiles(['lyxciteengines.lst', 'chkciteengines.tex']) removeFiles(['lyxciteengines.lst', 'chkciteengines.tex'])
logger.info('+checking list of cite engines... ') logger.info('+checking list of cite engines... ')
tx = open('lyxciteengines.lst', 'w') tx = open('lyxciteengines.lst', 'wb')
tx.write('''## This file declares cite engines and their associated definition files. tx.write(b'''## This file declares cite engines and their associated definition files.
## It has been automatically generated by configure ## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a ## Use "Options/Reconfigure" if you need to update it after a
## configuration change. ## configuration change.
@ -1617,8 +1617,8 @@ def checkCiteEnginesConfig():
continue continue
seen.append(filename) seen.append(filename)
retval = processCiteEngineFile(file, filename, bool_docbook) retval = processCiteEngineFile(file, filename.encode('ascii'), bool_docbook)
if retval != "": if retval != b"":
tx.write(retval) tx.write(retval)
tx.close() tx.close()
logger.info('\tdone') logger.info('\tdone')
@ -1635,25 +1635,25 @@ def processCiteEngineFile(file, filename, bool_docbook):
We expect output: We expect output:
"CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages" "CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages"
''' '''
remods = re.compile(r'\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}') remods = re.compile(b'\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}')
redbeg = re.compile(r'#+\s*DescriptionBegin\s*$') redbeg = re.compile(b'#+\s*DescriptionBegin\s*$')
redend = re.compile(r'#+\s*DescriptionEnd\s*$') redend = re.compile(b'#+\s*DescriptionEnd\s*$')
recet = re.compile(r'\s*CiteEngineType\s*(.*)') recet = re.compile(b'\s*CiteEngineType\s*(.*)')
redb = re.compile(r'\s*DefaultBiblio\s*(.*)') redb = re.compile(b'\s*DefaultBiblio\s*(.*)')
resfm = re.compile(r'\s*CiteFramework\s*(.*)') resfm = re.compile(b'\s*CiteFramework\s*(.*)')
modname = desc = pkgs = cet = db = cfm = "" modname = desc = pkgs = cet = db = cfm = ""
readingDescription = False readingDescription = False
descLines = [] descLines = []
for line in open(file).readlines(): for line in open(file, 'rb').readlines():
if readingDescription: if readingDescription:
res = redend.search(line) res = redend.search(line)
if res != None: if res != None:
readingDescription = False readingDescription = False
desc = " ".join(descLines) desc = b" ".join(descLines)
# Escape quotes. # Escape quotes.
desc = desc.replace('"', '\\"') desc = desc.replace(b'"', b'\\"')
continue continue
descLines.append(line[1:].strip()) descLines.append(line[1:].strip())
continue continue
@ -1665,10 +1665,10 @@ def processCiteEngineFile(file, filename, bool_docbook):
if res != None: if res != None:
(pkgs, modname) = res.groups() (pkgs, modname) = res.groups()
if pkgs == None: if pkgs == None:
pkgs = "" pkgs = b""
else: else:
tmp = [s.strip() for s in pkgs.split(",")] tmp = [s.strip() for s in pkgs.split(b",")]
pkgs = ",".join(tmp) pkgs = b",".join(tmp)
continue continue
res = recet.search(line) res = recet.search(line)
if res != None: if res != None:
@ -1683,28 +1683,28 @@ def processCiteEngineFile(file, filename, bool_docbook):
cfm = res.group(1) cfm = res.group(1)
continue continue
if modname == "": if modname == b"":
logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ") logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ")
return "" return b""
if pkgs != "": if pkgs != b"":
# this cite engine has some latex dependencies: # this cite engine has some latex dependencies:
# append the dependencies to chkciteengines.tex, # append the dependencies to chkciteengines.tex,
# which is \input'ed by chkconfig.ltx # which is \input'ed by chkconfig.ltx
testpackages = list() testpackages = list()
for pkg in pkgs.split(","): for pkg in pkgs.split(b","):
if "->" in pkg: if b"->" in pkg:
# this is a converter dependency: skip # this is a converter dependency: skip
continue continue
if pkg.endswith(".sty"): if pkg.endswith(b".sty"):
pkg = pkg[:-4] pkg = pkg[:-4]
testpackages.append("\\TestPackage{%s}" % (pkg,)) testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),))
cm = open('chkciteengines.tex', 'a') cm = open('chkciteengines.tex', 'a')
for line in testpackages: for line in testpackages:
cm.write(line + '\n') cm.write(line + '\n')
cm.close() 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(): def checkXTemplates():