diff --git a/NEWS b/NEWS index 03a3b376..86b68f2e 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,9 @@ xbps-0.44 (???): + * xbps-{install,query}: the --repository argument now works with relative + paths for local repositories. The relative path is always converted to + absolute. + * libxbps: the provides obj (array of strings) now fully expects exact pkgver strings, such as `foo-1.0_1`. Incomplete components such as `pkgname` or `pkgname-9` are not accepted anymore. diff --git a/bin/xbps-install/main.c b/bin/xbps-install/main.c index ce370d55..7704f09f 100644 --- a/bin/xbps-install/main.c +++ b/bin/xbps-install/main.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2008-2014 Juan Romero Pardines. + * Copyright (c) 2008-2015 Juan Romero Pardines. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -159,10 +159,7 @@ main(int argc, char **argv) drun = true; break; case 'R': - if (xh.repositories == NULL) - xh.repositories = xbps_array_create(); - - xbps_array_add_cstring_nocopy(xh.repositories, optarg); + xbps_repo_store(&xh, optarg); break; case 'r': rootdir = optarg; diff --git a/bin/xbps-query/main.c b/bin/xbps-query/main.c index a12d5c43..e976504c 100644 --- a/bin/xbps-query/main.c +++ b/bin/xbps-query/main.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2008-2014 Juan Romero Pardines. + * Copyright (c) 2008-2015 Juan Romero Pardines. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -170,10 +170,7 @@ main(int argc, char **argv) break; case 'R': if (optarg != NULL) { - if (xh.repositories == NULL) - xh.repositories = xbps_array_create(); - - xbps_array_add_cstring_nocopy(xh.repositories, optarg); + xbps_repo_store(&xh, optarg); } repo_mode = true; break; diff --git a/include/xbps.h.in b/include/xbps.h.in index be2ffe00..c2333462 100644 --- a/include/xbps.h.in +++ b/include/xbps.h.in @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2008-2014 Juan Romero Pardines. + * Copyright (c) 2008-2015 Juan Romero Pardines. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,7 +48,7 @@ * * This header documents the full API for the XBPS Library. */ -#define XBPS_API_VERSION "20141209" +#define XBPS_API_VERSION "20150110" #ifndef XBPS_VERSION #define XBPS_VERSION "UNSET" @@ -1389,6 +1389,16 @@ xbps_dictionary_t xbps_rpool_get_pkg_plist(struct xbps_handle *xhp, /** @addtogroup repo */ /*@{*/ +/** + * Stores repository \a url into the repository pool. + * + * @param[in] xhp Pointer to the xbps_handle struct. + * @param[in] uri Repository URI to store. + * + * @return True on success, false otherwise. + */ +bool xbps_repo_store(struct xbps_handle *xhp, const char *url); + /** * Opens a repository and returns a xbps_repo object. * diff --git a/lib/initend.c b/lib/initend.c index 99ee2462..8465a063 100644 --- a/lib/initend.c +++ b/lib/initend.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011-2014 Juan Romero Pardines. + * Copyright (c) 2011-2015 Juan Romero Pardines. * Copyright (c) 2014 Enno Boland. * All rights reserved. * @@ -137,14 +137,7 @@ store_repo(struct xbps_handle *xhp, const char *repo) if (xhp->flags & XBPS_FLAG_IGNORE_CONF_REPOS) return false; - if (xhp->repositories == NULL) - xhp->repositories = xbps_array_create(); - - if (xbps_match_string_in_array(xhp->repositories, repo)) - return false; - - xbps_array_add_cstring(xhp->repositories, repo); - return true; + return xbps_repo_store(xhp, repo); } static bool @@ -496,9 +489,10 @@ xbps_init(struct xbps_handle *xhp) } } /* Going back to old working directory */ - if (chdir(cwd) == -1) - xbps_dbg_printf(xhp, "%s: cannot chdir to %s: %s\n", __func__, cwd, strerror(errno)); - + if (chdir(cwd) == -1) { + xbps_dbg_printf(xhp, "%s: cannot chdir to %s: %s\n", + __func__, cwd, strerror(errno)); + } return 0; } diff --git a/lib/repo.c b/lib/repo.c index 6c7070ca..17227f90 100644 --- a/lib/repo.c +++ b/lib/repo.c @@ -172,6 +172,45 @@ repo_open_remote(struct xbps_repo *repo) return rv; } +bool +xbps_repo_store(struct xbps_handle *xhp, const char *repo) +{ + char *url = NULL; + + assert(xhp); + assert(repo); + + if (xhp->repositories == NULL) { + xhp->repositories = xbps_array_create(); + assert(xhp->repositories); + } + /* + * If it's a local repo and path is relative, make it absolute. + */ + if (!xbps_repository_is_remote(repo)) { + if (repo[0] != '/' && repo[0] != '\0') { + if ((url = realpath(repo, NULL)) == NULL) + xbps_dbg_printf(xhp, "[repo] %s: realpath %s\n", __func__, repo); + } + } + if (xbps_match_string_in_array(xhp->repositories, url ? url : repo)) { + xbps_dbg_printf(xhp, "[repo] `%s' already stored\n", url ? url : repo); + if (url) + free(url); + return false; + } + if (xbps_array_add_cstring(xhp->repositories, url ? url : repo)) { + xbps_dbg_printf(xhp, "[repo] `%s' stored successfully\n", url ? url : repo); + if (url) + free(url); + return true; + } + if (url) + free(url); + + return false; +} + struct xbps_repo * xbps_repo_open(struct xbps_handle *xhp, const char *url, bool lock) {