diff -r 1b4772ab420f Lib/tarfile.py --- a/Lib/tarfile.py Sun Aug 04 01:05:02 2013 +0300 +++ b/Lib/tarfile.py Sun Aug 04 11:14:47 2013 +0300 @@ -41,12 +41,12 @@ import sys import os import io -import shutil import stat import time import struct import copy import re +import builtins try: import grp, pwd @@ -65,8 +65,6 @@ # from tarfile import * __all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] -from builtins import open as _open # Since 'open' is TarFile.open - #--------------------------------------------------------- # tar constants #--------------------------------------------------------- @@ -255,11 +253,17 @@ """ if length == 0: return + + BUFSIZE = 16 * 1024 + if length is None: - shutil.copyfileobj(src, dst) + while True: + buf = src.read(BUFSIZE) + if not buf: + break + dst.write(buf) return - BUFSIZE = 16 * 1024 blocks, remainder = divmod(length, BUFSIZE) for b in range(blocks): buf = src.read(BUFSIZE) @@ -1429,7 +1433,7 @@ can be determined, `mode' is overridden by `fileobj's mode. `fileobj' is not closed, when TarFile is closed. """ - if len(mode)> 1 or mode not in "raw": + if mode not in ("r", "a", "w"): raise ValueError("mode must be 'r', 'a' or 'w'") self.mode = mode self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] @@ -1439,7 +1443,7 @@ # Create nonexistent files in append mode. self.mode = "w" self._mode = "wb" - fileobj = bltn_open(name, self._mode) + fileobj = builtins.open(name, self._mode) self._extfileobj = False else: if name is None and hasattr(fileobj, "name"): @@ -1501,7 +1505,7 @@ except HeaderError as e: raise ReadError(str(e)) - if self.mode in "aw": + if self.mode in ("a", "w"): self._loaded = True if self.pax_headers: @@ -1588,7 +1592,7 @@ filemode = filemode or "r" comptype = comptype or "tar" - if filemode not in "rw": + if filemode not in ("r", "w"): raise ValueError("mode must be 'r' or 'w'") stream = _Stream(name, filemode, comptype, fileobj, bufsize) @@ -1600,7 +1604,7 @@ t._extfileobj = False return t - elif mode in "aw": + elif mode in ("a", "w"): return cls.taropen(name, mode, fileobj, **kwargs) raise ValueError("undiscernible mode") @@ -1609,7 +1613,7 @@ def taropen(cls, name, mode="r", fileobj=None, **kwargs): """Open uncompressed tar archive name for reading or writing. """ - if len(mode)> 1 or mode not in "raw": + if mode not in ("r", "a", "w"): raise ValueError("mode must be 'r', 'a' or 'w'") return cls(name, mode, fileobj, **kwargs) @@ -1618,7 +1622,7 @@ """Open gzip compressed tar archive name for reading or writing. Appending is not allowed. """ - if len(mode)> 1 or mode not in "rw": + if mode not in ("r", "w"): raise ValueError("mode must be 'r' or 'w'") try: @@ -1649,7 +1653,7 @@ """Open bzip2 compressed tar archive name for reading or writing. Appending is not allowed. """ - if len(mode)> 1 or mode not in "rw": + if mode not in ("r", "w"): raise ValueError("mode must be 'r' or 'w'.") try: @@ -1709,7 +1713,7 @@ if self.closed: return - if self.mode in "aw": + if self.mode in ("a", "w"): self.fileobj.write(NUL * (BLOCKSIZE * 2)) self.offset += (BLOCKSIZE * 2) # fill up the end with zero-blocks @@ -1924,7 +1928,7 @@ # Append the tar header and data to the archive. if tarinfo.isreg(): - with bltn_open(name, "rb") as f: + with builtins.open(name, "rb") as f: self.addfile(tarinfo, f) elif tarinfo.isdir(): @@ -2130,7 +2134,7 @@ """ source = self.fileobj source.seek(tarinfo.offset_data) - with bltn_open(targetpath, "wb") as target: + with builtins.open(targetpath, "wb") as target: if tarinfo.sparse is not None: for offset, size in tarinfo.sparse: target.seek(offset) @@ -2426,5 +2430,4 @@ except TarError: return False -bltn_open = open open = TarFile.open