New _alpm_dep_edge function
The function is introduced to kill some code duplication. The function name uses the 'dependency graph' terminology. Signed-off-by: Nagy Gabor <ngaba@bibl.u-szeged.hu> Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
2122eb1428
commit
f7199f36ba
3 changed files with 31 additions and 40 deletions
|
@ -74,7 +74,7 @@ void _alpm_depmiss_free(pmdepmissing_t *miss)
|
||||||
*/
|
*/
|
||||||
static alpm_list_t *dep_graph_init(alpm_list_t *targets)
|
static alpm_list_t *dep_graph_init(alpm_list_t *targets)
|
||||||
{
|
{
|
||||||
alpm_list_t *i, *j, *k;
|
alpm_list_t *i, *j;
|
||||||
alpm_list_t *vertices = NULL;
|
alpm_list_t *vertices = NULL;
|
||||||
/* We create the vertices */
|
/* We create the vertices */
|
||||||
for(i = targets; i; i = i->next) {
|
for(i = targets; i; i = i->next) {
|
||||||
|
@ -91,12 +91,7 @@ static alpm_list_t *dep_graph_init(alpm_list_t *targets)
|
||||||
for(j = vertices; j; j = j->next) {
|
for(j = vertices; j; j = j->next) {
|
||||||
pmgraph_t *vertex_j = j->data;
|
pmgraph_t *vertex_j = j->data;
|
||||||
pmpkg_t *p_j = vertex_j->data;
|
pmpkg_t *p_j = vertex_j->data;
|
||||||
int child = 0;
|
if(_alpm_dep_edge(p_i, p_j)) {
|
||||||
for(k = alpm_pkg_get_depends(p_i); k && !child; k = k->next) {
|
|
||||||
pmdepend_t *depend = k->data;
|
|
||||||
child = alpm_depcmp(p_j, depend);
|
|
||||||
}
|
|
||||||
if(child) {
|
|
||||||
vertex_i->children =
|
vertex_i->children =
|
||||||
alpm_list_add(vertex_i->children, vertex_j);
|
alpm_list_add(vertex_i->children, vertex_j);
|
||||||
}
|
}
|
||||||
|
@ -458,7 +453,7 @@ pmdepend_t *_alpm_dep_dup(const pmdepend_t *dep)
|
||||||
static int can_remove_package(pmdb_t *db, pmpkg_t *pkg, alpm_list_t *targets,
|
static int can_remove_package(pmdb_t *db, pmpkg_t *pkg, alpm_list_t *targets,
|
||||||
int include_explicit)
|
int include_explicit)
|
||||||
{
|
{
|
||||||
alpm_list_t *i, *j;
|
alpm_list_t *i;
|
||||||
|
|
||||||
if(_alpm_pkg_find(targets, alpm_pkg_get_name(pkg))) {
|
if(_alpm_pkg_find(targets, alpm_pkg_get_name(pkg))) {
|
||||||
return(0);
|
return(0);
|
||||||
|
@ -482,14 +477,9 @@ static int can_remove_package(pmdb_t *db, pmpkg_t *pkg, alpm_list_t *targets,
|
||||||
/* see if other packages need it */
|
/* see if other packages need it */
|
||||||
for(i = _alpm_db_get_pkgcache(db); i; i = i->next) {
|
for(i = _alpm_db_get_pkgcache(db); i; i = i->next) {
|
||||||
pmpkg_t *lpkg = i->data;
|
pmpkg_t *lpkg = i->data;
|
||||||
for(j = alpm_pkg_get_depends(lpkg); j; j = j->next) {
|
if(_alpm_dep_edge(lpkg, pkg) && !_alpm_pkg_find(targets, lpkg->name)) {
|
||||||
if(alpm_depcmp(pkg, j->data)) {
|
|
||||||
if(!_alpm_pkg_find(targets, lpkg->name)) {
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* it's ok to remove */
|
/* it's ok to remove */
|
||||||
|
@ -508,7 +498,7 @@ static int can_remove_package(pmdb_t *db, pmpkg_t *pkg, alpm_list_t *targets,
|
||||||
*/
|
*/
|
||||||
void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit)
|
void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit)
|
||||||
{
|
{
|
||||||
alpm_list_t *i, *j, *k;
|
alpm_list_t *i, *j;
|
||||||
|
|
||||||
ALPM_LOG_FUNC;
|
ALPM_LOG_FUNC;
|
||||||
|
|
||||||
|
@ -518,12 +508,9 @@ void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit)
|
||||||
|
|
||||||
for(i = targs; i; i = i->next) {
|
for(i = targs; i; i = i->next) {
|
||||||
pmpkg_t *pkg = i->data;
|
pmpkg_t *pkg = i->data;
|
||||||
for(j = alpm_pkg_get_depends(pkg); j; j = j->next) {
|
for(j = _alpm_db_get_pkgcache(db); j; j = j->next) {
|
||||||
pmdepend_t *depend = j->data;
|
pmpkg_t *deppkg = j->data;
|
||||||
|
if(_alpm_dep_edge(pkg, deppkg)
|
||||||
for(k = _alpm_db_get_pkgcache(db); k; k = k->next) {
|
|
||||||
pmpkg_t *deppkg = k->data;
|
|
||||||
if(alpm_depcmp(deppkg,depend)
|
|
||||||
&& can_remove_package(db, deppkg, targs, include_explicit)) {
|
&& can_remove_package(db, deppkg, targs, include_explicit)) {
|
||||||
_alpm_log(PM_LOG_DEBUG, "adding '%s' to the targets\n",
|
_alpm_log(PM_LOG_DEBUG, "adding '%s' to the targets\n",
|
||||||
alpm_pkg_get_name(deppkg));
|
alpm_pkg_get_name(deppkg));
|
||||||
|
@ -532,7 +519,6 @@ void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* populates *list with packages that need to be installed to satisfy all
|
/* populates *list with packages that need to be installed to satisfy all
|
||||||
|
@ -668,6 +654,18 @@ error:
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Does pkg1 depend on pkg2, ie. does pkg2 satisfy a dependency of pkg1? */
|
||||||
|
int _alpm_dep_edge(pmpkg_t *pkg1, pmpkg_t *pkg2)
|
||||||
|
{
|
||||||
|
alpm_list_t *i;
|
||||||
|
for(i = alpm_pkg_get_depends(pkg1); i; i = i->next) {
|
||||||
|
if(alpm_depcmp(pkg2, i->data)) {
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
const char SYMEXPORT *alpm_miss_get_target(const pmdepmissing_t *miss)
|
const char SYMEXPORT *alpm_miss_get_target(const pmdepmissing_t *miss)
|
||||||
{
|
{
|
||||||
ALPM_LOG_FUNC;
|
ALPM_LOG_FUNC;
|
||||||
|
|
|
@ -50,6 +50,7 @@ void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit);
|
||||||
int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,
|
int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,
|
||||||
alpm_list_t **list, alpm_list_t *remove, pmtrans_t *trans, alpm_list_t
|
alpm_list_t **list, alpm_list_t *remove, pmtrans_t *trans, alpm_list_t
|
||||||
**data);
|
**data);
|
||||||
|
int _alpm_dep_edge(pmpkg_t *pkg1, pmpkg_t *pkg2);
|
||||||
pmdepend_t *_alpm_splitdep(const char *depstring);
|
pmdepend_t *_alpm_splitdep(const char *depstring);
|
||||||
alpm_list_t *_alpm_find_dep_satisfiers(alpm_list_t *pkgs, pmdepend_t *dep);
|
alpm_list_t *_alpm_find_dep_satisfiers(alpm_list_t *pkgs, pmdepend_t *dep);
|
||||||
|
|
||||||
|
|
|
@ -540,7 +540,7 @@ unsigned short SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg)
|
||||||
*/
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(pmpkg_t *pkg)
|
alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(pmpkg_t *pkg)
|
||||||
{
|
{
|
||||||
const alpm_list_t *i, *j;
|
const alpm_list_t *i;
|
||||||
alpm_list_t *reqs = NULL;
|
alpm_list_t *reqs = NULL;
|
||||||
|
|
||||||
pmdb_t *localdb = alpm_option_get_localdb();
|
pmdb_t *localdb = alpm_option_get_localdb();
|
||||||
|
@ -549,17 +549,9 @@ alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(pmpkg_t *pkg)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pmpkg_t *cachepkg = i->data;
|
pmpkg_t *cachepkg = i->data;
|
||||||
|
if(_alpm_dep_edge(cachepkg, pkg)) {
|
||||||
const char *cachepkgname = alpm_pkg_get_name(cachepkg);
|
const char *cachepkgname = alpm_pkg_get_name(cachepkg);
|
||||||
|
|
||||||
for(j = alpm_pkg_get_depends(cachepkg); j; j = j->next) {
|
|
||||||
pmdepend_t *dep = j->data;
|
|
||||||
|
|
||||||
if(alpm_depcmp(pkg, dep)) {
|
|
||||||
_alpm_log(PM_LOG_DEBUG, "adding '%s' in requiredby field for '%s'\n",
|
|
||||||
cachepkgname, pkg->name);
|
|
||||||
reqs = alpm_list_add(reqs, strdup(cachepkgname));
|
reqs = alpm_list_add(reqs, strdup(cachepkgname));
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(reqs);
|
return(reqs);
|
||||||
|
|
Loading…
Add table
Reference in a new issue