[pacman-dev] [patch] IV/B better version of IV/A
Nagy Gabor
ngaba at petra.hos.u-szeged.hu
Sun Apr 22 15:41:55 EDT 2007
Hi!
Sorry for flooding the channel; I hope you can use something from my
patches. This is not a cosmetic patch only, because static variable is
not good if sortbydeps called multiple times, so I removed that ugly
part from IV/A. And this version doesn't stop sorting in case of dep
circle just notices us (it continues sorting to get the "best"
possible result (but stops always)). You can ignore IV/A, but apply IV
first.
---patch-IV/B-----------
diff -Naur pacman-lib/lib/libalpm/deps.c pacman-lib.new/lib/libalpm/deps.c
--- pacman-lib/lib/libalpm/deps.c 2007-04-22 19:46:40.000000000 +0200
+++ pacman-lib.new/lib/libalpm/deps.c 2007-04-22 21:29:05.000000000 +0200
@@ -67,17 +67,6 @@
free(graph);
}
-pmgraph_t *_alpm_graph_finduntouched(alpm_list_t *vertices)
-{
- alpm_list_t *i;
- pmgraph_t *found = NULL;
- for (i = vertices; i && !found; i = i->next) {
- pmgraph_t *vertex = i->data;
- if (vertex->state == 0) found = vertex;
- }
- return(found);
-}
-
pmdepmissing_t *_alpm_depmiss_new(const char *target, pmdeptype_t type,
pmdepmod_t depmod, const char *depname,
const char *depversion)
@@ -142,6 +131,7 @@
alpm_list_t *newtargs = NULL;
alpm_list_t *i, *j, *k;
alpm_list_t *vertices = NULL;
+ alpm_list_t *vptr;
pmgraph_t *vertex;
ALPM_LOG_FUNC;
@@ -158,6 +148,7 @@
vertex->data = (void *)i->data;
vertices = alpm_list_add(vertices, vertex);
}
+ vptr = vertices;
/* We compute the edges */
for(i = vertices; i; i = i->next) {
@@ -179,7 +170,7 @@
}
vertex = vertices->data;
- while(vertex) {
+ while(vptr) {
vertex->state = -1; // we touched this vertex
int found = 0;
while(vertex->sonptr && !found) {
@@ -192,21 +183,21 @@
}
else if(nextson->state == -1) {
_alpm_log(PM_LOG_WARNING, _("dependency cycle detected\n"));
- /* We add remaining targets */
- for(i = targets; i; i = i->next)
- if(!_alpm_pkg_find(alpm_pkg_get_name(i->data), newtargs))
- newtargs = alpm_list_add(newtargs, i->data);
- goto cleanup;
}
}
if(!found) {
newtargs = alpm_list_add(newtargs, vertex->data);
vertex->state = 1; //we leave this vertex
vertex = vertex->father;
- if(!vertex) vertex=_alpm_graph_finduntouched(vertices);
+ if(!vertex) {
+ while(vptr) {
+ vertex = vptr->data;
+ vptr = vptr->next;
+ if (vertex->state == 0) break;
+ }
+ }
}
}
-cleanup:
_alpm_log(PM_LOG_DEBUG, _("sorting dependencies finished"));
diff -Naur pacman-lib/lib/libalpm/deps.h pacman-lib.new/lib/libalpm/deps.h
--- pacman-lib/lib/libalpm/deps.h 2007-04-22 19:21:24.000000000 +0200
+++ pacman-lib.new/lib/libalpm/deps.h 2007-04-22 21:27:15.000000000 +0200
@@ -53,7 +53,6 @@
pmgraph_t *_alpm_graph_new(void);
void _alpm_graph_free(pmgraph_t *graph);
-pmgraph_t *_alpm_graph_finduntouched(alpm_list_t *vertices);
pmdepmissing_t *_alpm_depmiss_new(const char *target, pmdeptype_t type,
pmdepmod_t depmod, const char *depname,
--------------------------
bye, ngaba
More information about the pacman-dev
mailing list