libxbps: make relative cachedir set via xbps.d(5) work again.

Close #117
This commit is contained in:
Juan RP 2015-09-15 09:26:07 +02:00
parent 21be2318cf
commit d8fc08eb50
2 changed files with 49 additions and 49 deletions

3
NEWS
View File

@ -1,5 +1,8 @@
xbps-0.48 (???): xbps-0.48 (???):
* libxbps: relative cachedir set via xbps.d(5) now work correctly.
Fixes #117 (https://github.com/voidlinux/xbps/issues/117)
* xbps-create(1): --compression now accepts "none" to not use any * xbps-create(1): --compression now accepts "none" to not use any
compression format. compression format.

View File

@ -55,38 +55,34 @@ static int parse_file(struct xbps_handle *, const char *, const char *, bool);
* Use these functions to initialize some parameters before start * Use these functions to initialize some parameters before start
* using libxbps and finalize usage to release resources at the end. * using libxbps and finalize usage to release resources at the end.
*/ */
static void static void
store_vpkg(struct xbps_handle *xhp, const char *path, size_t line, char *vpkg_s) store_vars(struct xbps_handle *xhp, xbps_dictionary_t *d,
const char *key, const char *path, size_t line, char *buf)
{ {
char *lp, *rp, *tc;
size_t len;
if (*d == NULL)
*d = xbps_dictionary_create();
/* /*
* Append virtual package overrides to our vpkgd dictionary: * Parse strings delimited by ':' i.e
* * <left>:<right>
* <key>vpkgver</key>
* <string>realpkgname</string>
*/ */
char *vpkg, *rpkg, *tc; lp = buf;
size_t vpkglen; rp = strchr(buf, ':');
if (rp == NULL || *rp == '\0') {
if (xhp->vpkgd == NULL)
xhp->vpkgd = xbps_dictionary_create();
/* real pkg after ':' */
vpkg = vpkg_s;
rpkg = strchr(vpkg_s, ':');
if (rpkg == NULL || *rpkg == '\0') {
xbps_dbg_printf(xhp, "%s: ignoring invalid " xbps_dbg_printf(xhp, "%s: ignoring invalid "
"virtualpkg option at line %zu\n", path, line); "%s option at line %zu\n", path, key, line);
return; return;
} }
/* vpkg until ':' */ tc = strchr(buf, ':');
tc = strchr(vpkg_s, ':'); len = strlen(buf) - strlen(tc);
vpkglen = strlen(vpkg_s) - strlen(tc); lp[len] = '\0';
vpkg[vpkglen] = '\0';
/* skip ':' */ rp++;
rpkg++; xbps_dictionary_set_cstring(*d, lp, rp);
xbps_dictionary_set_cstring(xhp->vpkgd, vpkg, rpkg); xbps_dbg_printf(xhp, "%s: added %s %s for %s\n", path, key, lp, rp);
xbps_dbg_printf(xhp, "%s: added vpkg %s for %s\n", path, vpkg, rpkg);
} }
static void static void
@ -262,7 +258,7 @@ parse_file(struct xbps_handle *xhp, const char *cwd, const char *path, bool nest
if (store_repo(xhp, v)) if (store_repo(xhp, v))
xbps_dbg_printf(xhp, "%s: added repository %s\n", path, v); xbps_dbg_printf(xhp, "%s: added repository %s\n", path, v);
} else if (strcmp(k, "virtualpkg") == 0) { } else if (strcmp(k, "virtualpkg") == 0) {
store_vpkg(xhp, path, nlines, v); store_vars(xhp, &xhp->vpkgd, k, path, nlines, v);
} else if (strcmp(k, "preserve") == 0) { } else if (strcmp(k, "preserve") == 0) {
store_preserved_file(xhp, v); store_preserved_file(xhp, v);
} else if (strcmp(k, "bestmatching") == 0) { } else if (strcmp(k, "bestmatching") == 0) {
@ -416,30 +412,6 @@ xbps_init(struct xbps_handle *xhp)
free(buf); free(buf);
} }
xbps_dbg_printf(xhp, "%s\n", XBPS_RELVER); xbps_dbg_printf(xhp, "%s\n", XBPS_RELVER);
/* Set cachedir */
if (xhp->cachedir[0] == '\0') {
snprintf(xhp->cachedir, sizeof(xhp->cachedir),
"%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "",
XBPS_CACHE_PATH);
} else if (xhp->cachedir[0] != '/') {
/* relative path */
buf = strdup(xhp->cachedir);
snprintf(xhp->cachedir, sizeof(xhp->cachedir),
"%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "", buf);
free(buf);
}
/* Set metadir */
if (xhp->metadir[0] == '\0') {
snprintf(xhp->metadir, sizeof(xhp->metadir),
"%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "",
XBPS_META_PATH);
} else if (xhp->metadir[0] != '/') {
/* relative path */
buf = strdup(xhp->metadir);
snprintf(xhp->metadir, sizeof(xhp->metadir),
"%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "", buf);
free(buf);
}
/* set confdir */ /* set confdir */
if (xhp->confdir[0] == '\0') { if (xhp->confdir[0] == '\0') {
snprintf(xhp->confdir, sizeof(xhp->confdir), snprintf(xhp->confdir, sizeof(xhp->confdir),
@ -472,6 +444,31 @@ xbps_init(struct xbps_handle *xhp)
if ((rv = parse_dir(xhp, cwd, xhp->confdir, sysconfdir)) != 0) if ((rv = parse_dir(xhp, cwd, xhp->confdir, sysconfdir)) != 0)
return rv; return rv;
/* Set cachedir */
if (xhp->cachedir[0] == '\0') {
snprintf(xhp->cachedir, sizeof(xhp->cachedir),
"%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "",
XBPS_CACHE_PATH);
} else if (xhp->cachedir[0] != '/') {
/* relative path */
buf = strdup(xhp->cachedir);
snprintf(xhp->cachedir, sizeof(xhp->cachedir),
"%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "", buf);
free(buf);
}
/* Set metadir */
if (xhp->metadir[0] == '\0') {
snprintf(xhp->metadir, sizeof(xhp->metadir),
"%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "",
XBPS_META_PATH);
} else if (xhp->metadir[0] != '/') {
/* relative path */
buf = strdup(xhp->metadir);
snprintf(xhp->metadir, sizeof(xhp->metadir),
"%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "", buf);
free(buf);
}
xbps_dbg_printf(xhp, "rootdir=%s\n", xhp->rootdir); xbps_dbg_printf(xhp, "rootdir=%s\n", xhp->rootdir);
xbps_dbg_printf(xhp, "metadir=%s\n", xhp->metadir); xbps_dbg_printf(xhp, "metadir=%s\n", xhp->metadir);
xbps_dbg_printf(xhp, "cachedir=%s\n", xhp->cachedir); xbps_dbg_printf(xhp, "cachedir=%s\n", xhp->cachedir);