Patchwork D2654: archival: fsdecode paths before passing to tar or zip objects

login
register
mail settings
Submitter phabricator
Date March 4, 2018, 6:12 p.m.
Message ID <differential-rev-PHID-DREV-47phbzu7qzyz62cx77yu-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/28949/
State Superseded
Headers show

Comments

phabricator - March 4, 2018, 6:12 p.m.
durin42 created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  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.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2654

AFFECTED FILES
  mercurial/archival.py

CHANGE DETAILS




To: durin42, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/archival.py b/mercurial/archival.py
--- a/mercurial/archival.py
+++ b/mercurial/archival.py
@@ -21,6 +21,7 @@ 
     error,
     formatter,
     match as matchmod,
+    pycompat,
     scmutil,
     util,
     vfs as vfsmod,
@@ -171,13 +172,14 @@ 
             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 @@ 
                 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 @@ 
         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).