xbps_rpool_foreach: process all entries in order.

if xbps_repo_open() fails then the repo is removed from array
xbps_repo_remove() but as we've removed the entry from it,
the index won't be valid any more, resulting in skipped entries.

If a entry is removed restart again at the correct index.

Close #127
This commit is contained in:
Juan RP 2019-06-18 23:44:36 +02:00
parent b12b72e151
commit 3a00a9eb9b
No known key found for this signature in database
GPG Key ID: AF19F6CB482F9368

View File

@ -141,16 +141,19 @@ xbps_rpool_foreach(struct xbps_handle *xhp,
const char *repouri; const char *repouri;
int rv = 0; int rv = 0;
bool foundrepo = false, done = false; bool foundrepo = false, done = false;
unsigned int n = 0;
assert(fn != NULL); assert(fn != NULL);
for (unsigned int i = 0; i < xbps_array_count(xhp->repositories); i++) { again:
for (unsigned int i = n; i < xbps_array_count(xhp->repositories); i++, n++) {
xbps_array_get_cstring_nocopy(xhp->repositories, i, &repouri); xbps_array_get_cstring_nocopy(xhp->repositories, i, &repouri);
xbps_dbg_printf(xhp, "[rpool] checking `%s' at index %u\n", repouri, n);
if ((repo = xbps_rpool_get_repo(repouri)) == NULL) { if ((repo = xbps_rpool_get_repo(repouri)) == NULL) {
repo = xbps_repo_open(xhp, repouri); repo = xbps_repo_open(xhp, repouri);
if (!repo) { if (!repo) {
xbps_repo_remove(xhp, repouri); xbps_repo_remove(xhp, repouri);
continue; goto again;
} }
SIMPLEQ_INSERT_TAIL(&rpool_queue, repo, entries); SIMPLEQ_INSERT_TAIL(&rpool_queue, repo, entries);
xbps_dbg_printf(xhp, "[rpool] `%s' registered.\n", repouri); xbps_dbg_printf(xhp, "[rpool] `%s' registered.\n", repouri);