Bug 971265 - Add --no-remove-empty-directories to process_install_manifest.py. r=gps

This commit is contained in:
Nick Alexander 2014-02-13 09:09:08 -08:00
parent 8b96dea6f0
commit e929711433
3 changed files with 41 additions and 5 deletions

View File

@ -14,14 +14,18 @@ COMPLETE = 'From {dest}: Kept {existing} existing; Added/updated {updated}; ' \
'Removed {rm_files} files and {rm_dirs} directories.'
def process_manifest(destdir, paths, remove_unaccounted=True):
def process_manifest(destdir, paths,
remove_unaccounted=True,
remove_empty_directories=True):
manifest = InstallManifest()
for path in paths:
manifest |= InstallManifest(path=path)
copier = FileCopier()
manifest.populate_registry(copier)
return copier.copy(destdir, remove_unaccounted=remove_unaccounted)
return copier.copy(destdir,
remove_unaccounted=remove_unaccounted,
remove_empty_directories=remove_empty_directories)
def main(argv):
@ -32,11 +36,14 @@ def main(argv):
parser.add_argument('manifests', nargs='+', help='Path to manifest file(s).')
parser.add_argument('--no-remove', action='store_true',
help='Do not remove unaccounted files from destination.')
parser.add_argument('--no-remove-empty-directories', action='store_true',
help='Do not remove empty directories from destination.')
args = parser.parse_args(argv)
result = process_manifest(args.destdir, args.manifests,
remove_unaccounted=not args.no_remove)
remove_unaccounted=not args.no_remove,
remove_empty_directories=not args.no_remove_empty_directories)
print(COMPLETE.format(dest=args.destdir,
existing=result.existing_files_count,

View File

@ -148,7 +148,7 @@ class FileCopier(FileRegistry):
FileRegistry with the ability to copy the registered files to a separate
directory.
'''
def copy(self, destination, skip_if_older=True, remove_unaccounted=True):
def copy(self, destination, skip_if_older=True, remove_unaccounted=True, remove_empty_directories=True):
'''
Copy all registered files to the given destination path. The given
destination can be an existing directory, or not exist at all. It
@ -158,7 +158,8 @@ class FileCopier(FileRegistry):
By default, files in the destination directory that aren't registered
are removed and empty directories are deleted. To disable removing of
unregistered files, pass remove_unaccounted=False.
unregistered files, pass remove_unaccounted=False. To disable removing
empty directories, pass remove_empty_directories=False.
Returns a FileCopyResult that details what changed.
'''
@ -295,6 +296,9 @@ class FileCopier(FileRegistry):
else:
result.existing_files.add(destfile)
if not remove_empty_directories:
return result
# Figure out which directories can be removed. This is complicated
# by the fact we optionally remove existing files. This would be easy
# if we walked the directory tree after installing files. But, we're

View File

@ -199,10 +199,35 @@ class TestFileCopier(TestWithTmpDir):
self.assertEqual(self.all_files(self.tmpdir), set(['foo', 'bar',
'populateddir/foo']))
self.assertEqual(self.all_dirs(self.tmpdir), set(['populateddir']))
self.assertEqual(result.removed_files, set())
self.assertEqual(result.removed_directories,
set([self.tmppath('emptydir')]))
def test_no_remove_empty_directories(self):
copier = FileCopier()
copier.add('foo', GeneratedFile('foo'))
with open(self.tmppath('bar'), 'a'):
pass
os.mkdir(self.tmppath('emptydir'))
d = self.tmppath('populateddir')
os.mkdir(d)
with open(self.tmppath('populateddir/foo'), 'a'):
pass
result = copier.copy(self.tmpdir, remove_unaccounted=False,
remove_empty_directories=False)
self.assertEqual(self.all_files(self.tmpdir), set(['foo', 'bar',
'populateddir/foo']))
self.assertEqual(self.all_dirs(self.tmpdir), set(['emptydir',
'populateddir']))
self.assertEqual(result.removed_files, set())
self.assertEqual(result.removed_directories, set())
class TestFilePurger(TestWithTmpDir):
def test_file_purger(self):