From e929711433c0bcf12631ad95756fb35eee925fdb Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Thu, 13 Feb 2014 09:09:08 -0800 Subject: [PATCH] Bug 971265 - Add --no-remove-empty-directories to process_install_manifest.py. r=gps --- .../action/process_install_manifest.py | 13 +++++++--- python/mozbuild/mozpack/copier.py | 8 ++++-- python/mozbuild/mozpack/test/test_copier.py | 25 +++++++++++++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/python/mozbuild/mozbuild/action/process_install_manifest.py b/python/mozbuild/mozbuild/action/process_install_manifest.py index a72c697c1873..717c60e5f357 100644 --- a/python/mozbuild/mozbuild/action/process_install_manifest.py +++ b/python/mozbuild/mozbuild/action/process_install_manifest.py @@ -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, diff --git a/python/mozbuild/mozpack/copier.py b/python/mozbuild/mozpack/copier.py index 9dcd86696580..e53c3668c0eb 100644 --- a/python/mozbuild/mozpack/copier.py +++ b/python/mozbuild/mozpack/copier.py @@ -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 diff --git a/python/mozbuild/mozpack/test/test_copier.py b/python/mozbuild/mozpack/test/test_copier.py index a9e81f19e6ff..13f74e04307f 100644 --- a/python/mozbuild/mozpack/test/test_copier.py +++ b/python/mozbuild/mozpack/test/test_copier.py @@ -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):