libxbps: add xbps_repository_pool_sync, to sync repoidx from all remotes.
This commit is contained in:
parent
de4504c248
commit
c2eed68471
@ -38,7 +38,6 @@ int repo_genindex(const char *);
|
|||||||
/* From repository.c */
|
/* From repository.c */
|
||||||
int show_pkg_info_from_repolist(const char *, const char *);
|
int show_pkg_info_from_repolist(const char *, const char *);
|
||||||
int show_pkg_deps_from_repolist(const char *);
|
int show_pkg_deps_from_repolist(const char *);
|
||||||
int repository_sync(void);
|
|
||||||
|
|
||||||
/* From find-files.c */
|
/* From find-files.c */
|
||||||
int repo_find_files_in_packages(const char *);
|
int repo_find_files_in_packages(const char *);
|
||||||
|
@ -266,7 +266,7 @@ main(int argc, char **argv)
|
|||||||
if (argc != 1)
|
if (argc != 1)
|
||||||
usage(xhp);
|
usage(xhp);
|
||||||
|
|
||||||
rv = repository_sync();
|
rv = xbps_repository_pool_sync();
|
||||||
if (rv == ENOTSUP) {
|
if (rv == ENOTSUP) {
|
||||||
xbps_error_printf("xbps-repo: no repositories "
|
xbps_error_printf("xbps-repo: no repositories "
|
||||||
"currently registered!\n");
|
"currently registered!\n");
|
||||||
|
@ -82,41 +82,3 @@ show_pkg_deps_from_repolist(const char *pkgname)
|
|||||||
prop_object_release(pkgd);
|
prop_object_release(pkgd);
|
||||||
return 0;
|
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);
|
|
||||||
}
|
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
*/
|
*/
|
||||||
#define XBPS_PKGINDEX_VERSION "1.3"
|
#define XBPS_PKGINDEX_VERSION "1.3"
|
||||||
|
|
||||||
#define XBPS_API_VERSION "20111109"
|
#define XBPS_API_VERSION "20111110"
|
||||||
#define XBPS_VERSION "0.11.0"
|
#define XBPS_VERSION "0.11.0"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -183,8 +183,8 @@ void xbps_warn_printf(const char *, ...);
|
|||||||
*
|
*
|
||||||
* <b>XBPS_TRANS_STATE_REGISTER</b>: a package is being registered.
|
* <b>XBPS_TRANS_STATE_REGISTER</b>: a package is being registered.
|
||||||
*
|
*
|
||||||
* <b>XBPS_TRANS_STATE_REPOSYNC</b>. a remote repository's
|
* <b>XBPS_TRANS_STATE_REPOSYNC</b>: a remote repository's
|
||||||
* pkg index is being synced.
|
* pkg index is being synchronized.
|
||||||
*/
|
*/
|
||||||
typedef enum trans_state {
|
typedef enum trans_state {
|
||||||
XBPS_TRANS_STATE_UNKNOWN = 0,
|
XBPS_TRANS_STATE_UNKNOWN = 0,
|
||||||
@ -1249,6 +1249,15 @@ struct repository_pool_index {
|
|||||||
char *rpi_uri;
|
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
|
* Iterates over the repository pool and executes the \a fn function
|
||||||
* callback passing in the void * \a arg argument to it. The bool pointer
|
* callback passing in the void * \a arg argument to it. The bool pointer
|
||||||
|
@ -48,20 +48,6 @@ static SIMPLEQ_HEAD(rpool_head, repository_pool) rpool_queue =
|
|||||||
|
|
||||||
static bool repolist_initialized;
|
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
|
* Returns true if repository URI contains "noarch" or matching architecture
|
||||||
* in last component, false otherwise.
|
* in last component, false otherwise.
|
||||||
@ -141,20 +127,6 @@ xbps_repository_pool_init(void)
|
|||||||
nmissing++;
|
nmissing++;
|
||||||
continue;
|
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
|
* Internalize repository's index dictionary and add it
|
||||||
* into the queue.
|
* into the queue.
|
||||||
@ -162,14 +134,12 @@ xbps_repository_pool_init(void)
|
|||||||
rpool = malloc(sizeof(struct repository_pool));
|
rpool = malloc(sizeof(struct repository_pool));
|
||||||
if (rpool == NULL) {
|
if (rpool == NULL) {
|
||||||
rv = errno;
|
rv = errno;
|
||||||
free(plist);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
rpool->rpi = malloc(sizeof(struct repository_pool_index));
|
rpool->rpi = malloc(sizeof(struct repository_pool_index));
|
||||||
if (rpool->rpi == NULL) {
|
if (rpool->rpi == NULL) {
|
||||||
rv = errno;
|
rv = errno;
|
||||||
free(plist);
|
|
||||||
free(rpool);
|
free(rpool);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -179,7 +149,11 @@ xbps_repository_pool_init(void)
|
|||||||
rv = errno;
|
rv = errno;
|
||||||
free(rpool->rpi);
|
free(rpool->rpi);
|
||||||
free(rpool);
|
free(rpool);
|
||||||
free(plist);
|
goto out;
|
||||||
|
}
|
||||||
|
plist = xbps_pkg_index_plist(repouri);
|
||||||
|
if (plist == NULL) {
|
||||||
|
rv = errno;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
rpool->rpi->rpi_repod =
|
rpool->rpi->rpi_repod =
|
||||||
@ -191,8 +165,8 @@ xbps_repository_pool_init(void)
|
|||||||
free(plist);
|
free(plist);
|
||||||
if (errno == ENOENT) {
|
if (errno == ENOENT) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
xbps_dbg_printf("[rpool] missing index file "
|
xbps_dbg_printf("[rpool] `%s' missing "
|
||||||
"for '%s' repository.\n", repouri);
|
"index file, ignoring.\n", repouri);
|
||||||
nmissing++;
|
nmissing++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -248,6 +222,44 @@ xbps_repository_pool_release(void)
|
|||||||
xbps_dbg_printf("[rpool] released ok.\n");
|
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
|
int
|
||||||
xbps_repository_pool_foreach(
|
xbps_repository_pool_foreach(
|
||||||
int (*fn)(struct repository_pool_index *, void *, bool *),
|
int (*fn)(struct repository_pool_index *, void *, bool *),
|
||||||
|
@ -165,6 +165,7 @@ xbps_repository_sync_pkg_index(const char *uri)
|
|||||||
} else
|
} else
|
||||||
fetch_outputdir = metadir;
|
fetch_outputdir = metadir;
|
||||||
|
|
||||||
|
/* reposync start cb */
|
||||||
if (xhp->xbps_transaction_cb) {
|
if (xhp->xbps_transaction_cb) {
|
||||||
xhp->xtcd->state = XBPS_TRANS_STATE_REPOSYNC;
|
xhp->xtcd->state = XBPS_TRANS_STATE_REPOSYNC;
|
||||||
xhp->xtcd->repourl = uri;
|
xhp->xtcd->repourl = uri;
|
||||||
@ -174,6 +175,7 @@ xbps_repository_sync_pkg_index(const char *uri)
|
|||||||
* Download index.plist file from repository.
|
* Download index.plist file from repository.
|
||||||
*/
|
*/
|
||||||
if (xbps_fetch_file(rpidx, fetch_outputdir, true, NULL) == -1) {
|
if (xbps_fetch_file(rpidx, fetch_outputdir, true, NULL) == -1) {
|
||||||
|
/* reposync error cb */
|
||||||
if (xhp->xbps_transaction_err_cb) {
|
if (xhp->xbps_transaction_err_cb) {
|
||||||
xhp->xtcd->state = XBPS_TRANS_STATE_REPOSYNC;
|
xhp->xtcd->state = XBPS_TRANS_STATE_REPOSYNC;
|
||||||
xhp->xtcd->repourl = uri;
|
xhp->xtcd->repourl = uri;
|
||||||
@ -192,7 +194,7 @@ xbps_repository_sync_pkg_index(const char *uri)
|
|||||||
*/
|
*/
|
||||||
tmpd = prop_dictionary_internalize_from_zfile(tmp_metafile);
|
tmpd = prop_dictionary_internalize_from_zfile(tmp_metafile);
|
||||||
if (tmpd == NULL) {
|
if (tmpd == NULL) {
|
||||||
xbps_error_printf("[rsyncidx] downloaded index.plist "
|
xbps_dbg_printf("[rsyncidx] downloaded index.plist "
|
||||||
"file cannot be read! removing...\n");
|
"file cannot be read! removing...\n");
|
||||||
(void)unlink(tmp_metafile);
|
(void)unlink(tmp_metafile);
|
||||||
rv = -1;
|
rv = -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user