Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Merge branch 'master' of https://github.com/pkgng/pkgng into recursive-lock
David Naylor committed 13 years ago
commit c3ecd0d36ed233ef9c513e667d6de504ece11c6e
parent cfd8042
52 files changed +805 -275
modified Doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME = libpkg
# This could be handy for archiving the generated documentation or
# if some version control system is used.

-
PROJECT_NUMBER         = 1.0-beta15
+
PROJECT_NUMBER         = 1.0-beta16

# Using the PROJECT_BRIEF tag one can provide an optional one line description for a project that appears at the top of each page and should give viewer a quick idea about the purpose of the project. Keep the description short.

modified libpkg/Makefile
@@ -37,12 +37,15 @@ HAVE_GRUTILS!= grep -q gr_copy /usr/include/libutil.h && echo yes || echo no

.if ${HAVE_GRUTILS} != yes
SRCS+=	gr_util.c
+
.else
+
CFLAGS+=	-DHAVE_GRUTILS
.endif

CFLAGS+=	-std=c99
CFLAGS+=	-I${.CURDIR} \
		-I${.CURDIR}/../external/sqlite \
		-I${.CURDIR}/../external/libyaml/include
+
STATIC_CFLAGS+=	-DSTATIC_LINKAGE
LDADD+=		-L${.OBJDIR}/../external/sqlite \
		-L${.OBJDIR}/../external/libyaml \
		-lsqlite3 \
modified libpkg/packing.c
@@ -90,7 +90,7 @@ packing_init(struct packing **pack, const char *path, pkg_formats format)
	}

	(*pack)->resolver = archive_entry_linkresolver_new();
-
	archive_entry_linkresolver_set_strategy((*pack)->resolver, archive_format((*pack)->awrite));
+
	archive_entry_linkresolver_set_strategy((*pack)->resolver, ARCHIVE_FORMAT_TAR_PAX_RESTRICTED);
	return (EPKG_OK);
}

modified libpkg/pkg.h
@@ -37,10 +37,10 @@
#include <sys/sbuf.h>
#include <openssl/pem.h>

-
#define PKGVERSION "1.0-beta15"
+
#define PKGVERSION "1.0-beta16"
/* PORTVERSION equivalent for proper pkg-static->ports-mgmt/pkg version comparison
 * in pkgdb_query_newpkgversion() */
-
#define PKG_PORTVERSION "1.0.b15_2"
+
#define PKG_PORTVERSION "1.0.b16"

struct pkg;
struct pkg_dep;
@@ -173,7 +173,7 @@ typedef enum {
	PKG_NEWVERSION,
	PKG_REPONAME,
	PKG_REPOURL, /* end of fields */
-
	PKG_FLATSIZE,
+
	PKG_FLATSIZE=64,
	PKG_NEW_FLATSIZE,
	PKG_NEW_PKGSIZE,
	PKG_LICENSE_LOGIC,
@@ -265,6 +265,15 @@ typedef enum {
	PKG_CONFIG_KV_VALUE
} pkg_config_kv_t;

+
typedef enum _pkg_stats_t {
+
	PKG_STATS_LOCAL_COUNT = 0,
+
	PKG_STATS_LOCAL_SIZE,
+
	PKG_STATS_REMOTE_COUNT,
+
	PKG_STATS_REMOTE_UNIQUE,
+
	PKG_STATS_REMOTE_SIZE,
+
	PKG_STATS_REMOTE_REPOS,
+
} pkg_stats_t;
+

/**
 * Error type used everywhere by libpkg.
 */
@@ -818,6 +827,14 @@ int pkg_create_staged(const char *, pkg_formats, const char *, const char *, cha
int pkg_update(const char *name, const char *packagesite);

/**
+
 * Get statistics information from the package database(s)
+
 * @param db A valid database object as returned by pkgdb_open()
+
 * @param type Type of statistics to be returned
+
 * @return The statistic information requested
+
 */
+
int64_t pkgdb_stats(struct pkgdb *db, pkg_stats_t type);
+

+
/**
 * Get the value of a configuration key
 */
int pkg_config_string(pkg_config_key key, const char **value);
modified libpkg/pkg_elf.c
@@ -57,6 +57,12 @@ test_depends(struct pkgdb *db, struct pkg *pkg, const char *name)
	bool shlibs = false;
	bool autodeps = false;

+
#ifdef STATIC_LINKAGE
+
	/* If we're compiled using static linkage, ie. as pkg-static,
+
	   calls to dlopen(3) will fail, so bail out immediately. */
+
	return (EPKG_OK);
+
#endif
+

	pkg_config_bool(PKG_CONFIG_AUTODEPS, &autodeps);
	pkg_config_bool(PKG_CONFIG_SHLIBS, &shlibs);

modified libpkg/pkg_repo.c
@@ -332,13 +332,13 @@ pkg_create_repo(char *path, void (progress)(struct pkg *pkg, void *data), void *
	/* remove everything that is not anymore in the repository */
	if (incremental) {
		sql_exec(sqlite, "DELETE FROM packages WHERE NOT FILE_EXISTS(path);");
-
		sql_exec(sqlite, "DELETE FROM deps WHERE package_id NOT IN (SELECT package_id FROM packages);");
-
		sql_exec(sqlite, "DELETE FROM pkg_categories WHERE package_id NOT IN (SELECT package_id FROM packages);");
+
		sql_exec(sqlite, "DELETE FROM deps WHERE package_id NOT IN (SELECT id FROM packages);");
+
		sql_exec(sqlite, "DELETE FROM pkg_categories WHERE package_id NOT IN (SELECT id FROM packages);");
		sql_exec(sqlite, "DELETE FROM categories WHERE id NOT IN (SELECT category_id FROM pkg_categories);");
-
		sql_exec(sqlite, "DELETE FROM pkg_licenses WHERE package_id NOT IN (SELECT package_id FROM packages);");
+
		sql_exec(sqlite, "DELETE FROM pkg_licenses WHERE package_id NOT IN (SELECT id FROM packages);");
		sql_exec(sqlite, "DELETE FROM licenses WHERE id NOT IN (SELECT license_id FROM pkg_licenses);");
-
		sql_exec(sqlite, "DELETE FROM options WHERE package_id NOT IN (SELECT package_id FROM packages);");
-
		sql_exec(sqlite, "DELETE FROM pkg_shlibs WHERE package_id NOT IN (SELECT package_id FROM packages);");
+
		sql_exec(sqlite, "DELETE FROM options WHERE package_id NOT IN (SELECT id FROM packages);");
+
		sql_exec(sqlite, "DELETE FROM pkg_shlibs WHERE package_id NOT IN (SELECT id FROM packages);");
	}

	if (sqlite3_prepare_v2(sqlite, pkgsql, -1, &stmt_pkg, NULL) != SQLITE_OK) {
modified libpkg/pkgdb.c
@@ -51,6 +51,10 @@
#include "private/db_upgrades.h"
#define DBVERSION 12

+
#define PKGGT	0<<1
+
#define PKGLT	0<<2
+
#define PKGEQ	0<<3
+

static struct pkgdb_it * pkgdb_it_new(struct pkgdb *, sqlite3_stmt *, int);
static void pkgdb_regex(sqlite3_context *, int, sqlite3_value **, int);
static void pkgdb_regex_basic(sqlite3_context *, int, sqlite3_value **);
@@ -58,6 +62,8 @@ static void pkgdb_regex_extended(sqlite3_context *, int, sqlite3_value **);
static void pkgdb_regex_delete(void *);
static void pkgdb_pkglt(sqlite3_context *, int, sqlite3_value **);
static void pkgdb_pkggt(sqlite3_context *, int, sqlite3_value **);
+
static void pkgdb_pkgle(sqlite3_context *, int, sqlite3_value **);
+
static void pkgdb_pkgge(sqlite3_context *, int, sqlite3_value **);
static int get_pragma(sqlite3 *, const char *, int64_t *);
static int pkgdb_upgrade(struct pkgdb *);
static void populate_pkg(sqlite3_stmt *stmt, struct pkg *pkg);
@@ -297,25 +303,54 @@ pkgdb_pkgcmp(sqlite3_context *ctx, int argc, sqlite3_value **argv, int sign)
{
	const unsigned char *version1 = NULL;
	const unsigned char *version2 = NULL;
+
	int res = 0;
+

	if (argc != 2 || (version1 = sqlite3_value_text(argv[0])) == NULL
			|| (version2 = sqlite3_value_text(argv[1])) == NULL) {
		sqlite3_result_error(ctx, "Invalid comparison\n", -1);
		return;
	}

-
	sqlite3_result_int(ctx, (pkg_version_cmp(version1, version2) == sign));
+
	switch(pkg_version_cmp(version1, version2)) {
+
	case -1:
+
		if ((sign & PKGLT) == PKGLT)
+
			res = 1;
+
		break;
+
	case 0:
+
		if ((sign & PKGEQ) == PKGEQ)
+
			res = 1;
+
		break;
+
	case 1:
+
		if ((sign & PKGGT) == PKGGT)
+
			res = 1;
+
		break;
+
	}
+

+
	sqlite3_result_int(ctx, res);
}

static void
pkgdb_pkglt(sqlite3_context *ctx, int argc, sqlite3_value **argv)
{
-
	pkgdb_pkgcmp(ctx, argc, argv, -1);
+
	pkgdb_pkgcmp(ctx, argc, argv, PKGLT);
}

static void
pkgdb_pkggt(sqlite3_context *ctx, int argc, sqlite3_value **argv)
{
-
	pkgdb_pkgcmp(ctx, argc, argv, 1);
+
	pkgdb_pkgcmp(ctx, argc, argv, PKGGT);
+
}
+

+
static void
+
pkgdb_pkgle(sqlite3_context *ctx, int argc, sqlite3_value **argv)
+
{
+
	pkgdb_pkgcmp(ctx, argc, argv, PKGLT|PKGEQ);
+
}
+

+
static void
+
pkgdb_pkgge(sqlite3_context * ctx, int argc, sqlite3_value **argv)
+
{
+
	pkgdb_pkgcmp(ctx, argc, argv, PKGGT|PKGEQ);
}

static int
@@ -2117,12 +2152,13 @@ report_already_installed(sqlite3 *s)
}

static int
-
sql_on_all_attached_db(sqlite3 *s, struct sbuf *sql, const char *multireposql) {
+
sql_on_all_attached_db(sqlite3 *s, struct sbuf *sql, const char *multireposql, const char *compound) {
	sqlite3_stmt *stmt;
	const char *dbname;
	bool first = true;

	assert(s != NULL);
+
	assert(compound != NULL);

	if (sqlite3_prepare_v2(s, "PRAGMA database_list;", -1, &stmt, NULL) != SQLITE_OK) {
		ERROR_SQLITE(s);
@@ -2135,11 +2171,13 @@ sql_on_all_attached_db(sqlite3 *s, struct sbuf *sql, const char *multireposql) {
			continue;

		if (!first) {
-
			sbuf_cat(sql, " UNION ALL ");
+
			sbuf_cat(sql, compound);
		} else {
			first = false;
		}
-
		sbuf_printf(sql, multireposql, dbname, dbname);
+

+
		/* replace any occurences of the dbname in the resulting SQL */
+
		sbuf_printf(sql, multireposql, dbname);
	}

	sqlite3_finalize(stmt);
@@ -2246,7 +2284,7 @@ create_temporary_pkgjobs(sqlite3 *s)
			"arch TEXT, maintainer TEXT, "
			"www TEXT, prefix TEXT, flatsize INTEGER, newversion TEXT, "
			"newflatsize INTEGER, pkgsize INTEGER, cksum TEXT, repopath TEXT, automatic INTEGER, weight INTEGER"
-
			"dbname TEXT);");
+
			"dbname TEXT, opts TEXT);");

	return (ret);
}
@@ -2341,10 +2379,10 @@ pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, c

	const char main_sql[] = "INSERT OR IGNORE INTO pkgjobs (pkgid, origin, name, version, comment, desc, arch, "
			"maintainer, www, prefix, flatsize, pkgsize, "
-
			"cksum, repopath, automatic) "
+
			"cksum, repopath, automatic, opts) "
			"SELECT id, origin, name, version, comment, desc, "
			"arch, maintainer, www, prefix, flatsize, pkgsize, "
-
			"cksum, path, 0 FROM '%s'.packages WHERE ";
+
			"cksum, path, 0, (select group_concat(option) from '%s'.options WHERE package_id=id AND value='on') FROM '%s'.packages WHERE ";

	const char deps_sql[] = "INSERT OR IGNORE INTO pkgjobs (pkgid, origin, name, version, comment, desc, arch, "
				"maintainer, www, prefix, flatsize, pkgsize, "
@@ -2370,7 +2408,7 @@ pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, c
		return (NULL);

	sql = sbuf_new_auto();
-
	sbuf_printf(sql, main_sql, reponame);
+
	sbuf_printf(sql, main_sql, reponame, reponame);

	how = pkgdb_get_match_how(match);

@@ -2402,8 +2440,14 @@ pkgdb_query_installs(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs, c

	/* Report and remove packages already installed and at the latest version */
	report_already_installed(db->sqlite);
-
	if (!force)
-
		sql_exec(db->sqlite, "DELETE from pkgjobs where (select p.origin from main.packages as p where p.origin=pkgjobs.origin and p.version=pkgjobs.version and p.name = pkgjobs.name) IS NOT NULL;");
+
	if (!force) {
+
		sql_exec(db->sqlite, "DELETE FROM pkgjobs WHERE "
+
		    "(SELECT p.origin FROM main.packages AS p WHERE PKGLT(p.version, pkgjobs.version)) IS NOT NULL; ");
+
		sql_exec(db->sqlite, "DELETE FROM pkgjobs WHERE "
+
		    "(SELECT p.origin FROM main.packages AS p WHERE "
+
		    "p.origin=pkgjobs.origin AND PKGLE(p.version,pkgjobs.version) AND p.name = pkgjobs.name "
+
		    "AND ( ((SELECT group_concat(option) FROM main.options WHERE package_id=p.id AND value='on') IS NULL AND pkgjobs.opts IS NULL) OR (SELECT group_concat(option) FROM main.options WHERE package_id=p.id AND value='on') == pkgjobs.opts)) IS NOT NULL;");
+
	}

	/* Append dependencies */
	sbuf_reset(sql);
@@ -2472,17 +2516,20 @@ pkgdb_query_upgrades(struct pkgdb *db, const char *repo, bool all)

	const char pkgjobs_sql_1[] = "INSERT OR IGNORE INTO pkgjobs (pkgid, origin, name, version, comment, desc, arch, "
			"maintainer, www, prefix, flatsize, pkgsize, "
-
			"cksum, repopath, automatic) "
+
			"cksum, repopath, automatic, opts) "
			"SELECT id, origin, name, version, comment, desc, "
			"arch, maintainer, www, prefix, flatsize, pkgsize, "
-
			"cksum, path, 0 FROM '%s'.packages WHERE origin IN (select origin from main.packages)";
+
			"cksum, path, 0 ,"
+
			"(select group_concat(option) from '%s'.options WHERE package_id=id AND value='on') "
+
			"FROM '%s'.packages WHERE origin IN (select origin from main.packages)";

	const char pkgjobs_sql_2[] = "INSERT OR IGNORE INTO pkgjobs (pkgid, origin, name, version, comment, desc, arch, "
				"maintainer, www, prefix, flatsize, pkgsize, "
-
				"cksum, repopath, automatic) "
+
				"cksum, repopath, automatic, opts) "
				"SELECT DISTINCT r.id, r.origin, r.name, r.version, r.comment, r.desc, "
				"r.arch, r.maintainer, r.www, r.prefix, r.flatsize, r.pkgsize, "
-
				"r.cksum, r.path, 1 "
+
				"r.cksum, r.path, 1, "
+
				"(select group_concat(option) from '%s'.options WHERE package_id=r.id AND value='on') "
				"FROM '%s'.packages AS r where r.origin IN "
				"(SELECT d.origin from '%s'.deps AS d, pkgjobs as j WHERE d.package_id = j.pkgid) "
				"AND (SELECT p.origin from main.packages as p WHERE p.origin=r.origin AND version=r.version) IS NULL;";
@@ -2520,16 +2567,22 @@ pkgdb_query_upgrades(struct pkgdb *db, const char *repo, bool all)
	sql = sbuf_new_auto();
	create_temporary_pkgjobs(db->sqlite);

-
	sbuf_printf(sql, pkgjobs_sql_1, reponame);
+
	sbuf_printf(sql, pkgjobs_sql_1, reponame, reponame);
	sbuf_finish(sql);
	sql_exec(db->sqlite, sbuf_get(sql));

	/* Remove packages already installed and in the latest version */
-
	if (!all)
-
		sql_exec(db->sqlite, "DELETE from pkgjobs where (select p.origin from main.packages as p where p.origin=pkgjobs.origin and p.version=pkgjobs.version and p.name = pkgjobs.name) IS NOT NULL;");
+
	if (!all) {
+
		sql_exec(db->sqlite, "DELETE FROM pkgjobs WHERE "
+
		    "(SELECT p.origin FROM main.packages AS p WHERE PKGLT(p.version, pkgjobs.version)) IS NOT NULL; ");
+
		sql_exec(db->sqlite, "DELETE FROM pkgjobs WHERE "
+
		    "(SELECT p.origin FROM main.packages AS p WHERE "
+
		    "p.origin=pkgjobs.origin AND PKGLE(p.version,pkgjobs.version) AND p.name = pkgjobs.name "
+
		    "AND ( ((SELECT group_concat(option) FROM main.options WHERE package_id=p.id AND value='on') IS NULL AND pkgjobs.opts IS NULL) OR (SELECT group_concat(option) FROM main.options WHERE package_id=p.id AND value='on') == pkgjobs.opts)) IS NOT NULL;");
+
	}

	sbuf_reset(sql);
-
	sbuf_printf(sql, pkgjobs_sql_2, reponame, reponame);
+
	sbuf_printf(sql, pkgjobs_sql_2, reponame, reponame, reponame);
	sbuf_finish(sql);

	do {
@@ -2723,8 +2776,8 @@ pkgdb_rquery(struct pkgdb *db, const char *pattern, match_t match, const char *r
				"SELECT id, origin, name, version, comment, "
				"prefix, desc, arch, maintainer, www, "
				"licenselogic, flatsize, pkgsize, "
-
				"cksum, path AS repopath, '%s' AS dbname "
-
				"FROM '%s'.packages p";
+
				"cksum, path AS repopath, '%1$s' AS dbname "
+
				"FROM '%1$s'.packages p";

	assert(db != NULL);
	assert(match == MATCH_ALL || (pattern != NULL && pattern[0] != '\0'));
@@ -2744,7 +2797,7 @@ pkgdb_rquery(struct pkgdb *db, const char *pattern, match_t match, const char *r
	 */
	if (multirepos_enabled && !strcmp(reponame, "default")) {
		/* duplicate the query via UNION for all the attached databases */
-
		if (sql_on_all_attached_db(db->sqlite, sql, basesql) != EPKG_OK) {
+
		if (sql_on_all_attached_db(db->sqlite, sql, basesql, " UNION ALL ") != EPKG_OK) {
			sbuf_delete(sql);
			return (NULL);
		}
@@ -2819,8 +2872,8 @@ pkgdb_search(struct pkgdb *db, const char *pattern, match_t match, unsigned int
				"SELECT id, origin, name, version, comment, "
					"prefix, desc, arch, maintainer, www, "
					"licenselogic, flatsize, pkgsize, "
-
					"cksum, path, '%s' AS dbname "
-
					"FROM '%s'.packages ";
+
					"cksum, path, '%1$s' AS dbname "
+
					"FROM '%1$s'.packages ";

	assert(db != NULL);
	assert(pattern != NULL && pattern[0] != '\0');
@@ -2850,7 +2903,7 @@ pkgdb_search(struct pkgdb *db, const char *pattern, match_t match, unsigned int
			}
		} else {
			/* test on all the attached databases */
-
			if (sql_on_all_attached_db(db->sqlite, sql, multireposql) != EPKG_OK) {
+
			if (sql_on_all_attached_db(db->sqlite, sql, multireposql, " UNION ALL ") != EPKG_OK) {
				sbuf_delete(sql);
				return (NULL);
			}
@@ -3256,19 +3309,23 @@ static int
sqlcmd_init(sqlite3 *db, __unused const char **err, __unused const void *noused)
{
		sqlite3_create_function(db, "now", 0, SQLITE_ANY, NULL,
-
				pkgdb_now, NULL, NULL);
+
		    pkgdb_now, NULL, NULL);
		sqlite3_create_function(db, "myarch", 0, SQLITE_ANY, NULL,
-
				pkgdb_myarch, NULL, NULL);
+
		    pkgdb_myarch, NULL, NULL);
		sqlite3_create_function(db, "myarch", 1, SQLITE_ANY, NULL,
-
				pkgdb_myarch, NULL, NULL);
+
		    pkgdb_myarch, NULL, NULL);
		sqlite3_create_function(db, "regexp", 2, SQLITE_ANY, NULL,
-
				pkgdb_regex_basic, NULL, NULL);
+
		    pkgdb_regex_basic, NULL, NULL);
		sqlite3_create_function(db, "eregexp", 2, SQLITE_ANY, NULL,
-
				pkgdb_regex_extended, NULL, NULL);
+
		    pkgdb_regex_extended, NULL, NULL);
		sqlite3_create_function(db, "pkglt", 2, SQLITE_ANY, NULL,
-
				pkgdb_pkglt, NULL, NULL);
+
		    pkgdb_pkglt, NULL, NULL);
		sqlite3_create_function(db, "pkggt", 2, SQLITE_ANY, NULL,
-
				pkgdb_pkggt, NULL, NULL);
+
		    pkgdb_pkggt, NULL, NULL);
+
		sqlite3_create_function(db, "pkgge", 2, SQLITE_ANY, NULL,
+
		    pkgdb_pkgge, NULL, NULL);
+
		sqlite3_create_function(db, "pkgle", 2, SQLITE_ANY, NULL,
+
		    pkgdb_pkgle, NULL, NULL);

		return SQLITE_OK;
}
@@ -3298,6 +3355,7 @@ pkgshell_open(const char **reponame)
int
pkgdb_lock(struct pkgdb *db)
{
+
        assert(db != NULL);
	assert(db->lock_count >= 0);
	if (!(db->lock_count++))
		return sql_exec(db->sqlite, "PRAGMA main.locking_mode=EXCLUSIVE;BEGIN IMMEDIATE;COMMIT;");
@@ -3308,9 +3366,96 @@ pkgdb_lock(struct pkgdb *db)
int
pkgdb_unlock(struct pkgdb *db)
{
+
        assert(db != NULL);
	assert(db->lock_count >= 1);
	if (!(--db->lock_count))
		return sql_exec(db->sqlite, "PRAGMA main.locking_mode=NORMAL;BEGIN IMMEDIATE;COMMIT;");
	else
		return (EPKG_OK);
}
+

+
int64_t
+
pkgdb_stats(struct pkgdb *db, pkg_stats_t type)
+
{
+
	sqlite3_stmt *stmt = NULL;
+
	int64_t stats = 0;
+
	struct sbuf *sql = NULL;
+

+
	assert(db != NULL);
+

+
	sql = sbuf_new_auto();
+

+
	switch(type) {
+
	case PKG_STATS_LOCAL_COUNT:
+
		sbuf_printf(sql, "SELECT COUNT(id) FROM main.packages;");
+
		break;
+
	case PKG_STATS_LOCAL_SIZE:
+
		sbuf_printf(sql, "SELECT SUM(flatsize) FROM main.packages;");
+
		break;
+
	case PKG_STATS_REMOTE_UNIQUE:
+
		sbuf_printf(sql, "SELECT COUNT(c) FROM ");
+

+
		/* open parentheses for the compound statement */
+
		sbuf_printf(sql, "(");
+

+
		/* execute on all databases */
+
		sql_on_all_attached_db(db->sqlite, sql, "SELECT origin AS c FROM '%1$s'.packages", " UNION ");
+

+
		/* close parentheses for the compound statement */
+
		sbuf_printf(sql, ");");
+
		break;
+
	case PKG_STATS_REMOTE_COUNT:
+
		sbuf_printf(sql, "SELECT COUNT(c) FROM ");
+

+
		/* open parentheses for the compound statement */
+
		sbuf_printf(sql, "(");
+

+
		/* execute on all databases */
+
		sql_on_all_attached_db(db->sqlite, sql, "SELECT origin AS c FROM '%1$s'.packages", " UNION ALL ");
+

+
		/* close parentheses for the compound statement */
+
		sbuf_printf(sql, ");");
+
		break;
+
	case PKG_STATS_REMOTE_SIZE:
+
		sbuf_printf(sql, "SELECT SUM(s) FROM ");
+

+
		/* open parentheses for the compound statement */
+
		sbuf_printf(sql, "(");
+

+
		/* execute on all databases */
+
		sql_on_all_attached_db(db->sqlite, sql, "SELECT flatsize AS s FROM '%1$s'.packages", " UNION ALL ");
+

+
		/* close parentheses for the compound statement */
+
		sbuf_printf(sql, ");");
+
		break;
+
	case PKG_STATS_REMOTE_REPOS:
+
		sbuf_printf(sql, "SELECT COUNT(c) FROM ");
+

+
		/* open parentheses for the compound statement */
+
		sbuf_printf(sql, "(");
+

+
		/* execute on all databases */
+
		sql_on_all_attached_db(db->sqlite, sql, "SELECT '%1$s' AS c", " UNION ALL ");
+

+
		/* close parentheses for the compound statement */
+
		sbuf_printf(sql, ");");
+
		break;
+
	}
+

+
	if (sqlite3_prepare_v2(db->sqlite, sbuf_data(sql), -1, &stmt, NULL) != SQLITE_OK) {
+
		sbuf_free(sql);
+
		ERROR_SQLITE(db->sqlite);
+
		return (-1);
+
	}
+

+
	while (sqlite3_step(stmt) != SQLITE_DONE) {
+
		stats = sqlite3_column_int64(stmt, 0);
+
	}
+

+

+
	sbuf_finish(sql);
+
	sbuf_free(sql);
+
	sqlite3_finalize(stmt);
+

+
	return (stats);
+
}
modified libpkg/rsa.c
@@ -129,6 +129,11 @@ rsa_sign(char *path, pem_password_cb *password_cb, char *rsa_key_path,
	OpenSSL_add_all_ciphers();

	rsa = _load_rsa_private_key(rsa_key_path, password_cb);
+
	if (rsa == NULL) {
+
		pkg_emit_error("can't load key from %s", rsa_key_path);
+
		return EPKG_FATAL;
+
	}
+

	max_len = RSA_size(rsa);
	*sigret = calloc(1, max_len + 1);

modified libpkg/usergroup.c
@@ -32,7 +32,7 @@
#include <libutil.h>
#include <string.h>

-
#if __FreeBSD_version < 1000003
+
#ifndef HAVE_GRUTILS
#include "private/gr_util.h"
#endif
#include "pkg.h"
modified pkg-static/Makefile
@@ -1,5 +1,6 @@
PROG=pkg-static

+
CFLAGS+=	-DSTATIC_LINKAGE
STATIC_PKGNG=	yes
NO_SHARED?=	yes
NO_MAN=		yes
modified pkg/Makefile
@@ -26,7 +26,8 @@ SRCS= add.c \
		version.c \
		which.c \
		fetch.c \
-
		shell.c
+
		shell.c \
+
		stats.c

PREFIX?=	/usr/local
BINDIR=		${PREFIX}/sbin
@@ -70,6 +71,7 @@ MAN= pkg.8 \
	pkg-set.8 \
	pkg-shell.8 \
	pkg-shlib.8 \
+
	pkg-stats.8 \
	pkg-update.8 \
	pkg-updating.8 \
	pkg-upgrade.8 \
@@ -77,6 +79,7 @@ MAN= pkg.8 \
	pkg-which.8 \
	pkg.conf.5

-
MLINKS=	pkg-delete.8 pkg-remove.8
+
MLINKS=	pkg-delete.8 pkg-remove.8 \
+
	pkg.8 pkg-static.8

.include <bsd.prog.mk>
modified pkg/audit.c
@@ -332,8 +332,11 @@ exec_audit(int argc, char **argv)
	}
	snprintf(audit_file, sizeof(audit_file), "%s/auditfile", db_dir);

-
	while ((ch = getopt(argc, argv, "F")) != -1) {
+
	while ((ch = getopt(argc, argv, "qF")) != -1) {
		switch (ch) {
+
			case 'q':
+
				quiet = true;
+
				break;
			case 'F':
				fetch = true;
				break;
modified pkg/clean.c
@@ -101,13 +101,13 @@ exec_clean(int argc, char **argv)
			continue;
		}

-
		ret = pkgdb_it_next(it, &p, PKG_LOAD_BASIC);
-
		to_delete = false;
-
		pkg_get(p, PKG_REPOPATH, &pkgrepopath);
-
		if (ret == EPKG_FATAL) {
+
		if ((ret = pkgdb_it_next(it, &p, PKG_LOAD_BASIC)) == EPKG_FATAL) {
			warnx("skipping %s", ent->fts_path);
			continue;
-
		} else if (ret == EPKG_END) {
+
		}
+
		to_delete = false;
+
		pkg_get(p, PKG_REPOPATH, &pkgrepopath);
+
		if (ret == EPKG_END) {
			to_delete = true;
			printf("%s does not exist anymore, deleting it\n", repopath);
		} else if (strcmp(repopath, pkgrepopath)) {
modified pkg/create.c
@@ -3,7 +3,7 @@
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2011 Will Andrews <will@FreeBSD.org>
 * All rights reserved.
-
 * 
+
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
@@ -13,7 +13,7 @@
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
-
 * 
+
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -27,6 +27,7 @@
 */

#include <sys/param.h>
+
#include <sys/queue.h>

#include <err.h>
#include <stdio.h>
@@ -37,6 +38,13 @@

#include "pkgcli.h"

+
struct pkg_entry {
+
	struct pkg *pkg;
+
	STAILQ_ENTRY(pkg_entry) next;
+
};
+

+
STAILQ_HEAD(pkg_head, pkg_entry);
+

void
usage_create(void)
{
@@ -53,6 +61,8 @@ pkg_create_matches(int argc, char **argv, match_t match, pkg_formats fmt, const
	struct pkgdb *db = NULL;
	struct pkgdb_it *it = NULL;
	struct pkg *pkg = NULL;
+
	struct pkg_head head = STAILQ_HEAD_INITIALIZER(head);
+
	struct pkg_entry *e = NULL;
	const char *name, *version;
	char pkgpath[MAXPATHLEN];
	int query_flags = PKG_LOAD_DEPS | PKG_LOAD_FILES | PKG_LOAD_CATEGORIES |
@@ -81,52 +91,50 @@ pkg_create_matches(int argc, char **argv, match_t match, pkg_formats fmt, const
			break;
	}

-

-
	if (match != MATCH_ALL) {
-
		for (i = 0;i < argc; i++) {
-
			if ((it = pkgdb_query(db, argv[i], match)) == NULL) {
+
	for (i = 0; i < argc || match == MATCH_ALL; i++) {
+
		if (match == MATCH_ALL) {
+
			printf("Loading package list...\n");
+
			if ((it = pkgdb_query(db, NULL, match)) == NULL)
				goto cleanup;
-
			}
-
			while ((ret = pkgdb_it_next(it, &pkg, query_flags)) == EPKG_OK) {
-
				pkg_get(pkg, PKG_NAME, &name, PKG_VERSION, &version);
-
				if (!overwrite) {
-
					snprintf(pkgpath, MAXPATHLEN, "%s/%s-%s.%s", outdir, name, version, format);
-
					if (access(pkgpath, F_OK) == 0) {
-
						printf("%s-%s already packaged skipping...\n", name, version);
-
						continue;
-
					}
-
				}
-
				printf("Creating package for %s-%s\n", name, version);
-
				if (pkg_create_installed(outdir, fmt, rootdir, pkg) != EPKG_OK)
-
					retcode++;
-
			}
-
		}
-
	} else {
-
		if ((it = pkgdb_query(db, NULL, match)) == NULL) {
-
			goto cleanup;
-
		}
+
			match = !MATCH_ALL;
+
		} else
+
			if ((it = pkgdb_query(db, argv[i], match)) == NULL)
+
				goto cleanup;
+

		while ((ret = pkgdb_it_next(it, &pkg, query_flags)) == EPKG_OK) {
-
			pkg_get(pkg, PKG_NAME, &name, PKG_VERSION, &version);
-
			if (!overwrite) {
-
				snprintf(pkgpath, MAXPATHLEN, "%s/%s-%s.%s", outdir, name, version, format);
-
				if (access(pkgpath, F_OK) == 0) {
-
					printf("%s-%s already packaged skipping...\n", name, version);
-
					continue;
-
				}
-
			}
-
			printf("Creating package for %s-%s\n", name, version);
-
			if (pkg_create_installed(outdir, fmt, rootdir, pkg) != EPKG_OK)
-
				retcode++;
+
			if ((e = malloc(sizeof(struct pkg_entry))) == NULL)
+
				err(1, "malloc(pkg_entry)");
+
			e->pkg = pkg;
+
			pkg = NULL;
+
			STAILQ_INSERT_TAIL(&head, e, next);
		}
+
		pkgdb_it_free(it);
+
		if (ret != EPKG_END)
+
			retcode++;
	}

-
cleanup:
-
	if (ret != EPKG_END) {
-
		retcode++;
+
	while (!STAILQ_EMPTY(&head)) {
+
		e = STAILQ_FIRST(&head);
+
		STAILQ_REMOVE_HEAD(&head, next);
+

+
		pkg_get(e->pkg, PKG_NAME, &name, PKG_VERSION, &version);
+
		if (!overwrite) {
+
			snprintf(pkgpath, MAXPATHLEN, "%s/%s-%s.%s", outdir, name, version, format);
+
			if (access(pkgpath, F_OK) == 0) {
+
				printf("%s-%s already packaged skipping...\n", name, version);
+
				pkg_free(e->pkg);
+
				free(e);
+
				continue;
+
			}
+
		}
+
		printf("Creating package for %s-%s\n", name, version);
+
		if (pkg_create_installed(outdir, fmt, rootdir, e->pkg) != EPKG_OK)
+
			retcode++;
+
		pkg_free(e->pkg);
+
		free(e);
	}

-
	pkg_free(pkg);
-
	pkgdb_it_free(it);
+
cleanup:
	pkgdb_close(db);

	return (retcode);
modified pkg/delete.c
@@ -59,7 +59,7 @@ exec_delete(int argc, char **argv)
	int retcode = 1;
	int recursive = 0;

-
	while ((ch = getopt(argc, argv, "agxXfyr")) != -1) {
+
	while ((ch = getopt(argc, argv, "aqgxXfyr")) != -1) {
		switch (ch) {
			case 'a':
				match = MATCH_ALL;
modified pkg/event.c
@@ -144,7 +144,7 @@ event_callback(void *data, struct pkg_event *ev)
		pkg_get(pkg, PKG_NAME, &name, PKG_VERSION, &version);
		fprintf(stderr, "%s-%s is required by:", name, version);
		while (pkg_rdeps(pkg, &dep) == EPKG_OK) {
-
			fprintf(stderr, " %s", pkg_dep_get(dep, PKG_DEP_ORIGIN));
+
			fprintf(stderr, " %s-%s", pkg_dep_get(dep, PKG_DEP_NAME), pkg_dep_get(dep, PKG_DEP_VERSION));
		}
		if (ev->e_required.force == 1)
			fprintf(stderr, ", deleting anyway\n");
modified pkg/main.c
@@ -80,6 +80,7 @@ static struct commands {
	{ "rquery", "Query information from the remote repository", exec_rquery, usage_rquery},
	{ "shell", "Open a debug shell", exec_shell, usage_shell},
	{ "shlib", "Displays which package links against a specific shared library", exec_shlib, usage_shlib},
+
	{ "stats", "Display package database statistics", exec_stats, usage_stats},
	{ "update", "Updates remote package repository databases", exec_update, usage_update},
	{ "updating", "Displays UPDATING information for a package", exec_updating, usage_updating},
	{ "upgrade", "Performs upgrades of package software distributions", exec_upgrade, usage_upgrade},
modified pkg/pkg-add.8
@@ -74,6 +74,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-audit.8
@@ -23,7 +23,7 @@
.Nd Audits installed packages against known vulnerabilities.
.Sh SYNOPSIS
.Nm
-
.Op Fl F
+
.Op Fl Fq
.Ar <pkg-name>
.Sh DESCRIPTION
.Nm
@@ -56,6 +56,10 @@ The following options are supported by
.Bl -tag -width F1
.It Fl F
Fetch the database before checking.
+
.It Fl q
+
Be ``quiet''.
+
Prints only the requested information without
+
displaying many hints.
.El
.Sh ENVIRONMENT
The following environment variables affect the execution of
@@ -91,6 +95,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-autoremove.8
@@ -71,6 +71,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-backup.8
@@ -81,6 +81,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-check.8
@@ -94,6 +94,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-clean.8
@@ -60,6 +60,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-create.8
@@ -220,6 +220,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-delete.8
@@ -84,6 +84,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-fetch.8
@@ -107,6 +107,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-info.8
@@ -138,6 +138,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-install.8
@@ -118,6 +118,7 @@ See
.Xr pkg-set 8,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-query.8
@@ -169,6 +169,18 @@ Expands to the list of scripts for the matching packages - install, deinstall, e
Expands to the list of shared libraries used by programs from the matched package.
.El
.Sh EVALUATION FORMAT
+
Packages can be selected by using expressions comparing
+
.Ar Variables
+
(see below) to string or integer values. The mode of comparison is specified
+
by the
+
.Ar Operator
+
(also listed below).
+
Expressions can be combined using && (for and) and || (for or).
+
Parentheses can be used for grouping in the usual manner.
+

+
String values are either any text not containing whitespace (possibly
+
followed by but not including whitespace) or any text enclosed in single or
+
double quotes.
.Ss Variables
.Bl -tag -width F1
.It Cm \&%n
@@ -193,6 +205,11 @@ Message of the package (type string)
Timestamp that the package was installed (type integer)
.It Cm \&%i
Additionnal information about the package (type string)
+
.It Cm \&%# Ns Op drCFODLUGB
+
Number of elements in the list of information (type integer).
+
See
+
.Cm %?
+
above for what information is used.
.El
.Ss Operators
.Bl -tag -width F1
@@ -203,7 +220,9 @@ Integer comparison
.It Cm < Ns Op =
Integer comparison
.It Cm = Ns Op =
-
Integer or string comparison
+
Integer or string equality comparison
+
.It Cm !=
+
Integer or string inequality comparison
.El
.Sh ENVIRONMENT
The following environment variables affect the execution of
@@ -237,6 +256,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-register.8
@@ -84,6 +84,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-repo.8
@@ -83,6 +83,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-rquery.8
@@ -168,6 +168,11 @@ Flatsize of the package (type integer)
Automatic status of the package (type integer)
.It Cm \&%M
Message of the package (type string)
+
.It Cm \&%# Ns Op drCOLB
+
Number of elements in the list of information (type integer).
+
See
+
.Cm %?
+
above for what information is used.
.El
.Ss Operators
.Bl -tag -width F1
@@ -212,6 +217,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-search.8
@@ -121,6 +121,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-set.8
@@ -75,6 +75,7 @@ See
.Xr pkg-search 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-shell.8
@@ -60,6 +60,7 @@ See
.Xr pkg-search 8 ,
.Xr pkg-set 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-shlib.8
@@ -70,6 +70,7 @@ See
.Xr pkg-search 8 ,
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
added pkg/pkg-stats.8
@@ -0,0 +1,75 @@
+
.\"
+
.\" FreeBSD pkg - a next generation package for the installation and maintenance
+
.\" of non-core utilities.
+
.\"
+
.\" Redistribution and use in source and binary forms, with or without
+
.\" modification, are permitted provided that the following conditions
+
.\" are met:
+
.\" 1. Redistributions of source code must retain the above copyright
+
.\"    notice, this list of conditions and the following disclaimer.
+
.\" 2. Redistributions in binary form must reproduce the above copyright
+
.\"    notice, this list of conditions and the following disclaimer in the
+
.\"    documentation and/or other materials provided with the distribution.
+
.\"
+
.\"
+
.\"     @(#)pkg.8
+
.\" $FreeBSD$
+
.\"
+
.Dd June 24, 2012
+
.Dt PKG-STATS 8
+
.Os
+
.Sh NAME
+
.Nm "pkg stats"
+
.Nd package database statistics
+
.Sh SYNOPSIS
+
.Nm
+
.Op Fl q
+
.Sh DESCRIPTION
+
.Nm
+
is used to display different statistics about the package databases.
+
.Sh OPTIONS
+
The following options are supported by
+
.Nm :
+
.Bl -tag -width F1
+
.It Fl q
+
Quiet mode.
+
Show less output.
+
.El
+
.Sh ENVIRONMENT
+
The following environment variables affect the execution of
+
.Nm .
+
See
+
.Xr pkg.conf 5
+
for further description.
+
.Bl -tag -width ".Ev NO_DESCRIPTIONS"
+
.El
+
.Sh FILES
+
See
+
.Xr pkg.conf 5 .
+
.Sh SEE ALSO
+
.Xr pkg-set 8 ,
+
.Xr pkg 8 ,
+
.Xr pkg-add 8 ,
+
.Xr pkg-audit 8 ,
+
.Xr pkg-autoremove 8 ,
+
.Xr pkg-backup 8 ,
+
.Xr pkg-clean 8 ,
+
.Xr pkg-create 8 ,
+
.Xr pkg-delete 8 ,
+
.Xr pkg-fetch 8 ,
+
.Xr pkg-info 8 ,
+
.Xr pkg-install 8 ,
+
.Xr pkg-query 8 ,
+
.Xr pkg-register 8 ,
+
.Xr pkg-repo 8 ,
+
.Xr pkg-rquery 8 ,
+
.Xr pkg-search 8 ,
+
.Xr pkg-set 8 ,
+
.Xr pkg-shell 8 ,
+
.Xr pkg-shlib 8 ,
+
.Xr pkg-update 8 ,
+
.Xr pkg-updating 8 ,
+
.Xr pkg-upgrade 8 ,
+
.Xr pkg-version 8 ,
+
.Xr pkg-which 8 ,
+
.Xr pkg.conf 5
modified pkg/pkg-update.8
@@ -88,6 +88,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
.Xr pkg-version 8 ,
modified pkg/pkg-updating.8
@@ -96,6 +96,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-upgrade 8 ,
.Xr pkg-version 8 ,
modified pkg/pkg-upgrade.8
@@ -94,6 +94,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-version 8 ,
modified pkg/pkg-version.8
@@ -121,6 +121,7 @@ See
.Xr pkg-set 8,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg-which.8
@@ -71,6 +71,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg.8
@@ -20,7 +20,8 @@
.Os
.\" ---------------------------------------------------------------------------
.Sh NAME
-
.Nm pkg
+
.Nm pkg ,
+
.Nm pkg-static
.Nd a utility for manipulating packages
.\" ---------------------------------------------------------------------------
.Sh SYNOPSIS
@@ -33,6 +34,15 @@
.Sh DESCRIPTION
provides an interface for manupulating packages - registering,
adding, removing and upgrading of packages.
+
.Nm pkg-static
+
is a statically linked variant of
+
.Nm
+
typically only used for the initial installation of 
+
.Nm .
+
There are some differences in functionality.
+
See
+
.Xr pkg.conf 5
+
for details.
.\" ---------------------------------------------------------------------------
.Sh OPTIONS
The following options are supported by
@@ -110,9 +120,6 @@ Query information about installed packages.
Register a package in the database.
.It Ic repo
Create a local package repository for remote usage.
-
.It Ic shell
-
Fires up a sqlite shell to the local or remote database.
-
Extreme care should be taken when using this command.
.It Ic rquery
Query information for remote repositories.
.It Ic search
@@ -120,8 +127,13 @@ Search for the given pattern in the remote package
repositories.
.It Ic set
Modify information in the installed database.
+
.It Ic shell
+
Fires up a sqlite shell to the local or remote database.
+
Extreme care should be taken when using this command.
.It Ic shlib
Displays which packages link to a specific shared library.
+
.It Ic stats
+
Display package database statistics.
.It Ic update
Update the available remote repositories as listed in
.Xr pkg.conf 5 .
@@ -166,6 +178,7 @@ See
.Xr pkg-set 8 ,
.Xr pkg-shell 8 ,
.Xr pkg-shlib 8 ,
+
.Xr pkg-stats 8 ,
.Xr pkg-update 8 ,
.Xr pkg-updating 8 ,
.Xr pkg-upgrade 8 ,
modified pkg/pkg.conf.5
@@ -104,10 +104,20 @@ This option is enabled by default, log all the
installation/deinstallation/upgrade operation via syslog(3)
.It Cm SHLIBS: boolean
Analyse elf and track all shared libraries needed by the packages.
+
This option is silently ignored by
+
.Xr pkg-static 8
+
since it relies on
+
.Xr dlopen 3
+
which is unavailable to statically linked programs.
default: off
.It Cm AUTODEPS: boolean
Analyse the elf to add dependencies (shared libraries) that may have been
forgotten by the maintainer.
+
This option is silently ignored by
+
.Xr pkg-static 8
+
since it relies on
+
.Xr dlopen 3
+
which is unavailable to statically linked programs.
default: off
.It Cm ABI: string
the abi of the package you want to install, by default the /bin/sh abi is used
modified pkg/pkg.conf.sample
@@ -3,22 +3,22 @@
# options please refer to the pkg.conf(5) man page

# Configuration options
-
PACKAGESITE	    : ftp://ftp.freebsd.org/pub/pkgng
-
PKG_DBDIR	    : /var/db/pkg
-
PKG_CACHEDIR	    : /var/cache/pkg
-
PORTSDIR	    : /usr/ports
-
PUBKEY		    : /etc/ssl/pkg.conf
-
HANDLE_RC_SCRIPTS   : NO
-
PKG_MULTIREPOS	    : NO
-
ASSUME_ALWAYS_YES   : NO
-
SYSLOG		    : YES
-
SHLIBS		    : NO
-
AUTODEPS	    : NO
-
PORTAUDIT_SITE	    : http://portaudit.FreeBSD.org/auditfile.tbz
+
PACKAGESITE	    : http://pkgbeta.freebsd.org/freebsd-9-amd64
+
#PKG_DBDIR	    : /var/db/pkg
+
#PKG_CACHEDIR	    : /var/cache/pkg
+
#PORTSDIR	    : /usr/ports
+
#PUBKEY		    : /etc/ssl/pkg.conf
+
#HANDLE_RC_SCRIPTS   : NO
+
#PKG_MULTIREPOS	    : NO
+
#ASSUME_ALWAYS_YES   : NO
+
#SYSLOG		    : YES
+
#SHLIBS		    : NO
+
#AUTODEPS	    : NO
+
#PORTAUDIT_SITE	    : http://portaudit.FreeBSD.org/auditfile.tbz

# Repository definitions
-
repos:
-
  default : http://example.org/pkgng/
-
  repo1 : http://somewhere.org/pkgng/repo1/
-
  repo2 : http://somewhere.org/pkgng/repo2/
+
#repos:
+
#  default : http://example.org/pkgng/
+
#  repo1 : http://somewhere.org/pkgng/repo1/
+
#  repo2 : http://somewhere.org/pkgng/repo2/

modified pkg/pkgcli.h
@@ -99,6 +99,10 @@ int exec_shlib(int, char **);
void usage_shlib(void);
char *sanitize(char *, const char *, size_t);

+
/* pkg stats */
+
int exec_stats(int, char **);
+
void usage_stats(void);
+

/* pkg update */
int exec_update(int, char **);
void usage_update(void);
@@ -171,20 +175,8 @@ struct query_flags {
	const int dbflags;
};

-
typedef enum {
-
	NONE,
-
	NEXT_IS_INT,
-
	OPERATOR_INT,
-
	INT,
-
	NEXT_IS_STRING,
-
	OPERATOR_STRING,
-
	STRING,
-
	QUOTEDSTRING,
-
	SQUOTEDSTRING
-
} type_t;
-

void print_query(struct pkg *pkg, char *qstr, char multiline);
-
int format_sql_condition(const char *str, struct sbuf *sqlcond);
+
int format_sql_condition(const char *str, struct sbuf *sqlcond, bool for_remote);
int analyse_query_string(char *qstr, struct query_flags *q_flags, const unsigned int q_flags_len, int *flags, char *multiline);

#endif
modified pkg/query.c
@@ -356,7 +356,7 @@ print_query(struct pkg *pkg, char *qstr, char multiline)
			}
			break;
		case 'G':
-
			while (pkg_users(pkg, &user) == EPKG_OK) {
+
			while (pkg_groups(pkg, &group) == EPKG_OK) {
				format_str(pkg, output, qstr, group);
				printf("%s\n", sbuf_data(output));
			}
@@ -381,16 +381,27 @@ print_query(struct pkg *pkg, char *qstr, char multiline)
	sbuf_delete(output);
}

+
typedef enum {
+
	NONE,
+
	NEXT_IS_INT,
+
	OPERATOR_INT,
+
	INT,
+
	NEXT_IS_STRING,
+
	OPERATOR_STRING,
+
	STRING,
+
	QUOTEDSTRING,
+
	SQUOTEDSTRING,
+
	POST_EXPR,
+
} state_t;
+

int
-
format_sql_condition(const char *str, struct sbuf *sqlcond)
+
format_sql_condition(const char *str, struct sbuf *sqlcond, bool for_remote)
{
-
	type_t state = NONE;
+
	state_t state = NONE;
+
	unsigned int bracket_level = 0;
+

	sbuf_cat(sqlcond, " WHERE ");
	while (str[0] != '\0') {
-
		if (str[0] == ';') {
-
			fprintf(stderr, "';' is forbidden in evaluation format");
-
			return (EPKG_FATAL);
-
		}
		if (state == NONE) {
			if (str[0] == '%') {
				str++;
@@ -424,64 +435,146 @@ format_sql_condition(const char *str, struct sbuf *sqlcond)
						state = OPERATOR_INT;
						break;
					case 'a':
+
						if (for_remote)
+
							goto bad_option;
						sbuf_cat(sqlcond, "automatic");
						state = OPERATOR_INT;
						break;
					case 'M':
+
						if (for_remote)
+
							goto bad_option;
						sbuf_cat(sqlcond, "message");
						state = OPERATOR_STRING;
						break;
					case 'i':
+
						if (for_remote)
+
							goto bad_option;
						sbuf_cat(sqlcond, "infos");
						state = OPERATOR_STRING;
						break;
					case 't':
+
						if (for_remote)
+
							goto bad_option;
						sbuf_cat(sqlcond, "time");
						state = OPERATOR_INT;
						break;
+
					case '#':
+
						str++;
+
						const char *dbstr = for_remote ? "%1$s." : "";
+
						switch (str[0]) {
+
							case 'd':
+
								sbuf_printf(sqlcond, "(SELECT COUNT(*) FROM %sdeps AS d WHERE d.package_id=p.id)", dbstr);
+
								break;
+
							case 'r':
+
								sbuf_printf(sqlcond, "(SELECT COUNT(*) FROM %sdeps AS d WHERE d.origin=p.origin)", dbstr);
+
								break;
+
							case 'C':
+
								sbuf_printf(sqlcond, "(SELECT COUNT(*) FROM %spkg_categories AS d WHERE d.package_id=p.id)", dbstr);
+
								break;
+
							case 'F':
+
								if (for_remote)
+
									goto bad_option;
+
								sbuf_printf(sqlcond, "(SELECT COUNT(*) FROM %sfiles AS d WHERE d.package_id=p.id)", dbstr);
+
								break;
+
							case 'O':
+
								sbuf_printf(sqlcond, "(SELECT COUNT(*) FROM %soptions AS d WHERE d.package_id=p.id)", dbstr);
+
								break;
+
							case 'D':
+
								if (for_remote)
+
									goto bad_option;
+
								sbuf_printf(sqlcond, "(SELECT COUNT(*) FROM %spkg_directories AS d WHERE d.package_id=p.id)", dbstr);
+
								break;
+
							case 'L':
+
								sbuf_printf(sqlcond, "(SELECT COUNT(*) FROM %spkg_licenses AS d WHERE d.package_id=p.id)", dbstr);
+
								break;
+
							case 'U':
+
								if (for_remote)
+
									goto bad_option;
+
								sbuf_printf(sqlcond, "(SELECT COUNT(*) FROM %spkg_users AS d WHERE d.package_id=p.id)", dbstr);
+
								break;
+
							case 'G':
+
								if (for_remote)
+
									goto bad_option;
+
								sbuf_printf(sqlcond, "(SELECT COUNT(*) FROM %spkg_groups AS d WHERE d.package_id=p.id)", dbstr);
+
								break;
+
							case 'B':
+
								sbuf_printf(sqlcond, "(SELECT COUNT(*) FROM %spkg_shlibs AS d WHERE d.package_id=p.id)", dbstr);
+
								break;
+
							default:
+
								goto bad_option;
+
						}
+
						state = OPERATOR_INT;
+
						break;
					default:
-
						fprintf(stderr, "malformed evaluation string");
+
bad_option:
+
						fprintf(stderr, "malformed evaluation string\n");
						return (EPKG_FATAL);
				}
			} else {
				switch (str[0]) {
					case '(':
-
					case ')':
+
						bracket_level++;
+
						sbuf_putc(sqlcond, str[0]);
+
						break;
					case ' ':
					case '\t':
-
						sbuf_putc(sqlcond, str[0]);
						break;
-
					case '|':
-
						if (str[1] == '|') {
-
							str++;
-
							sbuf_cat(sqlcond, " OR ");
-
							break;
-
						}
-
					case '&':
-
						if (str[1] == '&') {
-
							str++;
-
							sbuf_cat(sqlcond, " AND ");
-
							break;
-
						}
					default:
						fprintf(stderr, "unexpected character: %c\n", str[0]);
						return (EPKG_FATAL);
				}
			}
+
		} else if (state == POST_EXPR) {
+
			switch (str[0]) {
+
				case ')':
+
					if (bracket_level == 0) {
+
						fprintf(stderr, "too many closing brackets.\n");
+
						return (EPKG_FATAL);
+
					}
+
					bracket_level--;
+
					sbuf_putc(sqlcond, str[0]);
+
					break;
+
				case ' ':
+
				case '\t':
+
					break;
+
				case '|':
+
					if (str[1] == '|') {
+
						str++;
+
						state = NONE;
+
						sbuf_cat(sqlcond, " OR ");
+
						break;
+
					} else {
+
						fprintf(stderr, "unexpected character %c\n", str[1]);
+
						return (EPKG_FATAL);
+
					}
+
				case '&':
+
					if (str[1] == '&') {
+
						str++;
+
						state = NONE;
+
						sbuf_cat(sqlcond, " AND ");
+
						break;
+
					} else {
+
						fprintf(stderr, "unexpected character %c\n", str[1]);
+
						return (EPKG_FATAL);
+
					}
+
				default:
+
					fprintf(stderr, "unexpected character %c\n", str[0]);
+
					return (EPKG_FATAL);
+
			}
		} else if (state == OPERATOR_STRING || state == OPERATOR_INT) {
			/* only operators or space are allowed here */
			if (isspace(str[0])) {
-
				sbuf_putc(sqlcond, str[0]);
-
			} else if (str[0] == '~') {
+
				/* do nothing */
+
			} else if (str[0] == '~' ) {
				if (state != OPERATOR_STRING) {
-
					fprintf(stderr, "~ expected only for string testing");
+
					fprintf(stderr, "~ expected only for string testing\n");
					return (EPKG_FATAL);
				}
				state = NEXT_IS_STRING;
				sbuf_cat(sqlcond, " GLOB ");
			} else if (str[0] == '>' || str[0] == '<') {
				if (state != OPERATOR_INT) {
-
					fprintf(stderr, "> expected only for integers");
+
					fprintf(stderr, "> expected only for integers\n");
					return (EPKG_FATAL);
				}
				state = NEXT_IS_INT;
@@ -503,7 +596,7 @@ format_sql_condition(const char *str, struct sbuf *sqlcond)
				}
			} else if (str[0] == '!') {
				if (str[1] != '=') {
-
					fprintf(stderr, "expecting = after !");
+
					fprintf(stderr, "expecting = after !\n");
					return (EPKG_FATAL);
				}
				if (state == OPERATOR_STRING) {
@@ -514,10 +607,13 @@ format_sql_condition(const char *str, struct sbuf *sqlcond)
				sbuf_putc(sqlcond, str[0]);
				str++;
				sbuf_putc(sqlcond, str[0]);
+
			} else {
+
				fprintf(stderr, "an operator is expected, got %c\n", str[0]);
+
				return (EPKG_FATAL);
			}
		} else if (state == NEXT_IS_STRING || state == NEXT_IS_INT) {
			if (isspace(str[0])) {
-
				sbuf_putc(sqlcond, str[0]);
+
				/* do nothing */
			} else {
				if (state == NEXT_IS_STRING) {
					if (str[0] == '"') {
@@ -525,10 +621,10 @@ format_sql_condition(const char *str, struct sbuf *sqlcond)
					} else if (str[0] == '\'') {
						state = SQUOTEDSTRING;
					} else {
-
						sbuf_putc(sqlcond, '"');
						state = STRING;
+
						str--;
					}
-
					sbuf_putc(sqlcond, str[0]);
+
					sbuf_putc(sqlcond, '\'');
				} else {
					if (!isnumber(str[0])) {
						fprintf(stderr, "a number is expected, got: %c\n", str[0]);
@@ -539,32 +635,40 @@ format_sql_condition(const char *str, struct sbuf *sqlcond)
				}
			}
		} else if (state == INT) {
-
			if (isspace(str[0])) {
-
				state = NONE;
-
			} else if (!isnumber(str[0])) {
-
				fprintf(stderr, "a number is expected, got: %c\n", str[0]);
-
				return (EPKG_FATAL);
+
			if (!isnumber(str[0])) {
+
				state = POST_EXPR;
+
				str--;
+
			} else {
+
				sbuf_putc(sqlcond, str[0]);
			}
-
			sbuf_putc(sqlcond, str[0]);
-
		} else if (state == STRING) {
-
			if (isspace(str[0])) {
-
				sbuf_putc(sqlcond, '"');
-
				state = NONE;
+
		} else if (state == STRING || state == QUOTEDSTRING || state == SQUOTEDSTRING) {
+
			if ((state == STRING && isspace(str[0])) ||
+
			    (state == QUOTEDSTRING && str[0] == '"') ||
+
			    (state == SQUOTEDSTRING && str[0] == '\'')) {
+
				sbuf_putc(sqlcond, '\'');
+
				state = POST_EXPR;
+
			} else {
+
				sbuf_putc(sqlcond, str[0]);
+
				if (str[0] == '\'')
+
					sbuf_putc(sqlcond, str[0]);
+
				else if (str[0] == '%' && for_remote)
+
					sbuf_putc(sqlcond, str[0]);
			}
-
			sbuf_putc(sqlcond, str[0]);
-
		} else if (state == QUOTEDSTRING) {
-
			if (str[0] == '"')
-
				state = NONE;
-
			sbuf_putc(sqlcond, str[0]);
-
		} else if (state == SQUOTEDSTRING) {
-
			if (str[0] == '"')
-
				state = NONE;
-
			sbuf_putc(sqlcond, str[0]);
		}
		str++;
	}
-
	if (state == STRING)
-
		sbuf_putc(sqlcond, '"');
+
	if (state == STRING) {
+
		sbuf_putc(sqlcond, '\'');
+
		state = POST_EXPR;
+
	}
+

+
	if (state != POST_EXPR && state != INT) {
+
		fprintf(stderr, "unexpected end of expression\n");
+
		return (EPKG_FATAL);
+
	} else if (bracket_level > 0) {
+
		fprintf(stderr, "unexpected end of expression (too many open brackets)\n");
+
		return (EPKG_FATAL);
+
	}

	return (EPKG_OK);
}
@@ -737,7 +841,7 @@ exec_query(int argc, char **argv)

	if (condition != NULL) {
		sqlcond = sbuf_new_auto();
-
		if (format_sql_condition(condition, sqlcond) != EPKG_OK) {
+
		if (format_sql_condition(condition, sqlcond, false) != EPKG_OK) {
			sbuf_delete(sqlcond);
			return (EX_USAGE);
		}
modified pkg/rquery.c
@@ -139,7 +139,7 @@ exec_rquery(int argc, char **argv)

	if (condition != NULL) {
		sqlcond = sbuf_new_auto();
-
		if (format_sql_condition(condition, sqlcond) != EPKG_OK)
+
		if (format_sql_condition(condition, sqlcond, true) != EPKG_OK)
			return (EX_USAGE);
		sbuf_finish(sqlcond);
	}
added pkg/stats.c
@@ -0,0 +1,94 @@
+
/*
+
 * Copyright (c) 2011-2012 Marin Atanasov Nikolov <dnaeon@gmail.com>
+
 * All rights reserved.
+
 * 
+
 * Redistribution and use in source and binary forms, with or without
+
 * modification, are permitted provided that the following conditions
+
 * are met:
+
 * 1. Redistributions of source code must retain the above copyright
+
 *    notice, this list of conditions and the following disclaimer
+
 *    in this position and unchanged.
+
 * 2. Redistributions in binary form must reproduce the above copyright
+
 *    notice, this list of conditions and the following disclaimer in the
+
 *    documentation and/or other materials provided with the distribution.
+
 * 
+
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
 */
+

+
#include <stdio.h>
+
#include <sysexits.h>
+
#include <unistd.h>
+
#include <inttypes.h>
+
#include <libutil.h>
+

+
#include <pkg.h>
+

+
#include "pkgcli.h"
+

+
void
+
usage_stats(void)
+
{
+
	fprintf(stderr, "usage: pkg stats [-q]\n\n");
+
	fprintf(stderr, "For more information see 'pkg help stats'.\n");
+
}
+

+
int
+
exec_stats(int argc, char **argv)
+
{
+
	struct pkgdb *db = NULL;
+
	int64_t flatsize = 0;
+
	char size[7];
+
	int retcode = EX_OK;
+
	int ch;
+

+
	while ((ch = getopt(argc, argv, "q")) != -1) {
+
                switch (ch) {
+
		case 'q':
+
			quiet = true;
+
			break;
+
		default:
+
			usage_stats();
+
			return (EX_USAGE);
+
                }
+
        }
+
        argc -= optind;
+
        argv += optind;
+

+
	if (argc > 2) {
+
		usage_stats();
+
		return (EX_USAGE);
+
	}
+

+
	if (pkgdb_open(&db, PKGDB_REMOTE) != EPKG_OK) {
+
		return (EX_IOERR);
+
	}
+

+
	printf("Local package database:\n");
+
	printf("\tInstalled packages: %" PRId64 "\n", pkgdb_stats(db, PKG_STATS_LOCAL_COUNT));
+

+
	flatsize = pkgdb_stats(db, PKG_STATS_LOCAL_SIZE);
+
	humanize_number(size, sizeof(flatsize), flatsize, "B", HN_AUTOSCALE, 0);
+
	printf("\tDisk space occupied: %s\n\n", size);
+

+
	printf("Remote package database(s):\n");
+
	printf("\tNumber of repositories: %" PRId64 "\n", pkgdb_stats(db, PKG_STATS_REMOTE_REPOS));
+
	printf("\tPackages available: %" PRId64 "\n", pkgdb_stats(db, PKG_STATS_REMOTE_COUNT));
+
	printf("\tUnique packages: %" PRId64 "\n", pkgdb_stats(db, PKG_STATS_REMOTE_UNIQUE));
+

+
	flatsize = pkgdb_stats(db, PKG_STATS_REMOTE_SIZE);
+
	humanize_number(size, sizeof(flatsize), flatsize, "B", HN_AUTOSCALE, 0);
+
	printf("\tTotal size of packages: %s\n", size);
+

+
	pkgdb_close(db);
+

+
	return (retcode);
+
}
modified ports/patch-portmaster-pkgng
@@ -1,15 +1,18 @@
-
--- portmaster.sh.in.orig	2012-05-12 12:32:59.760289065 +0200
-
+++ portmaster.sh.in	2012-05-12 16:10:44.050502931 +0200
+

+
$FreeBSD$
+

+
--- portmaster.sh.in.orig
+
+++ portmaster.sh.in
@@ -49,7 +49,7 @@
 #=============== Begin functions we always want to have ===============
 
 version () {
-
-	echo '' ; echo "===>>> Version 3.11"
-
+	echo '' ; echo "===>>> Version 3.11 (pkgng patch 1.0)"
-
 	#svn='$FreeBSD: user/dougb/portmaster/portmaster 228452 2011-12-13 06:51:56Z dougb $'
+
-	echo '' ; echo "===>>> Version 3.12.2"
+
+	echo '' ; echo "===>>> Version 3.12.2  (pkgng patch 1.1)"
+
 	#svn='$FreeBSD: user/dougb/portmaster/portmaster 237588 2012-06-26 01:32:58Z dougb $'
 }
 
-
@@ -125,6 +125,8 @@
+
@@ -136,6 +136,8 @@
 			if [ -n "$files" ]; then
 				pm_sv Deleting \'install complete\' flags
 				pm_find_s $pdb -type f -name PM_UPGRADE_DONE_FLAG -delete
@@ -18,7 +21,7 @@
 			fi
 		fi
 		if [ -z "$BACKUP" -a -z "$NO_BACKUP" -a -n "$NB_DELETE" ]; then
-
@@ -164,9 +166,14 @@
+
@@ -187,9 +189,14 @@
 		fi
 
 		: ${PAGER:='less -e'}
@@ -36,7 +39,7 @@
 		echo "===>>> Done displaying pkg-message files" ; echo '' ) | $PAGER ;;
 	esac
 
-
@@ -212,10 +219,14 @@
+
@@ -233,10 +240,14 @@
 	if [ -n "$build_deps_il" ]; then
 		echo "===>>> Deleting installed build-only dependencies"
 		cd
@@ -55,7 +58,7 @@
 		echo ''
 	fi
 
-
@@ -292,7 +303,13 @@
+
@@ -324,7 +335,13 @@
 			 unset -v PM_URB_LIST;
 			 $PM_SU_CMD /usr/bin/nice /usr/bin/make $PM_MAKE_ARGS $*; ); }
 pm_mkdir_s        () { $PM_SU_CMD /bin/mkdir -p $1; }
@@ -70,7 +73,7 @@
 pm_rm_s           () { $PM_SU_CMD /bin/rm $*; }
 pm_rmdir_s        () { $PM_SU_CMD /bin/rmdir $*; }
 pm_unlink_s       () { [ -e "$1" ] && $PM_SU_CMD /bin/unlink $1; }
-
@@ -340,6 +357,10 @@
+
@@ -372,6 +389,10 @@
 	[ -z "$port_dbdir" ] &&
 		port_dbdir=`pm_make_b -f/usr/share/mk/bsd.port.mk -V PORT_DBDIR 2>/dev/null`
 	[ -n "$port_dbdir" ] && export port_dbdir
@@ -81,7 +84,7 @@
 fi
 
 usage () {
-
@@ -496,12 +517,17 @@
+
@@ -528,12 +549,17 @@
 
 	pattern=`globstrip $1`
 
@@ -101,7 +104,7 @@
 	esac
 
 	unset glob_dirs
-
@@ -511,20 +537,35 @@
+
@@ -543,20 +569,35 @@
 origin_from_pdb () {
 	local o
 
@@ -142,7 +145,7 @@
 		echo '' >&2
 	fi
 	return 1
-
@@ -666,12 +707,17 @@
+
@@ -698,12 +739,17 @@
 	o)	REPLACE_ORIGIN=oopt ;;
 	p)	fail 'The -p option has been deprecated' ;;
 	r)	PM_URB=ropt
@@ -162,7 +165,7 @@
 			2)	fail 'The argument to -r must match only one port' ;;
 			esac
 		fi
-
@@ -753,6 +799,12 @@
+
@@ -785,6 +831,12 @@
 	    fail 'The -[ar] options are not compatible with other updates'
 
 	if [ -n "$PM_PACKAGES" -o -n "$PM_PACKAGES_BUILD" ]; then
@@ -175,7 +178,7 @@
 		[ `/sbin/sysctl -n kern.osreldate 2>/dev/null` -lt 600400 ] &&
 			fail Package installation support requires FreeBSD 6.4 or newer
 	fi
-
@@ -818,7 +870,12 @@
+
@@ -851,7 +903,12 @@
 		fi
 		unset INDEXFILE INDEXDIR
 
@@ -189,7 +192,7 @@
 		export PM_INDEX_PORTS
 
 		if [ -z "$pd" -o "$pd" != /usr/ports ]; then
-
@@ -875,6 +932,10 @@
+
@@ -908,6 +965,10 @@
 iport_from_origin () {
 	local sn dir
 
@@ -200,7 +203,7 @@
 	sn=${1#*/} ; sn=${sn%-*} ; sn=${sn%%[0-9]*}
 
 	if ! dir=`grep -l "@comment ORIGIN:${1}$" $pdb/${sn}*/+CONTENTS 2>/dev/null`; then
-
@@ -903,7 +964,9 @@
+
@@ -936,7 +997,9 @@
 	done
 }
 
@@ -210,7 +213,7 @@
 	# Global: grep_deps
 	local origin iport ro_opd
 
-
@@ -985,7 +1048,9 @@
+
@@ -1018,7 +1081,9 @@
 	fi
 }
 
@@ -220,7 +223,7 @@
 	local IFS delete contents origin n_port old_origin iport new_cont
 	local o_seen line d_missing d_origin d_iport prev_line answer
 
-
@@ -1083,7 +1148,7 @@
+
@@ -1116,7 +1181,7 @@
 	for l in `grep "^$sf|" $pd/MOVED`; do
 		case "$l" in
 		${sf}\|\|*) [ -n "$iport" ] || iport=`iport_from_origin $sf`
@@ -229,7 +232,7 @@
 				if [ -n "$PM_VERBOSE" ]; then
 					echo ''
 					echo "	===>>> The $sf port has been deleted"
-
@@ -1118,7 +1183,7 @@
+
@@ -1151,7 +1216,7 @@
 		echo ''
 
 		[ -n "$iport" ] || iport=`iport_from_origin $sf`
@@ -238,7 +241,7 @@
 	fi
 	return 0
 }
-
@@ -1129,35 +1194,62 @@
+
@@ -1162,35 +1227,62 @@
 	echo '############' > $DI_FILES		# Make the file > 0 bytes
 	echo "===>>> Gathering distinfo list for installed ports"
 	echo ''
@@ -325,7 +328,7 @@
 
 	# Tell safe_exit that we are done
 	pm_unlink ${DI_FILES}-e
-
@@ -1203,25 +1295,45 @@
+
@@ -1236,25 +1328,45 @@
 }
 
 ports_by_category () {
@@ -384,7 +387,7 @@
 }
 
 delete_empty_dist_subdirs () {
-
@@ -1269,7 +1381,9 @@
+
@@ -1302,7 +1414,9 @@
 	esac
 }
 
@@ -394,7 +397,7 @@
 	# Global: grep_deps
 	local do_update
 
-
@@ -1324,11 +1438,15 @@
+
@@ -1357,11 +1471,15 @@
 
 	echo "===>>> Checking for stale packages"
 	for package in `find $PACKAGES -type f | sort`; do
@@ -413,7 +416,7 @@
 
 		if [ -z "$PM_INDEX" ]; then
 			if [ -d "$pd/$origin" ]; then
-
@@ -1344,16 +1462,28 @@
+
@@ -1377,16 +1495,28 @@
 		fi
 
 		if [ -n "$port_ver" ]; then
@@ -451,7 +454,7 @@
 				fi
 				unset port_ver
 				continue
-
@@ -1364,10 +1494,18 @@
+
@@ -1397,10 +1527,18 @@
 
 			unset port_ver
 
@@ -473,7 +476,7 @@
 			fi
 		fi
 
-
@@ -1406,6 +1544,10 @@
+
@@ -1439,6 +1577,10 @@
 fi	# [ -n "$CLEAN_PACKAGES" ]
 
 if [ -n "$CHECK_DEPENDS" ]; then
@@ -484,7 +487,7 @@
 	PM_VERBOSE=pmv_check_depends
 IFS='
 '
-
@@ -1452,24 +1594,42 @@
+
@@ -1485,24 +1627,42 @@
 	unique_list=':'
 
 	echo "===>>> Building list of installed port names"; echo ''
@@ -542,7 +545,7 @@
 
 	echo "===>>> Checking $port_dbdir"
 
-
@@ -1570,7 +1730,7 @@
+
@@ -1603,7 +1763,7 @@
 
 	if [ -z "$do_update" -a -z "$skip" -a -z "$PM_INDEX_ONLY" ] && [ -d "$pd/$origin" ]; then
 		if ! pm_cd $pd/$origin; then
@@ -551,7 +554,7 @@
 				echo "	===>>> Warning: Unable to cd to $pd/$origin"
 				echo "	===>>> Continuing due to $pdb/$iport/+IGNOREME"
 				echo ''
-
@@ -1587,13 +1747,13 @@
+
@@ -1620,13 +1780,13 @@
 
 		# If the port has moved and no +IGNOREME, we have to update it
 		if [ -n "$moved_npd" ]; then
@@ -568,7 +571,7 @@
 			fi
 		fi
 	fi
-
@@ -1610,14 +1770,20 @@
+
@@ -1643,14 +1803,20 @@
 				unset port_ver
 			fi
 		else
@@ -591,7 +594,7 @@
 			esac
 
 			[ -z "$do_update" ] && {
-
@@ -1633,8 +1799,9 @@
+
@@ -1666,8 +1832,9 @@
 	if [ -n "$LIST_PLUS" ]; then
 		if [ -z "$moved_npd" ]; then
 			echo "	===>>> New version available: $port_ver"
@@ -602,7 +605,7 @@
 			pm_cd_pd $origin && check_state
 			num_updates=$(( $num_updates + 1 ))
 		else
-
@@ -1689,7 +1856,13 @@
+
@@ -1722,7 +1889,13 @@
 	fi
 
 	pm_cd $pkgdir || fail "Cannot cd into $pkgdir to create a package"
@@ -617,7 +620,7 @@
 		if [ "$1" = "$pbu" ]; then
 			if [ -n "$BACKUP" ]; then
 				echo "	===>>> Package saved to $1" ; echo ''
-
@@ -2028,10 +2201,14 @@
+
@@ -2061,10 +2234,14 @@
 fi
 
 if [ -n "$EXPUNGE" ]; then
@@ -634,7 +637,7 @@
 		2)	echo "===>>> $EXPUNGE matched multiple ports"
 			fail "The -e option works with only one port at a time" ;;
 		0)	EXPUNGE=${glob_dirs#$pdb/}
-
@@ -2040,15 +2217,24 @@
+
@@ -2073,15 +2250,24 @@
 	fi
 
 	origin=`origin_from_pdb $EXPUNGE`
@@ -664,7 +667,7 @@
 				update_contents delete $f $origin
 			done ;;
 		*)	exit 1 ;;
-
@@ -2058,8 +2244,13 @@
+
@@ -2091,8 +2277,13 @@
 	[ -n "$BACKUP" ] && { init_packages ; pm_pkg_create $pbu $EXPUNGE; }
 	[ -z "$DONT_SCRUB_DISTFILES" ] && { delete_all_distfiles $origin; delete_dist_list; }
 
@@ -680,7 +683,7 @@
 
 	echo '' ; echo "===>>> Running ${0##*/} -s $ARGS"
 	exec $0 -s $ARGS
-
@@ -2069,13 +2260,21 @@
+
@@ -2102,13 +2293,21 @@
 if [ -n "$CLEAN_STALE" ]; then
 	[ -z "$no_del_list" ] && export no_del_list=':'
 
@@ -704,7 +707,7 @@
 		if [ -n "$deplist" ]; then
 			echo ''
 			echo "===>>> Warning: Unrecorded dependencies on ${iport}:"
-
@@ -2088,22 +2287,32 @@
+
@@ -2121,22 +2320,32 @@
 			continue
 		fi
 
@@ -745,7 +748,7 @@
 		esac
 	done
 	exit 0
-
@@ -2126,7 +2335,7 @@
+
@@ -2159,7 +2368,7 @@
 	# to go out to the disk if we don't have to.
 	[ -z "$RESTART" ] && return 1
 
@@ -754,7 +757,7 @@
 		return 1
 	else
 		already_done $1
-
@@ -2143,7 +2352,7 @@
+
@@ -2176,7 +2385,7 @@
 	case "$INTERACTIVE_YES" in *:${1}:*) return 0 ;; esac
 	case "$INTERACTIVE_NO" in *:${1}:*) return 1 ;; esac
 
@@ -763,7 +766,7 @@
 		echo ''
 		echo "===>>> +IGNOREME file is present for $1"
 		echo ''
-
@@ -2243,7 +2452,13 @@
+
@@ -2281,7 +2490,13 @@
 			fail "No entry for $origin in $PM_INDEX"
 	fi
 
@@ -778,7 +781,7 @@
 	\<)	build_l="${build_l}\tUpgrade $iport to $new_port\n" ;;
 	=)	build_l="${build_l}\tRe-install $iport\n" ;;
 	\>)	build_l="${build_l}\tDowngrade $iport to $new_port\n" ;;
-
@@ -2397,6 +2612,18 @@
+
@@ -2430,6 +2645,18 @@
 		rundeps=`gen_dep_list run-depends-list`
 
 		for dep in $d_port_list; do
@@ -797,7 +800,7 @@
 			case "$rundeps" in
 			*" ${dep} "*|*${dep}*)
 				varname=`echo ${dep#$pd/} | sed 's#[-+/\.]#_#g'`
-
@@ -2466,7 +2693,11 @@
+
@@ -2499,7 +2726,11 @@
 				fail "Cannot cd to $d_port"
 			fi
 			for glob in $conflicts; do
@@ -809,24 +812,21 @@
+				fi
 				if [ -n "$confl_p" ]; then
 					confl_p=${confl_p%% *}
-
 					echo ''
-
@@ -2601,8 +2832,13 @@
+
 					d_port="$pd/`origin_from_pdb $confl_p`"
+
@@ -2639,7 +2870,11 @@
 		done
 
 		for dep in $build_only_dl_g; do
-
-			grep -q "@comment DEPORIGIN:${dep#$pd/}$" $pdb/*/+CONTENTS ||
-
-				temp_bodlg="$temp_bodlg $dep"
+
-			grep -q "@comment DEPORIGIN:${dep#$pd/}$" $pdb/*/+CONTENTS && continue
+			if [ -z "$use_pkgng" ]; then
-
+				grep -q "@comment DEPORIGIN:${dep#$pd/}$" $pdb/*/+CONTENTS ||
-
+					temp_bodlg="$temp_bodlg $dep"
+
+				grep -q "@comment DEPORIGIN:${dep#$pd/}$" $pdb/*/+CONTENTS && continue
+			else
-
+				[ "`pkg query "%?r" ${dep#$pd/}`" = "1" ] ||
-
+					temp_bodlg="$temp_bodlg $dep"
+
+				[ "`pkg query "%?r" ${dep#$pd/}`" = "1" ] && continue
+			fi
-
 		done
-
 
-
 		build_only_dl_g=" `uniquify_list $temp_bodlg` "
-
@@ -2626,7 +2862,7 @@
+
 			[ -n "$PM_DEL_BUILD_ONLY" ] &&
+
 				iport_from_origin ${dep#$pd/} >/dev/null && continue
+
 			temp_bodlg="$temp_bodlg $dep"
+
@@ -2666,7 +2901,7 @@
 
 urb_update () {
 	# Global: PM_URB_UP
@@ -835,7 +835,7 @@
 
 	verb=checking ; [ -n "$1" ] && verb=updating
 
-
@@ -2636,15 +2872,25 @@
+
@@ -2676,15 +2911,25 @@
 	echo ''
 
 	for origin in $PM_URB_ORIGINS; do
@@ -868,7 +868,7 @@
 	done
 
 	if [ -n "$PM_URB_LIST" ]; then
-
@@ -2656,7 +2902,11 @@
+
@@ -2696,7 +2941,11 @@
 
 	for req_by in $PM_URB_LIST; do
 		# Probably not needed, but JIC
@@ -881,7 +881,7 @@
 
 		pm_v "===>>> $req_by depends on $PM_URB_IPORTS"
 
-
@@ -2697,12 +2947,16 @@
+
@@ -2737,12 +2986,16 @@
 			else
 				fail "$pd/${port} does not exist"
 			fi ;;
@@ -900,7 +900,7 @@
 				*)	local dir
 					for dir in $glob_dirs; do
 					worklist_temp="$worklist_temp ${dir#$pdb/}"
-
@@ -2806,9 +3060,16 @@
+
@@ -2850,9 +3103,16 @@
 		*/*)	origin=$port ;;
 		*)	# If an installed version does not exist at this
 			# point it probably got updated as a dependency
@@ -920,7 +920,7 @@
 			fi
 			origin=`origin_from_pdb $port` ;;
 		esac
-
@@ -3032,11 +3293,16 @@
+
@@ -3076,11 +3336,16 @@
 	case "$argv" in
 	'')	echo '' ; no_valid_port ;;
 	$pd/*)	portdir=${argv#$pd/} ;;
@@ -939,7 +939,7 @@
 	esac
 
 	if [ -z "$portdir" -a -z "$upg_port" ]; then
-
@@ -3069,7 +3335,7 @@
+
@@ -3113,7 +3378,7 @@
 
 	case "$arg2" in
 	*/*)	ro_opd=$arg2 ; ro_upg_port=`iport_from_origin $ro_opd` ;;
@@ -948,7 +948,7 @@
 			ro_upg_port=$arg2
 		else
 			find_glob_dirs $arg2 && ro_upg_port=${glob_dirs#$pdb/}
-
@@ -3080,12 +3346,21 @@
+
@@ -3128,12 +3393,21 @@
 	unset arg2
 
 	if [ -z "$ro_upg_port" ]; then
@@ -973,7 +973,7 @@
 			echo '       or listed as a dependency'
 			echo '' ; no_valid_port
 		fi
-
@@ -3117,7 +3392,7 @@
+
@@ -3165,7 +3439,7 @@
 fi
 [ -z "$upg_port" -a -z "$REPLACE_ORIGIN" ] && upg_port=`iport_from_origin ${portdir}`
 
@@ -982,7 +982,7 @@
 	# Adding to CUR_DEPS means we will not get here in the build unless -G
 	if [ -z "$PM_BUILDING" ]; then
 		# Only need to prompt for this once if -ai
-
@@ -3525,7 +3800,12 @@
+
@@ -3562,7 +3836,12 @@
 		pm_v "===>>> Available package ($latest_pv) matches the current version"
 	elif [ -n "$latest_pv" -a -n "$PM_PACKAGES_NEWER" ]; then
 		if [ -n "$upg_port" ]; then
@@ -996,7 +996,7 @@
 			\<)	use_package=up_newer
 				pm_v "===>>> Available package ($latest_pv)"
 				pm_v "       is newer than installed ($upg_port)" ;;
-
@@ -3541,7 +3821,12 @@
+
@@ -3578,7 +3857,12 @@
 			pm_v "===>>> There is a package available ($latest_pv)"
 		fi
 	elif [ -n "$latest_pv" ]; then
@@ -1010,7 +1010,7 @@
 		\<)	# Could happen if ports tree is out of date
 			use_package=up_old_tree
 			pm_v "===>>> Available package ($latest_pv)"
-
@@ -3640,7 +3925,12 @@
+
@@ -3677,7 +3961,12 @@
 		    grep -v ^$LOCALBASE_COMPAT > $ldconfig_out
 
 		unset temp
@@ -1024,7 +1024,7 @@
 		    sort - $ldconfig_out | uniq -d`; do
 			temp="${temp}$file "
 		done
-
@@ -3663,6 +3953,7 @@
+
@@ -3700,6 +3989,7 @@
 
 	if [ -n "$REPLACE_ORIGIN" -a -n "$ro_upg_port" ]; then
 		# Delete any existing versions of the old port
@@ -1032,7 +1032,7 @@
 		pm_sv "Running pkg_delete for $ro_upg_port"
 		pm_pkg_delete_s -f $ro_upg_port
 	fi
-
@@ -3681,6 +3972,8 @@
+
@@ -3719,6 +4009,8 @@
 			unset preserve_port files
 		esac
 
@@ -1041,7 +1041,7 @@
 		pm_sv "Running pkg_delete for $upg_port"
 		pm_pkg_delete_s -f $upg_port
 	fi
-
@@ -3726,6 +4019,18 @@
+
@@ -3764,6 +4056,18 @@
 		unset port_log_args
 	fi
 
@@ -1060,7 +1060,7 @@
 	# Defining NO_DEPENDS ensures that we will control the installation
 	# of the depends, not bsd.port.mk.
 	eval pm_make_s -DNO_DEPENDS install $port_log_args || install_failed $new_port
-
@@ -3743,29 +4048,32 @@
+
@@ -3781,29 +4085,31 @@
 	fi
 fi
 
@@ -1069,7 +1069,7 @@
-	mv ${preserve_dir}/${file##*/} $file
-	oldmd5="MD5:`md5 -q $file`"
-
-
-	new_cont=`pm_mktemp contents`
+
-	pm_mktemp contents ; new_cont=$pm_mktemp_file
-	while read left right; do
-		case "$left" in
-		@cwd)		short_file="${file#${right}/}" ;;
@@ -1087,14 +1087,13 @@
-	pm_unlink $new_cont
-	unset file oldmd5 new_cont left right short_file
-done
-
+#TODO
+if [ -z "$use_pkgng" ]; then
+	for file in $preserve_port_files; do
+		mv $file ${file}-new
+		mv ${preserve_dir}/${file##*/} $file
+		oldmd5="MD5:`md5 -q $file`"
-
+
-
+		new_cont=`pm_mktemp contents`
+
+	
+
+		pm_mktemp contents ; new_cont=$pm_mktemp_file
+		while read left right; do
+			case "$left" in
+			@cwd)		short_file="${file#${right}/}" ;;
@@ -1116,7 +1115,7 @@
 if [ -n "$preserve_dir" ]; then
 	rmdir $preserve_dir 2>/dev/null
 	unset preserve_dir preserve_port_files
-
@@ -3781,14 +4089,19 @@
+
@@ -3819,14 +4125,19 @@
 temp=`find $LOCALBASE_COMPAT -type d -empty 2>/dev/null`
 if [ -z "$temp" ] && [ -d "$LOCALBASE_COMPAT" ]; then
 	unset files
@@ -1138,7 +1137,7 @@
 		$PM_SU_CMD /etc/rc.d/ldconfig start > /dev/null
 	fi
 	unset temp file files
-
@@ -3844,7 +4157,8 @@
+
@@ -3882,7 +4193,8 @@
 	/bin/unlink $dist_list_temp ; unset ds dist_list_temp
 fi
 
@@ -1148,7 +1147,7 @@
 	if grep -q DEPORIGIN $pdb/$new_port/+CONTENTS; then
 		echo "===>>> Updating dependencies for $new_port to match installed versions"
 		update_contents $pdb/$new_port/+CONTENTS
-
@@ -3866,7 +4180,7 @@
+
@@ -3904,7 +4216,7 @@
 if [ -n "$MAKE_PACKAGE" ]; then
 	if [ -z "$use_package" ]; then
 		echo "===>>> Creating a package for new version $new_port"
@@ -1157,8 +1156,8 @@
 		echo "	===>>> Package saved to $PACKAGES/All" ; echo ''
 	else
 		pm_pkg_create $PACKAGES $new_port
-
@@ -3879,27 +4193,34 @@
-
 	echo ''
+
@@ -3917,27 +4229,34 @@
+
 	pm_v
 fi
 
-check_dependency_files $portdir $new_port
@@ -1168,7 +1167,15 @@
-		pm_v "===>>> $d_port"
-		dp_cont=$pdb/$d_port/+CONTENTS
-		[ -e "$dp_cont" ] || continue
-
-
+
+if [ -z $use_pkgng ]; then
+
+	check_dependency_files $portdir $new_port
+
+	if [ -s "$grep_deps" ]; then
+
+		echo "===>>> Updating dependency entry for $new_port in each dependent port"; pm_v
+
+		while read d_port; do
+
+			pm_v "===>>> $d_port"
+
+			dp_cont=$pdb/$d_port/+CONTENTS
+
+			[ -e "$dp_cont" ] || continue
+
 
-		if [ -n "$ro_opd" ]; then
-			grep -ql "DEPORIGIN:$ro_opd$" $dp_cont &&
-				update_contents $dp_cont $portdir $new_port $ro_opd
@@ -1180,15 +1187,6 @@
-		fi
-	done < $grep_deps
-	unset d_port dp_cont do_update
-
+if [ -z $use_pkgng ]; then
-
+	check_dependency_files $portdir $new_port
-
+	if [ -s "$grep_deps" ]; then
-
+		echo "===>>> Updating dependency entry for $new_port in each dependent port"; pm_v
-
+		while read d_port; do
-
+			pm_v "===>>> $d_port"
-
+			dp_cont=$pdb/$d_port/+CONTENTS
-
+			[ -e "$dp_cont" ] || continue
-
+
+			if [ -n "$ro_opd" ]; then
+				grep -ql "DEPORIGIN:$ro_opd$" $dp_cont &&
+					update_contents $dp_cont $portdir $new_port $ro_opd
@@ -1212,7 +1210,7 @@
 fi
 
 if [ -n "$upg_port" ]; then
-
@@ -3917,13 +4238,15 @@
+
@@ -3955,13 +4274,15 @@
 fi
 
 INSTALLED_LIST="${INSTALLED_LIST}\t${ilist}\n"
modified ports/pkg2ng
@@ -23,7 +23,7 @@ do
        continue
	fi
	PREFX=$(pkg_info -qp ${PKG})
-
	if [ -d ${PORTSDIR} ]; then
+
	if [ -d ${PORTSDIR}/${ORIGIN} ]; then
		MAINTAINER=$( make -C ${PORTSDIR}/${ORIGIN} -V MAINTAINER )
		CATEGORIES=$( make -C ${PORTSDIR}/${ORIGIN} -V CATEGORIES | sed -e "s/ /,/g")
		LICENSES=$( make -C ${PORTSDIR}/${ORIGIN} -V LICENSE | sed -e "s/ /,/g")
modified scripts/periodic/410.pkg-audit
@@ -59,7 +59,7 @@ case "${daily_status_security_pkgaudit_enable:-YES}" in
		if [ $rc -ne 0 -o \
			$(( 86400 \* "${daily_status_security_pkgaudit_expiry:-2}" )) \
			-le $(( ${now} - ${then} + 600 )) ]; then
-
			/usr/local/sbin/pkg audit -F || {
+
			/usr/local/sbin/pkg audit -Fq || {
			  rc=$?; [ $rc -lt 3 ] && rc=3
			}
		else