mercurial/archival.py
changeset 52602 f9af68aa6719
parent 52601 1756f5a788fd
child 52603 a19f102dd377
equal deleted inserted replaced
52601:1756f5a788fd 52602:f9af68aa6719
    20     Optional,
    20     Optional,
    21 )
    21 )
    22 
    22 
    23 from .i18n import _
    23 from .i18n import _
    24 from .node import nullrev
    24 from .node import nullrev
    25 from .pycompat import open
       
    26 
    25 
    27 from . import (
    26 from . import (
    28     error,
    27     error,
    29     formatter,
    28     formatter,
    30     match as matchmod,
    29     match as matchmod,
   149 
   148 
   150     def __init__(self, dest, mtime, kind: str = ''):
   149     def __init__(self, dest, mtime, kind: str = ''):
   151         self.mtime = mtime
   150         self.mtime = mtime
   152         self.fileobj = None
   151         self.fileobj = None
   153 
   152 
   154         def taropen(mode, name=b'', fileobj=None):
   153         def taropen(
       
   154             mode: str, name: bytes = b'', fileobj=None
       
   155         ) -> tarfile.TarFile:
   155             if kind == 'gz':
   156             if kind == 'gz':
   156                 mode = mode[0:1]
   157                 mode = mode[0:1]
   157                 if not fileobj:
   158                 if not fileobj:
   158                     fileobj = open(name, mode + b'b')
   159                     fileobj = open(name, mode + 'b')
   159                 gzfileobj = gzip.GzipFile(
   160                 gzfileobj = gzip.GzipFile(
   160                     name,
   161                     name,
   161                     pycompat.sysstr(mode + b'b'),
   162                     mode + 'b',
   162                     zlib.Z_BEST_COMPRESSION,
   163                     zlib.Z_BEST_COMPRESSION,
   163                     fileobj,
   164                     fileobj,
   164                     mtime=mtime,
   165                     mtime=mtime,
   165                 )
   166                 )
   166                 self.fileobj = gzfileobj
   167                 self.fileobj = gzfileobj
   167                 return tarfile.TarFile.taropen(name, "w", gzfileobj)
   168                 return tarfile.TarFile.taropen(name, "w", gzfileobj)
   168             else:
   169             else:
   169                 try:
   170                 try:
   170                     return tarfile.open(
   171                     return tarfile.open(name, mode + kind, fileobj)
   171                         name, pycompat.sysstr(mode) + kind, fileobj
       
   172                     )
       
   173                 except tarfile.CompressionError as e:
   172                 except tarfile.CompressionError as e:
   174                     raise error.Abort(stringutil.forcebytestr(e))
   173                     raise error.Abort(stringutil.forcebytestr(e))
   175 
   174 
   176         if isinstance(dest, bytes):
   175         if isinstance(dest, bytes):
   177             self.z = taropen(b'w:', name=dest)
   176             self.z = taropen('w:', name=dest)
   178         else:
   177         else:
   179             self.z = taropen(b'w|', fileobj=dest)
   178             self.z = taropen('w|', fileobj=dest)
   180 
   179 
   181     def addfile(self, name, mode, islink, data):
   180     def addfile(self, name, mode, islink, data):
   182         name = pycompat.fsdecode(name)
   181         name = pycompat.fsdecode(name)
   183         i = tarfile.TarInfo(name)
   182         i = tarfile.TarInfo(name)
   184         i.mtime = self.mtime
   183         i.mtime = self.mtime