mirror of
https://github.com/python/cpython.git
synced 2025-07-29 06:05:00 +00:00
Issue #6856: Add a filter keyword argument to TarFile.add().
The filter argument must be a function that takes a TarInfo object argument, changes it and returns it again. If the function returns None the TarInfo object will be excluded from the archive. The exclude argument is deprecated from now on, because it does something similar but is not as flexible.
This commit is contained in:
parent
d4c7eb1647
commit
21121e64b4
4 changed files with 76 additions and 8 deletions
|
@ -660,6 +660,34 @@ class WriteTest(WriteTestBase):
|
|||
finally:
|
||||
shutil.rmtree(tempdir)
|
||||
|
||||
def test_filter(self):
|
||||
tempdir = os.path.join(TEMPDIR, "filter")
|
||||
os.mkdir(tempdir)
|
||||
try:
|
||||
for name in ("foo", "bar", "baz"):
|
||||
name = os.path.join(tempdir, name)
|
||||
open(name, "wb").close()
|
||||
|
||||
def filter(tarinfo):
|
||||
if os.path.basename(tarinfo.name) == "bar":
|
||||
return
|
||||
tarinfo.uid = 123
|
||||
tarinfo.uname = "foo"
|
||||
return tarinfo
|
||||
|
||||
tar = tarfile.open(tmpname, self.mode, encoding="iso8859-1")
|
||||
tar.add(tempdir, arcname="empty_dir", filter=filter)
|
||||
tar.close()
|
||||
|
||||
tar = tarfile.open(tmpname, "r")
|
||||
for tarinfo in tar:
|
||||
self.assertEqual(tarinfo.uid, 123)
|
||||
self.assertEqual(tarinfo.uname, "foo")
|
||||
self.assertEqual(len(tar.getmembers()), 3)
|
||||
tar.close()
|
||||
finally:
|
||||
shutil.rmtree(tempdir)
|
||||
|
||||
# Guarantee that stored pathnames are not modified. Don't
|
||||
# remove ./ or ../ or double slashes. Still make absolute
|
||||
# pathnames relative.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue