summaryrefslogtreecommitdiff
path: root/obnam
diff options
context:
space:
mode:
authorLars Wirzenius <liw@gytha>2008-04-12 23:11:46 +0300
committerLars Wirzenius <liw@gytha>2008-04-12 23:11:46 +0300
commit323ee15aaa4144cb3a17257ff4707655000f5705 (patch)
tree9f27f640de1dee5d9258b8c857d10e9b7f5c3c21 /obnam
parent18eb0e836a382bcd6779a2befbb5dd76b9ca9bc2 (diff)
downloadobnam-323ee15aaa4144cb3a17257ff4707655000f5705.tar.gz
Wrote method to check whether a directory has changed since the previous generation.
Diffstat (limited to 'obnam')
-rw-r--r--obnam/app.py14
-rw-r--r--obnam/appTests.py99
2 files changed, 113 insertions, 0 deletions
diff --git a/obnam/app.py b/obnam/app.py
index 6949fe78..834da3c1 100644
--- a/obnam/app.py
+++ b/obnam/app.py
@@ -171,6 +171,20 @@ class Application:
return True # everything seems to be as before
+ def dir_is_unchanged(self, old, new):
+ """Has a directory changed since the previous generation?
+
+ Return True if a directory, or its files or subdirectories,
+ has changed since the previous generation.
+
+ """
+
+ return (old.get_name() == new.get_name() and
+ self.file_is_unchanged(old.get_stat(), new.get_stat()) and
+ sorted(old.get_dirrefs()) == sorted(new.get_dirrefs()) and
+ sorted(old.get_filegrouprefs()) ==
+ sorted(new.get_filegrouprefs()))
+
def set_prevgen_filelist(self, filelist):
"""Set the Filelist object from the previous generation.
diff --git a/obnam/appTests.py b/obnam/appTests.py
index d046be8a..72a54b7b 100644
--- a/obnam/appTests.py
+++ b/obnam/appTests.py
@@ -239,6 +239,105 @@ class ApplicationUnchangedFileGroupTests(unittest.TestCase):
stat=self.mock_stat))
+
+class ApplicationUnchangedDirTests(unittest.TestCase):
+
+ def setUp(self):
+ context = obnam.context.Context()
+ self.app = obnam.Application(context)
+
+ def make_dir(self, name, dirrefs, filegrouprefs, stat=None):
+ if stat is None:
+ stat = obnam.utils.make_stat_result()
+ return obnam.obj.DirObject(id=obnam.obj.object_id_new(),
+ name=name,
+ stat=stat,
+ dirrefs=dirrefs,
+ filegrouprefs=filegrouprefs)
+
+ def testSameDirWhenNothingHasChanged(self):
+ dir = self.make_dir("name", [], ["pink", "pretty"])
+ self.failUnless(self.app.dir_is_unchanged(dir, dir))
+
+ def testChangedDirWhenFileGroupHasBeenRemoved(self):
+ dir1 = self.make_dir("name", [], ["pink", "pretty"])
+ dir2 = self.make_dir("name", [], ["pink"])
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenFileGroupHasBeenAdded(self):
+ dir1 = self.make_dir("name", [], ["pink"])
+ dir2 = self.make_dir("name", [], ["pink", "pretty"])
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenDirHasBeenRemoved(self):
+ dir1 = self.make_dir("name", ["pink", "pretty"], [])
+ dir2 = self.make_dir("name", ["pink"], [])
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenDirHasBeenAdded(self):
+ dir1 = self.make_dir("name", ["pink"], [])
+ dir2 = self.make_dir("name", ["pink", "pretty"], [])
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenNameHasChanged(self):
+ dir1 = self.make_dir("name1", [], [])
+ dir2 = self.make_dir("name2", [], [])
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testSameDirWhenIrrelevantStatFieldsHaveChanged(self):
+ stat = obnam.utils.make_stat_result(st_ino=42,
+ st_atime=42,
+ st_blocks=42,
+ st_blksize=42,
+ st_rdev=42)
+
+ dir1 = self.make_dir("name", [], [])
+ dir2 = self.make_dir("name", [], [], stat=stat)
+ self.failUnless(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenDevHasChanged(self):
+ dir1 = self.make_dir("name1", [], [])
+ dir2 = self.make_dir("name2", [], [],
+ stat=obnam.utils.make_stat_result(st_dev=105))
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenModeHasChanged(self):
+ dir1 = self.make_dir("name1", [], [])
+ dir2 = self.make_dir("name2", [], [],
+ stat=obnam.utils.make_stat_result(st_mode=105))
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenNlinkHasChanged(self):
+ dir1 = self.make_dir("name1", [], [])
+ dir2 = self.make_dir("name2", [], [],
+ stat=obnam.utils.make_stat_result(st_nlink=105))
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenUidHasChanged(self):
+ dir1 = self.make_dir("name1", [], [])
+ dir2 = self.make_dir("name2", [], [],
+ stat=obnam.utils.make_stat_result(st_uid=105))
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenGidHasChanged(self):
+ dir1 = self.make_dir("name1", [], [])
+ dir2 = self.make_dir("name2", [], [],
+ stat=obnam.utils.make_stat_result(st_gid=105))
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenSizeHasChanged(self):
+ dir1 = self.make_dir("name1", [], [])
+ dir2 = self.make_dir("name2", [], [],
+ stat=obnam.utils.make_stat_result(st_size=105))
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+ def testChangedDirWhenMtimeHasChanged(self):
+ dir1 = self.make_dir("name1", [], [])
+ dir2 = self.make_dir("name2", [], [],
+ stat=obnam.utils.make_stat_result(st_mtime=105))
+ self.failIf(self.app.dir_is_unchanged(dir1, dir2))
+
+
class ApplicationFindFileByNameTests(unittest.TestCase):
def setUp(self):