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:
parent
29cd0403f1
commit
de685ae5e9
|
@ -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,6 +341,9 @@ class QAPISchemaParser(object):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
if sys.version_info[0] >= 3:
|
||||||
|
fobj = open(incl_fname, 'r', encoding='utf-8')
|
||||||
|
else:
|
||||||
fobj = open(incl_fname, 'r')
|
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))
|
||||||
|
@ -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,6 +2015,9 @@ 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)
|
||||||
|
if sys.version_info[0] >= 3:
|
||||||
|
f = open(fd, 'r+', encoding='utf-8')
|
||||||
|
else:
|
||||||
f = os.fdopen(fd, 'r+')
|
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))
|
||||||
|
|
Loading…
Reference in New Issue