ap: initial implementation

ap is a helper script to parse APKBUILD and calculate build time
dependencies.
This commit is contained in:
Natanael Copa 2010-12-13 14:14:06 +00:00
parent a111620bc8
commit ce0e95607d
3 changed files with 259 additions and 2 deletions

View File

@ -7,8 +7,11 @@ sysconfdir ?= /etc
datadir ?= $(prefix)/share/$(PACKAGE)
abuildrepo ?= ~/.cache/apks
LUA_VERSION = 5.1
LUA_SHAREDIR ?= $(prefix)/share/lua/$(LUA_VERSION)/
SCRIPTS := abuild devbuild buildrepo abuild-keygen \
abuild-sign newapkbuild abump
abuild-sign newapkbuild abump ap
USR_BIN_FILES := $(SCRIPTS) abuild-tar
SAMPLES := sample.APKBUILD sample.initd sample.confd \
sample.pre-install sample.post-install
@ -65,7 +68,7 @@ help:
@echo "usage: make install [ DESTDIR=<path> ]"
@echo " make dist"
install: $(USR_BIN_FILES) $(SAMPLES) abuild.conf functions.sh
install: $(USR_BIN_FILES) $(SAMPLES) abuild.conf functions.sh aports.lua
mkdir -p $(DESTDIR)/$(prefix)/bin $(DESTDIR)/$(sysconfdir) \
$(DESTDIR)/$(datadir)
for i in $(USR_BIN_FILES); do\
@ -76,6 +79,8 @@ install: $(USR_BIN_FILES) $(SAMPLES) abuild.conf functions.sh
fi
cp $(SAMPLES) $(DESTDIR)/$(prefix)/share/abuild
cp functions.sh $(DESTDIR)/$(datadir)/
mkdir -p $(DESTDIR)$(LUA_SHAREDIR)
cp aports.lua $(DESTDIR)$(LUA_SHAREDIR)/
dist: $(P).tar.bz2

147
ap.in Executable file
View File

@ -0,0 +1,147 @@
#!/usr/bin/lua
require("aports")
-- subcommands -----------------------
subcmd = {}
subcmd.revdep = {
desc = "Print reverse dependencies",
usage = "PKG...",
run = function(opts)
local i
local apkdb, rev = aports.init_apkdb(repodirs)
for i = 2, #opts do
local pkg = opts[i]
local _,p
for _,p in ipairs(rev[pkg] or {}) do
print(p.pkgname)
end
end
end
}
subcmd.list = {
desc = "Print all packages built from aports tree",
usage = "",
run = function()
local apkdb = aports.init_apkdb(repodirs)
local k,v
for k,v in pairs(apkdb) do
print(k)
end
end
}
subcmd.recursdeps = {
desc = "Recursively print all make dependencies for given packages",
usage = "PKG...",
run = function (opts)
local i
local visited = {}
local apkdb, rev = aports.init_apkdb(repodirs)
function recurs(pn)
if pn == nil or visited[pn] or apkdb[pn] == nil then
return
end
visited[pn] = true
local i,d, p
for i,p in ipairs(apkdb[pn]) do
local _, d
for _, d in ipairs(p.depends) do
recurs(d)
end
for _, d in ipairs(p.makedepends) do
recurs(d)
end
end
print(pn)
end
for i = 2, #opts do
recurs(opts[i])
end
end
}
subcmd.builddirs = {
desc = "Print the build dirs for given packages in build order",
usage = "PKG...",
run = function(opts)
local i, _
local visited = {}
local dir_visited = {}
local apkdb, rev = aports.init_apkdb(repodirs)
local to_print = {}
function recursdir(pn)
if pn == nil or visited[pn] or apkdb[pn] == nil then
return
end
visited[pn] = true
local i, p
for i,p in pairs(apkdb[pn]) do
if not dir_visited[p.dir] then
dir_visited[p.dir] = true
local _, d
for _, d in pairs(p.depends) do
recursdir(d)
end
for _, d in pairs(p.makedepends) do
recursdir(d)
end
if to_print[pn] then
print(p.dir)
end
end
end
end
for i = 2, #opts do
to_print[opts[i]] = true
end
for i = 2, #opts do
recursdir(opts[i])
end
end
}
function print_usage()
io.write("usage: ap SUBCOMMAND [options]\n\nSubcommands are:\n")
local k,v
for k in pairs(subcmd) do
print(" "..k)
end
end
-- those should be read from some config file
repodirs = {}
-- parse args
i = 1
opts = {}
help = false
while i <= #arg do
if arg[i] == "-d" then
i = i + 1
repodirs[#repodirs + 1] = arg[i]
elseif arg[i] == "-h" then
help = true
else
opts[#opts + 1] = arg[i]
end
i = i + 1
end
cmd = opts[1]
if cmd == nil then
print_usage()
-- usage
return
end
if subcmd[cmd] and type(subcmd[cmd].run) == "function" then
subcmd[cmd].run(opts)
else
io.stderr:write(cmd..": invalid subcommand\n")
end

105
aports.lua Executable file
View File

@ -0,0 +1,105 @@
module(..., package.seeall)
function split(str)
local t = {}
local e
if (str == nil) then
return nil
end
for e in string.gmatch(str, "%S+") do
t[#t + 1] = string.gsub(e, ":.*", "")
end
return t
end
function split_apkbuild(line)
local r = {}
local dir,pkgname, pkgver, pkgrel, arch, 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 an iterator
function parse_apkbuilds(dirs)
local i,v, p
local str=""
if dirs == nil then
return nil
end
--expand repos
for i,v in ipairs(dirs) do
str = str..v.."/*/APKBUILD "
end
local p = io.popen([[
for i in ]]..str..[[; do
pkgname=
pkgver=
pkgrel=
arch=
depends=
makedepends=
subpackages=
source=
dir="${i%/APKBUILD}"
cd "$dir"
. ./APKBUILD
echo $dir\|$pkgname\|$pkgver\|$pkgrel\|$arch\|$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 init_apkdb(repodirs)
local pkgdb = {}
local revdeps = {}
local a
for a in parse_apkbuilds(repodirs) 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)
-- add subpackages to package db
local k,v
for k,v in pairs(a.subpackages) do
if pkgdb[v] == nil then
pkgdb[v] = {}
end
table.insert(pkgdb[v], a)
end
-- add to reverse dependencies
for k,v in pairs(a.makedepends) do
if revdeps[v] == nil then
revdeps[v] = {}
end
table.insert(revdeps[v], a)
end
end
return pkgdb, revdeps
end