xbps-{install,query}: --repository now accepts relative paths in local repos.

This commit is contained in:
Juan RP 2015-01-10 11:59:31 +01:00
parent 283fb4bc06
commit b09faadebc
6 changed files with 65 additions and 24 deletions

4
NEWS
View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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.
*

View File

@ -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;
}

View File

@ -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)
{