qapi: Open files with encoding='utf-8'

Python 2 happily reads UTF-8 files in text mode, but Python 3 requires
either UTF-8 locale or an explicit encoding passed to open().  Commit
d4e5ec877c fixed this by setting the en_US.UTF-8 locale.  Falls apart
when the locale isn't be available.

Matthias Maier and Arfrever Frehtes Taifersar Arahesis proposed to use
binary mode instead, with manual conversion from bytes to str.  Works,
but opening with an explicit encoding is simpler, so do that.

Since Python 2's open() doesn't support the encoding parameter, we
need to suppress it with a version check.

Reported-by: Arfrever Frehtes Taifersar Arahesis <arfrever.fta@gmail.com>
Reported-by: Matthias Maier <tamiko@43-1.org>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20180618175958.29073-2-armbru@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Markus Armbruster 2018-06-18 19:59:57 +02:00
parent 29cd0403f1
commit de685ae5e9
1 changed files with 14 additions and 3 deletions

View File

@ -16,6 +16,7 @@ import errno
import os import os
import re import re
import string import string
import sys
from collections import OrderedDict from collections import OrderedDict
builtin_types = { builtin_types = {
@ -340,7 +341,10 @@ class QAPISchemaParser(object):
return None return None
try: try:
fobj = open(incl_fname, 'r') if sys.version_info[0] >= 3:
fobj = open(incl_fname, 'r', encoding='utf-8')
else:
fobj = open(incl_fname, 'r')
except IOError as e: except IOError as e:
raise QAPISemError(info, '%s: %s' % (e.strerror, incl_fname)) raise QAPISemError(info, '%s: %s' % (e.strerror, incl_fname))
return QAPISchemaParser(fobj, previously_included, info) return QAPISchemaParser(fobj, previously_included, info)
@ -1493,7 +1497,11 @@ class QAPISchemaEvent(QAPISchemaEntity):
class QAPISchema(object): class QAPISchema(object):
def __init__(self, fname): def __init__(self, fname):
self._fname = fname self._fname = fname
parser = QAPISchemaParser(open(fname, 'r')) if sys.version_info[0] >= 3:
f = open(fname, 'r', encoding='utf-8')
else:
f = open(fname, 'r')
parser = QAPISchemaParser(f)
exprs = check_exprs(parser.exprs) exprs = check_exprs(parser.exprs)
self.docs = parser.docs self.docs = parser.docs
self._entity_list = [] self._entity_list = []
@ -2007,7 +2015,10 @@ class QAPIGen(object):
if e.errno != errno.EEXIST: if e.errno != errno.EEXIST:
raise raise
fd = os.open(pathname, os.O_RDWR | os.O_CREAT, 0o666) fd = os.open(pathname, os.O_RDWR | os.O_CREAT, 0o666)
f = os.fdopen(fd, 'r+') if sys.version_info[0] >= 3:
f = open(fd, 'r+', encoding='utf-8')
else:
f = os.fdopen(fd, 'r+')
text = (self._top(fname) + self._preamble + self._body text = (self._top(fname) + self._preamble + self._body
+ self._bottom(fname)) + self._bottom(fname))
oldtext = f.read(len(text) + 1) oldtext = f.read(len(text) + 1)