diff --git a/src/libostree/ostree-repo-prune.c b/src/libostree/ostree-repo-prune.c index 2d93a9cb..eca2cff6 100644 --- a/src/libostree/ostree-repo-prune.c +++ b/src/libostree/ostree-repo-prune.c @@ -303,10 +303,28 @@ ostree_repo_prune (OstreeRepo *self, while (g_hash_table_iter_next (&hash_iter, &key, &value)) { const char *checksum = value; - - if (!ostree_repo_traverse_commit_union (self, checksum, depth, data.reachable, - cancellable, error)) + OstreeRepoCommitState commitstate; + GError *local_error = NULL; + + if (!ostree_repo_load_commit (self, checksum, NULL, &commitstate, + error)) goto out; + + if (!ostree_repo_traverse_commit_union (self, checksum, depth, data.reachable, + cancellable, &local_error)) + { + /* Don't fail traversing a partial commit */ + if ((commitstate & OSTREE_REPO_COMMIT_STATE_PARTIAL) > 0 && + g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + { + g_clear_error (&local_error); + } + else + { + g_propagate_error (error, local_error); + goto out; + } + } } } @@ -322,15 +340,33 @@ ostree_repo_prune (OstreeRepo *self, GVariant *serialized_key = key; const char *checksum; OstreeObjectType objtype; + OstreeRepoCommitState commitstate; + GError *local_error = NULL; ostree_object_name_deserialize (serialized_key, &checksum, &objtype); if (objtype != OSTREE_OBJECT_TYPE_COMMIT) continue; - - if (!ostree_repo_traverse_commit_union (self, checksum, depth, data.reachable, - cancellable, error)) + + if (!ostree_repo_load_commit (self, checksum, NULL, &commitstate, + error)) goto out; + + if (!ostree_repo_traverse_commit_union (self, checksum, depth, data.reachable, + cancellable, &local_error)) + { + /* Don't fail traversing a partial commit */ + if ((commitstate & OSTREE_REPO_COMMIT_STATE_PARTIAL) > 0 && + g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + { + g_clear_error (&local_error); + } + else + { + g_propagate_error (error, local_error); + goto out; + } + } } }