projects/aports·blob v2.2.3 · refs

244 lines · 4.7 KiB

1#!/usr/bin/lua
2
3
4-- those should be read from some config file
5aportsdir = "~/aports"
6repos = { "main", "testing" }
7
8
9function split(str)
10 local t = {}
11 if (str == nil) then
12 return nil
13 end
14 for e in string.gmatch(str, "%S+") do
15 table.insert(t, e)
16 end
17 return t
18end
19
20function split_apkbuild(line)
21 local r = {}
22 local dir, pkgname, pkgver, pkgrel, depends, makedepends, subpackages, source = string.match(line, "([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*)")
23 r.dir = dir
24 r.pkgname = pkgname
25 r.pkgver = pkgver
26 r.pkgrel = pkgrel
27 r.depends = split(depends)
28 r.makedepends = split(makedepends)
29 r.subpackages = split(subpackages)
30 r.source = split(source)
31 return r
32end
33
34-- parse the APKBUILDs and return a list
35function parse_apkbuilds(dir, repos)
36 local i,v, p
37 local str=""
38 if repos == nil then
39 return
40 end
41 --expand repos
42 for i,v in ipairs(repos) do
43 str = str..dir.."/"..v.."/*/APKBUILD "
44 end
45
46 local p = io.popen([[
47 for i in ]]..str..[[; do
48 pkgname=
49 pkgver=
50 pkgrel=
51 depends=
52 makedepends=
53 subpackages=
54 source=
55 dir="${i%/APKBUILD}"
56 cd "$dir"
57 . ./APKBUILD
58 echo $dir\|$pkgname\|$pkgver\|$pkgrel\|$depends\|$makedepends\|$subpackages\|$source
59 done
60 ]])
61 return function()
62 local line = p:read("*line")
63 if line == nil then
64 p:close()
65 return nil
66 end
67 return split_apkbuild(line)
68 end
69end
70
71function target_packages(pkgdb, pkgname)
72 local i,v
73 local t = {}
74 for i,v in ipairs(pkgdb[pkgname]) do
75 table.insert(t, pkgname.."-"..v.pkgver.."-r"..v.pkgrel..".apk")
76 end
77 return t
78end
79
80function list_depends( pkg, pkgdb )
81 local dl = {}
82 local s
83 if pkg and not pkg.added then
84 pkg.added = true
85
86 if pkg.depends then
87 for i,v in ipairs(pkg.depends) do
88 --print("v = <"..v..">")
89 s = list_depends( pkgdb[v], pkgdb )
90 if #s > 0 then
91 dl[#dl + 1] = s
92 end
93 end
94 end
95 if pkg.makedepends then
96 for i,v in ipairs(pkg.makedepends) do
97 --print("v = {"..v.."}")
98 s = list_depends( pkgdb[v], pkgdb )
99 if #s > 0 then
100 dl[#dl + 1] = s
101 end
102 end
103 end
104 dl[#dl + 1] = pkg.pkgname
105 end
106
107 s = table.concat(dl," ")
108 --print("s = ["..s.."]")
109 return s
110end
111
112function init_apkdb(aportsdir, repos)
113 local pkgdb = {}
114 local revdeps = {}
115 local a
116
117 for a in parse_apkbuilds(aportsdir, repos) do
118 -- io.write(a.pkgname.." "..a.pkgver.."\t"..a.dir.."\n")
119 if pkgdb[a.pkgname] == nil then
120 pkgdb[a.pkgname] = {}
121 end
122 --table.insert(pkgdb[a.pkgname], a)
123 pkgdb[a.pkgname] = a
124 --print("pk "..a.pkgname.." is a "..type(a).." ("..pkgdb[a.pkgname].pkgname..")")
125 -- add subpackages to package db
126 local k,v
127 for k,v in ipairs(a.subpackages) do
128 if pkgdb[v] == nil then
129 pkgdb[v] = {}
130 end
131 --table.insert(pkgdb[v], a)
132 pkgdb[v] = a
133 end
134 -- add to reverse dependencies
135 for k,v in ipairs(a.makedepends) do
136 if revdeps[v] == nil then
137 revdeps[v] = {}
138 end
139 table.insert(revdeps[v], a)
140 end
141 end
142 return pkgdb, revdeps
143end
144
145-- PKGBUILD import
146function split_pkgbuild(line)
147 local r = {}
148 local pkgname, pkgver = string.match(line, "([^|]*)|([^|]*)")
149 r.pkgname = pkgname
150 r.pkgver = pkgver
151 return r
152end
153
154function parse_pkgbuilds(dir, repos)
155 local i,v, p
156 local str=""
157 if repos == nil then
158 return
159 end
160 --expand repos
161 for i,v in ipairs(repos) do
162 str = str..dir.."/"..v.."/*/PKGBUILD "
163 end
164
165 local p = io.popen([[/bin/bash -c '
166 for i in ]]..str..[[; do
167 pkgname=
168 pkgver=
169 source $i
170 echo $pkgname\|$pkgver
171 done
172 ' 2>/dev/null
173 ]])
174 return function()
175 local line = p:read("*line")
176 if line == nil then
177 p:close()
178 return nil
179 end
180 return split_pkgbuild(line)
181 end
182end
183
184function init_absdb(dir, repos)
185 local p
186 local db = {}
187 for p in parse_pkgbuilds(dir, repos) do
188 if db[p.pkgname] == nil then
189 db[p.pkgname] = {}
190 end
191 table.insert(db[p.pkgname], p.pkgver)
192 end
193 return db
194end
195
196
197-- Applets -----------------------
198applet = {}
199function applet.revdep(arg)
200 local pkg = arg[2]
201 if pkg == nil then
202 -- usage?
203 return nil
204 end
205 local apkdb, rev = init_apkdb(aportsdir, repos)
206 local _,p
207 for _,p in ipairs(rev[pkg] or {}) do
208 print(p.pkgname)
209 end
210end
211--absdb = init_absdb("/var/abs", { "core", "extra", "community" })
212
213function applet.deplist(arg)
214 local apkdb, rev = init_apkdb(arg[2],{ arg[3] })
215
216 local deplist = {}
217 local nm,pk
218 for nm,pk in pairs(apkdb) do
219 local dl
220 --print("pk "..nm.." is a "..type(pk).." ("..apkdb[nm].pkgname..")")
221 --deplist[#deplist + 1] = "***"
222 dl = list_depends(pk,apkdb)
223 -- print("deplist for "..nm..": "..deplist)
224 if #dl > 0 then
225 deplist[#deplist + 1] = dl
226 end
227 end
228 print(table.concat(deplist," "))
229end
230
231cmd = arg[1]
232
233if cmd == nil then
234 -- usage
235 io.stderr:write( "no command given\n" );
236 return
237end
238
239if type(applet[cmd]) == "function" then
240 applet[cmd](arg)
241else
242 io.stderr:write(cmd..": invalid applet\n")
243end
244