mirror of
https://github.com/moparisthebest/pacman
synced 2025-01-10 21:38:19 -05:00
Merge branch 'depcmp-perf'
This commit is contained in:
commit
a7972625e3
@ -322,32 +322,41 @@ static int dep_vercmp(const char *version1, pmdepmod_t mod,
|
|||||||
int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep)
|
int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep)
|
||||||
{
|
{
|
||||||
alpm_list_t *i;
|
alpm_list_t *i;
|
||||||
|
const char *pkgname = pkg->name;
|
||||||
ALPM_LOG_FUNC;
|
const char *pkgversion = pkg->version;
|
||||||
|
|
||||||
const char *pkgname = alpm_pkg_get_name(pkg);
|
|
||||||
const char *pkgversion = alpm_pkg_get_version(pkg);
|
|
||||||
int satisfy = 0;
|
int satisfy = 0;
|
||||||
|
|
||||||
/* check (pkg->name, pkg->version) */
|
/* check (pkg->name, pkg->version) */
|
||||||
|
if(pkg->name_hash && dep->name_hash
|
||||||
|
&& pkg->name_hash != dep->name_hash) {
|
||||||
|
/* skip more expensive checks */
|
||||||
|
} else {
|
||||||
satisfy = (strcmp(pkgname, dep->name) == 0
|
satisfy = (strcmp(pkgname, dep->name) == 0
|
||||||
&& dep_vercmp(pkgversion, dep->mod, dep->version));
|
&& dep_vercmp(pkgversion, dep->mod, dep->version));
|
||||||
|
if(satisfy) {
|
||||||
|
return(satisfy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* check provisions, format : "name=version" */
|
/* check provisions, format : "name=version" */
|
||||||
for(i = alpm_pkg_get_provides(pkg); i && !satisfy; i = i->next) {
|
for(i = alpm_pkg_get_provides(pkg); i && !satisfy; i = i->next) {
|
||||||
char *provname = strdup(i->data);
|
const char *provision = i->data;
|
||||||
char *provver = strchr(provname, '=');
|
const char *provver = strchr(provision, '=');
|
||||||
|
|
||||||
if(provver == NULL) { /* no provision version */
|
if(provver == NULL) { /* no provision version */
|
||||||
satisfy = (dep->mod == PM_DEP_MOD_ANY
|
satisfy = (dep->mod == PM_DEP_MOD_ANY
|
||||||
&& strcmp(provname, dep->name) == 0);
|
&& strcmp(provision, dep->name) == 0);
|
||||||
} else {
|
} else {
|
||||||
*provver = '\0';
|
/* This is a bit tricker than the old code for performance reasons. To
|
||||||
|
* prevent the need to copy and duplicate strings, strncmp only the name
|
||||||
|
* portion if they are the same length, since there is a version and
|
||||||
|
* operator in play here. */
|
||||||
|
size_t namelen = provver - provision;
|
||||||
provver += 1;
|
provver += 1;
|
||||||
satisfy = (strcmp(provname, dep->name) == 0
|
satisfy = (strlen(dep->name) == namelen
|
||||||
|
&& strncmp(provision, dep->name, namelen) == 0
|
||||||
&& dep_vercmp(provver, dep->mod, dep->version));
|
&& dep_vercmp(provver, dep->mod, dep->version));
|
||||||
}
|
}
|
||||||
free(provname);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(satisfy);
|
return(satisfy);
|
||||||
@ -376,7 +385,8 @@ pmdepend_t *_alpm_splitdep(const char *depstring)
|
|||||||
depend->mod = PM_DEP_MOD_LE;
|
depend->mod = PM_DEP_MOD_LE;
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
} else if((ptr = strstr(newstr, "="))) { /* Note: we must do =,<,> checks after <=, >= checks */
|
} else if((ptr = strstr(newstr, "="))) {
|
||||||
|
/* Note: we must do =,<,> checks after <=, >= checks */
|
||||||
depend->mod = PM_DEP_MOD_EQ;
|
depend->mod = PM_DEP_MOD_EQ;
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
ptr += 1;
|
ptr += 1;
|
||||||
@ -392,6 +402,7 @@ pmdepend_t *_alpm_splitdep(const char *depstring)
|
|||||||
/* no version specified - copy the name and return it */
|
/* no version specified - copy the name and return it */
|
||||||
depend->mod = PM_DEP_MOD_ANY;
|
depend->mod = PM_DEP_MOD_ANY;
|
||||||
STRDUP(depend->name, newstr, RET_ERR(PM_ERR_MEMORY, NULL));
|
STRDUP(depend->name, newstr, RET_ERR(PM_ERR_MEMORY, NULL));
|
||||||
|
depend->name_hash = _alpm_hash_sdbm(depend->name);
|
||||||
depend->version = NULL;
|
depend->version = NULL;
|
||||||
free(newstr);
|
free(newstr);
|
||||||
return(depend);
|
return(depend);
|
||||||
@ -400,6 +411,7 @@ pmdepend_t *_alpm_splitdep(const char *depstring)
|
|||||||
/* if we get here, we have a version comparator, copy the right parts
|
/* if we get here, we have a version comparator, copy the right parts
|
||||||
* to the right places */
|
* to the right places */
|
||||||
STRDUP(depend->name, newstr, RET_ERR(PM_ERR_MEMORY, NULL));
|
STRDUP(depend->name, newstr, RET_ERR(PM_ERR_MEMORY, NULL));
|
||||||
|
depend->name_hash = _alpm_hash_sdbm(depend->name);
|
||||||
STRDUP(depend->version, ptr, RET_ERR(PM_ERR_MEMORY, NULL));
|
STRDUP(depend->version, ptr, RET_ERR(PM_ERR_MEMORY, NULL));
|
||||||
free(newstr);
|
free(newstr);
|
||||||
|
|
||||||
@ -412,6 +424,7 @@ pmdepend_t *_alpm_dep_dup(const pmdepend_t *dep)
|
|||||||
CALLOC(newdep, 1, sizeof(pmdepend_t), RET_ERR(PM_ERR_MEMORY, NULL));
|
CALLOC(newdep, 1, sizeof(pmdepend_t), RET_ERR(PM_ERR_MEMORY, NULL));
|
||||||
|
|
||||||
STRDUP(newdep->name, dep->name, RET_ERR(PM_ERR_MEMORY, NULL));
|
STRDUP(newdep->name, dep->name, RET_ERR(PM_ERR_MEMORY, NULL));
|
||||||
|
newdep->name_hash = dep->name_hash;
|
||||||
STRDUP(newdep->version, dep->version, RET_ERR(PM_ERR_MEMORY, NULL));
|
STRDUP(newdep->version, dep->version, RET_ERR(PM_ERR_MEMORY, NULL));
|
||||||
newdep->mod = dep->mod;
|
newdep->mod = dep->mod;
|
||||||
|
|
||||||
|
@ -29,9 +29,10 @@
|
|||||||
|
|
||||||
/* Dependency */
|
/* Dependency */
|
||||||
struct __pmdepend_t {
|
struct __pmdepend_t {
|
||||||
pmdepmod_t mod;
|
|
||||||
char *name;
|
char *name;
|
||||||
char *version;
|
char *version;
|
||||||
|
long name_hash;
|
||||||
|
pmdepmod_t mod;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Missing dependency */
|
/* Missing dependency */
|
||||||
|
Loading…
Reference in New Issue
Block a user