From fe9a7959950f8d1ff308b441f9a836919f2d440e Mon Sep 17 00:00:00 2001 From: Juan RP Date: Thu, 27 Nov 2014 10:42:05 +0100 Subject: [PATCH] xbps-{install,query}: added -M --memory-sync option. This explicitly enables the in memory fetch/store of remote repository data archives mode, ignoring existing on-disk repodata archives. This changes the previous behaviour of falling back to this mode if no on-disk repodata archives were found. Thanks to @Gottox and @dominikh for comments. --- NEWS | 12 +++++------- bin/xbps-install/main.c | 8 +++++++- bin/xbps-install/xbps-install.8 | 5 ++++- bin/xbps-query/main.c | 8 +++++++- bin/xbps-query/xbps-query.8 | 5 ++++- include/xbps.h.in | 9 ++++++++- lib/repo.c | 14 ++++++++++---- 7 files changed, 45 insertions(+), 16 deletions(-) diff --git a/NEWS b/NEWS index faa1a8ab..1e08879c 100644 --- a/NEWS +++ b/NEWS @@ -1,12 +1,10 @@ xbps-0.42 (???): - * Added support to fetch repository data remotely and on demand. That means - that synchronizing the repository data with `xbps-install -S` is now - completely optional. If local repodata is found on disk, it's the preferred - operation mode. This also means that `xbps-query(8)` may be used by any - user without the need to be the `superuser` to synchronize the repository - archives. Of course this new operation mode requires a proper network - connection. + * xbps-{install,query}: added new option (-M, --memory-sync) to fetch and + store remote repository data in memory. That means that synchronizing + the repository archives with `xbps-install -S` is now completely optional. + This also means that `xbps-query(8)` may be used by any user without the + need to be the `superuser` to synchronize the repository archives. * xbps-{install,query}: added new option (-i, --ignore-conf-repos) to ignore repositories defined in configuration files (xbps.d). Only repos specified diff --git a/bin/xbps-install/main.c b/bin/xbps-install/main.c index 2eb75c72..ce370d55 100644 --- a/bin/xbps-install/main.c +++ b/bin/xbps-install/main.c @@ -52,6 +52,8 @@ usage(bool fail) " overwritten.\n" " -h --help Print help usage\n" " -i --ignore-conf-repos Ignore repositories defined in xbps.d\n" + " -M --memory-sync Remote repository data is fetched and stored\n" + " in memory, ignoring on-disk repodata archives.\n" " -n --dry-run Dry-run mode\n" " -R,--repository= Add repository to the top of the list.\n" " This option can be specified multiple times.\n" @@ -91,7 +93,7 @@ repo_import_key_cb(struct xbps_repo *repo, void *arg _unused, bool *done _unused int main(int argc, char **argv) { - const char *shortopts = "AC:c:dfhinR:r:SuVvy"; + const char *shortopts = "AC:c:dfhiMnR:r:SuVvy"; const struct option longopts[] = { { "automatic", no_argument, NULL, 'A' }, { "config", required_argument, NULL, 'C' }, @@ -100,6 +102,7 @@ main(int argc, char **argv) { "force", no_argument, NULL, 'f' }, { "help", no_argument, NULL, 'h' }, { "ignore-conf-repos", no_argument, NULL, 'i' }, + { "memory-sync", no_argument, NULL, 'M' }, { "dry-run", no_argument, NULL, 'n' }, { "repository", required_argument, NULL, 'R' }, { "rootdir", required_argument, NULL, 'r' }, @@ -149,6 +152,9 @@ main(int argc, char **argv) case 'i': flags |= XBPS_FLAG_IGNORE_CONF_REPOS; break; + case 'M': + flags |= XBPS_FLAG_REPOS_MEMSYNC; + break; case 'n': drun = true; break; diff --git a/bin/xbps-install/xbps-install.8 b/bin/xbps-install/xbps-install.8 index 5035a12f..d1dd44c0 100644 --- a/bin/xbps-install/xbps-install.8 +++ b/bin/xbps-install/xbps-install.8 @@ -1,4 +1,4 @@ -.Dd November 5, 2014 +.Dd November 27, 2014 .Dt XBPS-INSTALL 8 .Sh NAME .Nm xbps-install @@ -86,6 +86,9 @@ Ignore repositories defined in configuration files. Only repositories specified in the command line via .Ar --repository will be used. +.It Fl M, Fl -memory-sync +For remote repositories, the data is fetched and stored in memory for the current +operation. This ignores the existing on-disk repository archives in rootdir. .It Fl n, Fl -dry-run Dry-run mode. Show what actions would be done but don't do anything. .It Fl R, Fl -repository=uri diff --git a/bin/xbps-query/main.c b/bin/xbps-query/main.c index 9f1b8b6d..a12d5c43 100644 --- a/bin/xbps-query/main.c +++ b/bin/xbps-query/main.c @@ -43,6 +43,8 @@ usage(bool fail) " -d --debug Debug mode shown to stderr\n" " -h --help Print help usage\n" " -i --ignore-conf-repos Ignore repositories defined in xbps.d\n" + " -M --memory-sync Remote repository data is fetched and stored\n" + " in memory, ignoring on-disk repodata archives.\n" " -p --property PROP[,...] Show properties for PKGNAME\n" " -R --repository Enable repository mode. This mode explicitly\n" " looks for packages in repositories.\n" @@ -74,7 +76,7 @@ usage(bool fail) int main(int argc, char **argv) { - const char *shortopts = "C:c:df:hHiLlmOo:p:Rr:s:S:VvX:x:"; + const char *shortopts = "C:c:df:hHiLlMmOo:p:Rr:s:S:VvX:x:"; const struct option longopts[] = { { "config", required_argument, NULL, 'C' }, { "cachedir", required_argument, NULL, 'c' }, @@ -84,6 +86,7 @@ main(int argc, char **argv) { "list-repos", no_argument, NULL, 'L' }, { "list-pkgs", no_argument, NULL, 'l' }, { "list-hold-pkgs", no_argument, NULL, 'H' }, + { "memory-sync", no_argument, NULL, 'M' }, { "list-manual-pkgs", no_argument, NULL, 'm' }, { "list-orphans", no_argument, NULL, 'O' }, { "ownedby", required_argument, NULL, 'o' }, @@ -148,6 +151,9 @@ main(int argc, char **argv) case 'l': list_pkgs = opmode = true; break; + case 'M': + flags |= XBPS_FLAG_REPOS_MEMSYNC; + break; case 'm': list_manual = opmode = true; break; diff --git a/bin/xbps-query/xbps-query.8 b/bin/xbps-query/xbps-query.8 index df21d609..3e4cc014 100644 --- a/bin/xbps-query/xbps-query.8 +++ b/bin/xbps-query/xbps-query.8 @@ -1,4 +1,4 @@ -.Dd November 21, 2014 +.Dd November 27, 2014 .Dt XBPS-QUERY 8 .Sh NAME .Nm xbps-query @@ -70,6 +70,9 @@ Ignore repositories defined in configuration files. Only repositories specified in the command line via .Ar --repository will be used. +.It Fl M, Fl -memory-sync +For remote repositories, the data is fetched and stored in memory for the current +operation. This ignores the existing on-disk repository archives in rootdir. .It Fl p, Fl -property Ar PROP[,...] Only match this package property. Multiple properties can be specified by delimiting them with commas. diff --git a/include/xbps.h.in b/include/xbps.h.in index cb73d723..ba83840f 100644 --- a/include/xbps.h.in +++ b/include/xbps.h.in @@ -48,7 +48,7 @@ * * This header documents the full API for the XBPS Library. */ -#define XBPS_API_VERSION "20141126" +#define XBPS_API_VERSION "20141127" #ifndef XBPS_VERSION #define XBPS_VERSION "UNSET" @@ -183,6 +183,13 @@ */ #define XBPS_FLAG_IGNORE_CONF_REPOS 0x00000200 +/** + * @def XBPS_FLAG_REPOS_MEMSYNC + * Fetch and store repodata in memory, ignoring on-disk metadata. + * Must be set through the xbps_handle::flags member. + */ +#define XBPS_FLAG_REPOS_MEMSYNC 0x00000400 + /** * @def XBPS_FETCH_CACHECONN * Default (global) limit of cached connections used in libfetch. diff --git a/lib/repo.c b/lib/repo.c index 73343825..12c820d7 100644 --- a/lib/repo.c +++ b/lib/repo.c @@ -206,7 +206,16 @@ xbps_repo_open(struct xbps_handle *xhp, const char *url, bool lock) repofile = xbps_repo_path(xhp, url); } /* - * Open or create the repository archive. + * In memory repo sync. + */ + if (xhp->flags & XBPS_FLAG_REPOS_MEMSYNC) { + if (repo_open_remote(repo)) + return repo; + + goto out; + } + /* + * Open the repository archive. */ if (lock) repo->fd = open(repofile, O_RDWR); @@ -215,9 +224,6 @@ xbps_repo_open(struct xbps_handle *xhp, const char *url, bool lock) if (repo->fd == -1) { int rv = errno; - if (repo_open_remote(repo)) - return repo; - xbps_dbg_printf(xhp, "[repo] `%s' open repodata %s\n", repofile, strerror(rv)); goto out;