Merge pull request #1008 from AladW/fetch-rework-iv
[aurutils.git] / lib / aur-graph
blobbae00bc56764786d244f686684044f8c3eb09867
1 #!/bin/awk -f
2 # aur-graph - print package/dependency pairs
4 # < 0 : if ver1 < ver2
5 # = 0 : if ver1 == ver2
6 # > 0 : if ver1 > ver2
7 function get_vercmp(ver1, ver2, op) {
8 command = ("vercmp " ver1 " " ver2)
10 if (op == "-" || ver2 == "-") {
11 return "true" # dependency is unversioned
12 } else if (op == "=") {
13 return (ver1 == ver2) # common case
14 } else if (op == "<") {
15 command | getline
16 close(command)
17 return ($1 < 0)
18 } else if (op == ">") {
19 command | getline
20 close(command)
21 return ($1 > 0)
22 } else if (op == "<=") {
23 command | getline
24 close(command)
25 return ($1 <= 0)
26 } else if (op == ">=") {
27 command | getline
28 close(command)
29 return ($1 >= 0)
30 } else {
31 printf("invalid operation\n") > "/dev/stderr"
32 exit 1
36 /pkgbase/ {
37 in_split_pkg = 0
38 pkgbase = $3
39 pkgver = ""
41 # track both the pkgbases themselves and their number of deps
42 dep_counts[pkgbase] = 0
45 /^\tpkgver/ {
46 if (!in_split_pkg) {
47 pkgver = $3
51 /^\t(make|check)?depends/ {
52 if (!in_split_pkg) {
53 # POSIX array of arrays!
54 pkg_deps[pkgbase, ++dep_counts[pkgbase]] = $3 # versioned
58 /^$/ {
59 in_split_pkg = 1
62 /pkgname/ {
63 pkg_map[$3] = pkgbase # node
64 ver_map[$3] = pkgver # weight
67 /^\tprovides/ {
68 split($3, prov, "=")
70 # if provider is unversioned, use pkgver
71 if ("2" in prov)
72 ver_map[prov[1]] = prov[2]
73 else
74 ver_map[prov[1]] = pkgver
76 # append node
77 pkg_map[prov[1]] = pkgbase
80 END {
81 _vercmp_exit = 0
83 for (pkgbase in dep_counts) {
84 # add a loop to isolated nodes (#402)
85 printf("%s\t%s\n", pkgbase, pkgbase)
87 for (dep = 1; dep <= dep_counts[pkgbase]; dep++) {
88 dep_op = "-" # unversioned / no comparison
90 # valid operators (important: <= before <)
91 split("<=|>=|<|=|>", cmp, "|")
93 # split: fourth argument is gawk extension
94 for (i in cmp) {
95 split(pkg_deps[pkgbase, dep], dep_split, cmp[i])
97 if ("2" in dep_split) {
98 dep_op = cmp[i]
99 break
103 if ("1" in dep_split)
104 dep_pkgname = dep_split[1]
105 else
106 exit 2
108 if ("2" in dep_split)
109 dep_pkgver = dep_split[2]
110 else
111 dep_pkgver = "-"
113 # only print dependency if it was encountered before
114 if (dep_pkgname in pkg_map == 0)
115 continue
117 # run vercmp with provider and versioned dependency
118 if (get_vercmp(ver_map[dep_pkgname], dep_pkgver, dep_op)) {
119 printf("%s\t%s\n", pkgbase, pkg_map[dep_pkgname])
120 } else {
121 printf("invalid node: %s %s (required: %s%s)\n",
122 dep_pkgname, ver_map[dep_pkgname], dep_op, dep_pkgver) > "/dev/stderr"
123 close("/dev/stderr")
125 # delay mismatches to loop end
126 _vercmp_exit = 1
131 if (_vercmp_exit)
132 exit _vercmp_exit