diff --git a/bin/xbps-repo/defs.h b/bin/xbps-repo/defs.h
index 82ec4c12..0e0c33a1 100644
--- a/bin/xbps-repo/defs.h
+++ b/bin/xbps-repo/defs.h
@@ -38,7 +38,6 @@ int repo_genindex(const char *);
/* From repository.c */
int show_pkg_info_from_repolist(const char *, const char *);
int show_pkg_deps_from_repolist(const char *);
-int repository_sync(void);
/* From find-files.c */
int repo_find_files_in_packages(const char *);
diff --git a/bin/xbps-repo/main.c b/bin/xbps-repo/main.c
index 2cbe7fa8..efc849a1 100644
--- a/bin/xbps-repo/main.c
+++ b/bin/xbps-repo/main.c
@@ -266,7 +266,7 @@ main(int argc, char **argv)
if (argc != 1)
usage(xhp);
- rv = repository_sync();
+ rv = xbps_repository_pool_sync();
if (rv == ENOTSUP) {
xbps_error_printf("xbps-repo: no repositories "
"currently registered!\n");
diff --git a/bin/xbps-repo/repository.c b/bin/xbps-repo/repository.c
index 4fbfe14d..d50a68f1 100644
--- a/bin/xbps-repo/repository.c
+++ b/bin/xbps-repo/repository.c
@@ -82,41 +82,3 @@ show_pkg_deps_from_repolist(const char *pkgname)
prop_object_release(pkgd);
return 0;
}
-
-static int
-repo_sync_pkg_index_cb(struct repository_pool_index *rpi, void *arg, bool *done)
-{
- prop_dictionary_t d;
- const char *idxver;
- uint64_t totalpkgs;
- char *plist;
- int rv = 0;
-
- (void)arg;
- (void)done;
-
- if ((rv = xbps_repository_sync_pkg_index(rpi->rpi_uri)) == 0) {
- printf("Package index file is up to date.\n");
- return 0;
- } else if (rv == -1)
- return rv;
-
- if ((plist = xbps_pkg_index_plist(rpi->rpi_uri)) == NULL)
- return EINVAL;
-
- d = prop_dictionary_internalize_from_zfile(plist);
- prop_dictionary_get_cstring_nocopy(d, "pkgindex-version", &idxver);
- prop_dictionary_get_uint64(d, "total-pkgs", &totalpkgs);
- printf("Updated package index at %s (v%s) with %ju packages.\n",
- rpi->rpi_uri, idxver, totalpkgs);
- prop_object_release(d);
- free(plist);
-
- return 0;
-}
-
-int
-repository_sync(void)
-{
- return xbps_repository_pool_foreach(repo_sync_pkg_index_cb, NULL);
-}
diff --git a/include/xbps_api.h b/include/xbps_api.h
index 874370f8..33053a34 100644
--- a/include/xbps_api.h
+++ b/include/xbps_api.h
@@ -55,7 +55,7 @@
*/
#define XBPS_PKGINDEX_VERSION "1.3"
-#define XBPS_API_VERSION "20111109"
+#define XBPS_API_VERSION "20111110"
#define XBPS_VERSION "0.11.0"
/**
@@ -183,8 +183,8 @@ void xbps_warn_printf(const char *, ...);
*
* XBPS_TRANS_STATE_REGISTER: a package is being registered.
*
- * XBPS_TRANS_STATE_REPOSYNC. a remote repository's
- * pkg index is being synced.
+ * XBPS_TRANS_STATE_REPOSYNC: a remote repository's
+ * pkg index is being synchronized.
*/
typedef enum trans_state {
XBPS_TRANS_STATE_UNKNOWN = 0,
@@ -1249,6 +1249,15 @@ struct repository_pool_index {
char *rpi_uri;
};
+/**
+ * Synchronizes the package index file for all remote repositories
+ * as specified in the configuration file, repositories.plist.
+ *
+ * @return 0 on success, ENOTSUP if no repositories were found in
+ * the configuration file.
+ */
+int xbps_repository_pool_sync(void);
+
/**
* Iterates over the repository pool and executes the \a fn function
* callback passing in the void * \a arg argument to it. The bool pointer
diff --git a/lib/repository_pool.c b/lib/repository_pool.c
index eb62e364..b4086be2 100644
--- a/lib/repository_pool.c
+++ b/lib/repository_pool.c
@@ -48,20 +48,6 @@ static SIMPLEQ_HEAD(rpool_head, repository_pool) rpool_queue =
static bool repolist_initialized;
-static int
-sync_remote_repo(const char *plist, const char *repourl)
-{
- /* if file is there, continue */
- if (access(plist, R_OK) == 0)
- return 0;
-
- /* file not found, fetch it */
- if (xbps_repository_sync_pkg_index(repourl) == -1)
- return -1;
-
- return 0;
-}
-
/*
* Returns true if repository URI contains "noarch" or matching architecture
* in last component, false otherwise.
@@ -141,20 +127,6 @@ xbps_repository_pool_init(void)
nmissing++;
continue;
}
- plist = xbps_pkg_index_plist(repouri);
- if (plist == NULL) {
- rv = errno;
- goto out;
- }
- /*
- * If it's a remote repository and index file is not available,
- * fetch it for the first time.
- */
- if (sync_remote_repo(plist, repouri) == -1) {
- nmissing++;
- free(plist);
- continue;
- }
/*
* Internalize repository's index dictionary and add it
* into the queue.
@@ -162,14 +134,12 @@ xbps_repository_pool_init(void)
rpool = malloc(sizeof(struct repository_pool));
if (rpool == NULL) {
rv = errno;
- free(plist);
goto out;
}
rpool->rpi = malloc(sizeof(struct repository_pool_index));
if (rpool->rpi == NULL) {
rv = errno;
- free(plist);
free(rpool);
goto out;
}
@@ -179,7 +149,11 @@ xbps_repository_pool_init(void)
rv = errno;
free(rpool->rpi);
free(rpool);
- free(plist);
+ goto out;
+ }
+ plist = xbps_pkg_index_plist(repouri);
+ if (plist == NULL) {
+ rv = errno;
goto out;
}
rpool->rpi->rpi_repod =
@@ -191,8 +165,8 @@ xbps_repository_pool_init(void)
free(plist);
if (errno == ENOENT) {
errno = 0;
- xbps_dbg_printf("[rpool] missing index file "
- "for '%s' repository.\n", repouri);
+ xbps_dbg_printf("[rpool] `%s' missing "
+ "index file, ignoring.\n", repouri);
nmissing++;
continue;
}
@@ -248,6 +222,44 @@ xbps_repository_pool_release(void)
xbps_dbg_printf("[rpool] released ok.\n");
}
+int
+xbps_repository_pool_sync(void)
+{
+ const struct xbps_handle *xhp;
+ const char *repouri;
+ size_t i;
+ int rv;
+
+ xhp = xbps_handle_get();
+ if (xhp->repos_array == NULL)
+ return ENOTSUP;
+
+ if (prop_array_count(xhp->repos_array) == 0)
+ return ENOTSUP;
+
+ for (i = 0; i < prop_array_count(xhp->repos_array); i++) {
+ prop_array_get_cstring_nocopy(xhp->repos_array, i, &repouri);
+ /*
+ * Check if repository doesn't match our architecture.
+ */
+ if (!check_repo_arch(repouri)) {
+ xbps_dbg_printf("[rpool] `%s' arch not matched, "
+ "ignoring.\n", repouri);
+ continue;
+ }
+ /*
+ * Fetch repository index file.
+ */
+ rv = xbps_repository_sync_pkg_index(repouri);
+ if (rv == -1) {
+ xbps_dbg_printf("[rpool] `%s' failed to fetch: %s\n",
+ repouri, xbps_fetch_error_string());
+ continue;
+ }
+ }
+ return 0;
+}
+
int
xbps_repository_pool_foreach(
int (*fn)(struct repository_pool_index *, void *, bool *),
diff --git a/lib/repository_sync_index.c b/lib/repository_sync_index.c
index cab4fc84..5458b1ba 100644
--- a/lib/repository_sync_index.c
+++ b/lib/repository_sync_index.c
@@ -165,6 +165,7 @@ xbps_repository_sync_pkg_index(const char *uri)
} else
fetch_outputdir = metadir;
+ /* reposync start cb */
if (xhp->xbps_transaction_cb) {
xhp->xtcd->state = XBPS_TRANS_STATE_REPOSYNC;
xhp->xtcd->repourl = uri;
@@ -174,6 +175,7 @@ xbps_repository_sync_pkg_index(const char *uri)
* Download index.plist file from repository.
*/
if (xbps_fetch_file(rpidx, fetch_outputdir, true, NULL) == -1) {
+ /* reposync error cb */
if (xhp->xbps_transaction_err_cb) {
xhp->xtcd->state = XBPS_TRANS_STATE_REPOSYNC;
xhp->xtcd->repourl = uri;
@@ -192,7 +194,7 @@ xbps_repository_sync_pkg_index(const char *uri)
*/
tmpd = prop_dictionary_internalize_from_zfile(tmp_metafile);
if (tmpd == NULL) {
- xbps_error_printf("[rsyncidx] downloaded index.plist "
+ xbps_dbg_printf("[rsyncidx] downloaded index.plist "
"file cannot be read! removing...\n");
(void)unlink(tmp_metafile);
rv = -1;