[elbe-devel] [PATCH v4 1/1] Python3: fix encoding for both py2 and py3
Olivier Dion
dion at linutronix.de
Fri Feb 14 18:06:58 CET 2020
On Fri, 14 Feb 2020, Christian Teklenborg <chris at linutronix.de>
wrote:
> Python3 has unicode strings as default whereas Python2 has
> binary strings. To avoid TypeErrors change the encoding at the
> necessary places. At some points we need only unicode strings
> but a string in Python3 doesn't have a decode() function and we
> need this decode() function to get a unicode string from a
> Python2 binary string. Python2 strings have an encode function,
> thus use .encode().decode() to make sure we end up with a
> unicode string in both cases.
>
> Again, this gets rid of the last unicode() calls which are not
> available on Python3.
>
> Signed-off-by: Christian Teklenborg <chris at linutronix.de> ---
> elbepack/daemons/soap/esoap.py | 2 +- elbepack/efilesystem.py
> | 13 ++++++++----- elbepack/elbexml.py | 4 ++--
> elbepack/licencexml.py | 9 +++++++-- elbepack/rfs.py
> | 4 ++-- elbepack/soapclient.py | 8 ++++---- 6 files
> changed, 24 insertions(+), 16 deletions(-)
>
> diff --git a/elbepack/daemons/soap/esoap.py
> b/elbepack/daemons/soap/esoap.py index 7d76d6a3..ddc09018 100644
> --- a/elbepack/daemons/soap/esoap.py +++
> b/elbepack/daemons/soap/esoap.py @@ -178,7 +178,7 @@ class ESoap
> (ServiceBase):
> if pos >= file_stat.st_size:
> return "EndOfFile"
>
> - with open(file_name) as fp: + with
> open(file_name, 'rb') as fp:
> if not fp:
> return "FileNotFound"
> try:
> diff --git a/elbepack/efilesystem.py b/elbepack/efilesystem.py
> index 5bc20afd..0c3b03e0 100644 --- a/elbepack/efilesystem.py
> +++ b/elbepack/efilesystem.py @@ -147,18 +147,21 @@ class
> ElbeFilesystem(Filesystem):
> copyright_file = os.path.join('/usr/share/doc',
> pkg, 'copyright') copyright_fname =
> self.fname(copyright_file) try:
> - with io.open(copyright_fname, "rb") as lic: +
> with io.open(copyright_fname, "r", +
> encoding='utf-8', errors='replace') as lic:
> lic_text = lic.read()
> except IOError as e:
> logging.exception("Error while processing
> license file %s",
> copyright_fname)
> - lic_text = "Error while processing license file
> %s: '%s'" % ( + lic_text = u"Error while
> processing license file %s: '%s'" % (
> copyright_file, e.strerror)
> - - lic_text = unicode(lic_text, encoding='utf-8',
> errors='replace') + # in Python2 'pkg' is a binary
> string whereas in Python3 it is a + # unicode
> string. So make sure that pkg ends up as a unicode string +
> # in both Python2 and Python3. + pkg =
> pkg.encode(encoding='utf-8').decode(encoding='utf-8')
>
> if f is not None:
> - f.write(unicode(pkg)) +
> f.write(pkg)
> f.write(u":\n======================================"
> "==========================================")
> f.write(u"\n")
> diff --git a/elbepack/elbexml.py b/elbepack/elbexml.py index
> 9029062a..fa815839 100644 --- a/elbepack/elbexml.py +++
> b/elbepack/elbexml.py @@ -193,13 +193,13 @@ class
> ElbeXML(object):
> ret = False if "srcstr" in r:
> for line in fp:
> - needle = bytes(r["srcstr"]) +
> needle = r["srcstr"].encode(encoding='utf-8')
> if line.find(needle) != -1:
> ret = True break
> elif "binstr" in r:
> for line in fp:
> - needle = bytes(r["binstr"]) +
> needle = r["binstr"].encode(encoding='utf-8')
> if line.find(needle) != -1:
> ret = True break
> diff --git a/elbepack/licencexml.py b/elbepack/licencexml.py
> index 6324fe4f..f5f4ee5e 100644 --- a/elbepack/licencexml.py +++
> b/elbepack/licencexml.py @@ -59,8 +59,13 @@ class copyright_xml
> (object):
> xmlpkg.et.attrib['name'] = pkg_name txtnode =
> xmlpkg.append('text') txtnode.et.text = copyright_text
> - - bytesio = io.StringIO(unicode(txtnode.et.text)) +
> # in Python2 'txtnode.et.text' is a binary string whereas in
> Python3 it + # is a unicode string. So make sure that
> 'txtnode.et.text' ends up as a + # unicode string in both
> Python2 and Python3. + bytesio =
> io.StringIO(txtnode.et.text.encode(encoding='utf-8', +
> errors='replace') +
> .decode(encoding='utf-8', +
> errors='replace'))
> try:
> c = Copyright(bytesio) files = []
> diff --git a/elbepack/rfs.py b/elbepack/rfs.py index
> c65d9831..6967d289 100644 --- a/elbepack/rfs.py +++
> b/elbepack/rfs.py @@ -186,7 +186,7 @@ class BuildEnv (object):
> if arch == "default":
> arch = self.xml.text("project/buildimage/arch",
> key="arch")
>
> - host_arch = get_command_out("dpkg
> --print-architecture").strip() + host_arch =
> get_command_out("dpkg --print-architecture").strip().decode()
Maybe do the decoding directly in 'get_command_out' on the
'stdout' object in shellhelper.py.
> includepkgs = None
> strapcmd = 'debootstrap '
> @@ -317,7 +317,7 @@ class BuildEnv (object):
>
>
> def seed_etc(self):
> - passwd = self.xml.text("target/passwd")
> + passwd = self.xml.text("target/passwd").encode(encoding='utf-8')
> stdin = "%s\n%s\n" % (passwd, passwd)
> chroot(self.rfs.path, "passwd", stdin=stdin)
>
> diff --git a/elbepack/soapclient.py b/elbepack/soapclient.py
> index 589bdefd..586fa513 100644
> --- a/elbepack/soapclient.py
> +++ b/elbepack/soapclient.py
> @@ -454,15 +454,15 @@ class GetFileAction(ClientAction):
> file=sys.stderr)
> sys.exit(20)
>
> - builddir = args[0]
> - filename = args[1]
> - dst_fname = filename
> + builddir = args[0].encode()
> + filename = args[1].encode()
> + dst_fname = filename.encode()
>
> if opt.output:
> fs = Filesystem('/')
> dst = os.path.abspath(opt.output)
> fs.mkdir_p(dst)
> - dst_fname = str(os.path.join(dst, filename))
> + dst_fname = str(os.path.join(dst, filename)).encode()
>
> client.download_file(builddir, filename, dst_fname)
> print("%s saved" % dst_fname)
> --
> 2.20.1
>
>
> _______________________________________________
> elbe-devel mailing list
> elbe-devel at linutronix.de
> https://lists.linutronix.de/mailman/listinfo/elbe-devel
--
Olivier Dion
Linutronix GmbH | Bahnhofstrasse 3 | D-88690 Uhldingen-Mühlhofen
More information about the elbe-devel
mailing list