Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
WIP: delete
jlaffaye committed 15 years ago
commit 86b89a884cc25da4d07596a1f7c087269eb5a4db
parent a0e181cd52b4c54f45a72bd48b96c401539521b5
8 files changed +146 -6
modified libpkg/Makefile
@@ -9,11 +9,12 @@ SHLIB_MAJOR= 0
SRCS=		pkg.c \
		pkgdb.c \
		pkg_conflict.c \
-
		pkg_ports.c \
+
		pkg_delete.c \
+
		pkg_exec.c \
		pkg_file.c \
		pkg_manifest.c \
+
		pkg_ports.c \
		pkg_version.c \
-
		pkg_exec.c \
		util.c

CFLAGS+=	-std=c99
modified libpkg/pkg.h
@@ -110,6 +110,7 @@ int pkgdb_open(struct pkgdb **);
void pkgdb_close(struct pkgdb *);

int pkgdb_register_pkg(struct pkgdb *, struct pkg *);
+
int pkgdb_unregister_pkg(struct pkgdb *, const char *);

struct pkgdb_it * pkgdb_query(struct pkgdb *, const char *, match_t);
struct pkgdb_it * pkgdb_query_which(struct pkgdb *, const char *);
@@ -138,6 +139,9 @@ int pkgdb_errnum(struct pkgdb *);
typedef enum pkg_formats { TAR, TGZ, TBZ, TXZ } pkg_formats;
int pkg_create(const char *, pkg_formats, const char *, const char *, struct pkg *);

+
/* delete */
+
int pkg_delete(struct pkg *, struct pkgdb *, int);
+

/* version */
int pkg_version_cmp(const char *, const char *);

added libpkg/pkg_delete.c
@@ -0,0 +1,34 @@
+
#include <err.h>
+
#include <unistd.h>
+

+
#include "pkg.h"
+

+
int
+
pkg_delete(struct pkg *pkg, struct pkgdb *db, int force)
+
{
+
	struct pkg **rdeps;
+
	struct pkg_file **files;
+

+
	if (pkg == NULL || db == NULL)
+
		return (-1);
+

+
	rdeps = pkg_rdeps(pkg);
+
	files = pkg_files(pkg);
+

+
	if (rdeps == NULL || files == NULL)
+
		return (-1);
+

+
	if (rdeps[0] != NULL && force == 0) {
+
		warnx("%s is required by other packages", pkg_get(pkg, PKG_ORIGIN));
+
		return (-1); /* TODO: special return code */
+
	}
+

+
	for (int i = 0; files[i] != NULL; i++) {
+
		if (unlink(pkg_file_path(files[i])) == -1) {
+
			warn("unlink(%s)", pkg_file_path(files[i]));
+
			continue;
+
		}
+
	}
+

+
	return (pkgdb_unregister_pkg(db, pkg_get(pkg, PKG_ORIGIN)));
+
}
modified libpkg/pkgdb.c
@@ -368,8 +368,10 @@ pkgdb_it_next_file(struct pkgdb_it *it, struct pkg_file **file_p)
void
pkgdb_it_free(struct pkgdb_it *it)
{
-
	sqlite3_finalize(it->stmt);
-
	free(it);
+
	if (it != NULL) {
+
		sqlite3_finalize(it->stmt);
+
		free(it);
+
	}
}

struct pkgdb_it *
@@ -636,6 +638,26 @@ pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg)

	sqlite3_exec(db->sqlite, "COMMIT;", NULL, NULL, NULL);

-
	
+
	return (0);
+
}
+

+
int
+
pkgdb_unregister_pkg(struct pkgdb *db, const char *origin)
+
{
+
	sqlite3_stmt *stmt_del;
+
	int ret;
+

+
	if (db == NULL || origin == NULL)
+
		return (-1);
+

+
	sqlite3_prepare(db->sqlite, "DELETE FROM packages WHERE origin = ?1",
+
					-1, &stmt_del, NULL);
+
	sqlite3_bind_text(stmt_del, 1, origin, -1, SQLITE_STATIC);
+
	ret = sqlite3_step(stmt_del);
+
	sqlite3_finalize(stmt_del);
+

+
	if (ret != SQLITE_DONE)
+
		return (-1);
+

	return (0);
}
modified pkg/Makefile
@@ -1,5 +1,6 @@
PROG=	pkg
SRCS=	main.c \
+
	delete.c \
	info.c \
	which.c \
	register.c \
added pkg/delete.c
@@ -0,0 +1,70 @@
+
#include <err.h>
+
#include <stdio.h>
+
#include <sysexits.h>
+
#include <unistd.h>
+

+
#include <pkg.h>
+

+
#include "delete.h"
+

+
void
+
usage_delete(void)
+
{
+
	fprintf(stderr, "delete [-f] <pkg-name>\n"
+
			"delete -a");
+
}
+

+
int
+
exec_delete(int argc, char **argv)
+
{
+
	struct pkg *pkg;
+
	struct pkgdb *db;
+
	struct pkgdb_it *it;
+
	match_t match = MATCH_EXACT;
+
	char *origin = NULL;
+
	char ch;
+
	int force = 0;
+
	int retcode = 0;
+

+
	while ((ch = getopt(argc, argv, "af")) != -1) {
+
		switch (ch) {
+
			case 'a':
+
				match = MATCH_ALL;
+
				force = 1;
+
				break;
+
			case 'f':
+
				force = 1;
+
				break;
+
		}
+
	}
+
	argc -= optind;
+
	argv += optind;
+

+
	if (argc != 1 && match == MATCH_EXACT) {
+
		usage_delete();
+
		return (EX_USAGE);
+
	}
+

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

+
	if (argc == 1)
+
		origin = argv[0];
+

+
	it = pkgdb_query(db, origin, match);
+

+
	pkg_new(&pkg);
+
	while (pkgdb_it_next_pkg(it, &pkg, PKG_BASIC|PKG_FILES|PKG_RDEPS) == 0) {
+
		if (pkg_delete(pkg, db, force) != 0) {
+
			retcode++;
+
			warnx("Can not delete %s", pkg_get(pkg, PKG_ORIGIN));
+
		}
+
	}
+
	pkg_free(pkg);
+

+
	pkgdb_it_free(it);
+
	pkgdb_close(db);
+
	return (retcode);
+
}
added pkg/delete.h
@@ -0,0 +1,7 @@
+
#ifndef _DELETE_H
+
#define _DELETE_H
+

+
void usage_delete(void);
+
int exec_delete(int, char **);
+

+
#endif
modified pkg/main.c
@@ -6,6 +6,7 @@
#include <sysexits.h>

#include "create.h"
+
#include "delete.h"
#include "info.h"
#include "which.h"
#include "add.h"
@@ -23,7 +24,7 @@ static struct commands {
} cmd[] = { 
	{ "add", exec_add, usage_add},
	{ "create", NULL, NULL},
-
	{ "delete", NULL, NULL},
+
	{ "delete", exec_delete, usage_delete},
	{ "info", exec_info, usage_info},
	{ "install", NULL, NULL},
	{ "update", NULL, NULL},