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
$
This commit is contained in:
Juan RP 2014-09-05 21:07:07 +02:00
parent b73d40092c
commit d7d749312d

View File

@ -1,5 +1,5 @@
/*- /*-
* Copyright (c) 2012-2013 Juan Romero Pardines. * Copyright (c) 2012-2014 Juan Romero Pardines.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * 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 static int
cleaner_cb(struct xbps_handle *xhp, xbps_object_t obj, const char *key _unused, void *arg, bool *done _unused) 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; struct xbps_repo *repo = arg;
const char *binpkg, *pkgver, *arch; const char *binpkg;
char *pkgver, *arch;
int rv; int rv;
binpkg = xbps_string_cstring_nocopy(obj); binpkg = xbps_string_cstring_nocopy(obj);
pkgd = xbps_get_pkg_plist_from_binpkg(binpkg, "./props.plist"); if (access(binpkg, R_OK) == -1) {
if (pkgd == NULL) { if (errno == ENOENT) {
rv = remove_pkg(repo->uri, binpkg); if ((rv = remove_pkg(repo->uri, binpkg)) != 0)
if (rv != 0) { return 0;
xbps_object_release(pkgd);
return 0; printf("Removed broken package `%s'.\n", binpkg);
} }
printf("Removed broken package `%s'.\n", binpkg);
} }
xbps_dictionary_get_cstring_nocopy(pkgd, "pkgver", &pkgver); arch = xbps_binpkg_arch(binpkg);
xbps_dictionary_get_cstring_nocopy(pkgd, "architecture", &arch); assert(arch);
/* ignore pkgs from other archs */ /* ignore pkgs from other archs */
if (!xbps_pkg_arch_match(xhp, arch, NULL)) { if (!xbps_pkg_arch_match(xhp, arch, NULL)) {
xbps_object_release(pkgd); free(arch);
return 0; return 0;
} }
pkgver = xbps_binpkg_pkgver(binpkg);
assert(pkgver);
if (xhp->flags & XBPS_FLAG_VERBOSE) if (xhp->flags & XBPS_FLAG_VERBOSE)
printf("checking %s (%s)\n", pkgver, binpkg); printf("checking %s (%s)\n", pkgver, binpkg);
/* /*
* If binpkg is not registered in index, remove binpkg. * If binpkg is not registered in index, remove binpkg.
*/ */
if (!xbps_repo_get_pkg(repo, pkgver)) { if (!xbps_repo_get_pkg(repo, pkgver)) {
rv = remove_pkg(repo->uri, binpkg); if ((rv = remove_pkg(repo->uri, binpkg)) != 0) {
if (rv != 0) { free(pkgver);
xbps_object_release(pkgd);
return 0; return 0;
} }
printf("Removed obsolete package `%s'.\n", binpkg); printf("Removed obsolete package `%s'.\n", binpkg);
} }
xbps_object_release(pkgd); free(pkgver);
return 0; return 0;
} }