Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Added support for globbing and regular expression.
jlaffaye committed 15 years ago
commit 1acd7ff256f64e7b9e9c5da23daa56b55ec58311
parent 05569f6
7 files changed +79 -14
modified libpkg/pkg.c
@@ -150,7 +150,7 @@ pkg_create(char *pkgname, pkg_formats format, const char *outdir, const char *ro

	pkgdb_dir = getenv("PKG_DBDIR");

-
	pkgdb_init(&db, pkgname);
+
	pkgdb_init(&db, pkgname, MATCH_EXACT);

	if (pkgdb_count(&db) == 0) {
		warnx("%s: no such package", pkgname);
modified libpkg/pkgdb.c
@@ -6,10 +6,10 @@
#include "pkgdb_cache.h"

void
-
pkgdb_init(struct pkgdb *db, const char *pattern) {
+
pkgdb_init(struct pkgdb *db, const char *pattern, match_t match) {
	/* first check if the cache has to be rebuild */
	pkgdb_cache_update();
-
	return (pkgdb_cache_init(db, pattern));
+
	return (pkgdb_cache_init(db, pattern, match));
}

void
modified libpkg/pkgdb.h
@@ -4,7 +4,15 @@

#define PKG_DBDIR "/var/db/pkg"

-
void pkgdb_init(struct pkgdb *db, const char *pattern);
+
typedef enum _math_t {
+
	MATCH_ALL,
+
	MATCH_EXACT,
+
	MATCH_GLOB,
+
	MATCH_REGEX,
+
	MATCH_EREGEX
+
} match_t;
+

+
void pkgdb_init(struct pkgdb *db, const char *pattern, match_t match);
void pkgdb_free(struct pkgdb *db);
size_t pkgdb_count(struct pkgdb *db);

modified libpkg/pkgdb_cache.c
@@ -1,6 +1,8 @@
#include <dirent.h>
#include <err.h>
#include <errno.h>
+
#include <fnmatch.h>
+
#include <regex.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -295,14 +297,20 @@ pkg_cmp(void const *a, void const *b)
}

void
-
pkgdb_cache_init(struct pkgdb *db, const char *pattern)
+
pkgdb_cache_init(struct pkgdb *db, const char *pattern, match_t match)
{
	int count, i;
-
	size_t patlen = 0;
	struct pkg *pkg;
+
	regex_t re;
+
	int matched;

	db->count = 0;

+
	if (match != MATCH_ALL && pattern == NULL) {
+
		warnx("a pattern is required");
+
		return;
+
	}
+

	if (pkgdb_open(&db->db, O_RDONLY) == -1)
		return;

@@ -312,11 +320,20 @@ pkgdb_cache_init(struct pkgdb *db, const char *pattern)
	}

	cdb_read(&db->db, &count, sizeof(count), cdb_datapos(&db->db));
-

	db->pkgs = calloc(count+1, sizeof(struct pkg *));

-
	if (pattern)
-
		patlen = strlen(pattern);
+
	/* Regex initialisation */
+
	if (match == MATCH_REGEX) {
+
		if (regcomp(&re, pattern, REG_BASIC | REG_NOSUB) != 0) {
+
			warnx("'%s' is not a valid regular expression", pattern);
+
			return;
+
		}
+
	} else if (match == MATCH_EREGEX) {
+
		if (regcomp(&re, pattern, REG_EXTENDED | REG_NOSUB) != 0) {
+
			warnx("'%s' is not a valid extended regular expression", pattern);
+
			return;
+
		}
+
	}

	for (i = 0; i < count; i++) {
		/* get package */
@@ -325,12 +342,32 @@ pkgdb_cache_init(struct pkgdb *db, const char *pattern)

		snprintf(pkg->name_version, FILENAME_MAX, "%s-%s", pkg->name, pkg->version);

-
		if (!pattern || strncmp(pkg->name_version, pattern, patlen) == 0)
+
		matched = 1; /* non zero is false */
+
		switch (match) {
+
			case MATCH_ALL:
+
				matched = 0;
+
				break;
+
			case MATCH_EXACT:
+
				matched = strcmp(pkg->name_version, pattern);
+
				break;
+
			case MATCH_GLOB:
+
				matched = fnmatch(pattern, pkg->name_version, 0);
+
				break;
+
			case MATCH_REGEX:
+
			case MATCH_EREGEX:
+
				matched = regexec(&re, pkg->name_version, 0, NULL, 0);
+
				break;
+
		}
+

+
		if (matched == 0)
			db->pkgs[db->count++] = pkg;
		else
			free(pkg);
	}

+
	if (match == MATCH_REGEX || match == MATCH_EREGEX)
+
		regfree(&re);
+

	/* sort packages */
	db->pkgs = realloc(db->pkgs, (db->count+1) * sizeof(struct pkg *));
	db->pkgs[db->count] = NULL;
modified libpkg/pkgdb_cache.h
@@ -15,6 +15,6 @@


void pkgdb_cache_update(void);
-
void pkgdb_cache_init(struct pkgdb *db, const char *pattern);
+
void pkgdb_cache_init(struct pkgdb *db, const char *pattern, match_t match);

#endif
modified pkg/info.c
@@ -1,4 +1,5 @@
#include <err.h>
+
#include <unistd.h>
#include <stdio.h>
#include <pkg.h>
#include <pkgdb.h>
@@ -24,10 +25,29 @@ cmd_info(int argc, char **argv)
{
	struct pkgdb db;
	struct pkg *pkg;
-
	(void)argc;
+
	match_t match = MATCH_EXACT;
+
	int ch;

-
	pkgdb_init(&db, argv[1]);
+
	while ((ch = getopt(argc, argv, "gxX")) != -1) {
+
		switch (ch) {
+
			case 'g':
+
				match = MATCH_GLOB;
+
				break;
+
			case 'x':
+
				match = MATCH_REGEX;
+
				break;
+
			case 'X':
+
				match = MATCH_EREGEX;
+
				break;
+
		}
+
	}
+
	argc -= optind;
+
	argv += optind;
+

+
	if (argc == 0)
+
		match = MATCH_ALL;

+
	pkgdb_init(&db, argv[0], match);
	if (pkgdb_count(&db) == 1) {
		/* one match */
		pkg = db.pkgs[0];
modified pkg/main.c
@@ -68,7 +68,7 @@ main(int argc, char **argv)
	if (ambiguous == 0) {
		argc--;
		argv++;
-
		if (command->exec_cmd != NULL) 
+
		if (command->exec_cmd != NULL)
			return (command->exec_cmd(argc, argv));
		else
			printf("%s: No yet implemented\n", command->name);