pull: Correctly handle repo->parent_repo when applying static deltas

In flatpak i was using a parent repo, and it failed to update
with ENOENT when dispatching an set-read-source opcode, because the
object it referenced was in the parent repo.

This fixes that by making _ostree_repo_read_bare_fd look
at parent_repo.

Closes: #362
Approved by: cgwalters
This commit is contained in:
Alexander Larsson 2016-06-23 11:51:15 +02:00 committed by Atomic Bot
parent 9a779563bb
commit fc4a7ec35e
1 changed files with 16 additions and 5 deletions

View File

@ -2715,18 +2715,29 @@ _ostree_repo_read_bare_fd (OstreeRepo *self,
GError **error) GError **error)
{ {
char loose_path_buf[_OSTREE_LOOSE_PATH_MAX]; char loose_path_buf[_OSTREE_LOOSE_PATH_MAX];
g_assert (self->mode == OSTREE_REPO_MODE_BARE || g_assert (self->mode == OSTREE_REPO_MODE_BARE ||
self->mode == OSTREE_REPO_MODE_BARE_USER); self->mode == OSTREE_REPO_MODE_BARE_USER);
_ostree_loose_path (loose_path_buf, checksum, OSTREE_OBJECT_TYPE_FILE, self->mode); _ostree_loose_path (loose_path_buf, checksum, OSTREE_OBJECT_TYPE_FILE, self->mode);
*out_fd = openat (self->objects_dir_fd, loose_path_buf, O_RDONLY | O_CLOEXEC); if (!ot_openat_ignore_enoent (self->objects_dir_fd, loose_path_buf, out_fd, error))
if (*out_fd < 0) return FALSE;
if (*out_fd == -1)
{ {
glnx_set_error_from_errno (error); if (self->parent_repo)
return _ostree_repo_read_bare_fd (self->parent_repo,
checksum,
out_fd,
cancellable,
error);
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
"No such file object %s", checksum);
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }