Skip to content

Commit

Permalink
Add :
Browse files Browse the repository at this point in the history
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
  • Loading branch information
bapt committed Jan 12, 2011
1 parent 071ba84 commit fc7e176
Show file tree
Hide file tree
Showing 7 changed files with 132 additions and 8 deletions.
35 changes: 35 additions & 0 deletions libpkg/pkg.c
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)
{
Expand Down
10 changes: 10 additions & 0 deletions libpkg/pkg.h
Expand Up @@ -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 *);
Expand All @@ -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 *);
Expand Down
6 changes: 0 additions & 6 deletions libpkg/pkg_private.h
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion pkg/Makefile
Expand Up @@ -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
Expand Down
76 changes: 76 additions & 0 deletions 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);
}
7 changes: 7 additions & 0 deletions pkg/add.h
@@ -0,0 +1,7 @@
#ifndef _ADD_H
#define _ADD_H

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

3 changes: 2 additions & 1 deletion pkg/main.c
Expand Up @@ -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);
Expand All @@ -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},
Expand Down

0 comments on commit fc7e176

Please sign in to comment.