Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add %Y and %Y in pkg_printf to show provides/requires
Baptiste Daroussin committed 11 years ago
commit 7dbe81746b89283bd1d71a9f04afac009b5dd5c2
parent 6a99f1c
4 files changed +165 -19
modified libpkg/pkg_printf.c
@@ -1,5 +1,6 @@
/*
 * Copyright (c) 2012-2013 Matthew Seaman <matthew@FreeBSD.org>
+
 * Copyright (c) 2014 Baptiste Daroussin <bapt@FreeBSD.org>
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
@@ -97,7 +98,7 @@
 * Od pkg_option   Option default value (if known)
 * OD pkg_option   Option description
 *
-
 * P
+
 * P pkg
 * Q
 *
 * R  pkg          Repopath
@@ -112,7 +113,8 @@
 * V  pkg          old version
 * W
 * X
-
 * Y
+
 * Y  pkg          List of requires
+
 * Yn pkg_provide  Name of the require
 * Z
 *
 * a  pkg          autoremove flag
@@ -155,8 +157,9 @@
 * v  pkg          version
 * w  pkg          home page URL
 *
-
 * x  pkg	   pkg tarball size
-
 * y
+
 * x  pkg          pkg tarball size
+
 * y  pkg          List of provides
+
 * yn pkg_provide  name of the provide
 *
 * z  pkg          short checksum
 */
@@ -510,6 +513,22 @@ static const struct pkg_printf_fmt fmt[] = {
		PP_ALL,
		&format_old_version,
	},
+
	[PP_PKG_REQUIRED_NAME] = {
+
		'Y',
+
		'n',
+
		false,
+
		false,
+
		PP_PKG|PP_Y,
+
		&format_provide_name,
+
	},
+
	[PP_PKG_REQUIRED] = {
+
		'Y',
+
		'\0',
+
		true,
+
		true,
+
		PP_PKG,
+
		&format_required,
+
	},
	[PP_PKG_AUTOREMOVE] =
	{
		'a',
@@ -761,6 +780,22 @@ static const struct pkg_printf_fmt fmt[] = {
		PP_ALL,
		&format_pkgsize,
	},
+
	[PP_PKG_PROVIDED_NAME] = {
+
		'y',
+
		'n',
+
		false,
+
		false,
+
		PP_PKG|PP_y,
+
		&format_provide_name,
+
	},
+
	[PP_PKG_PROVIDED] = {
+
		'y',
+
		'\0',
+
		true,
+
		true,
+
		PP_PKG,
+
		&format_provided,
+
	},
	[PP_PKG_SHORT_CHECKSUM] =
	{
		'z',
@@ -1423,6 +1458,48 @@ format_old_version(struct sbuf *sbuf, const void *data, struct percent_esc *p)
}

/*
+
 * %Y -- Required pattern.  List of pattern required by
+
 * binaries in the pkg.  Optionally accepts per-field format in %{ %|
+
 * %}.  Default %{%Yn\n%|%}
+
 */
+
struct sbuf *
+
format_required(struct sbuf *sbuf, const void *data, struct percent_esc *p)
+
{
+
	const struct pkg	*pkg = data;
+

+
	if (p->flags & (PP_ALTERNATE_FORM1|PP_ALTERNATE_FORM2))
+
		return (list_count(sbuf, pkg_list_count(pkg, PKG_REQUIRES), p));
+
	else {
+
		struct pkg_provide	*provide = NULL;
+
		int			 count;
+

+
		set_list_defaults(p, "%Yn\n", "");
+

+
		count = 1;
+
		while (pkg_requires(pkg, &provide) == EPKG_OK) {
+
			if (count > 1)
+
				iterate_item(sbuf, pkg, sbuf_data(p->sep_fmt),
+
					     provide, count, PP_Y);
+

+
			iterate_item(sbuf, pkg, sbuf_data(p->item_fmt),
+
				     provide, count, PP_Y);
+
			count++;
+
		}
+
	}
+
	return (sbuf);
+
}
+

+
/*
+
 * %Yn -- Required name or %yn -- Provided name
+
 */
+
struct sbuf *
+
format_provide_name(struct sbuf *sbuf, const void *data, struct percent_esc *p)
+
{
+
	const struct pkg_provide	*provide = data;
+

+
	return (string_val(sbuf, provide->provide, p));
+
}
+
/*
 * %a -- Autoremove flag. boolean.  Accepts field-width, left-align.
 * Standard form: 0, 1.  Alternate form1: no, yes.  Alternate form2:
 * false, true
@@ -1772,6 +1849,38 @@ format_pkgsize(struct sbuf *sbuf, const void *data, struct percent_esc *p)
}

/*
+
 * %y -- Provided pattern.  List of pattern provided by
+
 * binaries in the pkg.  Optionally accepts per-field format in %{ %|
+
 * %}.  Default %{%yn\n%|%}
+
 */
+
struct sbuf *
+
format_provided(struct sbuf *sbuf, const void *data, struct percent_esc *p)
+
{
+
	const struct pkg	*pkg = data;
+

+
	if (p->flags & (PP_ALTERNATE_FORM1|PP_ALTERNATE_FORM2))
+
		return (list_count(sbuf, pkg_list_count(pkg, PKG_PROVIDES), p));
+
	else {
+
		struct pkg_provide	*provide = NULL;
+
		int			 count;
+

+
		set_list_defaults(p, "%yn\n", "");
+

+
		count = 1;
+
		while (pkg_provides(pkg, &provide) == EPKG_OK) {
+
			if (count > 1)
+
				iterate_item(sbuf, pkg, sbuf_data(p->sep_fmt),
+
					     provide, count, PP_y);
+

+
			iterate_item(sbuf, pkg, sbuf_data(p->item_fmt),
+
				     provide, count, PP_y);
+
			count++;
+
		}
+
	}
+
	return (sbuf);
+
}
+

+
/*
 * %z -- Package short checksum. string. Accepts field width, left align
 */
struct sbuf *
modified libpkg/private/pkg_printf.h
@@ -56,9 +56,11 @@
#define PP_L	(1U << 7)	/* licence */
#define PP_O	(1U << 8)	/* option */
#define PP_U	(1U << 9)	/* user */
-
#define PP_b	(1U << 10)	/* shlib provided */
-
#define PP_d	(1U << 11)	/* dependency */
-
#define PP_r	(1U << 12)	/* requirement */
+
#define PP_Y	(1U << 10)	/* required */
+
#define PP_b	(1U << 11)	/* shlib provided */
+
#define PP_d	(1U << 12)	/* dependency */
+
#define PP_r	(1U << 13)	/* requirement */
+
#define PP_y	(1U << 14)	/* provided */

#define _PP_last	PP_r
#define PP_ALL	((_PP_last << 1) - 1) /* All contexts */
@@ -139,6 +141,10 @@ typedef enum _fmt_code_t {
	PP_PKG_VERSION,
	PP_PKG_HOME_PAGE,
	PP_PKG_PKGSIZE,
+
	PP_PKG_REQUIRED,
+
	PP_PKG_REQUIRED_NAME,
+
	PP_PKG_PROVIDED,
+
	PP_PKG_PROVIDED_NAME,
	PP_PKG_SHORT_CHECKSUM,
	PP_LAST_FORMAT = PP_PKG_SHORT_CHECKSUM,
	PP_LITERAL_PERCENT,
@@ -223,6 +229,9 @@ _static struct sbuf *format_pkgsize(struct sbuf *, const void *, struct percent_
_static struct sbuf *format_short_checksum(struct sbuf *, const void *, struct percent_esc *);
_static struct sbuf *format_literal_percent(struct sbuf *, __unused const void *, __unused struct percent_esc *);
_static struct sbuf *format_unknown(struct sbuf *, __unused const void *, __unused struct percent_esc *);
+
_static struct sbuf *format_provided(struct sbuf *, const void *, struct percent_esc *);
+
_static struct sbuf *format_required(struct sbuf *, const void *, struct percent_esc *);
+
_static struct sbuf *format_provide_name(struct sbuf *, const void *, struct percent_esc *);

/* Other static function prototypes */

modified src/pkgcli.h
@@ -214,19 +214,21 @@ void usage_config(void);
#define INFO_FLATSIZE		(1LL<<16)
#define INFO_PKGSIZE		(1LL<<17)
#define INFO_DESCR		(1LL<<18)
+
#define INFO_PROVIDED		(1LL<<19)
+
#define INFO_REQUIRED		(1LL<<20)

/* Other fields not part of the Full output */
-
#define INFO_MESSAGE		(1LL<<19)
-
#define INFO_DEPS		(1LL<<20)
-
#define INFO_RDEPS		(1LL<<21)
-
#define INFO_FILES		(1LL<<22)
-
#define INFO_DIRS		(1LL<<23)
-
#define INFO_USERS		(1LL<<24)
-
#define INFO_GROUPS		(1LL<<25)
-
#define INFO_REPOURL		(1LL<<26)
-
#define INFO_LOCKED		(1LL<<27)
-
#define INFO_OPTION_DEFAULTS    (1LL<<28)
-
#define INFO_OPTION_DESCRIPTIONS (1LL<<29)
+
#define INFO_MESSAGE		(1LL<<21)
+
#define INFO_DEPS		(1LL<<22)
+
#define INFO_RDEPS		(1LL<<23)
+
#define INFO_FILES		(1LL<<24)
+
#define INFO_DIRS		(1LL<<25)
+
#define INFO_USERS		(1LL<<26)
+
#define INFO_GROUPS		(1LL<<27)
+
#define INFO_REPOURL		(1LL<<28)
+
#define INFO_LOCKED		(1LL<<29)
+
#define INFO_OPTION_DEFAULTS    (1LL<<30)
+
#define INFO_OPTION_DESCRIPTIONS (1LL<<31)

#define INFO_LASTFIELD	INFO_LOCKED
#define INFO_ALL	(((INFO_LASTFIELD) << 1) - 1)
@@ -250,7 +252,7 @@ void usage_config(void);
			 INFO_WWW|INFO_COMMENT|INFO_OPTIONS|		 \
			 INFO_SHLIBS_REQUIRED|INFO_SHLIBS_PROVIDED|	 \
			 INFO_ANNOTATIONS|INFO_FLATSIZE|INFO_PKGSIZE|	 \
-
			 INFO_DESCR)
+
			 INFO_DESCR|INFO_PROVIDED|INFO_REQUIRED)

/* Everything that can take more than one line to print */
#define INFO_MULTILINE	(INFO_OPTIONS|INFO_SHLIBS_REQUIRED|	       \
modified src/utils.c
@@ -257,6 +257,10 @@ info_flags(uint64_t opt, bool remote)
		flags |= PKG_LOAD_SHLIBS_REQUIRED;
	if (opt & INFO_SHLIBS_PROVIDED)
		flags |= PKG_LOAD_SHLIBS_PROVIDED;
+
	if (opt & INFO_PROVIDED)
+
		flags |= PKG_LOAD_PROVIDES;
+
	if (opt & INFO_REQUIRED)
+
		flags |= PKG_LOAD_REQUIRES;
	if (opt & INFO_ANNOTATIONS)
		flags |= PKG_LOAD_ANNOTATIONS;
	if (opt & INFO_DEPS)
@@ -277,6 +281,8 @@ info_flags(uint64_t opt, bool remote)
			 PKG_LOAD_OPTIONS         |
			 PKG_LOAD_SHLIBS_REQUIRED |
			 PKG_LOAD_SHLIBS_PROVIDED |
+
			 PKG_LOAD_PROVIDES        |
+
			 PKG_LOAD_REQUIRES        |
			 PKG_LOAD_ANNOTATIONS     |
			 PKG_LOAD_DEPS;
		if (!remote) {
@@ -485,6 +491,26 @@ print_info(struct pkg * const pkg, uint64_t options)
					pkg_printf("%b%{\t%bn\n%|%}", pkg);
			}
			break;
+
		case INFO_REQUIRED:
+
			if (pkg_list_count(pkg, PKG_REQUIRES) > 0) {
+
				if (print_tag)
+
					printf("%-15s:\n", "Requires");
+
				if (quiet)
+
					pkg_printf("%Y%{%Yn\n%|%}", pkg);
+
				else
+
					pkg_printf("%Y%{\t%Yn\n%|%}", pkg);
+
			}
+
			break;
+
		case INFO_PROVIDED:
+
			if (pkg_list_count(pkg, PKG_PROVIDES) > 0) {
+
				if (print_tag)
+
					printf("%-15s:\n", "Provides");
+
				if (quiet)
+
					pkg_printf("%y%{%yn\n%|%}", pkg);
+
				else
+
					pkg_printf("%y%{\t%yn\n%|%}", pkg);
+
			}
+
			break;
		case INFO_ANNOTATIONS:
			if (print_tag)
				printf("%-15s:\n", "Annotations");