repo: Never delete .commitmeta files
Do not delete a .commitmeta file after removing the last metadata entry. This way a client will pull the empty .commitmeta file and overwrite old metadata as expected. https://bugzilla.gnome.org/750459
This commit is contained in:
parent
5307af5a7a
commit
df75fc232a
|
|
@ -2140,24 +2140,7 @@ ostree_repo_write_commit_detached_metadata (OstreeRepo *self,
|
||||||
normalized_size = g_variant_get_size (normalized);
|
normalized_size = g_variant_get_size (normalized);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (normalized_size == 0)
|
if (normalized_size > 0)
|
||||||
{
|
|
||||||
GError *local_error = NULL;
|
|
||||||
|
|
||||||
(void) g_file_delete (metadata_path, cancellable, &local_error);
|
|
||||||
|
|
||||||
if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
|
|
||||||
{
|
|
||||||
g_clear_error (&local_error);
|
|
||||||
}
|
|
||||||
else if (local_error != NULL)
|
|
||||||
{
|
|
||||||
g_propagate_error (error, local_error);
|
|
||||||
g_prefix_error (error, "Unable to delete detached metadata: ");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (!g_file_replace_contents (metadata_path,
|
if (!g_file_replace_contents (metadata_path,
|
||||||
g_variant_get_data (normalized),
|
g_variant_get_data (normalized),
|
||||||
|
|
@ -2169,6 +2152,21 @@ ostree_repo_write_commit_detached_metadata (OstreeRepo *self,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_autoptr(GFileOutputStream) output_stream = NULL;
|
||||||
|
|
||||||
|
/* Don't write to the stream, leave the file empty. */
|
||||||
|
output_stream = g_file_replace (metadata_path,
|
||||||
|
NULL, FALSE,
|
||||||
|
G_FILE_CREATE_NONE,
|
||||||
|
cancellable, error);
|
||||||
|
if (output_stream == NULL)
|
||||||
|
{
|
||||||
|
g_prefix_error (error, "Unable to write detached metadata: ");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
out:
|
out:
|
||||||
|
|
|
||||||
|
|
@ -273,7 +273,8 @@ do_get (OtTrivialHttpd *self,
|
||||||
buffer = soup_buffer_new_with_owner (g_mapped_file_get_contents (mapping),
|
buffer = soup_buffer_new_with_owner (g_mapped_file_get_contents (mapping),
|
||||||
buffer_length,
|
buffer_length,
|
||||||
mapping, (GDestroyNotify)g_mapped_file_unref);
|
mapping, (GDestroyNotify)g_mapped_file_unref);
|
||||||
soup_message_body_append_buffer (msg->response_body, buffer);
|
if (buffer->length > 0)
|
||||||
|
soup_message_body_append_buffer (msg->response_body, buffer);
|
||||||
soup_buffer_free (buffer);
|
soup_buffer_free (buffer);
|
||||||
}
|
}
|
||||||
else /* msg->method == SOUP_METHOD_HEAD */
|
else /* msg->method == SOUP_METHOD_HEAD */
|
||||||
|
|
|
||||||
|
|
@ -119,4 +119,13 @@ ${CMD_PREFIX} ostree --repo=${test_tmpdir}/ostree-srv/gnomerepo gpg-sign --gpg-h
|
||||||
${CMD_PREFIX} ostree --repo=repo pull origin main
|
${CMD_PREFIX} ostree --repo=repo pull origin main
|
||||||
${CMD_PREFIX} ostree --repo=repo show main | grep -o 'Found [[:digit:]] signature' > show
|
${CMD_PREFIX} ostree --repo=repo show main | grep -o 'Found [[:digit:]] signature' > show
|
||||||
assert_file_has_content show 'Found 1 signature'
|
assert_file_has_content show 'Found 1 signature'
|
||||||
|
|
||||||
|
# Delete the signature from the commit so the detached metadata is empty,
|
||||||
|
# then pull and verify the signature is also deleted on the client side.
|
||||||
|
${CMD_PREFIX} ostree --repo=${test_tmpdir}/ostree-srv/gnomerepo gpg-sign --gpg-homedir=${SRCDIR}/gpghome --delete main $keyid
|
||||||
|
${CMD_PREFIX} ostree --repo=repo pull origin main
|
||||||
|
if ${CMD_PREFIX} ostree --repo=repo show main | grep -o 'Found [[:digit:]] signature'; then
|
||||||
|
assert_not_reached
|
||||||
|
fi
|
||||||
|
|
||||||
rm -rf repo gnomerepo-files
|
rm -rf repo gnomerepo-files
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue