/* Convert a list of alpm_pkg_t * to a graph structure, * with a edge for each dependency. * Returns a list of vertices (one vertex = one package) * (used by alpm_sortbydeps) */ static alpm_list_t *dep_graph_init(alpm_handle_t *handle, alpm_list_t *targets, alpm_list_t *ignore) { alpm_list_t *i, *j; alpm_list_t *vertices = NULL; alpm_list_t *localpkgs = alpm_list_diff( alpm_db_get_pkgcache(handle->db_local), ignore, ptr_cmp); /* We create the vertices */ for(i = targets; i; i = i->next) { alpm_graph_t *vertex = _alpm_graph_new(); vertex->data = (void *)i->data; vertices = alpm_list_add(vertices, vertex); } /* We compute the edges */ for(i = vertices; i; i = i->next) { alpm_graph_t *vertex_i = i->data; alpm_pkg_t *p_i = vertex_i->data; /* TODO this should be somehow combined with alpm_checkdeps */ for(j = vertices; j; j = j->next) { alpm_graph_t *vertex_j = j->data; alpm_pkg_t *p_j = vertex_j->data; if(_alpm_pkg_depends_on(p_i, p_j)) { vertex_i->children = alpm_list_add(vertex_i->children, vertex_j); } } /* lazily add local packages to the dep graph so they don't * get resolved unnecessarily */ j = localpkgs; while(j) { alpm_list_t *next = j->next; if(_alpm_pkg_depends_on(p_i, j->data)) { alpm_graph_t *vertex_j = _alpm_graph_new(); vertex_j->data = (void *)j->data; vertices = alpm_list_add(vertices, vertex_j); vertex_i->children = alpm_list_add(vertex_i->children, vertex_j); localpkgs = alpm_list_remove_item(localpkgs, j); free(j); } j = next; } vertex_i->childptr = vertex_i->children; } alpm_list_free(localpkgs); return vertices; }
/* Convert a list of pmpkg_t * to a graph structure, * with a edge for each dependency. * Returns a list of vertices (one vertex = one package) * (used by alpm_sortbydeps) */ static alpm_list_t *dep_graph_init(alpm_list_t *targets) { alpm_list_t *i, *j; alpm_list_t *vertices = NULL; /* We create the vertices */ for(i = targets; i; i = i->next) { pmgraph_t *vertex = _alpm_graph_new(); vertex->data = (void *)i->data; vertices = alpm_list_add(vertices, vertex); } /* We compute the edges */ for(i = vertices; i; i = i->next) { pmgraph_t *vertex_i = i->data; pmpkg_t *p_i = vertex_i->data; /* TODO this should be somehow combined with alpm_checkdeps */ for(j = vertices; j; j = j->next) { pmgraph_t *vertex_j = j->data; pmpkg_t *p_j = vertex_j->data; if(_alpm_dep_edge(p_i, p_j)) { vertex_i->children = alpm_list_add(vertex_i->children, vertex_j); } } vertex_i->childptr = vertex_i->children; } return vertices; }
static alpm_list_t *graph_init(alpm_list_t *deltas, int reverse) { alpm_list_t *i, *j; alpm_list_t *vertices = NULL; /* create the vertices */ for(i = deltas; i; i = i->next) { alpm_graph_t *v = _alpm_graph_new(); if(!v) { alpm_list_free(vertices); return NULL; } alpm_delta_t *vdelta = i->data; vdelta->download_size = vdelta->delta_size; v->weight = LONG_MAX; v->data = vdelta; vertices = alpm_list_add(vertices, v); } /* compute the edges */ for(i = vertices; i; i = i->next) { alpm_graph_t *v_i = i->data; alpm_delta_t *d_i = v_i->data; /* loop a second time so we make all possible comparisons */ for(j = vertices; j; j = j->next) { alpm_graph_t *v_j = j->data; alpm_delta_t *d_j = v_j->data; /* We want to create a delta tree like the following: * 1_to_2 * | * 1_to_3 2_to_3 * \ / * 3_to_4 * If J 'from' is equal to I 'to', then J is a child of I. * */ if((!reverse && strcmp(d_j->from, d_i->to) == 0) || (reverse && strcmp(d_j->to, d_i->from) == 0)) { v_i->children = alpm_list_add(v_i->children, v_j); } } v_i->childptr = v_i->children; } return vertices; }