diff options
Diffstat (limited to 'aport.lua')
-rwxr-xr-x | aport.lua | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/aport.lua b/aport.lua new file mode 100755 index 0000000000..71113475af --- /dev/null +++ b/aport.lua @@ -0,0 +1,244 @@ +#!/usr/bin/lua + + +-- those should be read from some config file +aportsdir = "~/aports" +repos = { "main", "testing" } + + +function split(str) + local t = {} + if (str == nil) then + return nil + end + for e in string.gmatch(str, "%S+") do + table.insert(t, e) + end + return t +end + +function split_apkbuild(line) + local r = {} + local dir, pkgname, pkgver, pkgrel, depends, makedepends, subpackages, source = string.match(line, "([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*)|([^|]*)") + r.dir = dir + r.pkgname = pkgname + r.pkgver = pkgver + r.pkgrel = pkgrel + r.depends = split(depends) + r.makedepends = split(makedepends) + r.subpackages = split(subpackages) + r.source = split(source) + return r +end + +-- parse the APKBUILDs and return a list +function parse_apkbuilds(dir, repos) + local i,v, p + local str="" + if repos == nil then + return + end + --expand repos + for i,v in ipairs(repos) do + str = str..dir.."/"..v.."/*/APKBUILD " + end + + local p = io.popen([[ + for i in ]]..str..[[; do + pkgname= + pkgver= + pkgrel= + depends= + makedepends= + subpackages= + source= + dir="${i%/APKBUILD}" + cd "$dir" + . ./APKBUILD + echo $dir\|$pkgname\|$pkgver\|$pkgrel\|$depends\|$makedepends\|$subpackages\|$source + done + ]]) + return function() + local line = p:read("*line") + if line == nil then + p:close() + return nil + end + return split_apkbuild(line) + end +end + +function target_packages(pkgdb, pkgname) + local i,v + local t = {} + for i,v in ipairs(pkgdb[pkgname]) do + table.insert(t, pkgname.."-"..v.pkgver.."-r"..v.pkgrel..".apk") + end + return t +end + +function list_depends( pkg, pkgdb ) + local dl = {} + local s + if pkg and not pkg.added then + pkg.added = true + + if pkg.depends then + for i,v in ipairs(pkg.depends) do + --print("v = <"..v..">") + s = list_depends( pkgdb[v], pkgdb ) + if #s > 0 then + dl[#dl + 1] = s + end + end + end + if pkg.makedepends then + for i,v in ipairs(pkg.makedepends) do + --print("v = {"..v.."}") + s = list_depends( pkgdb[v], pkgdb ) + if #s > 0 then + dl[#dl + 1] = s + end + end + end + dl[#dl + 1] = pkg.pkgname + end + + s = table.concat(dl," ") + --print("s = ["..s.."]") + return s +end + +function init_apkdb(aportsdir, repos) + local pkgdb = {} + local revdeps = {} + local a + + for a in parse_apkbuilds(aportsdir, repos) do + -- io.write(a.pkgname.." "..a.pkgver.."\t"..a.dir.."\n") + if pkgdb[a.pkgname] == nil then + pkgdb[a.pkgname] = {} + end + --table.insert(pkgdb[a.pkgname], a) + pkgdb[a.pkgname] = a + --print("pk "..a.pkgname.." is a "..type(a).." ("..pkgdb[a.pkgname].pkgname..")") + -- add subpackages to package db + local k,v + for k,v in ipairs(a.subpackages) do + if pkgdb[v] == nil then + pkgdb[v] = {} + end + --table.insert(pkgdb[v], a) + pkgdb[v] = a + end + -- add to reverse dependencies + for k,v in ipairs(a.makedepends) do + if revdeps[v] == nil then + revdeps[v] = {} + end + table.insert(revdeps[v], a) + end + end + return pkgdb, revdeps +end + +-- PKGBUILD import +function split_pkgbuild(line) + local r = {} + local pkgname, pkgver = string.match(line, "([^|]*)|([^|]*)") + r.pkgname = pkgname + r.pkgver = pkgver + return r +end + +function parse_pkgbuilds(dir, repos) + local i,v, p + local str="" + if repos == nil then + return + end + --expand repos + for i,v in ipairs(repos) do + str = str..dir.."/"..v.."/*/PKGBUILD " + end + + local p = io.popen([[/bin/bash -c ' + for i in ]]..str..[[; do + pkgname= + pkgver= + source $i + echo $pkgname\|$pkgver + done + ' 2>/dev/null + ]]) + return function() + local line = p:read("*line") + if line == nil then + p:close() + return nil + end + return split_pkgbuild(line) + end +end + +function init_absdb(dir, repos) + local p + local db = {} + for p in parse_pkgbuilds(dir, repos) do + if db[p.pkgname] == nil then + db[p.pkgname] = {} + end + table.insert(db[p.pkgname], p.pkgver) + end + return db +end + + +-- Applets ----------------------- +applet = {} +function applet.revdep(arg) + local pkg = arg[2] + if pkg == nil then + -- usage? + return nil + end + local apkdb, rev = init_apkdb(aportsdir, repos) + local _,p + for _,p in ipairs(rev[pkg] or {}) do + print(p.pkgname) + end +end +--absdb = init_absdb("/var/abs", { "core", "extra", "community" }) + +function applet.deplist(arg) + local apkdb, rev = init_apkdb(arg[2],{ arg[3] }) + + local deplist = {} + local nm,pk + for nm,pk in pairs(apkdb) do + local dl + --print("pk "..nm.." is a "..type(pk).." ("..apkdb[nm].pkgname..")") + --deplist[#deplist + 1] = "***" + dl = list_depends(pk,apkdb) + -- print("deplist for "..nm..": "..deplist) + if #dl > 0 then + deplist[#deplist + 1] = dl + end + end + print(table.concat(deplist," ")) +end + +cmd = arg[1] + +if cmd == nil then + -- usage + io.stderr:write( "no command given\n" ); + return +end + +if type(applet[cmd]) == "function" then + applet[cmd](arg) +else + io.stderr:write(cmd..": invalid applet\n") +end + |