summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2012-01-18 12:12:39 -0600
committerDan McGee <dan@archlinux.org>2012-01-18 12:15:11 -0600
commitbe229d129eeb43e774217921e1c7e1bb802775fe (patch)
tree77ef45e534577248f5985e068d22382ad33ad20b
parente8a2c2545608c556cb65d96e7015a1d09d8b3890 (diff)
downloadpacman-be229d129eeb43e774217921e1c7e1bb802775fe.tar.xz
Don't remove unknown files in cache cleaning code
This removes the hack I added to skip '*.sig' files earlier since there are other files that also fall into the same bucket- source packages from `makepkg --source`, delta files, etc. Rather than prompting for each and every one, simply skip them. Doing '-Scc' rather than '-Sc' will delete these files if that is really what you want to do. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--doc/pacman.8.txt2
-rw-r--r--src/pacman/sync.c32
2 files changed, 11 insertions, 23 deletions
diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index 59853812..275f8ac0 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -349,7 +349,7 @@ Sync Options[[SO]]
databases are saved for every sync DB you download from, and are not
deleted even if they are removed from the configuration file
linkman:pacman.conf[5]. Use one '\--clean' switch to only remove
- packages that are no longer installed; use two to remove all packages
+ packages that are no longer installed; use two to remove all files
from the cache. In both cases, you will have a yes or no option to
remove packages and/or unused downloaded databases.
+
diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index 2773708c..2c64f090 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -198,7 +198,6 @@ static int sync_cleancache(int level)
/* step through the directory one file at a time */
while((ent = readdir(dir)) != NULL) {
char path[PATH_MAX];
- size_t pathlen;
int delete = 1;
alpm_pkg_t *localpkg = NULL, *pkg = NULL;
const char *local_name, *local_version;
@@ -209,30 +208,18 @@ static int sync_cleancache(int level)
/* build the full filepath */
snprintf(path, PATH_MAX, "%s%s", cachedir, ent->d_name);
- /* short circuit for removing all packages from cache */
+ /* short circuit for removing all files from cache */
if(level > 1) {
unlink(path);
continue;
}
- /* we handle .sig files with packages, not separately */
- pathlen = strlen(path);
- if(strcmp(path + pathlen - 4, ".sig") == 0) {
- continue;
- }
-
- /* attempt to load the package, prompt removal on failures as we may have
- * files here that aren't valid packages. we also don't need a full
- * load of the package, just the metadata. */
- if(alpm_pkg_load(config->handle, path, 0, 0, &localpkg) != 0
- || localpkg == NULL) {
- if(yesno(_("File %s does not seem to be a valid package, remove it?"),
- path)) {
- if(localpkg) {
- alpm_pkg_free(localpkg);
- }
- unlink(path);
- }
+ /* attempt to load the file as a package. if we cannot load the file,
+ * simply skip it and move on. we don't need a full load of the package,
+ * just the metadata. */
+ if(alpm_pkg_load(config->handle, path, 0, 0, &localpkg) != 0) {
+ pm_printf(ALPM_LOG_DEBUG, "skipping %s, could not load as package\n",
+ path);
continue;
}
local_name = alpm_pkg_get_name(localpkg);
@@ -244,7 +231,7 @@ static int sync_cleancache(int level)
if(pkg != NULL && alpm_pkg_vercmp(local_version,
alpm_pkg_get_version(pkg)) == 0) {
/* package was found in local DB and version matches, keep it */
- pm_printf(ALPM_LOG_DEBUG, "pkg %s-%s found in local db\n",
+ pm_printf(ALPM_LOG_DEBUG, "package %s-%s found in local db\n",
local_name, local_version);
delete = 0;
}
@@ -258,7 +245,7 @@ static int sync_cleancache(int level)
if(pkg != NULL && alpm_pkg_vercmp(local_version,
alpm_pkg_get_version(pkg)) == 0) {
/* package was found in a sync DB and version matches, keep it */
- pm_printf(ALPM_LOG_DEBUG, "pkg %s-%s found in sync db\n",
+ pm_printf(ALPM_LOG_DEBUG, "package %s-%s found in sync db\n",
local_name, local_version);
delete = 0;
}
@@ -268,6 +255,7 @@ static int sync_cleancache(int level)
alpm_pkg_free(localpkg);
if(delete) {
+ size_t pathlen = strlen(path);
unlink(path);
/* unlink a signature file if present too */
if(PATH_MAX - 5 >= pathlen) {