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:
		@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user