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 |