Added exclude keyword argument to the TarFile.add() method.
This commit is contained in:
parent
9d0476f7da
commit
104490e615
|
@ -314,13 +314,16 @@ tar archive several times. Each archive member is represented by a
|
|||
\end{notice}
|
||||
\end{methoddesc}
|
||||
|
||||
\begin{methoddesc}{add}{name\optional{, arcname\optional{, recursive}}}
|
||||
\begin{methoddesc}{add}{name\optional{, arcname\optional{, recursive\optional{, exclude}}}}
|
||||
Add the file \var{name} to the archive. \var{name} may be any type
|
||||
of file (directory, fifo, symbolic link, etc.).
|
||||
If given, \var{arcname} specifies an alternative name for the file in the
|
||||
archive. Directories are added recursively by default.
|
||||
This can be avoided by setting \var{recursive} to \constant{False};
|
||||
the default is \constant{True}.
|
||||
This can be avoided by setting \var{recursive} to \constant{False}.
|
||||
If \var{exclude} is given it must be a function that takes one filename
|
||||
argument and returns a boolean value. Depending on this value the
|
||||
respective file is either excluded (\constant{True}) or added
|
||||
(\constant{False}).
|
||||
\end{methoddesc}
|
||||
|
||||
\begin{methoddesc}{addfile}{tarinfo\optional{, fileobj}}
|
||||
|
|
|
@ -1923,18 +1923,24 @@ class TarFile(object):
|
|||
print "link to", tarinfo.linkname,
|
||||
print
|
||||
|
||||
def add(self, name, arcname=None, recursive=True):
|
||||
def add(self, name, arcname=None, recursive=True, exclude=None):
|
||||
"""Add the file `name' to the archive. `name' may be any type of file
|
||||
(directory, fifo, symbolic link, etc.). If given, `arcname'
|
||||
specifies an alternative name for the file in the archive.
|
||||
Directories are added recursively by default. This can be avoided by
|
||||
setting `recursive' to False.
|
||||
setting `recursive' to False. `exclude' is a function that should
|
||||
return True for each filename to be excluded.
|
||||
"""
|
||||
self._check("aw")
|
||||
|
||||
if arcname is None:
|
||||
arcname = name
|
||||
|
||||
# Exclude pathnames.
|
||||
if exclude is not None and exclude(name):
|
||||
self._dbg(2, "tarfile: Excluded %r" % name)
|
||||
return
|
||||
|
||||
# Skip if somebody tries to archive the archive...
|
||||
if self.name is not None and os.path.abspath(name) == self.name:
|
||||
self._dbg(2, "tarfile: Skipped %r" % name)
|
||||
|
@ -1947,7 +1953,7 @@ class TarFile(object):
|
|||
if arcname == ".":
|
||||
arcname = ""
|
||||
for f in os.listdir(name):
|
||||
self.add(f, os.path.join(arcname, f))
|
||||
self.add(f, os.path.join(arcname, f), recursive, exclude)
|
||||
return
|
||||
|
||||
self._dbg(1, name)
|
||||
|
@ -1969,7 +1975,7 @@ class TarFile(object):
|
|||
self.addfile(tarinfo)
|
||||
if recursive:
|
||||
for f in os.listdir(name):
|
||||
self.add(os.path.join(name, f), os.path.join(arcname, f))
|
||||
self.add(os.path.join(name, f), os.path.join(arcname, f), recursive, exclude)
|
||||
|
||||
else:
|
||||
self.addfile(tarinfo)
|
||||
|
|
|
@ -558,6 +558,27 @@ class WriteTest(unittest.TestCase):
|
|||
os.chdir(cwd)
|
||||
self.assert_(tar.getnames() == [], "added the archive to itself")
|
||||
|
||||
def test_exclude(self):
|
||||
tempdir = os.path.join(TEMPDIR, "exclude")
|
||||
os.mkdir(tempdir)
|
||||
try:
|
||||
for name in ("foo", "bar", "baz"):
|
||||
name = os.path.join(tempdir, name)
|
||||
open(name, "wb").close()
|
||||
|
||||
def exclude(name):
|
||||
return os.path.isfile(name)
|
||||
|
||||
tar = tarfile.open(tmpname, self.mode, encoding="iso8859-1")
|
||||
tar.add(tempdir, arcname="empty_dir", exclude=exclude)
|
||||
tar.close()
|
||||
|
||||
tar = tarfile.open(tmpname, "r")
|
||||
self.assertEqual(len(tar.getmembers()), 1)
|
||||
self.assertEqual(tar.getnames()[0], "empty_dir")
|
||||
finally:
|
||||
shutil.rmtree(tempdir)
|
||||
|
||||
|
||||
class StreamWriteTest(unittest.TestCase):
|
||||
|
||||
|
|
Loading…
Reference in New Issue