]>
Commit | Line | Data |
---|---|---|
95288a9a JB |
1 | Index: pkgset-order.c |
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 | |
8 | @@ -36,6 +36,7 @@ | |
9 | static void mapfn_clean_pkg_color(struct pkg *pkg) | |
10 | { | |
11 | pkg_set_color(pkg, PKG_COLOR_WHITE); | |
12 | + pkg_clr_prereqed(pkg); | |
13 | } | |
14 | ||
15 | /* | |
16 | @@ -45,11 +46,13 @@ | |
17 | tn_array *ordered_pkgs; | |
18 | tn_array *stack; | |
19 | int nerrors; | |
20 | + int prereq_only; | |
21 | }; | |
22 | ||
23 | ||
24 | static | |
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, | |
27 | + int deep) | |
28 | { | |
29 | int i, last_stack_i = -1; | |
30 | ||
31 | @@ -68,7 +71,7 @@ | |
32 | if (verbose > 2) { | |
33 | msg(4, "_\n"); | |
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++) { | |
37 | struct reqpkg *rp; | |
38 | ||
39 | rp = n_array_nth(pkg->reqpkgs, i); | |
40 | @@ -102,7 +105,9 @@ | |
41 | pkg_set_prereqed(rp->pkg); | |
42 | else | |
43 | pkg_clr_prereqed(rp->pkg); | |
44 | - visit_install_order(vs, rp->pkg, deep); | |
45 | + | |
46 | + if (!vs->prereq_only || (rp->flags & REQPKG_PREREQ)) | |
47 | + visit_install_order(vs, rp->pkg, deep); | |
48 | ||
49 | } else if (pkg_is_color(rp->pkg, PKG_COLOR_BLACK)) { | |
50 | msg(4, "_\n"); | |
51 | @@ -178,10 +183,11 @@ | |
52 | } | |
53 | } | |
54 | msg(4, "_\n"); | |
55 | - | |
56 | + | |
57 | l_end: | |
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++) { | |
64 | @@ -192,9 +198,7 @@ | |
65 | return 0; | |
66 | } | |
67 | ||
68 | - | |
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) | |
72 | { | |
73 | struct pkg *pkg; | |
74 | struct visit_install_order_s vs; | |
75 | @@ -204,15 +208,14 @@ | |
76 | (tn_fn_free)pkg_free, NULL); | |
77 | vs.nerrors = 0; | |
78 | vs.stack = n_array_new(128, NULL, NULL); | |
79 | + vs.prereq_only = prereq_only; | |
80 | ||
81 | n_array_map(pkgs, (tn_fn_map1)mapfn_clean_pkg_color); | |
82 | - n_array_isort_ex(pkgs, (tn_fn_cmp)pkg_cmp_pri); | |
83 | - | |
84 | + | |
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); | |
92 | } | |
93 | } | |
94 | @@ -222,8 +225,30 @@ | |
95 | n_assert(*ordered_pkgs == NULL); | |
96 | n_array_free(vs.stack); | |
97 | *ordered_pkgs = vs.ordered_pkgs; | |
98 | - n_array_isort(pkgs); | |
99 | return vs.nerrors; | |
100 | +} | |
101 | + | |
102 | + | |
103 | +/* RET: number of detected loops */ | |
104 | +int packages_order(tn_array *pkgs, tn_array **ordered_pkgs) | |
105 | +{ | |
106 | + tn_array *ordered = NULL; | |
107 | + int nloops, verbose_; | |
108 | + | |
109 | + n_array_isort_ex(pkgs, (tn_fn_cmp)pkg_cmp_pri); | |
110 | + | |
111 | + verbose_ = verbose; | |
112 | + verbose = -10; | |
113 | + do_order(pkgs, &ordered, 0); | |
114 | + | |
115 | + verbose = verbose_; | |
116 | + *ordered_pkgs = NULL; | |
117 | + nloops = do_order(ordered, ordered_pkgs, 1); | |
118 | + | |
119 | + n_array_free(ordered); | |
120 | + n_array_isort(pkgs); | |
121 | + | |
122 | + return nloops; | |
123 | } | |
124 | ||
125 | int pkgset_order(struct pkgset *ps) |