mirror of
https://github.com/pygos/pkg-utils.git
synced 2024-11-22 12:59:46 +01:00
Cleanup: split sort_by_dependencies function up
Signed-off-by: David Oberhollenzer <goliath@infraroot.at>
This commit is contained in:
parent
f2627b8933
commit
98b655f133
1 changed files with 57 additions and 48 deletions
|
@ -1,48 +1,15 @@
|
||||||
#include "install.h"
|
#include "install.h"
|
||||||
|
|
||||||
int sort_by_dependencies(struct pkg_dep_list *list)
|
static void remove_dependency(struct pkg_dep_list *list,
|
||||||
|
struct pkg_dep_node *pkg)
|
||||||
{
|
{
|
||||||
struct pkg_dep_node *it, *prev, *pkg;
|
struct pkg_dep_node *it;
|
||||||
struct pkg_dep_list result;
|
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
result.head = NULL;
|
|
||||||
result.tail = NULL;
|
|
||||||
|
|
||||||
while (list->head != NULL) {
|
|
||||||
/* find node with no outgoing edges */
|
|
||||||
prev = NULL;
|
|
||||||
it = list->head;
|
|
||||||
|
|
||||||
while (it != NULL && it->num_deps != 0) {
|
|
||||||
prev = it;
|
|
||||||
it = it->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (it == NULL) {
|
|
||||||
fputs("cycle detected in dependency graph\n", stderr);
|
|
||||||
pkg_list_cleanup(&result);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* remove from graph */
|
|
||||||
if (prev == NULL) {
|
|
||||||
list->head = it->next;
|
|
||||||
} else {
|
|
||||||
prev->next = it->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (it == list->tail)
|
|
||||||
list->tail = prev;
|
|
||||||
|
|
||||||
/* remove edges pointing to the package */
|
|
||||||
pkg = it;
|
|
||||||
|
|
||||||
for (it = list->head; it != NULL; it = it->next) {
|
for (it = list->head; it != NULL; it = it->next) {
|
||||||
for (i = 0; i < it->num_deps; ++i) {
|
for (i = 0; i < it->num_deps; ++i) {
|
||||||
if (it->deps[i] == pkg) {
|
if (it->deps[i] == pkg) {
|
||||||
it->deps[i] =
|
it->deps[i] = it->deps[it->num_deps - 1];
|
||||||
it->deps[it->num_deps - 1];
|
|
||||||
it->num_deps -= 1;
|
it->num_deps -= 1;
|
||||||
--i;
|
--i;
|
||||||
}
|
}
|
||||||
|
@ -53,17 +20,59 @@ int sort_by_dependencies(struct pkg_dep_list *list)
|
||||||
it->deps = NULL;
|
it->deps = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* append to list */
|
static void append(struct pkg_dep_list *out, struct pkg_dep_node *pkg)
|
||||||
if (result.tail == NULL) {
|
{
|
||||||
result.head = result.tail = pkg;
|
if (out->tail == NULL) {
|
||||||
|
out->head = out->tail = pkg;
|
||||||
} else {
|
} else {
|
||||||
result.tail->next = pkg;
|
out->tail->next = pkg;
|
||||||
result.tail = pkg;
|
out->tail = pkg;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct pkg_dep_node *remove_no_deps(struct pkg_dep_list *list)
|
||||||
|
{
|
||||||
|
struct pkg_dep_node *it = list->head, *prev = NULL;
|
||||||
|
|
||||||
|
while (it != NULL && it->num_deps != 0) {
|
||||||
|
prev = it;
|
||||||
|
it = it->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
list->head = result.head;
|
if (it != NULL) {
|
||||||
list->tail = result.tail;
|
if (prev == NULL) {
|
||||||
|
list->head = it->next;
|
||||||
|
} else {
|
||||||
|
prev->next = it->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (it == list->tail)
|
||||||
|
list->tail = prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
return it;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sort_by_dependencies(struct pkg_dep_list *list)
|
||||||
|
{
|
||||||
|
struct pkg_dep_list result = { NULL, NULL };
|
||||||
|
struct pkg_dep_node *pkg;
|
||||||
|
|
||||||
|
while (list->head != NULL) {
|
||||||
|
pkg = remove_no_deps(list);
|
||||||
|
|
||||||
|
if (pkg == NULL) {
|
||||||
|
fputs("cycle detected in dependency graph\n", stderr);
|
||||||
|
pkg_list_cleanup(&result);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_dependency(list, pkg);
|
||||||
|
append(&result, pkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
*list = result;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue