summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rwxr-xr-xabuild.in105
-rwxr-xr-xap.in62
-rwxr-xr-xaports.lua42
4 files changed, 135 insertions, 76 deletions
diff --git a/Makefile b/Makefile
index 5f8ef96..1979acd 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
PACKAGE := abuild
-VERSION := 2.7.4
+VERSION := 2.8.2
prefix ?= /usr
sysconfdir ?= /etc
diff --git a/abuild.in b/abuild.in
index 1dc63fb..736826e 100755
--- a/abuild.in
+++ b/abuild.in
@@ -21,6 +21,7 @@ BUILD_BASE="build-base"
SUDO=${SUDO:-"sudo"}
FAKEROOT=${FAKEROOT:-"fakeroot"}
APK=${APK:-apk}
+apk_opt_wait="--wait 30"
# read config
ABUILD_CONF=${ABUILD_CONF:-"$sysconfdir/abuild.conf"}
@@ -82,7 +83,7 @@ set_xterm_title() {
cleanup() {
set_xterm_title ""
if [ -z "$install_after" ] && [ -n "$uninstall_after" ]; then
- $SUDO $APK del $uninstall_after
+ $SUDO $APK del $apk_opt_wait $uninstall_after
fi
}
@@ -167,6 +168,7 @@ md5check() {
fi
fetch || return 1
msg "Checking md5sums..."
+ cd "$srcdir" || return 1
IFS=$'\n'
endreturnval=0
originalparams=$@
@@ -358,7 +360,7 @@ cleanpkg() {
for i in $(listpkgnames); do
local p="${i%:*}-$pkgver-r$pkgrel"
rm -f "$PKGDEST/$p.apk" "$PKGDEST/$p.src.tar.gz" \
- "$abuildrepo"/$p.apk
+ "$abuildrepo"/$p.apk "$abuildrepo"/*/$p.apk
done
# remove given packages from index
}
@@ -369,9 +371,11 @@ cleanoldpkg() {
getpkgver || return 1
msg "Cleaning all packages except $pkgver-r$pkgrel..."
for i in $(listpkgnames); do
- for j in "$PKGDEST"/${i%:*}-[0-9]*.apk; do
- [ "$j" != "$PKGDEST/${i%:*}-$pkgver-r$pkgrel.apk" ] \
- && rm -f "$j"
+ local pn=${i%:*}
+ for j in "$PKGDEST"/$pn-[0-9]*.apk ; do
+ [ "$j" = "$PKGDEST/$pn-$pkgver-r$pkgrel.apk" ] \
+ && continue
+ rm -f "$j" "$abuildrepo"/*/${j##*/}
done
done
return 0
@@ -519,6 +523,7 @@ builddate = $builddate
packager = ${PACKAGER:-"Unknown"}
size = $size
arch = $parch
+origin = $pkgname
EOF
local i deps
deps="$depends"
@@ -768,41 +773,75 @@ create_apks() {
done
}
-update_abuildrepo() {
- if ! apk_up2date || [ -n "$force" ]; then
- sanitycheck && builddeps && clean && fetch && unpack \
- && prepare && mkusers && rootpkg || return 1
- fi
+# fish out the arch from an apk file
+apk_arch_prefix() {
+ apk index -q "$1" | tar -zxO | awk -F: '$1 == "A" { print $2 }'
+}
+apk_arch_prefix_compat() {
+ tar -zxOf "$1" .PKGINFO | awk -F" = " '$1 == "arch" { print $2 }'
+}
+
+clean_abuildrepo() {
local apk
- mkdir -p "$abuildrepo" || return 1
- cd "$abuildrepo"
+ cd "$abuildrepo" || return 1
+
+ # remove compat symlink
+ for d in "$abuildrepo/$CARCH" "$abuildrepo"/noarch; do
+ [ -L "$d" ] && rm "$d"
+ done
- # remove broken links
- for apk in *.apk; do
+ # remove broken links from abuildrepo
+ for apk in *.apk */*.apk; do
if [ -L "$apk" ] && [ ! -f "$apk" ]; then
rm -f "$apk"
fi
done
+}
+mklinks_abuildrepo() {
+ local apk get_prefix=apk_arch_prefix
+ local version=$($APK --version | awk '{print $2}')
+ if [ "$($APK version --test $version 2.1)" = '<' ]; then
+ get_prefix=apk_arch_prefix_compat
+ fi
+ mkdir -p "$abuildrepo"/$CARCH "$abuildrepo"/noarch
+ cd "$abuildrepo" || return 1
# create links for this package
for apk in $(listpkg); do
- ln -sf "$PKGDEST"/$apk "$abuildrepo"/$apk
+ [ -f "$PKGDEST"/$apk ] || continue
+ local prefix=$($get_prefix "$PKGDEST"/$apk)
+ mkdir -p "$abuildrepo"/$prefix
+ ln -sf "$PKGDEST"/$apk "$abuildrepo"/$prefix/$apk
done
+}
+
+update_abuildrepo() {
+ local d apk
+ if ! apk_up2date || [ -n "$force" ]; then
+ sanitycheck && builddeps && clean && fetch && unpack \
+ && prepare && mkusers && rootpkg || return 1
+ fi
+
+ clean_abuildrepo
+ mklinks_abuildrepo
+
+ cd "$abuildrepo"
+ local index=$CARCH/APKINDEX.tar.gz
msg "Updating the cached abuild repository index..."
local sign=".SIGN.RSA.${SIGN_PUBLIC_KEY##*/}"
local oldindex=
- if [ -f APKINDEX.tar.gz ]; then
- oldindex="--index APKINDEX.tar.gz"
+ if [ -f "$index" ]; then
+ oldindex="--index $index"
fi
- $APK index $oldindex --output APKINDEX.tar.gz.unsigned \
+ $APK index --quiet $oldindex --output "$index".unsigned \
--description "$repo $(cd $startdir && git describe)" \
- *.apk || exit 1
+ noarch/*.apk $CARCH/*.apk || exit 1
msg "Signing the index..."
- abuild-sign -q APKINDEX.tar.gz.unsigned || exit 1
- mv APKINDEX.tar.gz.unsigned APKINDEX.tar.gz
- chmod 644 APKINDEX.tar.gz
+ abuild-sign -q "$index".unsigned || exit 1
+ mv "$index".unsigned "$index"
+ chmod 644 "$index"
}
# predefined splitfunc doc
@@ -968,11 +1007,17 @@ apk_up2date() {
}
abuildindex_up2date() {
- local i apk
+ local i j apk
getpkgver || return 1
for i in $pkgname $subpackages; do
apk="${i%:*}-$pkgver-r$pkgrel.apk"
- [ "$abuildrepo"/APKINDEX.tar.gz -nt "$abuildrepo"/$apk ] || return 1
+ for j in "$abuildrepo"/*/$apk; do
+ [ -r "$j" ] || continue # ignore missing files
+ local idx="${j%/*}"/APKINDEX.tar.gz
+ if ! [ "$idx" -nt "$j" ]; then
+ return 1
+ fi
+ done
done
return 0
}
@@ -1103,10 +1148,10 @@ builddeps() {
# make a --simluate run first to detect missing deps
# apk-tools --virtual is no goot at reporting those.
$SUDO $APK add --repository "$abuildrepo" \
- --wait 30 \
+ $apk_opt_wait \
--simulate --quiet $deps || return 1
$SUDO $APK add --repository "$abuildrepo" \
- --wait 30 \
+ $apk_opt_wait \
--virtual .makedepends-$pkgname $deps \
&& return 0
fi
@@ -1138,7 +1183,7 @@ builddeps() {
$recursive $upgrade $color_opt abuildindex || return 1
done
$SUDO $APK add -u --repository "$abuildrepo" \
- --wait 30 \
+ $apk_opt_wait \
--virtual .makedepends-$pkgname $deps
}
@@ -1252,18 +1297,18 @@ post_add() {
post_add $i || return 1
fi
done
- $SUDO $APK add --wait 30 -u "$pkgf" || die "Failed to install $1"
+ $SUDO $APK add $apk_opt_wait -u "$pkgf" || die "Failed to install $1"
}
installdeps() {
local deps i
- $SUDO $APK add --wait 30 --repository "$abuildrepo" \
+ $SUDO $APK add $apk_opt_wait --repository "$abuildrepo" \
--virtual .makedepends-$pkgname \
$makedepends
}
uninstalldeps (){
- $SUDO $APK del .makedepends-$pkgname
+ $SUDO $APK del $apk_opt_wait .makedepends-$pkgname
}
all() {
diff --git a/ap.in b/ap.in
index bcc5ab7..7b69e05 100755
--- a/ap.in
+++ b/ap.in
@@ -13,7 +13,7 @@ subcmd.revdep = {
for i = 2, #opts do
local pkg = opts[i]
local _,p
- for _,p in ipairs(rev[pkg] or {}) do
+ for _,p in pairs(rev[pkg] or {}) do
print(p.pkgname)
end
end
@@ -36,28 +36,11 @@ 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
+ local db, rev = aports.init_apkdb(repodirs)
for i = 2, #opts do
- recurs(opts[i])
+ aports.recurs_until(db, opts[i], function(pn)
+ print(pn)
+ end)
end
end
}
@@ -68,35 +51,23 @@ subcmd.builddirs = {
run = function(opts)
local i, p, _
local visited = {}
- local apkdb, rev = aports.init_apkdb(repodirs)
+ local db, 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
- 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[p.dir] then
- print(p.dir)
- to_print[p.dir] = nil
- end
- end
- end
for i = 2, #opts do
- for _,p in pairs(apkdb[opts[i]]) do
+ for _,p in pairs(db[opts[i]]) do
to_print[p.dir] = true
end
end
for i = 2, #opts do
- recursdir(opts[i])
+ aports.recurs_until(db, opts[i], function(pn)
+ local j,p
+ for j, p in pairs(db[pn]) do
+ if to_print[p.dir] then
+ print(p.dir)
+ to_print[p.dir] = nil
+ end
+ end
+ end)
end
end
}
@@ -130,6 +101,7 @@ while i <= #arg do
i = i + 1
end
+
cmd = opts[1]
if cmd == nil then
diff --git a/aports.lua b/aports.lua
index 44691c8..f8a0121 100755
--- a/aports.lua
+++ b/aports.lua
@@ -103,3 +103,45 @@ function init_apkdb(repodirs)
return pkgdb, revdeps
end
+-- return a key list with makedepends and depends
+function all_deps(p)
+ local m = {}
+ local k,v
+ if p == nil then
+ return m
+ end
+ if type(p.depends) == "table" then
+ for k,v in pairs(p.depends) do
+ m[v] = true
+ end
+ end
+ if type(p.makedepends) == "table" then
+ for k,v in pairs(p.makedepends) do
+ m[v] = true
+ end
+ end
+ return m
+end
+
+
+function recurs_until(apkdb, pn, func)
+ local visited={}
+ function recurs(pn)
+ if pn == nil or visited[pn] or apkdb[pn] == nil then
+ return false
+ end
+ visited[pn] = true
+ local _, p
+ for _, p in pairs(apkdb[pn]) do
+ local d
+ for d in pairs(all_deps(p)) do
+ if recurs(d) then
+ return true
+ end
+ end
+ end
+ return func(pn)
+ end
+ return recurs(pn)
+end
+