mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +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
				
			
		|  | @ -1918,13 +1918,16 @@ def list(self, verbose=True): | |||
|                     print "link to", tarinfo.linkname, | ||||
|             print | ||||
| 
 | ||||
|     def add(self, name, arcname=None, recursive=True, exclude=None): | ||||
|     def add(self, name, arcname=None, recursive=True, exclude=None, filter=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. `exclude' is a function that should | ||||
|            return True for each filename to be excluded. | ||||
|            return True for each filename to be excluded. `filter' is a function | ||||
|            that expects a TarInfo object argument and returns the changed | ||||
|            TarInfo object, if it returns None the TarInfo object will be | ||||
|            excluded from the archive. | ||||
|         """ | ||||
|         self._check("aw") | ||||
| 
 | ||||
|  | @ -1932,9 +1935,13 @@ def add(self, name, arcname=None, recursive=True, exclude=None): | |||
|             arcname = name | ||||
| 
 | ||||
|         # Exclude pathnames. | ||||
|         if exclude is not None and exclude(name): | ||||
|             self._dbg(2, "tarfile: Excluded %r" % name) | ||||
|             return | ||||
|         if exclude is not None: | ||||
|             import warnings | ||||
|             warnings.warn("use the filter argument instead", | ||||
|                     DeprecationWarning, 2) | ||||
|             if 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: | ||||
|  | @ -1950,6 +1957,13 @@ def add(self, name, arcname=None, recursive=True, exclude=None): | |||
|             self._dbg(1, "tarfile: Unsupported type %r" % name) | ||||
|             return | ||||
| 
 | ||||
|         # Change or exclude the TarInfo object. | ||||
|         if filter is not None: | ||||
|             tarinfo = filter(tarinfo) | ||||
|             if tarinfo is None: | ||||
|                 self._dbg(2, "tarfile: Excluded %r" % name) | ||||
|                 return | ||||
| 
 | ||||
|         # Append the tar header and data to the archive. | ||||
|         if tarinfo.isreg(): | ||||
|             f = bltn_open(name, "rb") | ||||
|  | @ -1960,7 +1974,8 @@ def add(self, name, arcname=None, recursive=True, exclude=None): | |||
|             self.addfile(tarinfo) | ||||
|             if recursive: | ||||
|                 for f in os.listdir(name): | ||||
|                     self.add(os.path.join(name, f), os.path.join(arcname, f), recursive, exclude) | ||||
|                     self.add(os.path.join(name, f), os.path.join(arcname, f), | ||||
|                             recursive, exclude, filter) | ||||
| 
 | ||||
|         else: | ||||
|             self.addfile(tarinfo) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lars Gustäbel
						Lars Gustäbel