+/* these packages do not get installed by the package manager */
+static inline int
+is_pseudo_package(Pool *pool, Solvable *s)
+{
+ const char *n = pool_id2str(pool, s->name);
+ if (*n == 'p' && !strncmp(n, "patch:", 6))
+ return 1;
+ if (*n == 'p' && !strncmp(n, "pattern:", 8))
+ return 1;
+ if (*n == 'p' && !strncmp(n, "product:", 8))
+ return 1;
+ if (*n == 'a' && !strncmp(n, "application:", 12))
+ return 1;
+ return 0;
+}
+
+/* these packages will never show up installed */
+static inline int
+is_noinst_pseudo_package(Pool *pool, Solvable *s)
+{
+ const char *n = pool_id2str(pool, s->name);
+ if (!strncmp(n, "patch:", 6))
+ return 1;
+ if (!strncmp(n, "pattern:", 8))
+ {
+#if defined(SUSE) && defined(ENABLE_LINKED_PKGS)
+ /* unlike normal patterns, autopatterns *can* be installed (via the package link),
+ so do not filter them */
+ if (s->provides)
+ {
+ Id prv, *prvp = s->repo->idarraydata + s->provides;
+ while ((prv = *prvp++) != 0)
+ if (ISRELDEP(prv) && !strcmp(pool_id2str(pool, prv), "autopattern()"))
+ return 0;
+ }
+#endif
+ return 1;
+ }
+ return 0;
+}
+
+static int
+obsoleted_by_pseudos_only(Transaction *trans, Id p)
+{
+ Pool *pool = trans->pool;
+ Queue q;
+ Id op;
+ int i;
+
+ op = transaction_obs_pkg(trans, p);
+ if (op && !is_pseudo_package(pool, pool->solvables + op))
+ return 0;
+ queue_init(&q);
+ transaction_all_obs_pkgs(trans, p, &q);
+ for (i = 0; i < q.count; i++)
+ if (!is_pseudo_package(pool, pool->solvables + q.elements[i]))
+ break;
+ i = !q.count || i < q.count ? 0 : 1;
+ queue_free(&q);
+ return i;
+}
+