2 ===================================================================
3 RCS file: /cvsroot/installer/poldek/pkgset-order.c,v
4 retrieving revision 1.16
5 diff -u -r1.16 pkgset-order.c
6 --- pkgset-order.c 24 Oct 2002 16:41:04 -0000 1.16
7 +++ pkgset-order.c 2 Jul 2004 17:07:02 -0000
9 static void mapfn_clean_pkg_color(struct pkg *pkg)
11 pkg_set_color(pkg, PKG_COLOR_WHITE);
12 + pkg_clr_prereqed(pkg);
17 tn_array *ordered_pkgs;
25 -int visit_install_order(struct visit_install_order_s *vs, struct pkg *pkg, int deep)
26 +int visit_install_order(struct visit_install_order_s *vs, struct pkg *pkg,
29 int i, last_stack_i = -1;
34 msg_i(4, deep, "_ visit %s -> (", pkg->name);
35 - for (i=0; i<n_array_size(pkg->reqpkgs); i++) {
36 + for (i=0; i < n_array_size(pkg->reqpkgs); i++) {
39 rp = n_array_nth(pkg->reqpkgs, i);
41 pkg_set_prereqed(rp->pkg);
43 pkg_clr_prereqed(rp->pkg);
44 - visit_install_order(vs, rp->pkg, deep);
46 + if (!vs->prereq_only || (rp->flags & REQPKG_PREREQ))
47 + visit_install_order(vs, rp->pkg, deep);
49 } else if (pkg_is_color(rp->pkg, PKG_COLOR_BLACK)) {
58 pkg_set_color(pkg, PKG_COLOR_BLACK);
59 pkg_clr_prereqed(pkg);
60 + msgn(4, "push %s", pkg_snprintf_s(pkg));
61 n_array_push(vs->ordered_pkgs, pkg_link(pkg));
62 if (last_stack_i != -1)
63 for (i=last_stack_i; i < n_array_size(vs->stack); i++) {
69 -/* RET: number of detected loops */
70 -int packages_order(tn_array *pkgs, tn_array **ordered_pkgs)
71 +static int do_order(tn_array *pkgs, tn_array **ordered_pkgs, int prereq_only)
74 struct visit_install_order_s vs;
76 (tn_fn_free)pkg_free, NULL);
78 vs.stack = n_array_new(128, NULL, NULL);
79 + vs.prereq_only = prereq_only;
81 n_array_map(pkgs, (tn_fn_map1)mapfn_clean_pkg_color);
82 - n_array_isort_ex(pkgs, (tn_fn_cmp)pkg_cmp_pri);
85 for (i=0; i<n_array_size(pkgs); i++) {
86 pkg = n_array_nth(pkgs, i);
87 - //printf("V %d %s\n", i, pkg_snprintf_s(pkg));
88 if (pkg_is_color(pkg, PKG_COLOR_WHITE)) {
89 - visit_install_order(&vs, pkg, 1);
90 + visit_install_order(&vs, pkg, 1);
91 n_array_clean(vs.stack);
95 n_assert(*ordered_pkgs == NULL);
96 n_array_free(vs.stack);
97 *ordered_pkgs = vs.ordered_pkgs;
98 - n_array_isort(pkgs);
103 +/* RET: number of detected loops */
104 +int packages_order(tn_array *pkgs, tn_array **ordered_pkgs)
106 + tn_array *ordered = NULL;
107 + int nloops, verbose_;
109 + n_array_isort_ex(pkgs, (tn_fn_cmp)pkg_cmp_pri);
111 + verbose_ = verbose;
113 + do_order(pkgs, &ordered, 0);
115 + verbose = verbose_;
116 + *ordered_pkgs = NULL;
117 + nloops = do_order(ordered, ordered_pkgs, 1);
119 + n_array_free(ordered);
120 + n_array_isort(pkgs);
125 int pkgset_order(struct pkgset *ps)