]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-115256: Remove refcycles from tarfile writing (GH-115257)
authorpan324 <103143968+pan324@users.noreply.github.com>
Mon, 4 Mar 2024 13:26:32 +0000 (14:26 +0100)
committerGitHub <noreply@github.com>
Mon, 4 Mar 2024 13:26:32 +0000 (13:26 +0000)
Doc/whatsnew/3.13.rst
Lib/tarfile.py
Misc/NEWS.d/next/Library/2024-02-10-17-18-49.gh-issue-115256.41Fy9P.rst [new file with mode: 0644]

index d08c63e7b2c2c5f2d607e89dbb408cc050b6e211..96c8aee5da075af1269098210be13ecef0d1ae80 100644 (file)
@@ -791,6 +791,9 @@ Deprecated
   coroutine.
   (Contributed by Irit Katriel in :gh:`81137`.)
 
+* The undocumented and unused ``tarfile`` attribute of :class:`tarfile.TarFile`
+  is deprecated and scheduled for removal in Python 3.16.
+
 
 Pending Removal in Python 3.14
 ------------------------------
index f4dd0fdab4a3e4dbc1d943e35b0065786f33188d..6f315a6408f185ee5dfac46b7605c30993a8b0d8 100755 (executable)
@@ -872,7 +872,7 @@ class TarInfo(object):
         pax_headers = ('A dictionary containing key-value pairs of an '
                        'associated pax extended header.'),
         sparse = 'Sparse member information.',
-        tarfile = None,
+        _tarfile = None,
         _sparse_structs = None,
         _link_target = None,
         )
@@ -901,6 +901,24 @@ class TarInfo(object):
         self.sparse = None      # sparse member information
         self.pax_headers = {}   # pax header information
 
+    @property
+    def tarfile(self):
+        import warnings
+        warnings.warn(
+            'The undocumented "tarfile" attribute of TarInfo objects '
+            + 'is deprecated and will be removed in Python 3.16',
+            DeprecationWarning, stacklevel=2)
+        return self._tarfile
+
+    @tarfile.setter
+    def tarfile(self, tarfile):
+        import warnings
+        warnings.warn(
+            'The undocumented "tarfile" attribute of TarInfo objects '
+            + 'is deprecated and will be removed in Python 3.16',
+            DeprecationWarning, stacklevel=2)
+        self._tarfile = tarfile
+
     @property
     def path(self):
         'In pax headers, "name" is called "path".'
@@ -2030,7 +2048,7 @@ class TarFile(object):
         # Now, fill the TarInfo object with
         # information specific for the file.
         tarinfo = self.tarinfo()
-        tarinfo.tarfile = self  # Not needed
+        tarinfo._tarfile = self  # To be removed in 3.16.
 
         # Use os.stat or os.lstat, depending on if symlinks shall be resolved.
         if fileobj is None:
diff --git a/Misc/NEWS.d/next/Library/2024-02-10-17-18-49.gh-issue-115256.41Fy9P.rst b/Misc/NEWS.d/next/Library/2024-02-10-17-18-49.gh-issue-115256.41Fy9P.rst
new file mode 100644 (file)
index 0000000..8cde053
--- /dev/null
@@ -0,0 +1,5 @@
+Added DeprecationWarning when accessing the tarfile attribute of TarInfo
+objects. The attribute is never used internally and is only attached to
+TarInfos when the tarfile is opened in write-mode, not read-mode. The
+attribute creates an unnecessary reference cycle which may cause
+corruption when not closing the handle after writing a tarfile.