Пример #1
0
char *pkg_to_str (const char *target, void *pkg, printpkgfn f, const char *format)
{
	if (!format) return NULL;
	const char *c;
	string_t *ret = string_new();
	const char *ptr = format;
	const char *end = &(format[strlen(format)]);
	while ((c = strchr (ptr, '%'))) {
		if (&(c[1]) == end) {
			break;
		}
		if (c[1] == '%' ) {
			ret = string_ncat (ret, ptr, (c-ptr));
			ret = string_cat (ret, "%%");
		} else {
			const char *info = NULL;
			if (strchr (FORMAT_LOCAL_PKG, c[1])) {
				info = alpm_local_pkg_get_str (f(pkg, 'n'), c[1]);
			} else if (c[1] == 't') {
				info = target;
			} else {
				info = f (pkg, c[1]);
			}
			if (c != ptr) {
				ret = string_ncat (ret, ptr, (c-ptr));
			}
			if (info) {
				ret = string_cat (ret, info);
			} else {
				ret = string_cat (ret, "-");
			}
		}
		ptr = &(c[2]);
	}
	if (ptr != end) {
		ret = string_ncat (ret, ptr, (end - ptr));
	}
	return string_free2 (ret);
}
Пример #2
0
void color_print_package (void * p, printpkgfn f)
{
	string_t *cstr;
	static int number=0;
	const char *info, *lver;
	char *ver=NULL;
	int aur=(f == aur_get_str);
	int grp=(f == alpm_grp_get_str);
	cstr=string_new ();

	/* Numbering list */
	if (config.numbering)
		cstr = string_fcat (cstr, "%s%d%s ",
		    color (C_NB), ++number, color (C_NO));

	/* repo/name */
	if (config.aur_foreign)
		info = f(p, 'r');
	else
		info = f(p, 's');
	if (info)
	{
		if (config.get_res) dprintf (FD_RES, "%s/", info);
		cstr = string_fcat (cstr, "%s%s/%s",
		    color_repo (info), info, color(C_NO));
	}
	info=f(p, 'n');
	if (config.get_res) dprintf (FD_RES, "%s\n", info);
	cstr = string_fcat (cstr, "%s%s%s ", color(C_PKG), info, color(C_NO));

	if (grp)
	{
		/* no more output for groups */
		fprintf (stdout, "%s\n", string_cstr (cstr));
		string_free (cstr);
		return;
	}

	/* Version
	 * different colors:
	 *   C_ORPHAN if package exists in AUR and is orphaned
	 *   C_OD if package exists and is out of date
	 *   C_VER otherwise
	 */
	lver = alpm_local_pkg_get_str (info, 'l');
	info = f(p, (config.aur_upgrades) ? 'V' : 'v');
	ver = STRDUP (info);
	info = (aur) ? f(p, 'm') : NULL;
	if (config.aur_foreign)
	{
		/* Compare foreign package with AUR */
		if (aur)
		{
			const char *lver_color = NULL;
			if (!info)
				lver_color=color(C_ORPHAN);
			else
			{
				info = f(p, 'o');
				if (info && info[0]=='1')
					lver_color=color(C_OD);
			}
			cstr = string_fcat (cstr, "%s%s%s",
			    (lver_color) ? lver_color : color(C_VER),
			    lver, color (C_NO));
			if (alpm_pkg_vercmp (ver, lver)>0)
				cstr = string_fcat (cstr, " ( aur: %s )", ver);
			fprintf (stdout, "%s\n", string_cstr (cstr));
			FREE (ver);
		}
		else
			fprintf (stdout, "%s %s%s%s\n", string_cstr (cstr),
				color(C_VER), lver, color(C_NO));
		string_free (cstr);
		return;
	}
	if (aur && !info)
		cstr = string_fcat (cstr, "%s%s%s", color(C_ORPHAN), ver, color (C_NO));
	else
		cstr = string_fcat (cstr, "%s%s%s", color(C_VER), ver, color (C_NO));

	/* show size */
	if (config.show_size)
	{
		info = f(p, 'r');
		if (info)
		{
			if (strcmp (info, "aur")!=0)
				cstr = string_fcat (cstr, " [%.2f M]",
				    (double) get_size_pkg (p) / (1024.0 * 1024));
		}
	}

	if (config.aur_upgrades)
	{
		fprintf (stdout, "%s\n", string_cstr (cstr));
		string_free (cstr);
		FREE (ver);
		return;
	}

	/* show groups */
	info = f(p, 'g');
	if (info)
	{
		cstr = string_fcat (cstr, " %s(%s)%s", color(C_GRP), info, color(C_NO));
	}

	/* show install information */
	if (lver)
	{
		info = f(p, 'r');
		if (info && strcmp (info, "local")!=0)
		{
			cstr = string_fcat (cstr, " %s[%s",
			    color(C_INSTALLED), _("installed"));
			if (strcmp (ver, lver)!=0)
			{
				cstr = string_fcat (cstr, ": %s%s%s%s",
				    color(C_LVER), lver, color (C_NO), color(C_INSTALLED));
			}
			cstr = string_fcat (cstr, "]%s", color(C_NO));
		}
	}
	/* ver no more needed */
	FREE (ver);

	/* Out of date status & votes */
	if (aur)
	{
		info = f(p, 'o');
		if (info && info[0]=='1')
		{
			cstr = string_fcat (cstr, " %s(%s)%s",
				color(C_OD), _("Out of Date"), color(C_NO));
		}
		info = f(p, 'w');
		if (info)
		{
			cstr = string_fcat (cstr, " %s(%s)%s",
			    color(C_VOTES), info, color(C_NO));
		}
	}

	/* Display computed string */
	fprintf (stdout, "%s\n", string_cstr (cstr));
	string_free (cstr);

	/* Description
	 * if -Q or -Sl or -Sg <target>, don't display description
	 */
	if (config.op != OP_SEARCH && config.op != OP_LIST_REPO_S) return;
	fprintf (stdout, "%s", color(C_DSC));
	indent (f(p, 'd'));
	fprintf (stdout, "%s", color(C_NO));
}
Пример #3
0
static void color_print_package (void *p, printpkgfn f)
{
	static int number = 0;
	const bool aur = (f == aur_get_str);
	const bool grp = (f == alpm_grp_get_str);

	/* Numbering list */
	if (config.numbering) {
		fprintf (stdout, "%s%d%s ", color (C_NB), ++number, color (C_NO));
	}

	/* repo/name */
	const char *info = color_print_repo (p, f);

	if (grp) {
		/* no more output for groups */
		fprintf (stdout, "\n");
		return;
	}

	/* Version
	 * different colors:
	 *   C_ORPHAN if package exists in AUR and is orphaned
	 *   C_OD if package exists and is out of date
	 *   C_VER otherwise
	 */
	const char *lver = alpm_local_pkg_get_str (info, 'l');
	info = f(p, (config.aur_upgrades || config.filter & F_UPGRADES) ? 'V' : 'v');
	char *ver = STRDUP (info);
	info = (aur) ? f(p, 'm') : NULL;
	if (config.aur_foreign) {
		/* Compare foreign package with AUR */
		if (aur) {
			info = color_print_aur_version (p, f, info, lver, ver);
		} else {
			fprintf (stdout, " %s%s%s\n", color(C_VER), lver, color(C_NO));
		}
		FREE (ver);
		return;
	}

	if (aur && !info) {
		fprintf (stdout, "%s", color(C_ORPHAN));
	} else {
		fprintf (stdout, "%s", color(C_VER));
	}
	if (config.filter & F_UPGRADES) {
		fprintf (stdout, "%s%s -> %s%s%s", lver, color (C_NO), color(C_VER), ver, color (C_NO));
	} else {
		fprintf (stdout, "%s%s", ver, color (C_NO));
	}

	/* show size */
	if (config.show_size) {
		color_print_size (p, f);
	}

	if (config.aur_upgrades || config.filter & F_UPGRADES) {
		fprintf (stdout, "\n");
		FREE (ver);
		return;
	}

	/* show groups */
	color_print_groups (p, f);

	/* show install information */
	color_print_install_info (p, f, lver, ver);

	/* ver no more needed */
	FREE (ver);

	/* Out of date status & votes */
	if (aur) {
		color_print_aur_status (p, f);
	}

	/* Nothing more to display */
	fprintf (stdout, "\n");

	/* Description
	 * if -Q or -Sl or -Sg <target>, don't display description
	 */
	if (config.op != OP_SEARCH && config.op != OP_LIST_REPO_S) {
		return;
	}
	fprintf (stdout, "%s", color(C_DSC));
	indent (f(p, 'd'));
	fprintf (stdout, "%s", color(C_NO));
}