/** * asb_task_explode_extra_package: **/ static gboolean asb_task_explode_extra_package (AsbTask *task, const gchar *pkg_name, gboolean require_same_srpm, GError **error) { AsbTaskPrivate *priv = GET_PRIVATE (task); AsbPackage *pkg_extra; GPtrArray *deps; guint i; const gchar *dep; /* if not found, that's fine */ pkg_extra = asb_context_find_by_pkgname (priv->ctx, pkg_name); if (pkg_extra == NULL) return TRUE; /* check it's from the same source package */ if (!asb_package_ensure (pkg_extra, ASB_PACKAGE_ENSURE_SOURCE, error)) return FALSE; if (require_same_srpm && (g_strcmp0 (asb_package_get_source (pkg_extra), asb_package_get_source (priv->pkg)) != 0)) return TRUE; g_debug ("decompressing extra pkg %s", asb_package_get_name (pkg_extra)); asb_package_log (priv->pkg, ASB_PACKAGE_LOG_LEVEL_DEBUG, "Adding extra package %s for %s", asb_package_get_name (pkg_extra), asb_package_get_name (priv->pkg)); if (!asb_package_ensure (pkg_extra, ASB_PACKAGE_ENSURE_FILES | ASB_PACKAGE_ENSURE_DEPS, error)) return FALSE; if (!asb_package_explode (pkg_extra, priv->tmpdir, asb_context_get_file_globs (priv->ctx), error)) return FALSE; /* copy all the extra package requires into the main package too */ deps = asb_package_get_deps (pkg_extra); for (i = 0; i < deps->len; i++) { dep = g_ptr_array_index (deps, i); asb_package_add_dep (priv->pkg, dep); } /* free resources */ if (!asb_package_close (pkg_extra, error)) return FALSE; asb_package_clear (pkg_extra, ASB_PACKAGE_ENSURE_DEPS | ASB_PACKAGE_ENSURE_FILES); return TRUE; }
static gboolean asb_package_alpm_ensure_depends (AsbPackage *pkg, GError **error) { AsbPackageAlpm *pkg_alpm = ASB_PACKAGE_ALPM (pkg); AsbPackageAlpmPrivate *priv = GET_PRIVATE (pkg_alpm); alpm_list_t *alpm_depends; alpm_list_t *current; alpm_depends = alpm_pkg_get_depends (priv->package); for (current = alpm_depends; current; current = alpm_list_next (current)) asb_package_add_dep (pkg, current->data); return TRUE; }
/** * asb_package_deb_ensure_simple: **/ static gboolean asb_package_deb_ensure_simple (AsbPackage *pkg, GError **error) { const gchar *argv[4] = { "dpkg", "--field", "fn", NULL }; gchar *tmp; guint i; guint j; g_autofree gchar *output = NULL; g_auto(GStrv) lines = NULL; /* spawn sync */ argv[2] = asb_package_get_filename (pkg); if (!g_spawn_sync (NULL, (gchar **) argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &output, NULL, NULL, error)) return FALSE; /* parse output */ lines = g_strsplit (output, "\n", -1); for (i = 0; lines[i] != NULL; i++) { if (g_str_has_prefix (lines[i], "Package: ")) { asb_package_set_name (pkg, lines[i] + 9); continue; } if (g_str_has_prefix (lines[i], "Source: ")) { asb_package_set_source (pkg, lines[i] + 8); continue; } if (g_str_has_prefix (lines[i], "Version: ")) { g_auto(GStrv) vr = NULL; vr = g_strsplit (lines[i] + 9, "-", 2); tmp = g_strstr_len (vr[0], -1, ":"); if (tmp == NULL) { asb_package_set_version (pkg, vr[0]); } else { *tmp = '\0'; j = g_ascii_strtoll (vr[0], NULL, 10); asb_package_set_epoch (pkg, j); asb_package_set_version (pkg, tmp + 1); } if (vr[1] != NULL) { asb_package_set_release (pkg, vr[1]); } else { /* packages don't actually have to have a * release value like rpm; in this case fake * something plausible */ asb_package_set_release (pkg, "0"); } continue; } if (g_str_has_prefix (lines[i], "Depends: ")) { g_auto(GStrv) vr = NULL; vr = g_strsplit (lines[i] + 9, ", ", -1); for (j = 0; vr[j] != NULL; j++) { tmp = g_strstr_len (vr[j], -1, " "); if (tmp != NULL) *tmp = '\0'; asb_package_add_dep (pkg, vr[j]); } continue; } } return TRUE; }