Fix build

Before I pushed the "move code to a different file" commit, I rebased,
but forgot to test the build. Sorry.
This commit is contained in:
Jasper St. Pierre 2013-09-06 20:47:13 -04:00
parent 91d3b90c9f
commit 3dcff0b2c4
2 changed files with 112 additions and 212 deletions

View File

@ -197,8 +197,8 @@ write_object (OstreeRepo *self,
if (expected_checksum)
{
if (!repo_find_object (self, objtype, expected_checksum, &stored_path,
cancellable, error))
if (!_ostree_repo_find_object (self, objtype, expected_checksum, &stored_path,
cancellable, error))
goto out;
}

View File

@ -56,7 +56,7 @@
* #OstreeMutableTree, and apply functions such as
* ostree_repo_write_directory_to_mtree() to traverse a physical
* filesystem and write content, possibly multiple times.
*
*
* Once the #OstreeMutableTree is complete, write all of its metadata
* with ostree_repo_write_mtree(), and finally create a commit with
* ostree_repo_write_commit().
@ -159,7 +159,7 @@ ostree_repo_constructed (GObject *object)
self->pending_dir = g_file_resolve_relative_path (self->repodir, "tmp/pending");
self->local_heads_dir = g_file_resolve_relative_path (self->repodir, "refs/heads");
self->remote_heads_dir = g_file_resolve_relative_path (self->repodir, "refs/remotes");
self->objects_dir = g_file_get_child (self->repodir, "objects");
self->uncompressed_objects_dir = g_file_get_child (self->repodir, "uncompressed-objects-cache");
self->remote_cache_dir = g_file_get_child (self->repodir, "remote-cache");
@ -294,7 +294,7 @@ ostree_repo_write_config (OstreeRepo *self,
if (!g_file_replace_contents (self->config_file, data, len, NULL, FALSE, 0, NULL,
NULL, error))
goto out;
g_key_file_free (self->config);
self->config = g_key_file_new ();
if (!g_key_file_load_from_data (self->config, data, len, 0, error))
@ -459,7 +459,7 @@ ostree_repo_open (OstreeRepo *self,
if (!gs_file_ensure_directory (self->pending_dir, FALSE, cancellable, error))
goto out;
self->config = g_key_file_new ();
if (!g_key_file_load_from_file (self->config, gs_file_get_path_cached (self->config_file), 0, error))
{
@ -520,7 +520,7 @@ ostree_repo_open (OstreeRepo *self,
goto out;
self->inited = TRUE;
ret = TRUE;
out:
return ret;
@ -549,7 +549,7 @@ ostree_repo_get_mode (OstreeRepo *self)
/**
* ostree_repo_get_parent:
* @self: Repo
*
*
* Before this function can be used, ostree_repo_init() must have been
* called.
*
@ -568,188 +568,6 @@ _ostree_repo_get_file_object_path (OstreeRepo *self,
return _ostree_repo_get_object_path (self, checksum, OSTREE_OBJECT_TYPE_FILE);
}
static gboolean
list_loose_object_dir (OstreeRepo *self,
GFile *dir,
GHashTable *inout_objects,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
const char *dirname = NULL;
const char *dot = NULL;
gs_unref_object GFileEnumerator *enumerator = NULL;
GString *checksum = NULL;
dirname = gs_file_get_basename_cached (dir);
/* We're only querying name */
enumerator = g_file_enumerate_children (dir, "standard::name,standard::type",
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
cancellable,
error);
if (!enumerator)
goto out;
ret = TRUE;
out:
return ret;
}
/* Create a randomly-named symbolic link in @tempdir which points to
* @target. The filename will be returned in @out_file.
*
* The reason this odd function exists is that the repo should only
* contain objects in their final state. For bare repositories, we
* need to first create the symlink, then chown it, and apply all
* extended attributes, before finally rename()ing it into place.
*/
static gboolean
make_temporary_symlink (GFile *tmpdir,
const char *target,
GFile **out_file,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
gs_free char *tmpname = NULL;
DIR *d = NULL;
int dfd = -1;
guint i;
const int max_attempts = 128;
d = opendir (gs_file_get_path_cached (tmpdir));
if (!d)
{
int errsv = errno;
g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
g_strerror (errsv));
goto out;
}
dfd = dirfd (d);
for (i = 0; i < max_attempts; i++)
{
g_free (tmpname);
tmpname = gsystem_fileutil_gen_tmp_name (NULL, NULL);
if (symlinkat (target, dfd, tmpname) < 0)
{
if (errno == EEXIST)
continue;
else
{
int errsv = errno;
g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
g_strerror (errsv));
goto out;
}
}
else
break;
}
if (i == max_attempts)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Exhausted attempts to open temporary file");
goto out;
}
ret = TRUE;
*out_file = g_file_get_child (tmpdir, tmpname);
out:
if (d) (void) closedir (d);
return ret;
}
static gboolean
stage_object (OstreeRepo *self,
OstreeObjectType objtype,
const char *expected_checksum,
GInputStream *input,
guint64 file_object_length,
guchar **out_csum,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
const char *actual_checksum;
gboolean do_commit;
OstreeRepoMode repo_mode;
gs_free char *temp_filename = NULL;
gs_unref_object GFile *temp_file = NULL;
gs_unref_object GFile *raw_temp_file = NULL;
gs_unref_object GFile *stored_path = NULL;
gs_free guchar *ret_csum = NULL;
gs_unref_object OstreeChecksumInputStream *checksum_input = NULL;
gs_unref_object GInputStream *file_input = NULL;
gs_unref_object GFileInfo *file_info = NULL;
gs_unref_variant GVariant *xattrs = NULL;
gboolean have_obj;
GChecksum *checksum = NULL;
gboolean temp_file_is_regular;
gboolean is_symlink = FALSE;
g_return_val_if_fail (self->in_transaction, FALSE);
while (TRUE)
{
GFileInfo *file_info;
const char *name;
guint32 type;
OstreeObjectType objtype;
if (!gs_file_enumerator_iterate (enumerator, &file_info, NULL,
NULL, error))
goto out;
if (file_info == NULL)
break;
type = g_file_info_get_attribute_uint32 (file_info, "standard::type");
if (type == G_FILE_TYPE_DIRECTORY)
continue;
name = g_file_info_get_attribute_byte_string (file_info, "standard::name");
if (g_str_has_suffix (name, ".file"))
objtype = OSTREE_OBJECT_TYPE_FILE;
else if (g_str_has_suffix (name, ".dirtree"))
objtype = OSTREE_OBJECT_TYPE_DIR_TREE;
else if (g_str_has_suffix (name, ".dirmeta"))
objtype = OSTREE_OBJECT_TYPE_DIR_META;
else if (g_str_has_suffix (name, ".commit"))
objtype = OSTREE_OBJECT_TYPE_COMMIT;
else
continue;
dot = strrchr (name, '.');
g_assert (dot);
if ((dot - name) == 62)
{
GVariant *key, *value;
if (checksum)
g_string_free (checksum, TRUE);
checksum = g_string_new (dirname);
g_string_append_len (checksum, name, 62);
key = ostree_object_name_serialize (checksum->str, objtype);
value = g_variant_new ("(b@as)",
TRUE, g_variant_new_strv (NULL, 0));
/* transfer ownership */
g_hash_table_replace (inout_objects, key,
g_variant_ref_sink (value));
}
}
ret = TRUE;
out:
if (checksum)
g_string_free (checksum, TRUE);
return ret;
}
static gboolean
append_object_dirs_from (OstreeRepo *self,
GFile *dir,
@ -761,9 +579,9 @@ append_object_dirs_from (OstreeRepo *self,
GError *temp_error = NULL;
gs_unref_object GFileEnumerator *enumerator = NULL;
enumerator = g_file_enumerate_children (dir, OSTREE_GIO_FAST_QUERYINFO,
enumerator = g_file_enumerate_children (dir, OSTREE_GIO_FAST_QUERYINFO,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
cancellable,
cancellable,
&temp_error);
if (!enumerator)
{
@ -790,9 +608,9 @@ append_object_dirs_from (OstreeRepo *self,
if (file_info == NULL)
break;
name = g_file_info_get_attribute_byte_string (file_info, "standard::name");
name = g_file_info_get_attribute_byte_string (file_info, "standard::name");
type = g_file_info_get_attribute_uint32 (file_info, "standard::type");
if (strlen (name) == 2 && type == G_FILE_TYPE_DIRECTORY)
{
GFile *objdir = g_file_get_child (g_file_enumerator_get_container (enumerator), name);
@ -834,6 +652,88 @@ _ostree_repo_get_loose_object_dirs (OstreeRepo *self,
return ret;
}
static gboolean
list_loose_object_dir (OstreeRepo *self,
GFile *dir,
GHashTable *inout_objects,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
const char *dirname = NULL;
const char *dot = NULL;
gs_unref_object GFileEnumerator *enumerator = NULL;
GString *checksum = NULL;
dirname = gs_file_get_basename_cached (dir);
/* We're only querying name */
enumerator = g_file_enumerate_children (dir, "standard::name,standard::type",
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
cancellable,
error);
if (!enumerator)
goto out;
while (TRUE)
{
GFileInfo *file_info;
const char *name;
guint32 type;
OstreeObjectType objtype;
if (!gs_file_enumerator_iterate (enumerator, &file_info, NULL,
NULL, error))
goto out;
if (file_info == NULL)
break;
type = g_file_info_get_attribute_uint32 (file_info, "standard::type");
if (type == G_FILE_TYPE_DIRECTORY)
continue;
name = g_file_info_get_attribute_byte_string (file_info, "standard::name");
if (g_str_has_suffix (name, ".file"))
objtype = OSTREE_OBJECT_TYPE_FILE;
else if (g_str_has_suffix (name, ".dirtree"))
objtype = OSTREE_OBJECT_TYPE_DIR_TREE;
else if (g_str_has_suffix (name, ".dirmeta"))
objtype = OSTREE_OBJECT_TYPE_DIR_META;
else if (g_str_has_suffix (name, ".commit"))
objtype = OSTREE_OBJECT_TYPE_COMMIT;
else
continue;
dot = strrchr (name, '.');
g_assert (dot);
if ((dot - name) == 62)
{
GVariant *key, *value;
if (checksum)
g_string_free (checksum, TRUE);
checksum = g_string_new (dirname);
g_string_append_len (checksum, name, 62);
key = ostree_object_name_serialize (checksum->str, objtype);
value = g_variant_new ("(b@as)",
TRUE, g_variant_new_strv (NULL, 0));
/* transfer ownership */
g_hash_table_replace (inout_objects, key,
g_variant_ref_sink (value));
}
}
ret = TRUE;
out:
if (checksum)
g_string_free (checksum, TRUE);
return ret;
}
static gboolean
list_loose_objects (OstreeRepo *self,
GHashTable *inout_objects,
@ -862,7 +762,7 @@ list_loose_objects (OstreeRepo *self,
static gboolean
load_metadata_internal (OstreeRepo *self,
OstreeObjectType objtype,
const char *sha256,
const char *sha256,
gboolean error_if_not_found,
GVariant **out_variant,
GInputStream **out_stream,
@ -899,7 +799,7 @@ load_metadata_internal (OstreeRepo *self,
if (out_size)
{
struct stat stbuf;
if (!gs_stream_fstat ((GFileDescriptorBased*)ret_stream, &stbuf, cancellable, error))
goto out;
*out_size = stbuf.st_size;
@ -1004,7 +904,7 @@ ostree_repo_load_file (OstreeRepo *self,
}
else if (self->parent_repo)
{
if (!ostree_repo_load_file (self->parent_repo, checksum,
if (!ostree_repo_load_file (self->parent_repo, checksum,
out_input ? &ret_input : NULL,
out_file_info ? &ret_file_info : NULL,
out_xattrs ? &ret_xattrs : NULL,
@ -1051,7 +951,7 @@ ostree_repo_load_object_stream (OstreeRepo *self,
gboolean ret = FALSE;
guint64 size;
gs_unref_object GInputStream *ret_input = NULL;
if (OSTREE_OBJECT_TYPE_IS_META (objtype))
{
if (!load_metadata_internal (self, objtype, checksum, TRUE, NULL,
@ -1096,7 +996,7 @@ _ostree_repo_find_object (OstreeRepo *self,
gs_unref_object GFile *ret_stored_path = NULL;
object_path = _ostree_repo_get_object_path (self, checksum, objtype);
if (lstat (gs_file_get_path_cached (object_path), &stbuf) == 0)
{
ret_stored_path = object_path;
@ -1107,7 +1007,7 @@ _ostree_repo_find_object (OstreeRepo *self,
ot_util_set_error_from_errno (error, errno);
goto out;
}
ret = TRUE;
ot_transfer_out_value (out_stored_path, &ret_stored_path);
out:
@ -1125,7 +1025,7 @@ out:
*
* Set @out_have_object to %TRUE if @self contains the given object;
* %FALSE otherwise.
*
*
* Returns: %FALSE if an unexpected error occurred, %TRUE otherwise
*/
gboolean
@ -1152,7 +1052,7 @@ ostree_repo_has_object (OstreeRepo *self,
&ret_have_object, cancellable, error))
goto out;
}
ret = TRUE;
if (out_have_object)
*out_have_object = ret_have_object;
@ -1175,7 +1075,7 @@ ostree_repo_has_object (OstreeRepo *self,
gboolean
ostree_repo_delete_object (OstreeRepo *self,
OstreeObjectType objtype,
const char *sha256,
const char *sha256,
GCancellable *cancellable,
GError **error)
{
@ -1198,7 +1098,7 @@ ostree_repo_delete_object (OstreeRepo *self,
gboolean
ostree_repo_query_object_storage_size (OstreeRepo *self,
OstreeObjectType objtype,
const char *sha256,
const char *sha256,
guint64 *out_size,
GCancellable *cancellable,
GError **error)
@ -1210,7 +1110,7 @@ ostree_repo_query_object_storage_size (OstreeRepo *self,
cancellable, error);
if (!finfo)
goto out;
*out_size = g_file_info_get_size (finfo);
ret = TRUE;
out:
@ -1224,7 +1124,7 @@ ostree_repo_query_object_storage_size (OstreeRepo *self,
* @sha256: ASCII checksum
* @out_variant: (out) (transfer full): Metadata
* @error: Error
*
*
* Attempt to load the metadata object @sha256 of type @objtype if it
* exists, storing the result in @out_variant. If it doesn't exist,
* %NULL is returned.
@ -1232,7 +1132,7 @@ ostree_repo_query_object_storage_size (OstreeRepo *self,
gboolean
ostree_repo_load_variant_if_exists (OstreeRepo *self,
OstreeObjectType objtype,
const char *sha256,
const char *sha256,
GVariant **out_variant,
GError **error)
{
@ -1247,14 +1147,14 @@ ostree_repo_load_variant_if_exists (OstreeRepo *self,
* @sha256: Checksum string
* @out_variant: (out): (transfer full): Metadata object
* @error: Error
*
*
* Load the metadata object @sha256 of type @objtype, storing the
* result in @out_variant.
*/
gboolean
ostree_repo_load_variant (OstreeRepo *self,
OstreeObjectType objtype,
const char *sha256,
const char *sha256,
GVariant **out_variant,
GError **error)
{
@ -1276,7 +1176,7 @@ ostree_repo_load_variant (OstreeRepo *self,
* to #GVariant values of type %OSTREE_REPO_LIST_OBJECTS_VARIANT_TYPE.
*
* Returns: %TRUE on success, %FALSE on error, and @error will be set
*/
*/
gboolean
ostree_repo_list_objects (OstreeRepo *self,
OstreeRepoListObjectsFlags flags,
@ -1289,7 +1189,7 @@ ostree_repo_list_objects (OstreeRepo *self,
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
g_return_val_if_fail (self->inited, FALSE);
ret_objects = g_hash_table_new_full (ostree_hash_object_name, g_variant_equal,
(GDestroyNotify) g_variant_unref,
(GDestroyNotify) g_variant_unref);
@ -1331,7 +1231,7 @@ ostree_repo_list_objects (OstreeRepo *self,
*/
gboolean
ostree_repo_read_commit (OstreeRepo *self,
const char *rev,
const char *rev,
GFile **out_root,
GCancellable *cancellable,
GError **error)