@@ -200,6 +200,7 @@ def itn(n, digits=8, format=DEFAULT_FORMAT):
200
200
# base-256 representation. This allows values up to (256**(digits-1))-1.
201
201
# A 0o200 byte indicates a positive number, a 0o377 byte a negative
202
202
# number.
203
+ original_n = n
203
204
n = int (n )
204
205
if 0 <= n < 8 ** (digits - 1 ):
205
206
s = bytes ("%0*o" % (digits - 1 , n ), "ascii" ) + NUL
@@ -363,7 +364,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize):
363
364
try :
364
365
import zlib
365
366
except ImportError :
366
- raise CompressionError ("zlib module is not available" )
367
+ raise CompressionError ("zlib module is not available" ) from None
367
368
self .zlib = zlib
368
369
self .crc = zlib .crc32 (b"" )
369
370
if mode == "r" :
@@ -376,7 +377,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize):
376
377
try :
377
378
import bz2
378
379
except ImportError :
379
- raise CompressionError ("bz2 module is not available" )
380
+ raise CompressionError ("bz2 module is not available" ) from None
380
381
if mode == "r" :
381
382
self .dbuf = b""
382
383
self .cmp = bz2 .BZ2Decompressor ()
@@ -388,7 +389,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize):
388
389
try :
389
390
import lzma
390
391
except ImportError :
391
- raise CompressionError ("lzma module is not available" )
392
+ raise CompressionError ("lzma module is not available" ) from None
392
393
if mode == "r" :
393
394
self .dbuf = b""
394
395
self .cmp = lzma .LZMADecompressor ()
@@ -541,8 +542,8 @@ def _read(self, size):
541
542
break
542
543
try :
543
544
buf = self .cmp .decompress (buf )
544
- except self .exception :
545
- raise ReadError ("invalid compressed data" )
545
+ except self .exception as e :
546
+ raise ReadError ("invalid compressed data" ) from e
546
547
t .append (buf )
547
548
c += len (buf )
548
549
t = b"" .join (t )
@@ -1164,8 +1165,8 @@ def _proc_gnulong(self, tarfile):
1164
1165
# Fetch the next header and process it.
1165
1166
try :
1166
1167
next = self .fromtarfile (tarfile )
1167
- except HeaderError :
1168
- raise SubsequentHeaderError ("missing or bad subsequent header" )
1168
+ except HeaderError as e :
1169
+ raise SubsequentHeaderError (str ( e )) from None
1169
1170
1170
1171
# Patch the TarInfo object from the next header with
1171
1172
# the longname information.
@@ -1277,8 +1278,8 @@ def _proc_pax(self, tarfile):
1277
1278
# Fetch the next header.
1278
1279
try :
1279
1280
next = self .fromtarfile (tarfile )
1280
- except HeaderError :
1281
- raise SubsequentHeaderError ("missing or bad subsequent header" )
1281
+ except HeaderError as e :
1282
+ raise SubsequentHeaderError (str ( e )) from None
1282
1283
1283
1284
# Process GNU sparse information.
1284
1285
if "GNU.sparse.map" in pax_headers :
@@ -1533,7 +1534,7 @@ def __init__(self, name=None, mode="r", fileobj=None, format=None,
1533
1534
self .fileobj .seek (self .offset )
1534
1535
break
1535
1536
except HeaderError as e :
1536
- raise ReadError (str (e ))
1537
+ raise ReadError (str (e )) from None
1537
1538
1538
1539
if self .mode in ("a" , "w" , "x" ):
1539
1540
self ._loaded = True
@@ -1669,21 +1670,21 @@ def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
1669
1670
try :
1670
1671
from gzip import GzipFile
1671
1672
except ImportError :
1672
- raise CompressionError ("gzip module is not available" )
1673
+ raise CompressionError ("gzip module is not available" ) from None
1673
1674
1674
1675
try :
1675
1676
fileobj = GzipFile (name , mode + "b" , compresslevel , fileobj )
1676
- except OSError :
1677
+ except OSError as e :
1677
1678
if fileobj is not None and mode == 'r' :
1678
- raise ReadError ("not a gzip file" )
1679
+ raise ReadError ("not a gzip file" ) from e
1679
1680
raise
1680
1681
1681
1682
try :
1682
1683
t = cls .taropen (name , mode , fileobj , ** kwargs )
1683
- except OSError :
1684
+ except OSError as e :
1684
1685
fileobj .close ()
1685
1686
if mode == 'r' :
1686
- raise ReadError ("not a gzip file" )
1687
+ raise ReadError ("not a gzip file" ) from e
1687
1688
raise
1688
1689
except :
1689
1690
fileobj .close ()
@@ -1702,16 +1703,16 @@ def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
1702
1703
try :
1703
1704
from bz2 import BZ2File
1704
1705
except ImportError :
1705
- raise CompressionError ("bz2 module is not available" )
1706
+ raise CompressionError ("bz2 module is not available" ) from None
1706
1707
1707
1708
fileobj = BZ2File (fileobj or name , mode , compresslevel = compresslevel )
1708
1709
1709
1710
try :
1710
1711
t = cls .taropen (name , mode , fileobj , ** kwargs )
1711
- except (OSError , EOFError ):
1712
+ except (OSError , EOFError ) as e :
1712
1713
fileobj .close ()
1713
1714
if mode == 'r' :
1714
- raise ReadError ("not a bzip2 file" )
1715
+ raise ReadError ("not a bzip2 file" ) from e
1715
1716
raise
1716
1717
except :
1717
1718
fileobj .close ()
@@ -1730,16 +1731,16 @@ def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs):
1730
1731
try :
1731
1732
from lzma import LZMAFile , LZMAError
1732
1733
except ImportError :
1733
- raise CompressionError ("lzma module is not available" )
1734
+ raise CompressionError ("lzma module is not available" ) from None
1734
1735
1735
1736
fileobj = LZMAFile (fileobj or name , mode , preset = preset )
1736
1737
1737
1738
try :
1738
1739
t = cls .taropen (name , mode , fileobj , ** kwargs )
1739
- except (LZMAError , EOFError ):
1740
+ except (LZMAError , EOFError ) as e :
1740
1741
fileobj .close ()
1741
1742
if mode == 'r' :
1742
- raise ReadError ("not an lzma file" )
1743
+ raise ReadError ("not an lzma file" ) from e
1743
1744
raise
1744
1745
except :
1745
1746
fileobj .close ()
@@ -2253,7 +2254,7 @@ def makelink(self, tarinfo, targetpath):
2253
2254
self ._extract_member (self ._find_link_target (tarinfo ),
2254
2255
targetpath )
2255
2256
except KeyError :
2256
- raise ExtractError ("unable to resolve link inside archive" )
2257
+ raise ExtractError ("unable to resolve link inside archive" ) from None
2257
2258
2258
2259
def chown (self , tarinfo , targetpath , numeric_owner ):
2259
2260
"""Set owner of targetpath according to tarinfo. If numeric_owner
@@ -2281,16 +2282,16 @@ def chown(self, tarinfo, targetpath, numeric_owner):
2281
2282
os .lchown (targetpath , u , g )
2282
2283
else :
2283
2284
os .chown (targetpath , u , g )
2284
- except OSError :
2285
- raise ExtractError ("could not change owner" )
2285
+ except OSError as e :
2286
+ raise ExtractError ("could not change owner" ) from e
2286
2287
2287
2288
def chmod (self , tarinfo , targetpath ):
2288
2289
"""Set file permissions of targetpath according to tarinfo.
2289
2290
"""
2290
2291
try :
2291
2292
os .chmod (targetpath , tarinfo .mode )
2292
- except OSError :
2293
- raise ExtractError ("could not change mode" )
2293
+ except OSError as e :
2294
+ raise ExtractError ("could not change mode" ) from e
2294
2295
2295
2296
def utime (self , tarinfo , targetpath ):
2296
2297
"""Set modification time of targetpath according to tarinfo.
@@ -2299,8 +2300,8 @@ def utime(self, tarinfo, targetpath):
2299
2300
return
2300
2301
try :
2301
2302
os .utime (targetpath , (tarinfo .mtime , tarinfo .mtime ))
2302
- except OSError :
2303
- raise ExtractError ("could not change modification time" )
2303
+ except OSError as e :
2304
+ raise ExtractError ("could not change modification time" ) from e
2304
2305
2305
2306
#--------------------------------------------------------------------------
2306
2307
def next (self ):
@@ -2336,15 +2337,15 @@ def next(self):
2336
2337
self .offset += BLOCKSIZE
2337
2338
continue
2338
2339
elif self .offset == 0 :
2339
- raise ReadError (str (e ))
2340
+ raise ReadError (str (e )) from None
2340
2341
except EmptyHeaderError :
2341
2342
if self .offset == 0 :
2342
- raise ReadError ("empty file" )
2343
+ raise ReadError ("empty file" ) from None
2343
2344
except TruncatedHeaderError as e :
2344
2345
if self .offset == 0 :
2345
- raise ReadError (str (e ))
2346
+ raise ReadError (str (e )) from None
2346
2347
except SubsequentHeaderError as e :
2347
- raise ReadError (str (e ))
2348
+ raise ReadError (str (e )) from None
2348
2349
break
2349
2350
2350
2351
if tarinfo is not None :
0 commit comments