xbps-bin: fixed the install target to work with pkgnames containing
multiple '-' characters, which resulted in incomplete pkgname. The fix is to always append '>=0' if a pkgname is specified, and passing a pkgpattern to xbps_repository_install_pkg(). --HG-- extra : convert_revision : xtraeme%40gmail.com-20100226051333-od2siux4rmsa88m7
This commit is contained in:
parent
9f4b36292d
commit
9bceb2adb7
@ -321,73 +321,29 @@ xbps_autoupdate_pkgs(bool yes)
|
||||
return xbps_exec_transaction(yes);
|
||||
}
|
||||
|
||||
static char *
|
||||
pkgname_from_pkgmatch(const char *pkg)
|
||||
{
|
||||
const char *version;
|
||||
|
||||
/*
|
||||
* Check if 'pkg' string is a pkgmatch valid pattern or it
|
||||
* is just a pkgname.
|
||||
*
|
||||
* XXX REALLY FIX THIS CRAP! I haven't found much easier ways...
|
||||
*/
|
||||
if ((version = xbps_get_pkgpattern_version(pkg))) {
|
||||
while (*version) {
|
||||
if (!isdigit((unsigned char)*version)) {
|
||||
version++;
|
||||
continue;
|
||||
}
|
||||
if (xbps_cmpver("0", version) <= 0)
|
||||
return xbps_get_pkgpattern_name(pkg);
|
||||
}
|
||||
}
|
||||
if ((version = xbps_get_pkg_version(pkg))) {
|
||||
while (*version) {
|
||||
if (!isdigit((unsigned char)*version)) {
|
||||
version++;
|
||||
continue;
|
||||
}
|
||||
|
||||
const char *tmp = version;
|
||||
size_t ndigits = 0, tmplen = strlen(tmp);
|
||||
bool dot = false, digit = false;
|
||||
|
||||
while (*tmp) {
|
||||
if (isdigit((unsigned char)*tmp)) {
|
||||
digit = true;
|
||||
ndigits++;
|
||||
}
|
||||
if (*tmp == '.')
|
||||
dot = true;
|
||||
else if (*tmp == '_')
|
||||
ndigits++;
|
||||
|
||||
tmp++;
|
||||
}
|
||||
if ((!dot && !digit) || (!dot && tmplen != ndigits))
|
||||
break;
|
||||
|
||||
if (xbps_cmpver("0", version) <= 0)
|
||||
return xbps_get_pkg_name(pkg);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
xbps_install_new_pkg(const char *pkg)
|
||||
{
|
||||
prop_dictionary_t pkgd;
|
||||
char *pkgname = NULL;
|
||||
char *pkgname = NULL, *pkgpatt = NULL;
|
||||
int rv = 0;
|
||||
bool pkgmatch = false;
|
||||
|
||||
if ((pkgname = pkgname_from_pkgmatch(pkg)))
|
||||
if (xbps_get_pkgpattern_version(pkg)) {
|
||||
pkgpatt = __UNCONST(pkg);
|
||||
} else {
|
||||
/*
|
||||
* If only pkgname has been specified, always append
|
||||
* '>=0' at the end, will be easier to parse.
|
||||
*/
|
||||
pkgmatch = true;
|
||||
else
|
||||
pkgname = __UNCONST(pkg);
|
||||
pkgpatt = xbps_xasprintf("%s%s", pkg, ">=0");
|
||||
if (pkgpatt == NULL)
|
||||
return -1;
|
||||
}
|
||||
pkgname = xbps_get_pkgpattern_name(pkgpatt);
|
||||
if (pkgname == NULL)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* Find a package in a repository and prepare for installation.
|
||||
@ -399,7 +355,7 @@ xbps_install_new_pkg(const char *pkg)
|
||||
free(pkgname);
|
||||
return 0;
|
||||
}
|
||||
rv = xbps_repository_install_pkg(pkg, pkgmatch);
|
||||
rv = xbps_repository_install_pkg(pkgpatt, true);
|
||||
if (rv == EAGAIN) {
|
||||
fprintf(stderr, "xbps-bin: unable to locate '%s' in "
|
||||
"repository pool.\n", pkg);
|
||||
@ -409,9 +365,10 @@ xbps_install_new_pkg(const char *pkg)
|
||||
strerror(errno));
|
||||
rv = -1;
|
||||
}
|
||||
|
||||
|
||||
if (pkgmatch)
|
||||
free(pkgname);
|
||||
free(pkgpatt);
|
||||
free(pkgname);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user