core: Tweak dir metadata importing code for libarchive work

This will allow us to share a bit more code.
This commit is contained in:
Colin Walters 2011-12-01 19:37:47 -05:00
parent 177d845f5b
commit f98e2a2ddb
3 changed files with 32 additions and 46 deletions

View File

@ -190,10 +190,14 @@ checksum_directory (GFile *f,
gboolean ret = FALSE; gboolean ret = FALSE;
GVariant *dirmeta = NULL; GVariant *dirmeta = NULL;
GVariant *packed = NULL; GVariant *packed = NULL;
GVariant *xattrs = NULL;
GChecksum *ret_checksum = NULL; GChecksum *ret_checksum = NULL;
if (!ostree_get_directory_metadata (f, f_info, &dirmeta, cancellable, error)) xattrs = ostree_get_xattrs_for_file (f, error);
if (!xattrs)
goto out; goto out;
dirmeta = ostree_create_directory_metadata (f_info, xattrs);
packed = ostree_wrap_metadata_variant (OSTREE_SERIALIZED_DIRMETA_VARIANT, dirmeta); packed = ostree_wrap_metadata_variant (OSTREE_SERIALIZED_DIRMETA_VARIANT, dirmeta);
ret_checksum = g_checksum_new (G_CHECKSUM_SHA256); ret_checksum = g_checksum_new (G_CHECKSUM_SHA256);
g_checksum_update (ret_checksum, g_variant_get_data (packed), g_checksum_update (ret_checksum, g_variant_get_data (packed),
@ -206,6 +210,7 @@ checksum_directory (GFile *f,
ot_clear_checksum (&ret_checksum); ot_clear_checksum (&ret_checksum);
ot_clear_gvariant (&dirmeta); ot_clear_gvariant (&dirmeta);
ot_clear_gvariant (&packed); ot_clear_gvariant (&packed);
ot_clear_gvariant (&xattrs);
return ret; return ret;
} }
@ -421,21 +426,12 @@ ostree_checksum_file_async_finish (GFile *f,
return TRUE; return TRUE;
} }
gboolean GVariant *
ostree_get_directory_metadata (GFile *dir, ostree_create_directory_metadata (GFileInfo *dir_info,
GFileInfo *dir_info, GVariant *xattrs)
GVariant **out_metadata,
GCancellable *cancellable,
GError **error)
{ {
gboolean ret = FALSE;
GVariant *xattrs = NULL;
GVariant *ret_metadata = NULL; GVariant *ret_metadata = NULL;
xattrs = ostree_get_xattrs_for_file (dir, error);
if (!xattrs)
goto out;
ret_metadata = g_variant_new ("(uuuu@a(ayay))", ret_metadata = g_variant_new ("(uuuu@a(ayay))",
OSTREE_DIR_META_VERSION, OSTREE_DIR_META_VERSION,
GUINT32_TO_BE (g_file_info_get_attribute_uint32 (dir_info, "unix::uid")), GUINT32_TO_BE (g_file_info_get_attribute_uint32 (dir_info, "unix::uid")),
@ -444,13 +440,7 @@ ostree_get_directory_metadata (GFile *dir,
xattrs); xattrs);
g_variant_ref_sink (ret_metadata); g_variant_ref_sink (ret_metadata);
ret = TRUE; return ret_metadata;
*out_metadata = ret_metadata;
ret_metadata = NULL;
out:
ot_clear_gvariant (&ret_metadata);
ot_clear_gvariant (&xattrs);
return ret;
} }
gboolean gboolean

View File

@ -128,11 +128,8 @@ gboolean ostree_checksum_file_async_finish (GFile *f,
GChecksum **out_checksum, GChecksum **out_checksum,
GError **error); GError **error);
gboolean ostree_get_directory_metadata (GFile *dir, GVariant *ostree_create_directory_metadata (GFileInfo *dir_info,
GFileInfo *dir_info, GVariant *xattrs);
GVariant **out_metadata,
GCancellable *cancellable,
GError **error);
/* Packed files: /* Packed files:
* *

View File

@ -735,44 +735,30 @@ ostree_repo_load_variant_checked (OstreeRepo *self,
} }
static gboolean static gboolean
import_directory_meta (OstreeRepo *self, import_directory_meta (OstreeRepo *self,
GFile *f, GFileInfo *file_info,
GVariant **out_variant, GVariant *xattrs,
GChecksum **out_checksum, GChecksum **out_checksum,
GCancellable *cancellable, GCancellable *cancellable,
GError **error) GError **error)
{ {
gboolean ret = FALSE; gboolean ret = FALSE;
GChecksum *ret_checksum = NULL; GChecksum *ret_checksum = NULL;
GVariant *dirmeta = NULL; GVariant *dirmeta = NULL;
GFileInfo *f_info = NULL;
f_info = g_file_query_info (f, OSTREE_GIO_FAST_QUERYINFO, dirmeta = ostree_create_directory_metadata (file_info, xattrs);
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
cancellable, error);
if (!f_info)
goto out;
if (!ostree_get_directory_metadata (f, f_info, &dirmeta, cancellable, error))
goto out;
if (!import_gvariant_object (self, OSTREE_SERIALIZED_DIRMETA_VARIANT, if (!import_gvariant_object (self, OSTREE_SERIALIZED_DIRMETA_VARIANT,
dirmeta, &ret_checksum, cancellable, error)) dirmeta, &ret_checksum, cancellable, error))
goto out; goto out;
ret = TRUE; ret = TRUE;
if (out_variant)
{
*out_variant = dirmeta;
dirmeta = NULL;
}
if (out_checksum) if (out_checksum)
{ {
*out_checksum = ret_checksum; *out_checksum = ret_checksum;
ret_checksum = NULL; ret_checksum = NULL;
} }
out: out:
g_clear_object (&f_info);
ot_clear_checksum (&ret_checksum); ot_clear_checksum (&ret_checksum);
ot_clear_gvariant (&dirmeta); ot_clear_gvariant (&dirmeta);
return ret; return ret;
@ -1114,12 +1100,25 @@ import_directory_recurse (OstreeRepo *self,
GHashTableIter hash_iter; GHashTableIter hash_iter;
GSList *sorted_filenames = NULL; GSList *sorted_filenames = NULL;
GSList *iter; GSList *iter;
GVariant *dir_xattrs = NULL;
GVariant *serialized_tree = NULL; GVariant *serialized_tree = NULL;
gpointer key, value; gpointer key, value;
if (!import_directory_meta (self, dir, NULL, &ret_metadata_checksum, cancellable, error)) child_info = g_file_query_info (dir, OSTREE_GIO_FAST_QUERYINFO,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
cancellable, error);
if (!child_info)
goto out; goto out;
dir_xattrs = ostree_get_xattrs_for_file (dir, error);
if (!dir_xattrs)
goto out;
if (!import_directory_meta (self, child_info, dir_xattrs, &ret_metadata_checksum, cancellable, error))
goto out;
g_clear_object (&child_info);
dir_enum = g_file_enumerate_children ((GFile*)dir, OSTREE_GIO_FAST_QUERYINFO, dir_enum = g_file_enumerate_children ((GFile*)dir, OSTREE_GIO_FAST_QUERYINFO,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
cancellable, cancellable,