core: Tweak dir metadata importing code for libarchive work
This will allow us to share a bit more code.
This commit is contained in:
parent
177d845f5b
commit
f98e2a2ddb
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue