From 62f311ba9baee15ffa35305b975498e0cabf6cc7 Mon Sep 17 00:00:00 2001 From: Luca BRUNO Date: Tue, 18 May 2021 10:23:39 +0000 Subject: [PATCH] importer: align /var/lib/rpm handling This reworks the special-case handling of `/var/lib/rpm`, in order to make it uniform across codepaths and outside of auto-tmpfiles logic. It prepares for further oxidation and auto-tmpfiles codepaths unification. --- src/libpriv/rpmostree-importer.cxx | 52 ++++++++++++------------------ 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/src/libpriv/rpmostree-importer.cxx b/src/libpriv/rpmostree-importer.cxx index 5c1d38c5..509f9f9a 100644 --- a/src/libpriv/rpmostree-importer.cxx +++ b/src/libpriv/rpmostree-importer.cxx @@ -532,18 +532,6 @@ ensure_directories_user_writable (GFileInfo *file_info) } } -static gboolean -path_for_tmpfiles_should_be_ignored (const char *path) -{ - /* HACK: Avoid generating tmpfiles.d entries for the `rpm` package's - * /var/lib/rpm entries in --unified-core composes. A much more - * rigorous approach here would be to maintain our built-in tmpfiles.d - * entries as a struct and ensure we're not writing any overrides for - * those here. - */ - return g_str_has_prefix (path, "/var/lib/rpm"); -} - /* systemd-tmpfiles complains loudly about writing to /var/run; ideally, * all of the packages get fixed for this but...eh. */ @@ -565,9 +553,6 @@ append_tmpfiles_d (RpmOstreeImporter *self, const char *user, const char *group) { - if (path_for_tmpfiles_should_be_ignored (path)) - return; - GString *tmpfiles_d = self->tmpfiles_d; const guint32 mode = g_file_info_get_attribute_uint32 (finfo, "unix::mode"); char filetype_c; @@ -632,6 +617,12 @@ compose_filter_cb (OstreeRepo *repo, if (self->doc_files && g_hash_table_contains (self->doc_files, path)) return OSTREE_REPO_COMMIT_FILTER_SKIP; + /* HACK: special-case rpm's `/var/lib/rpm`, otherwise libsolv can get confused. + * See https://github.com/projectatomic/rpm-ostree/pull/290 + */ + if (g_str_has_prefix (path, "/var/lib/rpm")) + return OSTREE_REPO_COMMIT_FILTER_SKIP; + /* Lookup any rpmfi overrides (was parsed from the header) */ get_rpmfi_override (self, path, &user, &group, NULL); @@ -675,17 +666,8 @@ compose_filter_cb (OstreeRepo *repo, else if (g_str_has_prefix (path, "/run/") || g_str_has_prefix (path, "/var/")) { - /* HACK: Avoid generating tmpfiles.d entries for the `rpm` package's - * /var/lib/rpm entries in --unified-core composes. A much more - * rigorous approach here would be to maintain our built-in tmpfiles.d - * entries as a struct and ensure we're not writing any overrides for - * those here. - */ - if (!g_str_has_prefix (path, "/var/lib/rpm")) - { - append_tmpfiles_d (self, path, file_info, - user ?: "root", group ?: "root"); - } + append_tmpfiles_d (self, path, file_info, + user ?: "root", group ?: "root"); return OSTREE_REPO_COMMIT_FILTER_SKIP; } else if (!error_was_set) @@ -738,6 +720,12 @@ unprivileged_filter_cb (OstreeRepo *repo, if (self->doc_files && g_hash_table_contains (self->doc_files, path)) return OSTREE_REPO_COMMIT_FILTER_SKIP; + /* HACK: special-case rpm's `/var/lib/rpm`, otherwise libsolv can get confused. + * See https://github.com/projectatomic/rpm-ostree/pull/290 + */ + if (g_str_has_prefix (path, "/var/lib/rpm")) + return OSTREE_REPO_COMMIT_FILTER_SKIP; + /* First, the common directory workaround */ ensure_directories_user_writable (file_info); @@ -753,12 +741,6 @@ unprivileged_filter_cb (OstreeRepo *repo, g_file_info_set_attribute_uint32 (file_info, "unix::mode", mode); } - /* HACK: Also special-case rpm's `/var/lib/rpm` here like in the privileged flow; - * otherwise libsolv can get confused (see - * https://github.com/projectatomic/rpm-ostree/pull/290) */ - if (g_str_has_prefix (path, "/var/lib/rpm")) - return OSTREE_REPO_COMMIT_FILTER_SKIP; - return OSTREE_REPO_COMMIT_FILTER_ALLOW; } @@ -780,6 +762,12 @@ rojig_filter_cb (OstreeRepo *repo, g_assert (path != NULL); g_assert (*path == '/'); + /* HACK: special-case rpm's `/var/lib/rpm`, otherwise libsolv can get confused. + * See https://github.com/projectatomic/rpm-ostree/pull/290 + */ + if (g_str_has_prefix (path, "/var/lib/rpm")) + return OSTREE_REPO_COMMIT_FILTER_SKIP; + self->n_rojig_total++; if (g_file_info_get_file_type (file_info) != G_FILE_TYPE_DIRECTORY)