Added support to specify multiple repositories via cmdline (close #17).
This commit is contained in:
parent
c514894152
commit
5e1432f418
@ -52,7 +52,8 @@ usage(bool fail)
|
|||||||
" overwritten.\n"
|
" overwritten.\n"
|
||||||
" -h --help Print help usage\n"
|
" -h --help Print help usage\n"
|
||||||
" -n --dry-run Dry-run mode\n"
|
" -n --dry-run Dry-run mode\n"
|
||||||
" -R --repository <uri> Default repository to be used if config not set\n"
|
" -R --repository <uri> Repository to be used. Can be specified\n"
|
||||||
|
" multiple times.\n"
|
||||||
" -r --rootdir <dir> Full path to rootdir\n"
|
" -r --rootdir <dir> Full path to rootdir\n"
|
||||||
" -S --sync Sync remote repository index\n"
|
" -S --sync Sync remote repository index\n"
|
||||||
" -u --update Update target package(s)\n"
|
" -u --update Update target package(s)\n"
|
||||||
@ -97,15 +98,17 @@ main(int argc, char **argv)
|
|||||||
};
|
};
|
||||||
struct xbps_handle xh;
|
struct xbps_handle xh;
|
||||||
struct xferstat xfer;
|
struct xferstat xfer;
|
||||||
const char *rootdir, *cachedir, *conffile, *defrepo;
|
const char *rootdir, *cachedir, *conffile;
|
||||||
int i, c, flags, rv, fflag = 0;
|
int i, c, flags, rv, fflag = 0;
|
||||||
bool sync, yes, reinstall, drun, update;
|
bool sync, yes, reinstall, drun, update;
|
||||||
int maxcols;
|
int maxcols;
|
||||||
|
|
||||||
rootdir = cachedir = conffile = defrepo = NULL;
|
rootdir = cachedir = conffile = NULL;
|
||||||
flags = rv = 0;
|
flags = rv = 0;
|
||||||
sync = yes = reinstall = drun = update = false;
|
sync = yes = reinstall = drun = update = false;
|
||||||
|
|
||||||
|
memset(&xh, 0, sizeof(xh));
|
||||||
|
|
||||||
while ((c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1) {
|
while ((c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'A':
|
case 'A':
|
||||||
@ -133,7 +136,10 @@ main(int argc, char **argv)
|
|||||||
drun = true;
|
drun = true;
|
||||||
break;
|
break;
|
||||||
case 'R':
|
case 'R':
|
||||||
defrepo = optarg;
|
if (xh.repositories == NULL)
|
||||||
|
xh.repositories = xbps_array_create();
|
||||||
|
|
||||||
|
xbps_array_add_cstring_nocopy(xh.repositories, optarg);
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
rootdir = optarg;
|
rootdir = optarg;
|
||||||
@ -165,7 +171,6 @@ main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Initialize libxbps.
|
* Initialize libxbps.
|
||||||
*/
|
*/
|
||||||
memset(&xh, 0, sizeof(xh));
|
|
||||||
xh.state_cb = state_cb;
|
xh.state_cb = state_cb;
|
||||||
xh.fetch_cb = fetch_file_progress_cb;
|
xh.fetch_cb = fetch_file_progress_cb;
|
||||||
xh.fetch_cb_data = &xfer;
|
xh.fetch_cb_data = &xfer;
|
||||||
@ -173,7 +178,6 @@ main(int argc, char **argv)
|
|||||||
xh.cachedir = cachedir;
|
xh.cachedir = cachedir;
|
||||||
xh.conffile = conffile;
|
xh.conffile = conffile;
|
||||||
xh.flags = flags;
|
xh.flags = flags;
|
||||||
xh.repository = defrepo;
|
|
||||||
if (flags & XBPS_FLAG_VERBOSE)
|
if (flags & XBPS_FLAG_VERBOSE)
|
||||||
xh.unpack_cb = unpack_progress_cb;
|
xh.unpack_cb = unpack_progress_cb;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
.Dd August 18, 2013
|
.Dd September 18, 2013
|
||||||
.Os Void Linux
|
.Os Void Linux
|
||||||
.Dt xbps-install 8
|
.Dt xbps-install 8
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -70,8 +70,8 @@ Show the help usage.
|
|||||||
.It Fl n, Fl -dry-run
|
.It Fl n, Fl -dry-run
|
||||||
Dry-run mode. Show what actions would be done but don't do anything.
|
Dry-run mode. Show what actions would be done but don't do anything.
|
||||||
.It Fl R, Fl -repository Ar uri
|
.It Fl R, Fl -repository Ar uri
|
||||||
Default repository to be used overriding repository list in configuration file.
|
Default repository to be used. Multiple repositories can be specified. This repository
|
||||||
Only a single repository can be specified.
|
list overrides the list in a configuration file.
|
||||||
.It Fl r, Fl -rootdir Ar dir
|
.It Fl r, Fl -rootdir Ar dir
|
||||||
Specifies a full path for the target root directory.
|
Specifies a full path for the target root directory.
|
||||||
.It Fl S, Fl -sync
|
.It Fl S, Fl -sync
|
||||||
|
@ -40,10 +40,11 @@ usage(bool fail)
|
|||||||
"\nOPTIONS\n"
|
"\nOPTIONS\n"
|
||||||
" -C --config <file> Full path to configuration file\n"
|
" -C --config <file> Full path to configuration file\n"
|
||||||
" -c --cachedir <dir> Full path to cachedir\n"
|
" -c --cachedir <dir> Full path to cachedir\n"
|
||||||
" -D --defrepo <uri> Default repository to be used if config not set\n"
|
" -D --defrepo <uri> Repository to be used. Can be specified\n"
|
||||||
|
" multiple times.\n"
|
||||||
" -d --debug Debug mode shown to stderr\n"
|
" -d --debug Debug mode shown to stderr\n"
|
||||||
" -h --help Print help usage\n"
|
" -h --help Print help usage\n"
|
||||||
" -R --repository Enable repository mode\n"
|
" -R --repoisotyr Enable repository mode\n"
|
||||||
" -r --rootdir <dir> Full path to rootdir\n"
|
" -r --rootdir <dir> Full path to rootdir\n"
|
||||||
" -V --version Show XBPS version\n"
|
" -V --version Show XBPS version\n"
|
||||||
" -v --verbose Verbose messages\n"
|
" -v --verbose Verbose messages\n"
|
||||||
@ -104,6 +105,8 @@ main(int argc, char **argv)
|
|||||||
show = show_rdeps = fulldeptree = false;
|
show = show_rdeps = fulldeptree = false;
|
||||||
repo_mode = opmode = false;
|
repo_mode = opmode = false;
|
||||||
|
|
||||||
|
memset(&xh, 0, sizeof(xh));
|
||||||
|
|
||||||
while ((c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1) {
|
while ((c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'C':
|
case 'C':
|
||||||
@ -113,7 +116,10 @@ main(int argc, char **argv)
|
|||||||
cachedir = optarg;
|
cachedir = optarg;
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
defrepo = optarg;
|
if (xh.repositories == NULL)
|
||||||
|
xh.repositories = xbps_array_create();
|
||||||
|
|
||||||
|
xbps_array_add_cstring_nocopy(xh.repositories, optarg);
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
flags |= XBPS_FLAG_DEBUG;
|
flags |= XBPS_FLAG_DEBUG;
|
||||||
@ -183,12 +189,10 @@ main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Initialize libxbps.
|
* Initialize libxbps.
|
||||||
*/
|
*/
|
||||||
memset(&xh, 0, sizeof(xh));
|
|
||||||
xh.rootdir = rootdir;
|
xh.rootdir = rootdir;
|
||||||
xh.cachedir = cachedir;
|
xh.cachedir = cachedir;
|
||||||
xh.conffile = conffile;
|
xh.conffile = conffile;
|
||||||
xh.flags = flags;
|
xh.flags = flags;
|
||||||
xh.repository = defrepo;
|
|
||||||
|
|
||||||
if ((rv = xbps_init(&xh)) != 0) {
|
if ((rv = xbps_init(&xh)) != 0) {
|
||||||
xbps_error_printf("Failed to initialize libxbps: %s\n",
|
xbps_error_printf("Failed to initialize libxbps: %s\n",
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
.Dd September 13, 2013
|
.Dd September 18, 2013
|
||||||
.Os Void Linux
|
.Os Void Linux
|
||||||
.Dt xbps-query 8
|
.Dt xbps-query 8
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -55,7 +55,8 @@ Specifies a full path to the XBPS configuration file.
|
|||||||
.It Fl c, Fl -cachedir Ar dir
|
.It Fl c, Fl -cachedir Ar dir
|
||||||
Specifies a full path to the cache directory, where binary packages are stored.
|
Specifies a full path to the cache directory, where binary packages are stored.
|
||||||
.It Fl D, Fl -defrepo Ar uri
|
.It Fl D, Fl -defrepo Ar uri
|
||||||
Default repository to be used if no repository is specified in configuration file.
|
Default repository to be used. Multiple repositories can be specified. This repository
|
||||||
|
list overrides the list in a configuration file.
|
||||||
.It Fl d, Fl -debug
|
.It Fl d, Fl -debug
|
||||||
Enables extra debugging shown to stderr.
|
Enables extra debugging shown to stderr.
|
||||||
.It Fl h, Fl -help
|
.It Fl h, Fl -help
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
#
|
#
|
||||||
# By default we use the official "public" repositories. You can add
|
# By default we use the official "public" repositories. You can add
|
||||||
# your own repositories by specifying the path to the directory
|
# your own repositories by specifying the path to the directory
|
||||||
# where the plist index file is stored.
|
# where the <arch>-repodata file is stored.
|
||||||
#
|
#
|
||||||
# Repositories not matching the host architecture are simply ignored.
|
# Repositories not matching the host architecture are simply ignored.
|
||||||
#
|
#
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
*
|
*
|
||||||
* This header documents the full API for the XBPS Library.
|
* This header documents the full API for the XBPS Library.
|
||||||
*/
|
*/
|
||||||
#define XBPS_API_VERSION "20130917"
|
#define XBPS_API_VERSION "20130918"
|
||||||
|
|
||||||
#ifndef XBPS_VERSION
|
#ifndef XBPS_VERSION
|
||||||
#define XBPS_VERSION "UNSET"
|
#define XBPS_VERSION "UNSET"
|
||||||
@ -455,7 +455,7 @@ struct xbps_handle {
|
|||||||
/**
|
/**
|
||||||
* @var pkgdb
|
* @var pkgdb
|
||||||
*
|
*
|
||||||
* Internalized proplib dictionary with the master package database
|
* Proplib dictionary with the master package database
|
||||||
* stored in XBPS_META_PATH/XBPS_PKGDB.
|
* stored in XBPS_META_PATH/XBPS_PKGDB.
|
||||||
*/
|
*/
|
||||||
xbps_dictionary_t pkgdb;
|
xbps_dictionary_t pkgdb;
|
||||||
@ -470,10 +470,17 @@ struct xbps_handle {
|
|||||||
/**
|
/**
|
||||||
* @var transd
|
* @var transd
|
||||||
*
|
*
|
||||||
* Proplib dictionary with transaction details, required by
|
* Proplib dictionary with transaction objects, required by
|
||||||
* xbps_transaction_commit().
|
* xbps_transaction_commit().
|
||||||
*/
|
*/
|
||||||
xbps_dictionary_t transd;
|
xbps_dictionary_t transd;
|
||||||
|
/**
|
||||||
|
* @var repositories
|
||||||
|
*
|
||||||
|
* Proplib array of strings with repositories, overriding the list
|
||||||
|
* in the configuration file.
|
||||||
|
*/
|
||||||
|
xbps_array_t repositories;
|
||||||
/**
|
/**
|
||||||
* Pointer to the supplifed function callback to be used
|
* Pointer to the supplifed function callback to be used
|
||||||
* in the XBPS possible states.
|
* in the XBPS possible states.
|
||||||
@ -531,6 +538,12 @@ struct xbps_handle {
|
|||||||
* If NULL, defaults to \a XBPS_CACHE_PATH (relative to rootdir).
|
* If NULL, defaults to \a XBPS_CACHE_PATH (relative to rootdir).
|
||||||
*/
|
*/
|
||||||
const char *metadir;
|
const char *metadir;
|
||||||
|
/**
|
||||||
|
* @var conffile
|
||||||
|
*
|
||||||
|
* Full path to the xbps configuration file.
|
||||||
|
*/
|
||||||
|
const char *conffile;
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
@ -538,19 +551,6 @@ struct xbps_handle {
|
|||||||
char *metadir_priv;
|
char *metadir_priv;
|
||||||
char *native_arch;
|
char *native_arch;
|
||||||
const char *target_arch;
|
const char *target_arch;
|
||||||
/*
|
|
||||||
* @var repository
|
|
||||||
*
|
|
||||||
* Default repository to be used if a configuration file
|
|
||||||
* couldn't be found.
|
|
||||||
*/
|
|
||||||
const char *repository;
|
|
||||||
/**
|
|
||||||
* @var conffile
|
|
||||||
*
|
|
||||||
* Full path to the xbps configuration file.
|
|
||||||
*/
|
|
||||||
const char *conffile;
|
|
||||||
/**
|
/**
|
||||||
* @var fetch_timeout
|
* @var fetch_timeout
|
||||||
*
|
*
|
||||||
|
@ -75,22 +75,6 @@ set_metadir(struct xbps_handle *xh)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
config_inject_repos(struct xbps_handle *xh)
|
|
||||||
{
|
|
||||||
char *buf;
|
|
||||||
|
|
||||||
if (xh->repository) {
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
buf = xbps_xasprintf("repositories = { %s }", xh->repository);
|
|
||||||
if ((rv = cfg_parse_buf(xh->cfg, buf)) != 0)
|
|
||||||
return rv;
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cb_validate_virtual(cfg_t *cfg, cfg_opt_t *opt)
|
cb_validate_virtual(cfg_t *cfg, cfg_opt_t *opt)
|
||||||
{
|
{
|
||||||
@ -131,6 +115,7 @@ xbps_init(struct xbps_handle *xhp)
|
|||||||
CFG_END()
|
CFG_END()
|
||||||
};
|
};
|
||||||
struct utsname un;
|
struct utsname un;
|
||||||
|
const char *repodir;
|
||||||
int rv, cc, cch;
|
int rv, cc, cch;
|
||||||
bool syslog_enabled = false;
|
bool syslog_enabled = false;
|
||||||
|
|
||||||
@ -163,10 +148,6 @@ xbps_init(struct xbps_handle *xhp)
|
|||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Inject custom repo overriding the ones from configuration file */
|
|
||||||
if ((rv = config_inject_repos(xhp)) != 0)
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
xbps_dbg_printf(xhp, "Configuration file: %s\n",
|
xbps_dbg_printf(xhp, "Configuration file: %s\n",
|
||||||
xhp->conffile ? xhp->conffile : "not found");
|
xhp->conffile ? xhp->conffile : "not found");
|
||||||
/*
|
/*
|
||||||
@ -190,6 +171,19 @@ xbps_init(struct xbps_handle *xhp)
|
|||||||
xhp->rootdir = buf;
|
xhp->rootdir = buf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* If repositories array is empty use the provided list from
|
||||||
|
* configuration file.
|
||||||
|
*/
|
||||||
|
if (xbps_array_count(xhp->repositories) == 0) {
|
||||||
|
for (unsigned int i = 0; i < cfg_size(xhp->cfg, "repositories"); i++) {
|
||||||
|
if (xhp->repositories == NULL)
|
||||||
|
xhp->repositories = xbps_array_create();
|
||||||
|
|
||||||
|
repodir = cfg_getnstr(xhp->cfg, "repositories", i);
|
||||||
|
xbps_array_add_cstring_nocopy(xhp->repositories, repodir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (xhp->cachedir == NULL) {
|
if (xhp->cachedir == NULL) {
|
||||||
if (xhp->cfg == NULL)
|
if (xhp->cfg == NULL)
|
||||||
@ -237,6 +231,13 @@ xbps_init(struct xbps_handle *xhp)
|
|||||||
xbps_dbg_printf(xhp, "Architecture: %s\n", xhp->native_arch);
|
xbps_dbg_printf(xhp, "Architecture: %s\n", xhp->native_arch);
|
||||||
xbps_dbg_printf(xhp, "Target Architecture: %s\n", xhp->target_arch);
|
xbps_dbg_printf(xhp, "Target Architecture: %s\n", xhp->target_arch);
|
||||||
|
|
||||||
|
if (xhp->flags & XBPS_FLAG_DEBUG) {
|
||||||
|
for (unsigned int i = 0; i < xbps_array_count(xhp->repositories); i++) {
|
||||||
|
xbps_array_get_cstring_nocopy(xhp->repositories, i, &repodir);
|
||||||
|
xbps_dbg_printf(xhp, "Repository[%u]=%s\n", i, repodir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
xhp->initialized = true;
|
xhp->initialized = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
13
lib/rpool.c
13
lib/rpool.c
@ -59,13 +59,11 @@ xbps_rpool_init(struct xbps_handle *xhp)
|
|||||||
|
|
||||||
if (xhp->rpool_initialized)
|
if (xhp->rpool_initialized)
|
||||||
return 0;
|
return 0;
|
||||||
else if (xhp->cfg == NULL)
|
|
||||||
return ENOTSUP;
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < cfg_size(xhp->cfg, "repositories"); i++) {
|
for (unsigned int i = 0; i < xbps_array_count(xhp->repositories); i++) {
|
||||||
rp = malloc(sizeof(struct rpool));
|
rp = malloc(sizeof(struct rpool));
|
||||||
assert(rp);
|
assert(rp);
|
||||||
repouri = cfg_getnstr(xhp->cfg, "repositories", i);
|
xbps_array_get_cstring_nocopy(xhp->repositories, i, &repouri);
|
||||||
if ((rp->repo = xbps_repo_open(xhp, repouri)) == NULL) {
|
if ((rp->repo = xbps_repo_open(xhp, repouri)) == NULL) {
|
||||||
rp->repo = calloc(1, sizeof(struct xbps_repo));
|
rp->repo = calloc(1, sizeof(struct xbps_repo));
|
||||||
assert(rp->repo);
|
assert(rp->repo);
|
||||||
@ -114,11 +112,8 @@ xbps_rpool_sync(struct xbps_handle *xhp, const char *uri)
|
|||||||
{
|
{
|
||||||
const char *repouri;
|
const char *repouri;
|
||||||
|
|
||||||
if (xhp->cfg == NULL)
|
for (unsigned int i = 0; i < xbps_array_count(xhp->repositories); i++) {
|
||||||
return ENOTSUP;
|
xbps_array_get_cstring_nocopy(xhp->repositories, i, &repouri);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < cfg_size(xhp->cfg, "repositories"); i++) {
|
|
||||||
repouri = cfg_getnstr(xhp->cfg, "repositories", i);
|
|
||||||
/* If argument was set just process that repository */
|
/* If argument was set just process that repository */
|
||||||
if (uri && strcmp(repouri, uri))
|
if (uri && strcmp(repouri, uri))
|
||||||
continue;
|
continue;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user