cache: make cache cleaning work again properly
parent
a7c5fda40a
commit
ba76c5f48a
|
@ -84,6 +84,8 @@ struct apk_package *apk_pkg_new(void);
|
|||
struct apk_package *apk_pkg_read(struct apk_database *db, const char *name);
|
||||
void apk_pkg_free(struct apk_package *pkg);
|
||||
|
||||
int apk_pkg_parse_name(apk_blob_t apkname, apk_blob_t *name, apk_blob_t *version);
|
||||
|
||||
int apk_pkg_add_info(struct apk_database *db, struct apk_package *pkg,
|
||||
char field, apk_blob_t value);
|
||||
int apk_pkg_get_state(struct apk_package *pkg);
|
||||
|
|
51
src/cache.c
51
src/cache.c
|
@ -17,6 +17,7 @@
|
|||
#include "apk_applet.h"
|
||||
#include "apk_database.h"
|
||||
#include "apk_state.h"
|
||||
#include "apk_package.h"
|
||||
|
||||
#define CACHE_CLEAN BIT(0)
|
||||
#define CACHE_DOWNLOAD BIT(1)
|
||||
|
@ -70,7 +71,8 @@ static int cache_clean(struct apk_database *db)
|
|||
struct dirent *de;
|
||||
char path[256], csum[APK_CACHE_CSUM_BYTES];
|
||||
int delete, i;
|
||||
apk_blob_t b;
|
||||
apk_blob_t b, bname, bver;
|
||||
struct apk_name *name;
|
||||
|
||||
snprintf(path, sizeof(path), "%s/%s", db->root, db->cache_dir);
|
||||
if (chdir(path) != 0)
|
||||
|
@ -85,35 +87,36 @@ static int cache_clean(struct apk_database *db)
|
|||
continue;
|
||||
delete = TRUE;
|
||||
do {
|
||||
if (strlen(de->d_name) <= APK_CACHE_CSUM_BYTES*2+2)
|
||||
break;
|
||||
b = APK_BLOB_PTR_LEN(de->d_name, APK_CACHE_CSUM_BYTES*2);
|
||||
b = APK_BLOB_STR(de->d_name);
|
||||
apk_blob_pull_hexdump(&b, APK_BLOB_BUF(csum));
|
||||
if (APK_BLOB_IS_NULL(b))
|
||||
break;
|
||||
if (de->d_name[APK_CACHE_CSUM_BYTES*2] != '.')
|
||||
break;
|
||||
if (strcmp(&de->d_name[APK_CACHE_CSUM_BYTES*2+1],
|
||||
apk_index_gz) == 0) {
|
||||
apk_blob_pull_char(&b, '.');
|
||||
|
||||
if (apk_blob_compare(b, APK_BLOB_STR(apk_index_gz)) == 0) {
|
||||
/* Index - check for matching repository */
|
||||
for (i = 0; i < db->num_repos; i++)
|
||||
for (i = 0; i < db->num_repos; i++) {
|
||||
if (memcmp(db->repos[i].csum.data,
|
||||
csum, APK_CACHE_CSUM_BYTES) == 0)
|
||||
break;
|
||||
delete = (i >= db->num_repos);
|
||||
} else {
|
||||
csum, APK_CACHE_CSUM_BYTES) != 0)
|
||||
continue;
|
||||
delete = 0;
|
||||
break;
|
||||
}
|
||||
} else if (b.len > 4 &&
|
||||
memcmp(b.ptr+b.len-4, ".apk", 4) == 0) {
|
||||
/* Package - search for it */
|
||||
#if 0
|
||||
pkg = apk_db_get_pkg(db, csum);
|
||||
if (pkg == NULL)
|
||||
if (apk_pkg_parse_name(b, &bname, &bver) < 0)
|
||||
break;
|
||||
|
||||
snprintf(path, sizeof(path), "%s-%s.apk",
|
||||
pkg->name->name, pkg->version);
|
||||
delete = strcmp(&de->d_name[sizeof(csum_t)*2+1],
|
||||
path);
|
||||
#endif
|
||||
//#warning FIXME - need to check if cache file is valid - look up using name, check csum
|
||||
name = apk_db_get_name(db, bname);
|
||||
if (name == NULL || name->pkgs == NULL)
|
||||
break;
|
||||
|
||||
for (i = 0; i < name->pkgs->num; i++) {
|
||||
struct apk_package *pkg = name->pkgs->item[i];
|
||||
if (memcmp(pkg->csum.data, csum, APK_CACHE_CSUM_BYTES) != 0)
|
||||
continue;
|
||||
delete = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (0);
|
||||
|
||||
|
|
|
@ -43,6 +43,9 @@ int apk_pkg_parse_name(apk_blob_t apkname,
|
|||
{
|
||||
int i, dash = 0;
|
||||
|
||||
if (APK_BLOB_IS_NULL(apkname))
|
||||
return -1;
|
||||
|
||||
for (i = apkname.len - 2; i >= 0; i--) {
|
||||
if (apkname.ptr[i] != '-')
|
||||
continue;
|
||||
|
|
Loading…
Reference in New Issue