Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Implement AUTOCLEAN
Baptiste Daroussin committed 10 years ago
commit 69205cd6f0023eee035be267244f89e82f8cf765
parent 74199f0
8 files changed +100 -1
modified docs/pkg.conf.5
@@ -15,7 +15,7 @@
.\"     @(#)pkg.1
.\" $FreeBSD$
.\"
-
.Dd June 19, 2015
+
.Dd June 22, 2015
.Dt PKG.CONF 5
.Os
.Sh NAME
@@ -72,6 +72,13 @@ a syntactically correct
command line when substituted in and followed by any remaining tokens from
the original command line.
Default: not set.
+
.It Cm AUTOCLEAN: boolean
+
Automatically cleanout the content of
+
.Em PKG_CACHEDIR
+
after each non dry-run call to
+
.Xr pkg-install 8
+
or
+
.Xr pkg-upgrade 8
.It Cm DEFAULT_ALWAYS_YES: boolean
When this option is enabled
.Xr pkg 1
modified libpkg/Makefile.am
@@ -22,6 +22,7 @@ endif

libpkg_la_SOURCES=	pkg.c \
			backup.c \
+
			clean_cache.c \
			dns_utils.c \
			fetch.c \
			packing.c \
added libpkg/clean_cache.c
@@ -0,0 +1,76 @@
+
/*-
+
 * Copyright (c) 2015 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * All rights reserved.
+
 * 
+
 * Redistribution and use in source and binary forms, with or without
+
 * modification, are permitted provided that the following conditions
+
 * are met:
+
 * 1. Redistributions of source code must retain the above copyright
+
 *    notice, this list of conditions and the following disclaimer
+
 *    in this position and unchanged.
+
 * 2. Redistributions in binary form must reproduce the above copyright
+
 *    notice, this list of conditions and the following disclaimer in the
+
 *    documentation and/or other materials provided with the distribution.
+
 * 
+
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
 */
+

+
#include <sys/stat.h>
+

+
#include <assert.h>
+
#include <dirent.h>
+
#include "pkg.h"
+
#include "private/pkg.h"
+
#include "private/event.h"
+

+
static void
+
rm_rf(const char *path)
+
{
+
	DIR *d;
+
	struct dirent *e;
+
	struct stat st;
+
	char filepath[MAXPATHLEN];
+

+
	if ((d = opendir(path)) == NULL) {
+
		pkg_emit_errno("opendir", path);
+
		return;
+
	}
+

+
	while ((e = readdir(d)) != NULL) {
+
		if (strcmp(e->d_name, ".") == 0 || strcmp(e->d_name, "..") == 0)
+
			continue;
+
		snprintf(filepath, sizeof(filepath), "%s/%s", path, e->d_name);
+
		if (lstat(filepath, &st) != 0) {
+
			pkg_emit_errno("lstat", filepath);
+
			continue;
+
		}
+
		if (S_ISDIR(st.st_mode))
+
			rm_rf(filepath);
+
		remove(filepath);
+
	}
+
	closedir(d);
+
}
+

+
void
+
pkg_cache_full_clean(void)
+
{
+
	const char *cachedir;
+

+
	if (!pkg_object_bool(pkg_config_get("AUTOCLEAN")))
+
		return;
+

+
	pkg_debug(1, "Cleaning up cachedir");
+

+
	cachedir = pkg_object_string(pkg_config_get("PKG_CACHEDIR"));
+

+
	return (rm_rf(cachedir));
+
}
modified libpkg/libpkg.ver
@@ -16,6 +16,7 @@ global:
	pkg_audit_load;
	pkg_audit_new;
	pkg_audit_process;
+
	pkg_cache_full_clean;
	pkg_compiled_for_same_os_major;
	pkg_conf;
	pkg_config_dump;
modified libpkg/pkg.h.in
@@ -1674,6 +1674,8 @@ int pkg_add_port(struct pkgdb *db, struct pkg *pkg, const char *root, \
    const char *locationn, bool testing);
char *pkg_absolutepath(const char *src, char *dest, size_t dest_len);

+
void pkg_cache_full_clean(void);
+

#ifdef __cplusplus
}
#endif
modified libpkg/pkg_config.c
@@ -367,6 +367,12 @@ static struct config_entry c[] = {
		"NO",
		"Enable verbose mode for 'pkg create'",
	},
+
	{
+
		PKG_BOOL,
+
		"AUTOCLEAN",
+
		"NO",
+
		"Always cleanup the cache directory after install/upgrade",
+
	},
};

static bool parsed = false;
modified src/install.c
@@ -269,6 +269,9 @@ cleanup:
	pkg_jobs_free(jobs);
	pkgdb_close(db);

+
	if (!dry_run)
+
		pkg_cache_full_clean();
+

	if (!rc && newpkgversion)
		newpkgversion = false;

modified src/upgrade.c
@@ -222,6 +222,9 @@ cleanup:
	pkgdb_release_lock(db, lock_type);
	pkgdb_close(db);

+
	if (!dry_run)
+
		pkg_cache_full_clean();
+

	if (!rc && newpkgversion)
		newpkgversion = false;