OSDN Git Service

Corrected so as not to show opening messages of portsreinstall launched by portsreins...
[portsreinstall/current.git] / libexec / order_dependencies.awk
1 #!/usr/bin/env awk
2 # ==============================================================================
3 # portsreinstall library script
4 # - Order the dependency of all ports to install/reinstall -
5 # Copyright (C) 2018 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
6 # This software is distributed under the 2-Clause BSD License.
7 # ==============================================================================
8
9 BEGIN {
10         it = 0;
11         i = 0;
12 }
13 {
14         if (NF == 0)
15         {
16                 i = 0;
17         }
18         else
19         {
20                 if (i == 0)
21                 {
22                         target = $0;
23                         sub (/\/requirements.all\.full$/, "", target);
24                         sub (/^\.\//, "", target);
25                         srcikey[it] = target;
26                         srckeyi[target] = it;
27                         it++;
28                 }
29                 else
30                 {
31                         src[it-1,i-1] = $0;
32                         srcimax[it-1] = srcsize[it-1] = i;
33                 }
34                 i++;
35         }
36 }
37 END {
38         ntargets = it;
39         norder = 0;
40         order_str = "";
41         icycle = 0;
42         lf_order_str = "";
43         while (1)
44         {
45                 is_operated = 0;
46                 for (it = 0; it < ntargets; it++)
47                 {
48                         if (!(it in srcikey)) continue;
49                         if (srcsize[it] > 0) continue;
50                         is_operated = 1;
51                         target = srcikey[it];
52                         delete srcikey[it];
53                         order[norder++] = target;
54                         order_str = order_str lf_order_str;
55                         order_str = sprintf ("%s%s", order_str, target);
56                         lf_order_str = "\n";
57                         for (jt = 0; jt < ntargets; jt++)
58                         {
59                                 for (j = 0; j < srcimax[jt]; j++)
60                                 {
61                                         if ((jt,j) in src && src[jt,j] == target)
62                                         {
63                                                 delete src[jt,j];
64                                                 srcsize[jt]--;
65                                                 break;
66                                         }
67                                 }
68                         }
69                 }
70                 if (is_operated == 0) break;
71                 icycle++;
72         }
73         reinst_order_list = sprintf ("%s%s", ENVIRON["DBDIR"], "/reinst_order.list.tmp");
74         print order_str > reinst_order_list;
75         unsatisfied = "";
76         for (it = 0; it < ntargets; it++)
77         {
78                 if (srcsize[it] == 0) continue;
79                 reqs = "";
80                 sp_reqs = "";
81                 for (i = 0; i < srcimax[it]; i++)
82                 {
83                         if ((it,i) in src)
84                         {
85                                 reqs = reqs sp_reqs src[it,i];
86                                 sp_reqs = ", ";
87                         }
88                 }
89                 unsatisfied = sprintf ("%s%s [%d] (%s)\n", unsatisfied, srcikey[it], srcsize[it], reqs);
90         }
91         if (unsatisfied != "")
92         {
93                 unsatisfied_list = sprintf ("%s%s", ENVIRON["DBDIR"], "/unsatisfied.list");
94                 print unsatisfied > unsatisfied_list;
95                 exit 1;
96         }
97 }