END_TEST START_TEST(test_goal_downgrade) { DnfSack *sack = test_globals.sack; DnfPackage *to_be_pkg = get_available_pkg(sack, "baby"); HyGoal goal = hy_goal_create(sack); hy_goal_downgrade_to(goal, to_be_pkg); fail_if(hy_goal_run(goal)); assert_iueo(goal, 0, 0, 0, 0); GPtrArray *plist = hy_goal_list_downgrades(goal, NULL); fail_unless(plist->len == 1); DnfPackage *pkg = g_ptr_array_index(plist, 0); ck_assert_str_eq(dnf_package_get_evr(pkg), "6:4.9-3"); GPtrArray *obsoleted = hy_goal_list_obsoleted_by_package(goal, pkg); fail_unless(obsoleted->len == 1); DnfPackage *old_pkg = g_ptr_array_index(obsoleted, 0); ck_assert_str_eq(dnf_package_get_evr(old_pkg), "6:5.0-11"); g_ptr_array_unref(obsoleted); g_ptr_array_unref(plist); hy_goal_free(goal); g_object_unref(to_be_pkg); }
/** * dnf_package_get_release: * @pkg: a #DnfPackage instance. * * Gets the release for the package. * * Returns: (transfer none): a string, or %NULL * * Since: 0.7.0 */ const char * dnf_package_get_release(DnfPackage *pkg) { char *e, *v, *r; pool_split_evr(dnf_package_get_pool(pkg), dnf_package_get_evr(pkg), &e, &v, &r); return r; }
/** * dnf_package_get_version: * @pkg: a #DnfPackage instance. * * Gets the version for the package. * * Returns: (transfer none): a string, or %NULL * * Since: 0.7.0 */ const char * dnf_package_get_version(DnfPackage *pkg) { char *e, *v, *r; pool_split_evr(dnf_package_get_pool(pkg), dnf_package_get_evr(pkg), &e, &v, &r); return v; }
/** * dnf_package_get_package_id: * @pkg: a #DnfPackage *instance. * * Gets the package-id as used by PackageKit. * * Returns: the package_id string, or %NULL, e.g. "hal;2:0.3.4;i386;installed:fedora" * * Since: 0.1.0 **/ const gchar * dnf_package_get_package_id(DnfPackage *pkg) { DnfPackagePrivate *priv; const gchar *reponame; g_autofree gchar *reponame_tmp = NULL; priv = dnf_package_get_priv(pkg); if (priv == NULL) return NULL; if (priv->package_id != NULL) goto out; /* calculate and cache */ reponame = dnf_package_get_reponame(pkg); if (g_strcmp0(reponame, HY_SYSTEM_REPO_NAME) == 0) { /* origin data to munge into the package_id data field */ if (priv->origin != NULL) { reponame_tmp = g_strdup_printf("installed:%s", priv->origin); reponame = reponame_tmp; } else { reponame = "installed"; } } else if (g_strcmp0(reponame, HY_CMDLINE_REPO_NAME) == 0) { reponame = "local"; } priv->package_id = dnf_package_id_build(dnf_package_get_name(pkg), dnf_package_get_evr(pkg), dnf_package_get_arch(pkg), reponame); out: return priv->package_id; }
/** * rpm_ostree_db_diff: * @repo: An OSTree repository * @orig_ref: Original ref (branch or commit) * @new_ref: New ref (branch or commit) * @out_removed: (out) (transfer container) (element-type RpmOstreePackage): Return location for removed packages * @out_added: (out) (transfer container) (element-type RpmOstreePackage): Return location for added packages * @out_modified_old: (out) (transfer container) (element-type RpmOstreePackage): Return location for modified old packages * @out_modified_new: (out) (transfer container) (element-type RpmOstreePackage): Return location for modified new packages * * Compute the RPM package delta between two commits. Currently you * must use %NULL for the @query parameter; in a future version this * function may allow looking at a subset of the packages. * * The @out_modified_old and @out_modified_new arrays will always be * the same length, and indicies will refer to the same base package * name. It is possible in RPM databases to have multiple packages * installed with the same name; in this case, the behavior will * depend on whether the package set is transitioning from 1 -> N or N * -> 1. In the former case, an arbitrary single instance of one of * the new packages will be in @out_modified_new. If the latter, then * multiple entries with the same name will be returned in * the array @out_modified_old, with each having a reference to the * single corresponding new package. */ gboolean rpm_ostree_db_diff (OstreeRepo *repo, const char *orig_ref, const char *new_ref, GPtrArray **out_removed, GPtrArray **out_added, GPtrArray **out_modified_old, GPtrArray **out_modified_new, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; g_autoptr(RpmOstreeRefSack) orig_sack = NULL; g_autoptr(RpmOstreeRefSack) new_sack = NULL; g_autoptr(GPtrArray) orig_pkglist = NULL; g_autoptr(GPtrArray) new_pkglist = NULL; g_autoptr(GPtrArray) ret_removed = g_ptr_array_new_with_free_func (g_object_unref); g_autoptr(GPtrArray) ret_added = g_ptr_array_new_with_free_func (g_object_unref); g_autoptr(GPtrArray) ret_modified_old = g_ptr_array_new_with_free_func (g_object_unref); g_autoptr(GPtrArray) ret_modified_new = g_ptr_array_new_with_free_func (g_object_unref); guint i; g_return_val_if_fail (out_removed != NULL && out_added != NULL && out_modified_old != NULL && out_modified_new != NULL, FALSE); orig_sack = rpmostree_get_refsack_for_commit (repo, orig_ref, cancellable, error); if (!orig_sack) goto out; { HyQuery query = hy_query_create (orig_sack->sack); hy_query_filter (query, HY_PKG_REPONAME, HY_EQ, HY_SYSTEM_REPO_NAME); orig_pkglist = hy_query_run (query); hy_query_free (query); } new_sack = rpmostree_get_refsack_for_commit (repo, new_ref, cancellable, error); if (!new_sack) goto out; { HyQuery query = hy_query_create (new_sack->sack); hy_query_filter (query, HY_PKG_REPONAME, HY_EQ, HY_SYSTEM_REPO_NAME); new_pkglist = hy_query_run (query); hy_query_free (query); } for (i = 0; i < new_pkglist->len; i++) { DnfPackage *pkg = new_pkglist->pdata[i]; HyQuery query = NULL; g_autoptr(GPtrArray) pkglist = NULL; guint count; DnfPackage *oldpkg; query = hy_query_create (orig_sack->sack); hy_query_filter (query, HY_PKG_NAME, HY_EQ, dnf_package_get_name (pkg)); hy_query_filter (query, HY_PKG_EVR, HY_NEQ, dnf_package_get_evr (pkg)); hy_query_filter (query, HY_PKG_REPONAME, HY_EQ, HY_SYSTEM_REPO_NAME); pkglist = hy_query_run (query); count = pkglist->len; if (count > 0) { /* See comment above about transitions from N -> 1 */ oldpkg = pkglist->pdata[0]; g_ptr_array_add (ret_modified_old, _rpm_ostree_package_new (orig_sack, oldpkg)); g_ptr_array_add (ret_modified_new, _rpm_ostree_package_new (new_sack, pkg)); } } for (i = 0; i < orig_pkglist->len; i++) { DnfPackage *pkg = orig_pkglist->pdata[i]; HyQuery query = NULL; g_autoptr(GPtrArray) pkglist = NULL; query = hy_query_create (new_sack->sack); hy_query_filter (query, HY_PKG_NAME, HY_EQ, dnf_package_get_name (pkg)); hy_query_filter (query, HY_PKG_REPONAME, HY_EQ, HY_SYSTEM_REPO_NAME); pkglist = hy_query_run (query); if (pkglist->len == 0) g_ptr_array_add (ret_removed, _rpm_ostree_package_new (orig_sack, pkg)); hy_query_free (query); } for (i = 0; i < new_pkglist->len; i++) { DnfPackage *pkg = new_pkglist->pdata[i]; HyQuery query = NULL; g_autoptr(GPtrArray) pkglist = NULL; query = hy_query_create (orig_sack->sack); hy_query_filter (query, HY_PKG_NAME, HY_EQ, dnf_package_get_name (pkg)); hy_query_filter (query, HY_PKG_REPONAME, HY_EQ, HY_SYSTEM_REPO_NAME); pkglist = hy_query_run (query); if (pkglist->len == 0) g_ptr_array_add (ret_added, _rpm_ostree_package_new (new_sack, pkg)); hy_query_free (query); } ret = TRUE; *out_removed = g_steal_pointer (&ret_removed); *out_added = g_steal_pointer (&ret_added); *out_modified_old = g_steal_pointer (&ret_modified_old); *out_modified_new = g_steal_pointer (&ret_modified_new); out: return ret; }
/** * dnf_package_get_epoch: * @pkg: a #DnfPackage instance. * * Gets the epoch for the package. * * Returns: %TRUE for success * * Since: 0.7.0 */ guint64 dnf_package_get_epoch(DnfPackage *pkg) { return pool_get_epoch(dnf_package_get_pool(pkg), dnf_package_get_evr(pkg)); }