diff --git a/filetags/__init__.py b/filetags/__init__.py index 8193c41..8cedfcc 100755 --- a/filetags/__init__.py +++ b/filetags/__init__.py @@ -2010,7 +2010,9 @@ def assert_empty_tagfilter_directory(directory): @param directory: the directory to use as starting directory """ - if options.tagtrees_directory and os.path.isdir(directory) and os.listdir(directory): + id = os.path.join(directory, '.filetags_tagtrees') + + if not os.path.exists(id) and options.tagtrees_directory and os.path.exists(directory) and os.listdir(directory): error_exit(13, 'The given tagtrees directory ' + directory + ' is not empty. Aborting here instead ' + 'of removing its content without asking. Please free it up yourself and try again.') @@ -2027,6 +2029,10 @@ def assert_empty_tagfilter_directory(directory): shutil.rmtree(directory) logging.debug('re-creating tagfilter directory "%s" ...' % str(directory)) os.makedirs(directory) + + with open(id, 'w'): + pass + if not options.dryrun: assert(os.path.isdir(directory)) diff --git a/tests/unit_tests.py b/tests/unit_tests.py index d6eb817..8ddcc8f 100755 --- a/tests/unit_tests.py +++ b/tests/unit_tests.py @@ -755,7 +755,7 @@ class TestHierarchyWithFilesAndFolders(unittest.TestCase): link_missing_mutual_tagged_items=False, filtertags=None) - self.assertEqual(len(os.listdir(self.subdir2)), 4) # 4 entries in this directory + self.assertEqual(len(os.listdir(self.subdir2)), 5) # 5 entries in this directory self.assertTrue(os.path.isdir(os.path.join(self.subdir2, 'bar'))) self.assertEqual(set(os.listdir(os.path.join(self.subdir2, 'bar'))), @@ -781,7 +781,7 @@ class TestHierarchyWithFilesAndFolders(unittest.TestCase): link_missing_mutual_tagged_items=False, filtertags=['teststring1']) - self.assertEqual(len(os.listdir(self.subdir2)), 3) # 3 entries in this directory + self.assertEqual(len(os.listdir(self.subdir2)), 4) # 4 entries in this directory self.assertFalse(os.path.isdir(os.path.join(self.subdir2, 'bar'))) @@ -806,7 +806,7 @@ class TestHierarchyWithFilesAndFolders(unittest.TestCase): filtertags=['teststring1', 'baz']) self.assertEqual(set(os.listdir(self.subdir2)), - set(['teststring1', 'baz', 'nontagged_items'])) + set(['.filetags_tagtrees', 'teststring1', 'baz', 'nontagged_items'])) self.assertFalse(os.path.isdir(os.path.join(self.subdir2, 'bar'))) @@ -819,6 +819,68 @@ class TestHierarchyWithFilesAndFolders(unittest.TestCase): self.assertTrue(os.path.isdir(os.path.join(self.subdir2, 'nontagged_items'))) + def test_tagtrees_overwrites_old_default_directory(self): + + with open(os.path.join(self.subdir2, 'boring tagtrees data.txt'), 'w'): + pass + + filetags.generate_tagtrees(directory=self.subdir2, + maxdepth=5, + ignore_nontagged=False, + nontagged_subdir='nontagged_items', + link_missing_mutual_tagged_items=False, + filtertags=None) + + + def test_tagtrees_overwrites_known_tagtrees(self): + + filetags.options.tagtrees_directory = self.subdir2 + + with open(os.path.join(self.subdir2, '.filetags_tagtrees'), 'w'): + pass + + filetags.generate_tagtrees(directory=self.subdir2, + maxdepth=5, + ignore_nontagged=False, + nontagged_subdir='nontagged_items', + link_missing_mutual_tagged_items=False, + filtertags=None) + + filetags.options.tagtrees_directory = None + + + def test_tagtrees_overwrites_nonempty_foreign_directory(self): + + filetags.options.tagtrees_directory = self.subdir2 + + with open(os.path.join(self.subdir2, 'critical data.txt'), 'w'): + pass + + with self.assertRaises(SystemExit): + filetags.generate_tagtrees(directory=self.subdir2, + maxdepth=5, + ignore_nontagged=False, + nontagged_subdir='nontagged_items', + link_missing_mutual_tagged_items=False, + filtertags=None) + + filetags.options.tagtrees_directory = None + + + def test_tagtrees_overwrites_empty_foreign_directory(self): + + filetags.options.tagtrees_directory = self.subdir2 + + filetags.generate_tagtrees(directory=self.subdir2, + maxdepth=5, + ignore_nontagged=False, + nontagged_subdir='nontagged_items', + link_missing_mutual_tagged_items=False, + filtertags=None) + + filetags.options.tagtrees_directory = None + + def tearDown(self): if platform.system() != 'Windows':