OstreeMutableTree: Invalidate parent contents checksum when metadata changes
authorWilliam Manley <will@williammanley.net>
Mon, 25 Jun 2018 21:56:10 +0000 (22:56 +0100)
committerAtomic Bot <atomic-devel@projectatomic.io>
Fri, 29 Jun 2018 21:31:08 +0000 (21:31 +0000)
This bug has existed before the previous commit, but thanks to the previous
commit it is now easy to fix.

Closes: #1655
Approved by: cgwalters

src/libostree/ostree-mutable-tree.c
tests/test-mutable-tree.c

index 7ae915ff6c5ab6ff35941031e202162e35dbe407..25dc901ebe5ac24fdbae1a2ed1e9eebd56202979 100644 (file)
@@ -148,7 +148,6 @@ invalidate_contents_checksum (OstreeMutableTree *self)
     if (!self->contents_checksum)
       break;
 
-    g_free (self->contents_checksum);
     g_clear_pointer (&self->contents_checksum, g_free);
     self = self->parent;
   }
@@ -158,6 +157,10 @@ void
 ostree_mutable_tree_set_metadata_checksum (OstreeMutableTree *self,
                                            const char        *checksum)
 {
+  if (g_strcmp0 (checksum, self->metadata_checksum) == 0)
+    return;
+
+  invalidate_contents_checksum (self->parent);
   g_free (self->metadata_checksum);
   self->metadata_checksum = g_strdup (checksum);
 }
index c03bddba49cf5b8df14f56813e047cc1f53c8918..d0dfdd74812daa544752d342d819936845bd5a23 100644 (file)
@@ -31,6 +31,7 @@
 static void
 test_metadata_checksum (void)
 {
+  g_autoptr(GError) error = NULL;
   const char *checksum = "12345678901234567890123456789012";
   glnx_unref_object OstreeMutableTree *tree = ostree_mutable_tree_new ();
 
@@ -39,6 +40,27 @@ test_metadata_checksum (void)
   ostree_mutable_tree_set_metadata_checksum (tree, checksum);
 
   g_assert_cmpstr (checksum, ==, ostree_mutable_tree_get_metadata_checksum (tree));
+
+  /* If a child tree's metadata changes the parent tree's contents needs to be
+   * recalculated */
+  glnx_unref_object OstreeMutableTree *subdir = NULL;
+  g_assert (ostree_mutable_tree_ensure_dir (tree, "subdir", &subdir, &error));
+  g_assert_nonnull (subdir);
+
+  ostree_mutable_tree_set_contents_checksum (
+      subdir, "11111111111111111111111111111111");
+  ostree_mutable_tree_set_metadata_checksum (
+      subdir, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+  ostree_mutable_tree_set_contents_checksum (
+      tree, "abcdefabcdefabcdefabcdefabcdefab");
+
+  g_assert_cmpstr (ostree_mutable_tree_get_contents_checksum (tree), ==,
+      "abcdefabcdefabcdefabcdefabcdefab");
+  ostree_mutable_tree_set_metadata_checksum (
+      subdir, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
+  g_assert_null (ostree_mutable_tree_get_contents_checksum (tree));
+  g_assert_cmpstr (ostree_mutable_tree_get_contents_checksum (subdir), ==,
+      "11111111111111111111111111111111");
 }
 
 static void
@@ -162,13 +184,12 @@ test_contents_checksum (void)
   const char *subdir_checksum = "ABCD0123456789012345678901234567";
   glnx_unref_object OstreeMutableTree *tree = ostree_mutable_tree_new ();
   glnx_unref_object OstreeMutableTree *subdir = NULL;
-  g_autoptr(GError) error = NULL;
   g_assert_null (ostree_mutable_tree_get_contents_checksum (tree));
 
   ostree_mutable_tree_set_contents_checksum (tree, checksum);
   g_assert_cmpstr (checksum, ==, ostree_mutable_tree_get_contents_checksum (tree));
 
-  g_assert (ostree_mutable_tree_ensure_dir (tree, "subdir", &subdir, &error));
+  g_assert (ostree_mutable_tree_ensure_dir (tree, "subdir", &subdir, NULL));
   g_assert_nonnull (subdir);
 
   ostree_mutable_tree_set_contents_checksum (subdir, subdir_checksum);