# HG changeset patch # User Augie Fackler # Date 2018-03-04 17:08:19 # Node ID bfe23afea361644ebefabc362dc3b90059cea58b # Parent 87b8fc4533cacdce79d3261dffdd2db4dd63c561 archival: fsdecode paths before passing to tar or zip objects Both of these traffic in unicodes for filenames on Python 3, and inspection of the tarfile module shows that it uses the filesystem encoding, so fsdecode is the right choice. Differential Revision: https://phab.mercurial-scm.org/D2654 diff --git a/mercurial/archival.py b/mercurial/archival.py --- a/mercurial/archival.py +++ b/mercurial/archival.py @@ -21,6 +21,7 @@ from . import ( error, formatter, match as matchmod, + pycompat, scmutil, util, vfs as vfsmod, @@ -171,13 +172,14 @@ class tarit(object): self.z = taropen('w|', fileobj=dest) def addfile(self, name, mode, islink, data): + name = pycompat.fsdecode(name) i = tarfile.TarInfo(name) i.mtime = self.mtime i.size = len(data) if islink: i.type = tarfile.SYMTYPE i.mode = 0o777 - i.linkname = data + i.linkname = pycompat.fsdecode(data) data = None i.size = 0 else: @@ -218,7 +220,7 @@ class zipit(object): dest.tell() except (AttributeError, IOError): dest = tellable(dest) - self.z = zipfile.ZipFile(dest, r'w', + self.z = zipfile.ZipFile(pycompat.fsdecode(dest), r'w', compress and zipfile.ZIP_DEFLATED or zipfile.ZIP_STORED) @@ -232,7 +234,7 @@ class zipit(object): self.date_time = time.gmtime(mtime)[:6] def addfile(self, name, mode, islink, data): - i = zipfile.ZipInfo(name, self.date_time) + i = zipfile.ZipInfo(pycompat.fsdecode(name), self.date_time) i.compress_type = self.z.compression # unzip will not honor unix file modes unless file creator is # set to unix (id 3).