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);
|
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
|
int
|
||||||
xbps_install_new_pkg(const char *pkg)
|
xbps_install_new_pkg(const char *pkg)
|
||||||
{
|
{
|
||||||
prop_dictionary_t pkgd;
|
prop_dictionary_t pkgd;
|
||||||
char *pkgname = NULL;
|
char *pkgname = NULL, *pkgpatt = NULL;
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
bool pkgmatch = false;
|
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;
|
pkgmatch = true;
|
||||||
else
|
pkgpatt = xbps_xasprintf("%s%s", pkg, ">=0");
|
||||||
pkgname = __UNCONST(pkg);
|
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.
|
* Find a package in a repository and prepare for installation.
|
||||||
@ -399,7 +355,7 @@ xbps_install_new_pkg(const char *pkg)
|
|||||||
free(pkgname);
|
free(pkgname);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
rv = xbps_repository_install_pkg(pkg, pkgmatch);
|
rv = xbps_repository_install_pkg(pkgpatt, true);
|
||||||
if (rv == EAGAIN) {
|
if (rv == EAGAIN) {
|
||||||
fprintf(stderr, "xbps-bin: unable to locate '%s' in "
|
fprintf(stderr, "xbps-bin: unable to locate '%s' in "
|
||||||
"repository pool.\n", pkg);
|
"repository pool.\n", pkg);
|
||||||
@ -411,7 +367,8 @@ xbps_install_new_pkg(const char *pkg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pkgmatch)
|
if (pkgmatch)
|
||||||
free(pkgname);
|
free(pkgpatt);
|
||||||
|
free(pkgname);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user