Esempio n. 1
0
/**
 * 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;
}
Esempio n. 3
0
/**
 * 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;
}