From: Lars Gustäbel Date: Mon, 18 Jun 2007 11:42:11 +0000 (+0000) Subject: Added exclude keyword argument to the TarFile.add() method. X-Git-Tag: v2.6a1~1598 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=104490e6159e2b541cf51c17399453906f59f825;p=python Added exclude keyword argument to the TarFile.add() method. --- diff --git a/Doc/lib/libtarfile.tex b/Doc/lib/libtarfile.tex index 54683a7707..67207a1f06 100644 --- a/Doc/lib/libtarfile.tex +++ b/Doc/lib/libtarfile.tex @@ -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}} diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 107041e828..1ab13f0e41 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -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) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 67e52e904f..596b0adac0 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -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): diff --git a/Misc/NEWS b/Misc/NEWS index 6f2cf9dabd..dfec57b2a6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -231,6 +231,8 @@ Core and builtins Library ------- +- tarfile.py: Added "exclude" keyword argument to TarFile.add(). + - Bug #1734723: Fix repr.Repr() so it doesn't ignore the maxtuple attribute. - The urlopen function of urllib2 now has an optional timeout parameter (note