Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Sort the output of pkg search by the search (-S) field
Matthew Seaman committed 13 years ago
commit fac2377c77290588306493a411de072318529a68
parent bff9b07
4 files changed +51 -21
modified libpkg/pkg.h
@@ -714,10 +714,11 @@ int pkgdb_unregister_pkg(struct pkgdb *pkg, const char *origin);
 * @warning Returns NULL on failure.
 */
struct pkgdb_it * pkgdb_query(struct pkgdb *db, const char *pattern,
-
							  match_t type);
-
struct pkgdb_it * pkgdb_rquery(struct pkgdb *db, const char *pattern, match_t type, const char *reponame);
+
    match_t type);
+
struct pkgdb_it * pkgdb_rquery(struct pkgdb *db, const char *pattern,
+
    match_t type, const char *reponame);
struct pkgdb_it * pkgdb_search(struct pkgdb *db, const char *pattern,
-
		match_t type, pkgdb_field field, const char *reponame);
+
    match_t type, pkgdb_field field, pkgdb_field sort, const char *reponame);

/**
 *
modified libpkg/pkgdb.c
@@ -3015,10 +3015,11 @@ pkgdb_rquery(struct pkgdb *db, const char *pattern, match_t match,

static int
pkgdb_search_build_search_query(struct sbuf *sql, match_t match,
-
    pkgdb_field field)
+
    pkgdb_field field, pkgdb_field sort)
{
	const char *how = NULL;
	const char *what = NULL;
+
	const char *orderby = NULL;

	how = pkgdb_get_match_how(match);

@@ -3046,28 +3047,52 @@ pkgdb_search_build_search_query(struct sbuf *sql, match_t match,
	if (what != NULL && how != NULL)
		sbuf_printf(sql, how, what);

+
	switch (sort) {
+
	case FIELD_NONE:
+
		orderby = NULL;
+
		break;
+
	case FIELD_ORIGIN:
+
		orderby = " ORDER BY origin";
+
		break;
+
	case FIELD_NAME:
+
		orderby = " ORDER BY name";
+
		break;
+
	case FIELD_NAMEVER:
+
		orderby = " ORDER BY name, version";
+
		break;
+
	case FIELD_COMMENT:
+
		orderby = " ORDER BY comment";
+
		break;
+
	case FIELD_DESC:
+
		orderby = " ORDER BY desc";
+
		break;
+
	}
+

+
	if (orderby != NULL)
+
		sbuf_cat(sql, orderby);
+

	return (EPKG_OK);
}

struct pkgdb_it *
pkgdb_search(struct pkgdb *db, const char *pattern, match_t match,
-
    pkgdb_field field, const char *reponame)
+
    pkgdb_field field, pkgdb_field sort, const char *reponame)
{
	sqlite3_stmt *stmt = NULL;
	struct sbuf *sql = NULL;
	bool multirepos_enabled = false;
	int ret;
	const char *basesql = ""
-
				"SELECT id, origin, name, version, comment, "
-
					"prefix, desc, arch, maintainer, www, "
-
					"licenselogic, flatsize AS newflatsize, pkgsize, "
-
					"cksum, path AS repopath ";
+
		"SELECT id, origin, name, version, comment, "
+
		"prefix, desc, arch, maintainer, www, "
+
		"licenselogic, flatsize AS newflatsize, pkgsize, "
+
		"cksum, path AS repopath ";
	const char *multireposql = ""
-
				"SELECT id, origin, name, version, comment, "
-
					"prefix, desc, arch, maintainer, www, "
-
					"licenselogic, flatsize, pkgsize, "
-
					"cksum, path, '%1$s' AS dbname "
-
					"FROM '%1$s'.packages ";
+
		"SELECT id, origin, name, version, comment, "
+
		"prefix, desc, arch, maintainer, www, "
+
		"licenselogic, flatsize, pkgsize, "
+
		"cksum, path, '%1$s' AS dbname "
+
		"FROM '%1$s'.packages ";

	assert(db != NULL);
	assert(pattern != NULL && pattern[0] != '\0');
@@ -3089,7 +3114,8 @@ pkgdb_search(struct pkgdb *db, const char *pattern, match_t match,

		if (reponame != NULL) {
			if (is_attached(db->sqlite, reponame)) {
-
				sbuf_printf(sql, multireposql, reponame, reponame);
+
				sbuf_printf(sql, multireposql, reponame,
+
				    reponame);
			} else {
				pkg_emit_error("Repository %s can't be loaded",
				    reponame);
@@ -3115,7 +3141,7 @@ pkgdb_search(struct pkgdb *db, const char *pattern, match_t match,
		sbuf_cat(sql, ", 'remote' AS dbname FROM remote.packages WHERE ");
	}

-
	pkgdb_search_build_search_query(sql, match, field);
+
	pkgdb_search_build_search_query(sql, match, field, sort);
	sbuf_cat(sql, ";");
	sbuf_finish(sql);

modified pkg/clean.c
@@ -95,14 +95,16 @@ exec_clean(int argc, char **argv)
		}

		pkg_get(pkg, PKG_ORIGIN, &origin);
-
		it = pkgdb_search(db, origin, MATCH_EXACT, FIELD_ORIGIN, NULL);
+
		it = pkgdb_search(db, origin, MATCH_EXACT, FIELD_ORIGIN,
+
		    FIELD_NONE, NULL);

		if (it == NULL) {
			warnx("skipping %s", ent->fts_path);
			continue;
		}

-
		if ((ret = pkgdb_it_next(it, &p, PKG_LOAD_BASIC)) == EPKG_FATAL) {
+
		if ((ret = pkgdb_it_next(it, &p, PKG_LOAD_BASIC)) ==
+
		    EPKG_FATAL) {
			warnx("skipping %s", ent->fts_path);
			continue;
		}
@@ -110,7 +112,8 @@ exec_clean(int argc, char **argv)
		pkg_get(p, PKG_REPOPATH, &pkgrepopath);
		if (ret == EPKG_END) {
			to_delete = true;
-
			printf("%s does not exist anymore, deleting it\n", repopath);
+
			printf("%s does not exist anymore, deleting it\n",
+
			    repopath);
		} else if (strcmp(repopath, pkgrepopath)) {
			printf("%s is out-of-date, deleting it\n", repopath);
			to_delete = true;
modified pkg/search.c
@@ -344,8 +344,8 @@ exec_search(int argc, char **argv)
	if (pkgdb_open(&db, PKGDB_REMOTE) != EPKG_OK)
		return (EX_IOERR);

-
	if ((it = pkgdb_search(db, pattern, match, search, reponame)) ==
-
	    NULL) {
+
	if ((it = pkgdb_search(db, pattern, match, search, search,
+
	    reponame)) == NULL) {
		pkgdb_close(db);
		return (EX_IOERR);
	}