[ostree] Fix ostree_repo_list_static_delta_names



commit 82ed6c43edeca7ff1cbc464a08dba4a38f248b9a
Author: Alexander Larsson <alexl redhat com>
Date:   Tue Jan 13 21:28:17 2015 +0100

    Fix ostree_repo_list_static_delta_names
    
    The current layout uses a prefix of two bytes as the initial dir
    and a second directory inside that with the superblock. This
    updates the list code to handle that.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=721799

 src/libostree/ostree-repo-static-delta-core.c |   41 ++++++++++++++++++++-----
 1 files changed, 33 insertions(+), 8 deletions(-)
---
diff --git a/src/libostree/ostree-repo-static-delta-core.c b/src/libostree/ostree-repo-static-delta-core.c
index c404b13..3424086 100644
--- a/src/libostree/ostree-repo-static-delta-core.c
+++ b/src/libostree/ostree-repo-static-delta-core.c
@@ -80,12 +80,12 @@ ostree_repo_list_static_delta_names (OstreeRepo                  *self,
                                             NULL, error);
       if (!dir_enum)
         goto out;
-      
+
       while (TRUE)
         {
+          gs_unref_object GFileEnumerator *dir_enum2 = NULL;
           GFileInfo *file_info;
           GFile *child;
-          const char *name;
 
           if (!gs_file_enumerator_iterate (dir_enum, &file_info, &child,
                                            NULL, error))
@@ -96,16 +96,41 @@ ostree_repo_list_static_delta_names (OstreeRepo                  *self,
           if (g_file_info_get_file_type (file_info) != G_FILE_TYPE_DIRECTORY)
             continue;
 
-          name = gs_file_get_basename_cached (child);
 
-          {
-            gs_unref_object GFile *meta_path = g_file_get_child (child, "superblock");
+          dir_enum2 = g_file_enumerate_children (child, OSTREE_GIO_FAST_QUERYINFO,
+                                                 G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+                                                 NULL, error);
+          if (!dir_enum2)
+            goto out;
+
+          while (TRUE)
+            {
+              GFileInfo *file_info2;
+              GFile *child2;
+              const char *name1;
+              const char *name2;
+
+              if (!gs_file_enumerator_iterate (dir_enum2, &file_info2, &child2,
+                                               NULL, error))
+                goto out;
+              if (file_info2 == NULL)
+                break;
+
+              if (g_file_info_get_file_type (file_info2) != G_FILE_TYPE_DIRECTORY)
+                continue;
+
+              name1 = gs_file_get_basename_cached (child);
+              name2 = gs_file_get_basename_cached (child2);
 
-            if (g_file_query_exists (meta_path, NULL))
               {
-                g_ptr_array_add (ret_deltas, g_strdup (name));
+                gs_unref_object GFile *meta_path = g_file_get_child (child2, "superblock");
+
+                if (g_file_query_exists (meta_path, NULL))
+                  {
+                    g_ptr_array_add (ret_deltas, g_strconcat (name1, name2, NULL));
+                  }
               }
-          }
+            }
         }
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]