Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Merge branch 'master' of etoilebsd.net:pkgng
Philippe Pepiot committed 15 years ago
commit 5b0bf825158ad61a28602b264e9a0f08d6e8dd4b
parent f051ed94dac9f20e4a77e96dde45ee22b56b0395
7 files changed +80 -16
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();
-
	pkgdb_cache_init(db, pattern, 0);
+
	pkgdb_cache_init(db, pattern, match, 0);
}

static 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>
@@ -368,15 +370,21 @@ pkg_cmp(void const *a, void const *b)
}

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

	db->count = 0;
	db->flags = flags;

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

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

@@ -386,27 +394,55 @@ pkgdb_cache_init(struct pkgdb *db, const char *pattern, unsigned char flags)
	}

	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 */
		if ((pkg = pkg_idx_query(&db->db, i)) == NULL)
			continue;

-
		if (!pattern || strncmp(pkg->name_version, pattern, patlen) == 0) {
-
			if (db->flags & PKGDB_INIT_DEPS) {
+
		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) {
+
			if (db->flags & PKGDB_INIT_DEPS)
				pkg_get_deps(&db->db, pkg);
-
			}
			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
@@ -16,6 +16,6 @@


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

#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);