aboutsummaryrefslogtreecommitdiff
path: root/qpkg.c
diff options
context:
space:
mode:
authorFabian Groffen <grobian@gentoo.org>2019-03-09 19:55:47 +0100
committerFabian Groffen <grobian@gentoo.org>2019-03-09 19:58:23 +0100
commitaffdba842a41c49b71911109272186acf36cfd8a (patch)
treed204e4b684260ae6759e06aeb99a96fa3d64a0dd /qpkg.c
parentrmspace: add copyright (diff)
downloadportage-utils-affdba842a41c49b71911109272186acf36cfd8a.tar.gz
portage-utils-affdba842a41c49b71911109272186acf36cfd8a.tar.bz2
portage-utils-affdba842a41c49b71911109272186acf36cfd8a.zip
libq: introduce set to replace virtuals (queue)
The virtuals file contained some queue functions which actually were list functions. Replaced this with a proper set, which hash backend to speed up many search operations. Changed throughout the code to use more efficient path. While at it, merge xstrdup wrappers in xmalloc, and use wrappers more consistently. Signed-off-by: Fabian Groffen <grobian@gentoo.org>
Diffstat (limited to 'qpkg.c')
-rw-r--r--qpkg.c58
1 files changed, 30 insertions, 28 deletions
diff --git a/qpkg.c b/qpkg.c
index dcdc1905..05c85051 100644
--- a/qpkg.c
+++ b/qpkg.c
@@ -44,15 +44,17 @@ filter_tbz2(const struct dirent *dentry)
/* process a single dir for cleaning. dir can be a $PKGDIR, $PKGDIR/All/, $PKGDIR/$CAT */
static uint64_t
-qpkg_clean_dir(char *dirp, queue *vdb)
+qpkg_clean_dir(char *dirp, set *vdb)
{
- queue *ll;
+ set *ll = NULL;
struct dirent **fnames;
int i, count;
char buf[_Q_PATH_MAX];
struct stat st;
uint64_t num_all_bytes = 0;
size_t disp_units = 0;
+ char **t;
+ bool ignore;
if (dirp == NULL)
return 0;
@@ -61,18 +63,13 @@ qpkg_clean_dir(char *dirp, queue *vdb)
if ((count = scandir(".", &fnames, filter_tbz2, alphasort)) < 0)
return 0;
+ /* create copy of vdb with only basenames */
+ for ((void)list_set(vdb, &t); *t != NULL; t++)
+ ll = add_set_unique(basename(*t), ll, &ignore);
+
for (i = 0; i < count; i++) {
- int del = 1;
fnames[i]->d_name[strlen(fnames[i]->d_name)-5] = 0;
- for (ll = vdb; ll != NULL; ll = ll->next) {
- if (1) {
- if (strcmp(fnames[i]->d_name, basename(ll->name)) == 0) {
- del = 0;
- break;
- }
- }
- }
- if (!del)
+ if (contains_set(fnames[i]->d_name, ll))
continue;
snprintf(buf, sizeof(buf), "%s.tbz2", fnames[i]->d_name);
if (lstat(buf, &st) != -1) {
@@ -81,14 +78,19 @@ qpkg_clean_dir(char *dirp, queue *vdb)
if ((st.st_size / KILOBYTE) > 1000)
disp_units = MEGABYTE;
num_all_bytes += st.st_size;
- qprintf(" %s[%s%s %3s %s %s%s]%s %s%s/%s%s\n", DKBLUE, NORM, GREEN, make_human_readable_str(st.st_size, 1, disp_units),
- disp_units == MEGABYTE ? "M" : "K", NORM, DKBLUE, NORM, CYAN, basename(dirp), fnames[i]->d_name, NORM);
+ qprintf(" %s[%s%s %3s %s %s%s]%s %s%s/%s%s\n",
+ DKBLUE, NORM, GREEN,
+ make_human_readable_str(st.st_size, 1, disp_units),
+ disp_units == MEGABYTE ? "M" : "K",
+ NORM, DKBLUE, NORM, CYAN,
+ basename(dirp), fnames[i]->d_name, NORM);
}
if (!pretend)
unlink(buf);
}
}
+ free_set(ll);
scandir_free(fnames, count);
return num_all_bytes;
@@ -103,18 +105,14 @@ qpkg_clean(char *dirp)
size_t disp_units = 0;
uint64_t num_all_bytes;
struct dirent **dnames;
- queue *vdb;
-
- vdb = get_vdb_atoms(1);
+ set *vdb;
- if (chdir(dirp) != 0) {
- free_sets(vdb);
+ if (chdir(dirp) != 0)
return 1;
- }
- if ((count = scandir(".", &dnames, filter_hidden, alphasort)) < 0) {
- free_sets(vdb);
+ if ((count = scandir(".", &dnames, filter_hidden, alphasort)) < 0)
return 1;
- }
+
+ vdb = get_vdb_atoms(1);
if (eclean) {
size_t n;
@@ -141,11 +139,13 @@ qpkg_clean(char *dirp)
if ((p = strrchr(buf, '/')) == NULL)
continue;
*p = 0;
- /* these strcat() are safe. the name is extracted from buf already. */
+ /* these strcat() are safe. the name is extracted from
+ * buf already. */
strcat(buf, "/");
strcat(buf, name);
- /* num_all_bytes will be off when pretend and eclean are enabled together */
+ /* num_all_bytes will be off when pretend and eclean are
+ * enabled together */
/* vdb = del_set(buf, vdb, &i); */
vdb = add_set(buf, vdb);
}
@@ -164,13 +164,15 @@ qpkg_clean(char *dirp)
}
scandir_free(dnames, count);
- free_sets(vdb);
+ free_set(vdb);
disp_units = KILOBYTE;
if ((num_all_bytes / KILOBYTE) > 1000)
disp_units = MEGABYTE;
- qprintf(" %s*%s Total space that would be freed in packages directory: %s%s %c%s\n", GREEN, NORM, RED,
- make_human_readable_str(num_all_bytes, 1, disp_units), disp_units == MEGABYTE ? 'M' : 'K', NORM);
+ qprintf(" %s*%s Total space that would be freed in packages "
+ "directory: %s%s %c%s\n", GREEN, NORM, RED,
+ make_human_readable_str(num_all_bytes, 1, disp_units),
+ disp_units == MEGABYTE ? 'M' : 'K', NORM);
return 0;
}