Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Fix pkg upgrade leaving directories behind
Baptiste Daroussin committed 11 years ago
commit 4d852ea91be66abd1405f22b2fa173894e54a5fd
parent d95716e
3 files changed +17 -16
modified libpkg/pkg_add.c
@@ -380,7 +380,7 @@ cleanup:
}

static int
-
pkg_add_cleanup_old(struct pkg *old, struct pkg *new, int flags)
+
pkg_add_cleanup_old(struct pkgdb *db, struct pkg *old, struct pkg *new, int flags)
{
	struct pkg_file *f;
	struct pkg_dir *d, *cd;
@@ -414,12 +414,7 @@ pkg_add_cleanup_old(struct pkg *old, struct pkg *new, int flags)
		}

		d = NULL;
-
		while (pkg_dirs(old, &d) == EPKG_OK) {
-
			HASH_FIND_STR(new->dirs, d->path, cd);
-

-
			if (cd == NULL)
-
				pkg_delete_dir(old, d);
-
		}
+
		pkg_delete_dirs(db, old, new);
	}

	return (ret);
@@ -512,7 +507,7 @@ pkg_add_common(struct pkgdb *db, const char *path, unsigned flags,

	if (local != NULL) {
		pkg_debug(1, "Cleaning up old version");
-
		if (pkg_add_cleanup_old(local, pkg, flags) != EPKG_OK) {
+
		if (pkg_add_cleanup_old(db, local, pkg, flags) != EPKG_OK) {
			retcode = EPKG_FATAL;
			goto cleanup;
		}
@@ -535,7 +530,7 @@ pkg_add_common(struct pkgdb *db, const char *path, unsigned flags,
	    != EPKG_OK) {
		/* If the add failed, clean up (silently) */
		pkg_delete_files(pkg, 2);
-
		pkg_delete_dirs(db, pkg);
+
		pkg_delete_dirs(db, pkg, NULL);
		goto cleanup_reg;
	}

modified libpkg/pkg_delete.c
@@ -94,7 +94,7 @@ pkg_delete(struct pkg *pkg, struct pkgdb *db, unsigned flags)
			return (ret);
	}

-
	ret = pkg_delete_dirs(db, pkg);
+
	ret = pkg_delete_dirs(db, pkg, NULL);
	if (ret != EPKG_OK)
		return (ret);

@@ -328,12 +328,18 @@ pkg_delete_dir(struct pkg *pkg, struct pkg_dir *dir)
}

int
-
pkg_delete_dirs(__unused struct pkgdb *db, struct pkg *pkg)
+
pkg_delete_dirs(__unused struct pkgdb *db, struct pkg *pkg, struct pkg *new)
{
-
	struct pkg_dir		*dir = NULL;
-

-
	while (pkg_dirs(pkg, &dir) == EPKG_OK)
-
		pkg_delete_dir(pkg, dir);
+
	struct pkg_dir	*dir = NULL;
+
	struct pkg_dir	*d;
+

+
	while (pkg_dirs(pkg, &dir) == EPKG_OK) {
+
		d = NULL;
+
		if (new != NULL)
+
			HASH_FIND_STR(new->dirs, dir->path, d);
+
		if (d == NULL)
+
			pkg_delete_dir(pkg, dir);
+
	}

	pkg_effective_rmdir(db, pkg);

modified libpkg/private/pkg.h
@@ -575,7 +575,7 @@ pkg_formats packing_format_from_string(const char *str);
const char* packing_format_to_string(pkg_formats format);

int pkg_delete_files(struct pkg *pkg, unsigned force);
-
int pkg_delete_dirs(struct pkgdb *db, struct pkg *pkg);
+
int pkg_delete_dirs(struct pkgdb *db, struct pkg *pkg, struct pkg *p);

/* pkgdb commands */
int sql_exec(sqlite3 *, const char *, ...);