From d7d749312d7d87d562a7f4280b3092f30c3e9851 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Fri, 5 Sep 2014 21:07:07 +0200 Subject: [PATCH] xbps-rindex: use xbps_binpkg_{arch,pkgver} for -r (remove-obsoletes). This is magnituds faster than before; some results: $ for f in 1 2 3; do time xbps-rindex -r /var/cache/xbps/ &>/dev/null; done real 0m0.624s user 0m2.163s sys 0m0.032s real 0m0.590s user 0m2.159s sys 0m0.023s real 0m0.584s user 0m2.144s sys 0m0.039s $ for f in 1 2 3; do time LD_PRELOAD=$PWD/lib/libxbps.so.2.0.0 ./bin/xbps-rindex/xbps-rindex -r /var/cache/xbps &>/dev/null; done real 0m0.037s user 0m0.030s sys 0m0.010s real 0m0.036s user 0m0.032s sys 0m0.007s real 0m0.037s user 0m0.035s sys 0m0.006s $ --- bin/xbps-rindex/remove-obsoletes.c | 36 +++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/bin/xbps-rindex/remove-obsoletes.c b/bin/xbps-rindex/remove-obsoletes.c index c5d1a6bb..d8d59d8b 100644 --- a/bin/xbps-rindex/remove-obsoletes.c +++ b/bin/xbps-rindex/remove-obsoletes.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2012-2013 Juan Romero Pardines. + * Copyright (c) 2012-2014 Juan Romero Pardines. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -67,43 +67,43 @@ remove_pkg(const char *repodir, const char *file) static int cleaner_cb(struct xbps_handle *xhp, xbps_object_t obj, const char *key _unused, void *arg, bool *done _unused) { - xbps_dictionary_t pkgd; struct xbps_repo *repo = arg; - const char *binpkg, *pkgver, *arch; + const char *binpkg; + char *pkgver, *arch; int rv; binpkg = xbps_string_cstring_nocopy(obj); - pkgd = xbps_get_pkg_plist_from_binpkg(binpkg, "./props.plist"); - if (pkgd == NULL) { - rv = remove_pkg(repo->uri, binpkg); - if (rv != 0) { - xbps_object_release(pkgd); - return 0; + if (access(binpkg, R_OK) == -1) { + if (errno == ENOENT) { + if ((rv = remove_pkg(repo->uri, binpkg)) != 0) + return 0; + + printf("Removed broken package `%s'.\n", binpkg); } - printf("Removed broken package `%s'.\n", binpkg); } - xbps_dictionary_get_cstring_nocopy(pkgd, "pkgver", &pkgver); - xbps_dictionary_get_cstring_nocopy(pkgd, "architecture", &arch); + arch = xbps_binpkg_arch(binpkg); + assert(arch); /* ignore pkgs from other archs */ if (!xbps_pkg_arch_match(xhp, arch, NULL)) { - xbps_object_release(pkgd); + free(arch); return 0; } + + pkgver = xbps_binpkg_pkgver(binpkg); + assert(pkgver); if (xhp->flags & XBPS_FLAG_VERBOSE) printf("checking %s (%s)\n", pkgver, binpkg); /* * If binpkg is not registered in index, remove binpkg. */ if (!xbps_repo_get_pkg(repo, pkgver)) { - rv = remove_pkg(repo->uri, binpkg); - if (rv != 0) { - xbps_object_release(pkgd); + if ((rv = remove_pkg(repo->uri, binpkg)) != 0) { + free(pkgver); return 0; } printf("Removed obsolete package `%s'.\n", binpkg); } - xbps_object_release(pkgd); - + free(pkgver); return 0; }