summaryrefslogtreecommitdiff
path: root/src/libostree/ostree-repo-prune.c
diff options
context:
space:
mode:
authorGiuseppe Scrivano <gscrivan@redhat.com>2016-03-11 12:59:18 +0100
committerGiuseppe Scrivano <gscrivan@redhat.com>2016-03-15 09:48:47 +0100
commitcff4e48d02303d49c813c1d628fe73a13bc3f024 (patch)
tree3475f2b804d03c1bb4b0ac78ac543ee5b22f209b /src/libostree/ostree-repo-prune.c
parent2bf84d7e5dee96f49e8ead32fffb1dfefb845f4b (diff)
downloadostree-cff4e48d02303d49c813c1d628fe73a13bc3f024.tar.gz
prune: delete all cached summaries files
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
Diffstat (limited to 'src/libostree/ostree-repo-prune.c')
-rw-r--r--src/libostree/ostree-repo-prune.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/libostree/ostree-repo-prune.c b/src/libostree/ostree-repo-prune.c
index 166e67e0..33848839 100644
--- a/src/libostree/ostree-repo-prune.c
+++ b/src/libostree/ostree-repo-prune.c
@@ -112,6 +112,68 @@ maybe_prune_loose_object (OtPruneData *data,
return ret;
}
+static gboolean
+_ostree_repo_prune_tmp (OstreeRepo *self,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
+ glnx_fd_close int fd = -1;
+
+ fd = glnx_opendirat_with_errno (self->repo_dir_fd, _OSTREE_SUMMARY_CACHE_PATH, FALSE);
+ if (fd < 0)
+ {
+ if (errno == ENOENT)
+ ret = TRUE;
+ else
+ glnx_set_error_from_errno (error);
+ goto out;
+ }
+
+ if (!glnx_dirfd_iterator_init_take_fd (dup (fd), &dfd_iter, error))
+ goto out;
+
+ while (TRUE)
+ {
+ size_t len;
+ gboolean has_sig_suffix = FALSE;
+ struct dirent *dent;
+
+ if (!glnx_dirfd_iterator_next_dent (&dfd_iter, &dent, cancellable, error))
+ goto out;
+
+ if (dent == NULL)
+ break;
+
+ len = strlen (dent->d_name);
+ if (len > 4 && g_strcmp0 (dent->d_name + len - 4, ".sig") == 0)
+ {
+ has_sig_suffix = TRUE;
+ dent->d_name[len - 4] = '\0';
+ }
+
+ if (!g_hash_table_contains (self->remotes, dent->d_name))
+ {
+ /* Restore the previous value to get the file name. */
+ if (has_sig_suffix)
+ dent->d_name[len - 4] = '.';
+
+ if (unlinkat (fd, dent->d_name, 0) < 0)
+ {
+ glnx_set_error_from_errno (error);
+ goto out;
+ }
+ }
+ }
+
+ ret = TRUE;
+
+ out:
+ return ret;
+}
+
+
/**
* ostree_repo_prune_static_deltas:
* @self: Repo
@@ -295,6 +357,9 @@ ostree_repo_prune (OstreeRepo *self,
if (!ostree_repo_prune_static_deltas (self, NULL, cancellable, error))
goto out;
+ if (!_ostree_repo_prune_tmp (self, cancellable, error))
+ goto out;
+
ret = TRUE;
*out_objects_total = (data.n_reachable_meta + data.n_unreachable_meta +
data.n_reachable_content + data.n_unreachable_content);