/** * dnf_package_get_filename: * @pkg: a #DnfPackage *instance. * * Gets the package filename. * * Returns: absolute filename, or %NULL * * Since: 0.1.0 **/ const gchar * dnf_package_get_filename(DnfPackage *pkg) { DnfPackagePrivate *priv; priv = dnf_package_get_priv(pkg); if (priv == NULL) return NULL; if (dnf_package_installed(pkg)) return NULL; /* default cache filename location */ if (priv->filename == NULL && priv->repo != NULL) { priv->filename = g_build_filename(dnf_repo_get_location(priv->repo), dnf_package_get_location(pkg), NULL); /* set the filename to cachedir for non-local repos */ if (!dnf_repo_is_local(priv->repo) || !g_file_test(priv->filename, G_FILE_TEST_EXISTS)) { g_autofree gchar *basename = NULL; basename = g_path_get_basename(dnf_package_get_location(pkg)); g_free(priv->filename); priv->filename = g_build_filename(dnf_repo_get_packages(priv->repo), basename, NULL); } } return priv->filename; }
/** * dnf_package_get_size: * @pkg: a #DnfPackage instance. * * Gets the size for the package. * * Returns: size in bytes * * Since: 0.7.0 */ guint64 dnf_package_get_size(DnfPackage *pkg) { unsigned type = dnf_package_installed(pkg) ? SOLVABLE_INSTALLSIZE : SOLVABLE_DOWNLOADSIZE; return lookup_num(pkg, type); }
/** * dnf_package_get_origin: * @pkg: a #DnfPackage *instance. * * Gets the package origin. * * Returns: the package origin, or %NULL * * Since: 0.1.0 **/ const gchar * dnf_package_get_origin(DnfPackage *pkg) { DnfPackagePrivate *priv; priv = dnf_package_get_priv(pkg); if (priv == NULL) return NULL; if (!dnf_package_installed(pkg)) return NULL; return priv->origin; }
/** * dnf_emit_package: */ void dnf_emit_package (PkBackendJob *job, PkInfoEnum info, DnfPackage *pkg) { /* detect */ if (info == PK_INFO_ENUM_UNKNOWN) info = dnf_package_get_info (pkg); if (info == PK_INFO_ENUM_UNKNOWN) info = dnf_package_installed (pkg) ? PK_INFO_ENUM_INSTALLED : PK_INFO_ENUM_AVAILABLE; pk_backend_job_package (job, info, dnf_package_get_package_id (pkg), dnf_package_get_summary (pkg)); }
/** * dnf_package_is_downloaded: * @pkg: a #DnfPackage *instance. * * Returns: %TRUE if the package is already downloaded * * Since: 0.1.0 **/ gboolean dnf_package_is_downloaded(DnfPackage *pkg) { const gchar *filename; if (dnf_package_installed(pkg)) return FALSE; filename = dnf_package_get_filename(pkg); if (filename == NULL) { g_warning("Failed to get cache filename for %s", dnf_package_get_name(pkg)); return FALSE; } return g_file_test(filename, G_FILE_TEST_EXISTS); }
/** * dnf_db_ensure_origin_pkg: * @db: a #DnfDb instance. * @pkg: A package to set * * Sets the repo origin on a package if not already set. * * Since: 0.1.0 */ void dnf_db_ensure_origin_pkg(DnfDb *db, DnfPackage *pkg) { g_autoptr(GError) error = NULL; g_autofree gchar *tmp = NULL; /* already set */ if (dnf_package_get_origin(pkg) != NULL) return; if (!dnf_package_installed(pkg)) return; /* set from the database if available */ tmp = dnf_db_get_string(db, pkg, "from_repo", &error); if (tmp == NULL) { g_debug("no origin for %s: %s", dnf_package_get_package_id(pkg), error->message); } else { dnf_package_set_origin(pkg, tmp); } }
/** * dnf_emit_package_list_filter: */ void dnf_emit_package_list_filter (PkBackendJob *job, PkBitfield filters, GPtrArray *pkglist) { DnfPackage *found; DnfPackage *pkg; guint i; g_autoptr(GHashTable) hash_cost = NULL; g_autoptr(GHashTable) hash_installed = NULL; /* if a package exists in multiple repos, show the one with the lowest * cost of downloading */ hash_cost = g_hash_table_new (g_str_hash, g_str_equal); for (i = 0; i < pkglist->len; i++) { pkg = g_ptr_array_index (pkglist, i); if (dnf_package_installed (pkg)) continue; /* if the NEVRA does not already exist in the array, just add */ found = g_hash_table_lookup (hash_cost, dnf_package_get_nevra (pkg)); if (found == NULL) { g_hash_table_insert (hash_cost, (gpointer) dnf_package_get_nevra (pkg), (gpointer) pkg); continue; } /* a lower cost package */ if (dnf_package_get_cost (pkg) < dnf_package_get_cost (found)) { dnf_package_set_info (found, PK_INFO_ENUM_BLOCKED); g_hash_table_replace (hash_cost, (gpointer) dnf_package_get_nevra (pkg), (gpointer) pkg); } else { dnf_package_set_info (pkg, PK_INFO_ENUM_BLOCKED); } } /* add all the installed packages to a hash */ hash_installed = g_hash_table_new (g_str_hash, g_str_equal); for (i = 0; i < pkglist->len; i++) { pkg = g_ptr_array_index (pkglist, i); if (!dnf_package_installed (pkg)) continue; g_hash_table_insert (hash_installed, (gpointer) dnf_package_get_nevra (pkg), (gpointer) pkg); } /* anything remote in metadata-only mode needs to be unavailable */ for (i = 0; i < pkglist->len; i++) { DnfRepo *src; pkg = g_ptr_array_index (pkglist, i); if (dnf_package_installed (pkg)) continue; src = dnf_package_get_repo (pkg); if (src == NULL) continue; if (dnf_repo_get_enabled (src) != DNF_REPO_ENABLED_METADATA) continue; dnf_package_set_info (pkg, PK_INFO_ENUM_UNAVAILABLE); } for (i = 0; i < pkglist->len; i++) { pkg = g_ptr_array_index (pkglist, i); /* blocked */ if ((PkInfoEnum) dnf_package_get_info (pkg) == PK_INFO_ENUM_BLOCKED) continue; /* GUI */ if (pk_bitfield_contain (filters, PK_FILTER_ENUM_GUI) && !dnf_package_is_gui (pkg)) continue; if (pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_GUI) && dnf_package_is_gui (pkg)) continue; /* DEVELOPMENT */ if (pk_bitfield_contain (filters, PK_FILTER_ENUM_DEVELOPMENT) && !dnf_package_is_devel (pkg)) continue; if (pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_DEVELOPMENT) && dnf_package_is_devel (pkg)) continue; /* DOWNLOADED */ if (pk_bitfield_contain (filters, PK_FILTER_ENUM_DOWNLOADED) && !dnf_package_is_downloaded (pkg)) continue; if (pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_DOWNLOADED) && dnf_package_is_downloaded (pkg)) continue; /* if this package is available and the very same NEVRA is * installed, skip this package */ if (!dnf_package_installed (pkg)) { found = g_hash_table_lookup (hash_installed, dnf_package_get_nevra (pkg)); if (found != NULL) continue; } dnf_emit_package (job, PK_INFO_ENUM_UNKNOWN, pkg); } }