Merge pull request #1027 from AladW/build-asroot-example
[aurutils.git] / lib / aur-graph
blob108c097592320c728fd8c33f139f6475a6e62542
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 /^\tdepends/ {
52 if ((!length(DEPENDS) || DEPENDS == 1) && !in_split_pkg)
53 pkg_deps[pkgbase, ++dep_counts[pkgbase]] = $3 # versioned
56 /^\tmakedepends/ {
57 if ((!length(MAKEDEPENDS) || MAKEDEPENDS == 1) && !in_split_pkg)
58 pkg_deps[pkgbase, ++dep_counts[pkgbase]] = $3
61 /^\tcheckdepends/ {
62 if ((!length(CHECKDEPENDS) || CHECKDEPENDS == 1) && !in_split_pkg)
63 pkg_deps[pkgbase, ++dep_counts[pkgbase]] = $3
66 /^\toptdepends/ {
67 if (OPTDEPENDS == 1 && !in_split_pkg) {
68 pkg_deps[pkgbase, ++dep_counts[pkgbase]] = $3
72 /^$/ {
73 in_split_pkg = 1
76 /pkgname/ {
77 pkg_map[$3] = pkgbase # node
78 ver_map[$3] = pkgver # weight
81 /^\tprovides/ {
82 split($3, prov, "=")
84 # if provider is unversioned, use pkgver
85 if ("2" in prov)
86 ver_map[prov[1]] = prov[2]
87 else
88 ver_map[prov[1]] = pkgver
90 # append node
91 pkg_map[prov[1]] = pkgbase
94 END {
95 _vercmp_exit = 0
97 for (pkgbase in dep_counts) {
98 # add a loop to isolated nodes (#402)
99 printf("%s\t%s\n", pkgbase, pkgbase)
101 for (dep = 1; dep <= dep_counts[pkgbase]; dep++) {
102 dep_op = "-" # unversioned / no comparison
104 # valid operators (important: <= before <)
105 split("<=|>=|<|=|>", cmp, "|")
107 # split: fourth argument is gawk extension
108 for (i in cmp) {
109 split(pkg_deps[pkgbase, dep], dep_split, cmp[i])
111 if ("2" in dep_split) {
112 dep_op = cmp[i]
113 break
117 if ("1" in dep_split)
118 dep_pkgname = dep_split[1]
119 else
120 exit 2
122 if ("2" in dep_split)
123 dep_pkgver = dep_split[2]
124 else
125 dep_pkgver = "-"
127 # only print dependency if it was encountered before
128 if (dep_pkgname in pkg_map == 0)
129 continue
131 # run vercmp with provider and versioned dependency
132 if (get_vercmp(ver_map[dep_pkgname], dep_pkgver, dep_op)) {
133 printf("%s\t%s\n", pkgbase, pkg_map[dep_pkgname])
134 } else {
135 printf("invalid node: %s %s (required: %s%s)\n",
136 dep_pkgname, ver_map[dep_pkgname], dep_op, dep_pkgver) > "/dev/stderr"
137 close("/dev/stderr")
139 # delay mismatches to loop end
140 _vercmp_exit = 1
145 if (_vercmp_exit)
146 exit _vercmp_exit