rockerzz |
|
Темы:
3
Сообщения:
12
Участник с: 14 января 2008
|
Вот это считалось багом: http://bugs.archlinux.org/task/8061 . Теперь при попытке очистить кэш и отрицательном ответе на вопрос "Do you want to remove uninstalled packages from cache? " pacman не удаляет старые пакеты. Все таки это баг или фича? |
amigo |
|
![]()
Темы:
35
Сообщения:
2126
Участник с: 05 февраля 2007
|
вообще, pacman - фича archlinux ;)
Разберемся, голубчик!
|
cucullus |
|
![]()
Темы:
269
Сообщения:
3574
Участник с: 06 июня 2007
|
а как должно быть? ;)
такие дела.
|
rockerzz |
|
Темы:
3
Сообщения:
12
Участник с: 14 января 2008
|
cucullus До версии 3.1 удалялись старые версии пакетов, но оставались не инсталлированные. Теперь же он сносит и старые и не инсталлированные, если сказать “Yes” на вопрос из предыдущего поста. В случае отказа - ничего не происходит. |
cucullus |
|
![]()
Темы:
269
Сообщения:
3574
Участник с: 06 июня 2007
|
ну это вопрос терминологический. ;) старый пакет тоже ведь не инсталлирован. в любом случае нужные вещи только в кэше лучше не держать.
такие дела.
|
drsmp |
|
Темы:
8
Сообщения:
52
Участник с: 25 января 2008
|
Данный факт меня опечалил :( , хоть на старую версию откатывайся. Как хорошо раньше - в крон прописал yes|pacman -Syu && yes|pacman -Sc и никаких заморок. А сейчас придется скрипт придумывать… |
rockerzz |
|
Темы:
3
Сообщения:
12
Участник с: 14 января 2008
|
Я тупо выдрал из сорцов пекмана функцию clean_cache() со всеми функциями которые она использует и собрал отдельную програмульку. |
rockerzz |
|
Темы:
3
Сообщения:
12
Участник с: 14 января 2008
|
В общем может кому еще пригодится. Так как тупо выдрал код - ответственности за работу не несу, но сам использую. Собирать так: gcc -lalpm -o ./cache_cleaner ./cache_cleaner.c. ./cache_cleaner - чистить /var/cache/pacman/pkg/ ./cache_cleaner <dir> - соответствующую директорию. Работает с последним пакманом 3.1.1-1. В конце добавил возможность подтверждения удаления файла, чтобы убедится, что все работает корректно. #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <sys/types.h> #include <dirent.h> #include <alpm.h> #include <libintl.h> #define _(str) gettext(str) #define PM_EXT_PKG ".pkg.tar.gz" /* internal */ static char *_supported_archs[] = { "i586", "i686", "ppc", "x86_64", }; char *alpm_pkg_name_hasarch(char *pkgname) { /* TODO remove this when we transfer everything over to -ARCH * * this parsing sucks... it's done to support * two package formats for the time being: * package-name-foo-1.0.0-1-i686 * and * package-name-bar-1.2.3-1 */ size_t i = 0; char *arch, *cmp, *p; if((p = strrchr(pkgname, '-'))) { for(i=0; i < sizeof(_supported_archs)/sizeof(char*); ++i) { cmp = p+1; arch = _supported_archs[i]; /* whee, case insensitive compare */ while(*arch && *cmp && tolower(*arch++) == tolower(*cmp++)) ; if(*arch || *cmp) { continue; } return(p); } } return(NULL); } /* Trim whitespace and newlines from a string */ char *strtrim(char *str) { char *pch = str; while(isspace(*pch)) { pch++; } if(pch != str) { memmove(str, pch, (strlen(pch) + 1)); } pch = (char *)(str + (strlen(str) - 1)); while(isspace(*pch)) { pch--; } *++pch = '\0'; return str; } /* presents a prompt and gets a Y/N answer */ /* TODO there must be a better way */ int yesno(char *fmt, ...) { char response[32]; va_list args; /* if(config->noconfirm) { return(1); } */ va_start(args, fmt); /* Use stderr so questions are always displayed when redirecting output */ vfprintf(stderr, fmt, args); va_end(args); if(fgets(response, 32, stdin)) { if(strlen(response) != 0) { strtrim(response); } if(!strcasecmp(response, _("Y")) || !strcasecmp(response, _("YES")) || strlen(response) == 0) { return(1); } } return(0); } static int split_pkgname(char *target, char *name, char *version) { char tmp[512]; char *p, *q; if(target == NULL) { return(-1); } /* trim path name (if any) */ if((p = strrchr(target, '/')) == NULL) { p = target; } else { p++; } strncpy(tmp, p, 512); /* trim file extension (if any) */ if((p = strstr(tmp, PM_EXT_PKG))) { *p = '\0'; } /* trim architecture */ if((p = alpm_pkg_name_hasarch(tmp))) { *p = '\0'; } p = tmp + strlen(tmp); for(q = --p; *q && *q != '-'; q--); if(*q != '-' || q == tmp) { return(-1); } for(p = --q; *p && *p != '-'; p--); if(*p != '-' || p == tmp) { return(-1); } strncpy(version, p+1, 64); *p = '\0'; strncpy(name, tmp, 256); return(0); } int clean_cache(const char *cachedir) { DIR *dir; struct dirent *ent; alpm_list_t *cache = NULL, *clean = NULL, *i, *j; printf(_("Cache directory: %s\n"), cachedir); if(!yesno(_("Do you want to remove uninstalled packages from cache? [Y/n] "))) { return(0); } printf(_("removing old packages from cache... \n")); dir = opendir(cachedir); if(dir == NULL) { fprintf(stderr, _("error: could not access cache directory\n")); return(1); } rewinddir(dir); while((ent = readdir(dir)) != NULL) { if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { continue; } cache = alpm_list_add(cache, strdup(ent->d_name)); } closedir(dir); for(i = cache; i; i = alpm_list_next(i)) { char *str = alpm_list_getdata(i); char name[256], version[64]; if(strstr(str, PM_EXT_PKG) == NULL) { clean = alpm_list_add(clean, strdup(str)); continue; } if(split_pkgname(str, name, version) != 0) { clean = alpm_list_add(clean, strdup(str)); continue; } for(j = alpm_list_next(i); j; j = alpm_list_next(j)) { char *s = alpm_list_getdata(j); char n[256], v[64]; if(strstr(s, PM_EXT_PKG) == NULL) { continue; } if(strstr(s, PM_EXT_PKG ".part")) { continue; } if(split_pkgname(s, n, v) != 0) { continue; } //printf("compare %s with %s\n", name, n); /* TODO Do not remove the currently installed version EITHER */ if(!strcmp(name, n)) { char *ptr = (alpm_pkg_vercmp(version, v) < 0) ? str : s; if(!alpm_list_find_str(clean, ptr)) { clean = alpm_list_add(clean, strdup(ptr)); } } } } for(i = clean; i; i = alpm_list_next(i)) { char path[PATH_MAX]; snprintf(path, PATH_MAX, "%s/%s", cachedir, (char *)alpm_list_getdata(i)); printf("unlink %s\n", path); if(yesno(_("Remove [Y/n]"))) unlink(path); } } int main(int argc, char **argv) { char *cachedir = (NULL == argv[1]) ? "/var/cache/pacman/pkg" : argv[1]; clean_cache(cachedir); return EXIT_SUCCESS; } |
hedgehog |
|
Темы:
12
Сообщения:
48
Участник с: 28 декабря 2007
|
а он(cache_cleaner) оставит то что сейчас установлено? |
rockerzz |
|
Темы:
3
Сообщения:
12
Участник с: 14 января 2008
|
hedgehog Удаляются только дубликаты пакетов с меньшей версией и файлы, информации о которых нет в локальной базе репозиториев. Пример: #ls 123 - будет удален 123.pkg.tar.gz - будет удален dnsutils-9.4.2-1-i686.pkg.tar.gz - останется, хотя в системе не установлен, но такой пакет существует в core psi-0.11-2-i686.pkg.tar.gz - будет удален psi-0.11-2.2-i686.pkg.tar.gz - актуальная версия останется |