Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add : pkg_numdeps: to return the number of dependencies of a given pkg pkg_resolvdeps: to find wether or not a dependency is already installed new add command unfinished
Baptiste Daroussin committed 15 years ago
commit fc7e176688adff1ffefe3406d2e641325b3510ba
parent 071ba84
7 files changed +132 -8
modified libpkg/pkg.c
@@ -10,6 +10,11 @@

static void pkg_free_void(void*);

+
pkg_t
+
pkg_type(struct pkg *pkg)
+
{
+
	return (pkg->type);
+
}
const char *
pkg_origin(struct pkg *pkg)
{
@@ -46,6 +51,36 @@ pkg_deps(struct pkg *pkg)
	return ((struct pkg **)pkg->deps.data);
}

+
int
+
pkg_numdeps(struct pkg *pkg)
+
{
+
	return (pkg->deps.len);
+
}
+

+
int
+
pkg_resolvdeps(struct pkg *pkg, struct pkgdb *db) {
+
	struct pkg *p;
+
	struct pkgdb_it *it;
+
	struct pkg **deps;
+
	int i;
+

+
	deps = pkg_deps(pkg);
+
	pkg_new(&p);
+
	for (i = 0; deps[i] != NULL; i++) {
+
		it = pkgdb_query(db, pkg_name(deps[i]), MATCH_EXACT);
+

+
		if (pkgdb_it_next_pkg(it, &p, MATCH_EXACT) == 0) {
+
			p->type = PKG_INSTALLED;
+
			pkg_free(deps[i]);
+
			deps[i] = p;
+
		} else {
+
			deps[i]->type = PKG_NOTFOUND;
+
		}
+
	}
+

+
	return (0);
+
}
+

struct pkg **
pkg_rdeps(struct pkg *pkg)
{
modified libpkg/pkg.h
@@ -16,9 +16,17 @@ typedef enum _match_t {
	MATCH_EREGEX
} match_t;

+
typedef enum {
+
	PKG_FILE,
+
	PKG_REMOTE,
+
	PKG_INSTALLED,
+
	PKG_NOTFOUND
+
} pkg_t;
+

/* pkg */
int pkg_new(struct pkg **);
int pkg_open(const char *, struct pkg **, int);
+
pkg_t pkg_type(struct pkg *);
void pkg_reset(struct pkg *);
void pkg_free(struct pkg *);
const char *pkg_name(struct pkg *);
@@ -30,6 +38,8 @@ struct pkg ** pkg_deps(struct pkg *);
struct pkg ** pkg_rdeps(struct pkg *);
struct pkg_file ** pkg_files(struct pkg *);
struct pkg_conflict ** pkg_conflicts(struct pkg *);
+
int pkg_numdeps(struct pkg *);
+
int pkg_resolvdeps(struct pkg *, struct pkgdb *db);

/* pkg_manifest */
int pkg_parse_manifest(struct pkg *, char *);
modified libpkg/pkg_private.h
@@ -6,12 +6,6 @@

#include "util.h"

-
typedef enum {
-
	PKG_FILE,
-
	PKG_REMOTE,
-
	PKG_INSTALLED,
-
	PKG_NOTFOUND
-
} pkg_t;
struct pkg {
	struct sbuf *origin;
	struct sbuf *name;
modified pkg/Makefile
@@ -2,7 +2,8 @@ PROG= pkg
SRCS=	main.c \
	info.c \
	which.c \
-
	register.c
+
	register.c \
+
	add.c

CFLAGS+=	-I${.CURDIR}/../libpkg -I${.CURDIR}/../external/tinycdb/
LDADD+=	-L${.CURDIR}/../external -L../libpkg -lpkg -lutil
added pkg/add.c
@@ -0,0 +1,76 @@
+
#include <stdio.h>
+
#include <pkg.h>
+
#include <stdbool.h>
+
#include <err.h>
+

+
#include "add.h"
+

+
void
+
usage_add(void)
+
{
+
	fprintf(stderr, "add ... <pkg-name>\n"
+
			"add\n");
+
}
+

+
int
+
exec_add(int argc, char **argv)
+
{
+
	struct pkgdb *db;
+
	struct pkgdb_it *it;
+
	struct pkg *pkg;
+
	struct pkg *p;
+
	struct pkg **deps;
+
	int ret = 0;
+

+
	bool installed = false;
+

+
	int numdeps, i;
+

+
	if (argc != 2)
+
		return (-1);
+

+
	if (pkg_open(argv[1], &pkg, 0) != 0) {
+
		return (-1);
+
	}
+

+
	if (pkgdb_open(&db) == -1) {
+
		pkgdb_warn(db);
+
		return (-1);
+
	}
+

+
	/* check if already installed */
+
	if ((it = pkgdb_query(db, pkg_name(pkg), MATCH_EXACT)) == NULL) {
+
		pkgdb_warn(db);
+
		return (-1);
+
	}
+

+
	pkg_new(&p);
+

+
	if (pkgdb_it_next_pkg(it, &p, PKG_BASIC) == 0) {
+
		installed = true;
+
	}
+

+

+
	if (installed) {
+
		err(1, "%s is already installed\n", pkg_name(pkg));
+
	}
+

+

+
	if ((numdeps = pkg_numdeps(pkg)) > 0) {
+
		pkg_resolvdeps(pkg, db);
+

+
		deps = pkg_deps(pkg);
+
		for (i = 0; deps[i] != NULL; i++) {
+
			if (pkg_type(deps[i]) == PKG_NOTFOUND) {
+
				warnx("%s-%s: unresolved dependency %s-%s", pkg_name(pkg), pkg_version(pkg), pkg_name(deps[i]), pkg_version(deps[i]));
+
				ret = 1;
+
			}
+
		}
+
	}
+

+
	if (ret != 0)
+
		return (ret);
+

+

+
	return (0);
+
}
added pkg/add.h
@@ -0,0 +1,7 @@
+
#ifndef _ADD_H
+
#define _ADD_H
+

+
int exec_add(int, char **);
+
void usage_add(void);
+
#endif
+

modified pkg/main.c
@@ -8,6 +8,7 @@
#include "create.h"
#include "info.h"
#include "which.h"
+
#include "add.h"

static void usage(void);
static void usage_help(void);
@@ -18,7 +19,7 @@ static struct commands {
	int (*exec)(int argc, char **argv);
	void (*usage)(void);
} cmd[] = { 
-
	{ "add", NULL, NULL},
+
	{ "add", exec_add, usage_add},
	{ "create", NULL, NULL},
	{ "delete", NULL, NULL},
	{ "info", exec_info, usage_info},