Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
b4d9195c03 | |||
0123e6d044 | |||
e2b2a21ed1 | |||
0e2e2875db | |||
a4d006adef | |||
98926fbdd0 | |||
a1a2289e18 | |||
057cbf1691 | |||
0b05cbeba1 | |||
ed5dad3066 | |||
76cce316a2 | |||
7c152b4f60 | |||
79c831c616 | |||
6b27c82b86 | |||
2cc5047dda | |||
08ab8c2137 | |||
9ddd962c2c | |||
a8c07bd7f3 | |||
1fcf78bb47 | |||
167265944d | |||
7ef931026e | |||
bef2a0b3fa | |||
8d6f12f5a9 | |||
bf6fc3fcff |
8
Makefile
8
Makefile
@@ -1,4 +1,4 @@
|
|||||||
VERSION=0.12
|
VERSION=0.13
|
||||||
|
|
||||||
CHROOT_VERSION=0.9
|
CHROOT_VERSION=0.9
|
||||||
|
|
||||||
@@ -34,13 +34,11 @@ PKG_BIN = \
|
|||||||
bin/pkg/deploypkg \
|
bin/pkg/deploypkg \
|
||||||
bin/pkg/commitpkg \
|
bin/pkg/commitpkg \
|
||||||
bin/pkg/comparepkg \
|
bin/pkg/comparepkg \
|
||||||
bin/pkg/checkpkg \
|
|
||||||
bin/pkg/mkchrootpkg \
|
bin/pkg/mkchrootpkg \
|
||||||
bin/pkg/pkg2yaml \
|
bin/pkg/pkg2yaml \
|
||||||
bin/pkg/buildtree \
|
bin/pkg/buildtree \
|
||||||
bin/pkg/lddd \
|
bin/pkg/lddd \
|
||||||
bin/pkg/finddeps \
|
bin/pkg/links-add
|
||||||
bin/pkg/find-libdeps
|
|
||||||
|
|
||||||
LN_COMMITPKG = \
|
LN_COMMITPKG = \
|
||||||
extrapkg \
|
extrapkg \
|
||||||
@@ -169,7 +167,7 @@ install_pkg:
|
|||||||
install $(DIRMODE) $(DESTDIR)$(BINDIR)
|
install $(DIRMODE) $(DESTDIR)$(BINDIR)
|
||||||
install $(MODE) $(PKG_BIN) $(DESTDIR)$(BINDIR)
|
install $(MODE) $(PKG_BIN) $(DESTDIR)$(BINDIR)
|
||||||
|
|
||||||
$(LN) find-libdeps $(DESTDIR)$(BINDIR)/find-libprovides
|
$(LN) links-add $(DESTDIR)$(BINDIR)/links-remove
|
||||||
|
|
||||||
for l in $(LN_COMMITPKG); do $(LN) commitpkg $(DESTDIR)$(BINDIR)/$$l; done
|
for l in $(LN_COMMITPKG); do $(LN) commitpkg $(DESTDIR)$(BINDIR)/$$l; done
|
||||||
for l in $(LN_BUILDPKG); do $(LN) buildpkg $(DESTDIR)$(BINDIR)/$$l; done
|
for l in $(LN_BUILDPKG); do $(LN) buildpkg $(DESTDIR)$(BINDIR)/$$l; done
|
||||||
|
@@ -1,80 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Copyright (C) 2018-19 artoo@artixlinux.org
|
|
||||||
# Copyright (C) 2018 Artix Linux Developers
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; version 2 of the License.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
. @libdir@/artools/util-base.sh
|
|
||||||
. @libdir@/artools/util-pkg.sh
|
|
||||||
|
|
||||||
shopt -s extglob
|
|
||||||
|
|
||||||
load_user_info
|
|
||||||
|
|
||||||
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
|
|
||||||
load_vars /etc/makepkg.conf
|
|
||||||
|
|
||||||
if [[ ! -f PKGBUILD ]]; then
|
|
||||||
die 'This must be run in the directory of a built package.'
|
|
||||||
fi
|
|
||||||
|
|
||||||
. ./PKGBUILD
|
|
||||||
if [[ $arch == 'any' ]]; then
|
|
||||||
CARCH='any'
|
|
||||||
fi
|
|
||||||
|
|
||||||
STARTDIR=$(pwd)
|
|
||||||
TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX)
|
|
||||||
|
|
||||||
for _pkgname in "${pkgname[@]}"; do
|
|
||||||
target_pkgver=$(get_full_version "$_pkgname")
|
|
||||||
if ! pkgfile=$(find_cached_package "$_pkgname" "$target_pkgver" "$CARCH"); then
|
|
||||||
die 'tarball not found for package: %s' "${_pkgname}-$target_pkgver"
|
|
||||||
fi
|
|
||||||
|
|
||||||
ln -s "$pkgfile" "$TEMPDIR"
|
|
||||||
|
|
||||||
pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$_pkgname")
|
|
||||||
|
|
||||||
if [[ $? -ne 0 ]]; then
|
|
||||||
die "Couldn't download previous package for %s." "$_pkgname"
|
|
||||||
fi
|
|
||||||
|
|
||||||
oldpkg=${pkgurl##*://*/}
|
|
||||||
|
|
||||||
if [[ ${oldpkg##*/} = ${pkgfile##*/} ]]; then
|
|
||||||
die "The built package (%s) is the one in the repo right now!" "$_pkgname"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $pkgurl = file://* ]]; then
|
|
||||||
ln -s "${pkgurl#file://}" "$TEMPDIR/$oldpkg"
|
|
||||||
elif [[ -f "$PKGDEST/$oldpkg" ]]; then
|
|
||||||
ln -s "$PKGDEST/$oldpkg" "$TEMPDIR/$oldpkg"
|
|
||||||
elif [[ -f "$STARTDIR/$oldpkg" ]]; then
|
|
||||||
ln -s "$STARTDIR/$oldpkg" "$TEMPDIR/$oldpkg"
|
|
||||||
else
|
|
||||||
curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl"
|
|
||||||
fi
|
|
||||||
|
|
||||||
bsdtar tf "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old"
|
|
||||||
bsdtar tf "$pkgfile" | sort > "$TEMPDIR/filelist-$_pkgname"
|
|
||||||
|
|
||||||
sdiff -s "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname"
|
|
||||||
|
|
||||||
find-libprovides "$TEMPDIR/$oldpkg" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname-old"
|
|
||||||
find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname"
|
|
||||||
if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then
|
|
||||||
msg "Sonames differ in %s!" "$_pkgname"
|
|
||||||
echo "$diff_output"
|
|
||||||
else
|
|
||||||
msg "No soname differences for %s" "$_pkgname."
|
|
||||||
fi
|
|
||||||
done
|
|
@@ -15,73 +15,162 @@
|
|||||||
. @libdir@/artools/util-base.sh
|
. @libdir@/artools/util-base.sh
|
||||||
. @libdir@/artools/util-pkg.sh
|
. @libdir@/artools/util-pkg.sh
|
||||||
|
|
||||||
|
compare(){
|
||||||
|
local pkgpath="$1"
|
||||||
|
local pkg=${pkgpath##*/}
|
||||||
|
local artixrepo=$(find_repo "$package" "${staging}" "${unstable}")
|
||||||
|
local artixshow=${artixrepo%-*}
|
||||||
|
local pkgbuild=$pkgpath/repos/$artixrepo/PKGBUILD
|
||||||
|
|
||||||
|
if [[ -f $pkgbuild ]];then
|
||||||
|
|
||||||
|
. $pkgbuild 2>/dev/null
|
||||||
|
local artixver=$(get_full_version $pkg)
|
||||||
|
|
||||||
|
local archpath=$(get_import_path $pkg)
|
||||||
|
|
||||||
|
local archrepo=$(find_repo "$archpath" "${staging}" "${unstable}")
|
||||||
|
|
||||||
|
local archshow=${archrepo%-*}
|
||||||
|
pkgbuild=$archpath/repos/$archrepo/PKGBUILD
|
||||||
|
|
||||||
|
if [[ -f $pkgbuild ]];then
|
||||||
|
. $pkgbuild 2>/dev/null
|
||||||
|
local archver=$(get_full_version $pkg)
|
||||||
|
fi
|
||||||
|
|
||||||
|
local result=$(vercmp "$artixver" "$archver")
|
||||||
|
|
||||||
|
local repomatch=false
|
||||||
|
[[ "$archrepo" == "$artixrepo" ]] && repomatch=true
|
||||||
|
|
||||||
|
if ${move};then
|
||||||
|
|
||||||
|
if [ $result -gt -1 ];then
|
||||||
|
case $artixrepo in
|
||||||
|
*testing*|*staging*)
|
||||||
|
if $repomatch;then
|
||||||
|
msg_row "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
|
||||||
|
else
|
||||||
|
msg_row_notify "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif ${upgrades};then
|
||||||
|
|
||||||
|
if [ $result -eq -1 ];then
|
||||||
|
msg_row_upgrade "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif ${downgrades};then
|
||||||
|
|
||||||
|
if [ $result -eq 1 ];then
|
||||||
|
if [[ -n $archver ]] && [[ -n $archrepo ]];then
|
||||||
|
msg_row_downgrade "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
unset pkgver epoch pkgrel artixver archver pkgbuild archpath
|
||||||
|
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
is_db_entry() {
|
||||||
|
local pkgname="$1" repo="$(arch2artix $2)"
|
||||||
|
if [[ -d ${USERCACHEDIR}/${LINKSDBEXT}/${ARCH}/$repo/$pkgname ]];then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
check_db(){
|
||||||
|
local pkgpath="$1"
|
||||||
|
local pkg=${pkgpath##*/}
|
||||||
|
local sarch=(any ${ARCH})
|
||||||
|
local arch_repos=$(arch_repos "${staging}" "${unstable}")
|
||||||
|
|
||||||
|
for repo in ${arch_repos[@]};do
|
||||||
|
|
||||||
|
for a in ${sarch[@]};do
|
||||||
|
|
||||||
|
local pkgbuild=$pkgpath/repos/$repo-$a/PKGBUILD
|
||||||
|
|
||||||
|
if [[ -f $pkgbuild ]];then
|
||||||
|
|
||||||
|
. $pkgbuild 2>/dev/null
|
||||||
|
local artixver=$(get_full_version $pkg)
|
||||||
|
local is_entry=false
|
||||||
|
|
||||||
|
for name in ${pkgname[@]};do
|
||||||
|
|
||||||
|
if is_db_entry "$name-$artixver" "$repo";then
|
||||||
|
is_entry=true
|
||||||
|
fi
|
||||||
|
if ! $is_entry; then
|
||||||
|
msg_row "%-20s %-35s %-20s %-10s" "$repo" "$name" "$artixver" "$is_entry"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
unset artixver is_entry pkgbuild pkgver epoch pkgname pkgbase
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
update_db_cache(){
|
||||||
|
msg "Updating database cache"
|
||||||
|
for repo in "${searchrepos[@]}"; do
|
||||||
|
local cachedir=${USERCACHEDIR}/${LINKSDBEXT}/${ARCH}/${repo}
|
||||||
|
rm -rf "$cachedir"
|
||||||
|
mkdir -p "$cachedir"
|
||||||
|
msg2 "%s" "$repo"
|
||||||
|
curl -s "${REPOS_MIRROR}/${repo}/os/${ARCH}/${repo}.${LINKSDBEXT}" \
|
||||||
|
| bsdtar -xf - -C "$cachedir"
|
||||||
|
done
|
||||||
|
msg "Done"
|
||||||
|
}
|
||||||
|
|
||||||
|
query_db() {
|
||||||
|
msg_table_header "%-20s %-45s %s" "Repo" "Package" "Library"
|
||||||
|
for repo in "${searchrepos[@]}"; do
|
||||||
|
local prefix=
|
||||||
|
local db=${USERCACHEDIR}/${LINKSDBEXT}/${ARCH}/${repo}/
|
||||||
|
if [[ -d ${db} ]]; then
|
||||||
|
while read -rd '' pkg; do
|
||||||
|
read -r match
|
||||||
|
pkg=${pkg#${db}}
|
||||||
|
pkg="${pkg%/*}"
|
||||||
|
|
||||||
|
msg_row "%-20s %-45s %s" "${repo}" "${pkg}" "${match}"
|
||||||
|
done < <(grep -rZ "${library}" "${db}") | sort -u
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
show_version_table(){
|
show_version_table(){
|
||||||
msg_table_header "%-20s %-20s %-25s %-30s %-30s" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version"
|
|
||||||
|
if ${check};then
|
||||||
|
${sync} && update_db_cache
|
||||||
|
msg_table_header "%-20s %-35s %-20s %-10s" "Repo" "Package" "Version" "Database"
|
||||||
|
elif ${query};then
|
||||||
|
${sync} && update_db_cache
|
||||||
|
query_db
|
||||||
|
else
|
||||||
|
msg_table_header "%-20s %-20s %-25s %-30s %-30s" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version"
|
||||||
|
fi
|
||||||
|
|
||||||
for tree in ${TREE_NAMES_ARTIX[@]};do
|
for tree in ${TREE_NAMES_ARTIX[@]};do
|
||||||
|
|
||||||
local git=$(find ${TREE_DIR_ARTIX}/$tree/ -mindepth 1 -maxdepth 1 -type d)
|
local git=$(find ${TREE_DIR_ARTIX}/$tree/ -mindepth 1 -maxdepth 1 -type d)
|
||||||
|
|
||||||
for package in ${git[@]}; do
|
for package in ${git[@]}; do
|
||||||
|
if ${check};then
|
||||||
local pkg=${package##*/}
|
check_db "$package"
|
||||||
local artixrepo=$(find_repo "$package" "${staging}" "${unstable}")
|
else
|
||||||
local artixshow=${artixrepo%-*}
|
compare "$package"
|
||||||
local pkgbuild=$package/repos/$artixrepo/PKGBUILD
|
|
||||||
|
|
||||||
if [[ -f $pkgbuild ]];then
|
|
||||||
|
|
||||||
. $pkgbuild 2>/dev/null
|
|
||||||
local artixver=$(get_full_version $pkg)
|
|
||||||
|
|
||||||
local archpath=$(get_import_path $pkg)
|
|
||||||
|
|
||||||
local archrepo=$(find_repo "$archpath" "${staging}" "${unstable}")
|
|
||||||
|
|
||||||
local archshow=${archrepo%-*}
|
|
||||||
pkgbuild=$archpath/repos/$archrepo/PKGBUILD
|
|
||||||
|
|
||||||
if [[ -f $pkgbuild ]];then
|
|
||||||
. $pkgbuild 2>/dev/null
|
|
||||||
local archver=$(get_full_version $pkg)
|
|
||||||
fi
|
|
||||||
|
|
||||||
local result=$(vercmp "$artixver" "$archver")
|
|
||||||
|
|
||||||
local repomatch=false
|
|
||||||
[[ "$archrepo" == "$artixrepo" ]] && repomatch=true
|
|
||||||
|
|
||||||
if ${move};then
|
|
||||||
|
|
||||||
if [ $result -gt -1 ];then
|
|
||||||
case $artixrepo in
|
|
||||||
*testing*|*staging*)
|
|
||||||
if $repomatch;then
|
|
||||||
msg_row "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
|
|
||||||
else
|
|
||||||
msg_row_notify "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
elif ${upgrades};then
|
|
||||||
|
|
||||||
if [ $result -eq -1 ];then
|
|
||||||
msg_row_upgrade "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
|
|
||||||
fi
|
|
||||||
|
|
||||||
elif ${downgrades};then
|
|
||||||
|
|
||||||
if [ $result -eq 1 ];then
|
|
||||||
if [[ -n $archver ]] && [[ -n $archrepo ]];then
|
|
||||||
msg_row_downgrade "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
unset pkgver epoch pkgrel artixver archver pkgbuild archpath
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
@@ -98,14 +187,31 @@ staging=true
|
|||||||
upgrades=false
|
upgrades=false
|
||||||
downgrades=false
|
downgrades=false
|
||||||
move=false
|
move=false
|
||||||
|
check=false
|
||||||
|
sync=false
|
||||||
|
query=false
|
||||||
|
|
||||||
|
artix_repos=(
|
||||||
|
'goblins' 'gremlins' 'system' 'world'
|
||||||
|
'galaxy-goblins' 'galaxy-gremlins' 'galaxy'
|
||||||
|
'lib32-goblins' 'lib32-gremlins' 'lib32'
|
||||||
|
'gnome-wobble' 'kde-wobble'
|
||||||
|
)
|
||||||
|
|
||||||
|
searchrepos=(${artix_repos[@]})
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "Usage: ${0##*/} [options]"
|
echo "Usage: ${0##*/} [options] (with -q [libname])"
|
||||||
echo ' -u Show upgrade packages'
|
echo ' -u Show upgrade packages'
|
||||||
echo ' -d Show downgrade packages'
|
echo ' -d Show downgrade packages'
|
||||||
echo ' -m Show packages to move'
|
echo ' -m Show packages to move'
|
||||||
echo " -x Don't inlcude staging packages"
|
echo " -x Don't inlcude staging packages"
|
||||||
echo ' -y Include unstable kde and gnome'
|
echo ' -y Include unstable kde and gnome'
|
||||||
|
echo ' -c Check repos'
|
||||||
|
echo " -s Sync repo databases"
|
||||||
|
echo " -q Query repo databases for so libs"
|
||||||
|
echo ' -r <repo> Repo name to query'
|
||||||
|
echo ' [default: all]'
|
||||||
echo ' -h This help'
|
echo ' -h This help'
|
||||||
echo ''
|
echo ''
|
||||||
echo ''
|
echo ''
|
||||||
@@ -114,7 +220,7 @@ usage() {
|
|||||||
|
|
||||||
orig_argv=("$0" "$@")
|
orig_argv=("$0" "$@")
|
||||||
|
|
||||||
opts='udmxyh'
|
opts='r:qcsudmxyh'
|
||||||
|
|
||||||
while getopts "${opts}" arg; do
|
while getopts "${opts}" arg; do
|
||||||
case "${arg}" in
|
case "${arg}" in
|
||||||
@@ -123,6 +229,10 @@ while getopts "${opts}" arg; do
|
|||||||
m) move=true ;;
|
m) move=true ;;
|
||||||
x) staging=false ;;
|
x) staging=false ;;
|
||||||
y) unstable=true ;;
|
y) unstable=true ;;
|
||||||
|
c) check=true ;;
|
||||||
|
s) sync=true ;;
|
||||||
|
q) query=true ;;
|
||||||
|
r) searchrepos=("$OPTARG") ;;
|
||||||
h|?) usage 0 ;;
|
h|?) usage 0 ;;
|
||||||
*) echo "invalid argument '${arg}'"; usage 1 ;;
|
*) echo "invalid argument '${arg}'"; usage 1 ;;
|
||||||
esac
|
esac
|
||||||
@@ -130,4 +240,6 @@ done
|
|||||||
|
|
||||||
shift $(($OPTIND - 1))
|
shift $(($OPTIND - 1))
|
||||||
|
|
||||||
|
library="$1"; shift
|
||||||
|
|
||||||
show_version_table
|
show_version_table
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
. @libdir@/artools/util-pkg.sh
|
. @libdir@/artools/util-pkg.sh
|
||||||
|
|
||||||
update_repo(){
|
update_repo(){
|
||||||
local repo="$1" pkgfile ver ext=db.tar.xz
|
local repo="$1" pkgfile ver
|
||||||
local repo_path=${REPOS_ROOT}/$repo/os/${ARCH} packages=()
|
local repo_path=${REPOS_ROOT}/$repo/os/${ARCH} packages=()
|
||||||
|
|
||||||
. PKGBUILD
|
. PKGBUILD
|
||||||
@@ -51,7 +51,11 @@ update_repo(){
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
cd $repo_path
|
cd $repo_path
|
||||||
[[ -n $action ]] && repo-$action -R $repo.$ext ${packages[@]}
|
if [[ -n $action ]]; then
|
||||||
|
repo-$action -R $repo.${PKGDBEXT} ${packages[@]}
|
||||||
|
${linksdb} && links-$action $repo.${LINKSDBEXT} ${packages[@]}
|
||||||
|
fi
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,6 +68,7 @@ load_vars /etc/makepkg.conf
|
|||||||
add_pkg=false
|
add_pkg=false
|
||||||
del_pkg=false
|
del_pkg=false
|
||||||
sign_pkg=false
|
sign_pkg=false
|
||||||
|
linksdb=false
|
||||||
|
|
||||||
cmd=${0##*/}
|
cmd=${0##*/}
|
||||||
dest_repo=${cmd#*-}
|
dest_repo=${cmd#*-}
|
||||||
@@ -72,6 +77,7 @@ usage() {
|
|||||||
echo "Usage: ${cmd} [options]"
|
echo "Usage: ${cmd} [options]"
|
||||||
echo ' -a Add package(s) to repository'
|
echo ' -a Add package(s) to repository'
|
||||||
echo ' -r Remove package(s) from repository'
|
echo ' -r Remove package(s) from repository'
|
||||||
|
echo ' -l Use links db'
|
||||||
echo ' -s Sign package(s)'
|
echo ' -s Sign package(s)'
|
||||||
echo ' -h This help'
|
echo ' -h This help'
|
||||||
echo ''
|
echo ''
|
||||||
@@ -79,12 +85,13 @@ usage() {
|
|||||||
exit $1
|
exit $1
|
||||||
}
|
}
|
||||||
|
|
||||||
opts='arsh'
|
opts='arlsh'
|
||||||
|
|
||||||
while getopts "${opts}" arg; do
|
while getopts "${opts}" arg; do
|
||||||
case "${arg}" in
|
case "${arg}" in
|
||||||
a) add_pkg=true; del_pkg=false ;;
|
a) add_pkg=true; del_pkg=false ;;
|
||||||
r) del_pkg=true; add_pkg=false ;;
|
r) del_pkg=true; add_pkg=false ;;
|
||||||
|
l) linksdb=true ;;
|
||||||
s) sign_pkg=true ;;
|
s) sign_pkg=true ;;
|
||||||
h|?) usage 0 ;;
|
h|?) usage 0 ;;
|
||||||
*) echo "invalid argument '${arg}'"; usage 1 ;;
|
*) echo "invalid argument '${arg}'"; usage 1 ;;
|
||||||
|
@@ -1,102 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Copyright (C) 2018-19 artoo@artixlinux.org
|
|
||||||
# Copyright (C) 2018 Artix Linux Developers
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; version 2 of the License.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
. @libdir@/artools/util-base.sh
|
|
||||||
. @libdir@/artools/util-pkg.sh
|
|
||||||
|
|
||||||
# $1: sofile
|
|
||||||
# $2: soarch
|
|
||||||
process_sofile() {
|
|
||||||
# extract the library name: libfoo.so
|
|
||||||
local soname="${1%.so?(+(.+([0-9])))}".so
|
|
||||||
# extract the major version: 1
|
|
||||||
soversion="${1##*\.so\.}"
|
|
||||||
if [[ "$soversion" = "$1" ]] && (($IGNORE_INTERNAL)); then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
if ! in_array "${soname}=${soversion}-$2" ${soobjects[@]}; then
|
|
||||||
# libfoo.so=1-64
|
|
||||||
msg "${soname}=${soversion}-$2"
|
|
||||||
soobjects+=("${soname}=${soversion}-$2")
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
set -e
|
|
||||||
shopt -s extglob
|
|
||||||
|
|
||||||
IGNORE_INTERNAL=0
|
|
||||||
|
|
||||||
if [[ $1 = "--ignore-internal" ]]; then
|
|
||||||
IGNORE_INTERNAL=1
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
script_mode=${0##*/find-lib}
|
|
||||||
|
|
||||||
case $script_mode in
|
|
||||||
deps|provides) true;;
|
|
||||||
*) die "Unknown mode %s" "$script_mode" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [[ -z $1 ]]; then
|
|
||||||
echo "${0##*/} [options] <package file|extracted package dir>"
|
|
||||||
echo "Options:"
|
|
||||||
echo " --ignore-internal ignore internal libraries"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -d $1 ]]; then
|
|
||||||
pushd $1 >/dev/null
|
|
||||||
else
|
|
||||||
WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
|
|
||||||
|
|
||||||
case ${script_mode} in
|
|
||||||
deps) bsdtar -C "$WORKDIR" -xf "$1";;
|
|
||||||
provides) bsdtar -C "$WORKDIR" -xf "$1" --include="*.so*";;
|
|
||||||
esac
|
|
||||||
|
|
||||||
pushd "$WORKDIR" >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
case $script_mode in
|
|
||||||
deps) find_args=(-perm -u+x);;
|
|
||||||
provides) find_args=(-name *.so*);;
|
|
||||||
esac
|
|
||||||
|
|
||||||
find $PWD -type f "${find_args[@]}" | while read filename; do
|
|
||||||
if [[ $script_mode = "provides" ]]; then
|
|
||||||
# ignore if we don't have a shared object
|
|
||||||
if ! LC_ALL=C readelf -h "$filename" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# get architecture of the file; if soarch is empty it's not an ELF binary
|
|
||||||
soarch=$(LC_ALL=C readelf -h "$filename" 2>/dev/null | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p')
|
|
||||||
[[ -n $soarch ]] || continue
|
|
||||||
|
|
||||||
if [[ $script_mode = "provides" ]]; then
|
|
||||||
# get the string binaries link to: libfoo.so.1.2 -> libfoo.so.1
|
|
||||||
sofile=$(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p')
|
|
||||||
[[ -z $sofile ]] && sofile="${filename##*/}"
|
|
||||||
process_sofile "${sofile}" "${soarch}"
|
|
||||||
elif [[ $script_mode = "deps" ]]; then
|
|
||||||
# process all libraries needed by the binary
|
|
||||||
for sofile in $(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'); do
|
|
||||||
process_sofile "${sofile}" "${soarch}"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
popd >/dev/null
|
|
@@ -1,48 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Copyright (C) 2018-19 artoo@artixlinux.org
|
|
||||||
# Copyright (C) 2018 Artix Linux Developers
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; version 2 of the License.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
. @libdir@/artools/util-base.sh
|
|
||||||
|
|
||||||
match=$1
|
|
||||||
|
|
||||||
if [[ -z $match ]]; then
|
|
||||||
echo 'Usage: finddeps <depname>'
|
|
||||||
echo ''
|
|
||||||
echo 'Find packages that depend on a given depname.'
|
|
||||||
echo 'Run this script from the top-level directory of your ABS tree.'
|
|
||||||
echo ''
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
find $PWD -type d | while read d; do
|
|
||||||
if [[ -f "$d/PKGBUILD" ]]; then
|
|
||||||
unset pkgname depends makedepends optdepends
|
|
||||||
. "$d/PKGBUILD"
|
|
||||||
for dep in "${depends[@]}"; do
|
|
||||||
# lose the version comparator, if any
|
|
||||||
depname=${dep%%[<>=]*}
|
|
||||||
[[ $depname = $match ]] && msg "$d (depends)"
|
|
||||||
done
|
|
||||||
for dep in "${makedepends[@]}"; do
|
|
||||||
# lose the version comparator, if any
|
|
||||||
depname=${dep%%[<>=]*}
|
|
||||||
[[ $depname = $match ]] && msg "$d (makedepends)"
|
|
||||||
done
|
|
||||||
for dep in "${optdepends[@]/:*}"; do
|
|
||||||
# lose the version comaparator, if any
|
|
||||||
depname=${dep%%[<>=]*}
|
|
||||||
[[ $depname = $match ]] && msg "$d (optdepends)"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
done
|
|
518
bin/pkg/links-add.in
Normal file
518
bin/pkg/links-add.in
Normal file
@@ -0,0 +1,518 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# links-add - add a package to a given repo database file
|
||||||
|
# links-remove - remove a package entry from a given repo database file
|
||||||
|
#
|
||||||
|
# Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
|
# Copyright (c) 2019 artoo@artixlinux.org
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
shopt -s extglob
|
||||||
|
|
||||||
|
declare -r REPO_DB_NAME="links"
|
||||||
|
|
||||||
|
QUIET=0
|
||||||
|
ONLYADDNEW=0
|
||||||
|
SIGN=0
|
||||||
|
KEY=0
|
||||||
|
VERIFY=0
|
||||||
|
REPO_DB_FILE=
|
||||||
|
REPO_DB_PREFIX=
|
||||||
|
REPO_DB_SUFFIX=
|
||||||
|
LOCKFILE=
|
||||||
|
CLEAN_LOCK=0
|
||||||
|
|
||||||
|
. @libdir@/artools/util-base.sh
|
||||||
|
|
||||||
|
# ensure we have a sane umask set
|
||||||
|
umask 0022
|
||||||
|
|
||||||
|
# print usage instructions
|
||||||
|
usage() {
|
||||||
|
cmd=${0##*/}
|
||||||
|
printf -- "%s \n\n" "$cmd"
|
||||||
|
if [[ $cmd == "links-add" ]] ; then
|
||||||
|
printf -- "Usage: links-add [options] <path-to-db> <package> ...\n"
|
||||||
|
printf -- "\n"
|
||||||
|
printf -- "\
|
||||||
|
links-add will update a package database by reading a package file.\n\
|
||||||
|
Multiple packages to add can be specified on the command line.\n"
|
||||||
|
printf -- "\n"
|
||||||
|
printf -- "Options:\n"
|
||||||
|
printf -- " -n, --new only add packages that are not already in the database\n"
|
||||||
|
elif [[ $cmd == "links-remove" ]] ; then
|
||||||
|
printf -- "Usage: links-remove [options] <path-to-db> <packagename> ...\n"
|
||||||
|
printf -- "\n"
|
||||||
|
printf -- "\
|
||||||
|
links-remove will update a package database by removing the package name\n\
|
||||||
|
specified on the command line from the given repo database. Multiple\n\
|
||||||
|
packages to remove can be specified on the command line.\n"
|
||||||
|
printf -- "\n"
|
||||||
|
printf -- "Options:\n"
|
||||||
|
else
|
||||||
|
printf -- "Please move along, there is nothing to see here.\n"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
printf -- " --nocolor turn off color in output\n"
|
||||||
|
printf -- " -q, --quiet minimize output\n"
|
||||||
|
printf -- " -s, --sign sign database with GnuPG after update\n"
|
||||||
|
printf -- " -k, --key <key> use the specified key to sign the database\n"
|
||||||
|
printf -- " -v, --verify verify database's signature before update\n"
|
||||||
|
printf -- "\n\
|
||||||
|
See %s(8) for more details and descriptions of the available options.\n" $cmd
|
||||||
|
printf "\n"
|
||||||
|
if [[ $cmd == "links-add" ]] ; then
|
||||||
|
printf -- "Example: links-add /path/to/repo.${LINKSDBEXT} pacman-5.1.3-1-x86_64.pkg.tar.xz\n"
|
||||||
|
elif [[ $cmd == "links-remove" ]] ; then
|
||||||
|
printf -- "Example: links-remove /path/to/repo.${LINKSDBEXT} kernel26\n"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
find_pkgentry() {
|
||||||
|
local pkgname=$1
|
||||||
|
local pkgentry
|
||||||
|
|
||||||
|
for pkgentry in "$tmpdir/${REPO_DB_NAME}/$pkgname"*; do
|
||||||
|
name=${pkgentry##*/}
|
||||||
|
if [[ ${name%-*-*} = $pkgname ]]; then
|
||||||
|
echo $pkgentry
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
check_gpg() {
|
||||||
|
if ! type -p gpg >/dev/null; then
|
||||||
|
error "Cannot find the gpg binary! Is GnuPG installed?"
|
||||||
|
exit 1 # $E_MISSING_PROGRAM
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( ! VERIFY )); then
|
||||||
|
if ! gpg --list-key ${GPGKEY} &>/dev/null; then
|
||||||
|
if [[ ! -z $GPGKEY ]]; then
|
||||||
|
error "The key ${GPGKEY} does not exist in your keyring."
|
||||||
|
elif (( ! KEY )); then
|
||||||
|
error "There is no key in your keyring."
|
||||||
|
fi
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# sign the package database once repackaged
|
||||||
|
create_signature() {
|
||||||
|
(( ! SIGN )) && return
|
||||||
|
local dbfile=$1
|
||||||
|
local ret=0
|
||||||
|
msg "Signing database '%s'..." "${dbfile##*/.tmp.}"
|
||||||
|
|
||||||
|
local SIGNWITHKEY=""
|
||||||
|
if [[ -n $GPGKEY ]]; then
|
||||||
|
SIGNWITHKEY="-u ${GPGKEY}"
|
||||||
|
fi
|
||||||
|
gpg --detach-sign --use-agent --no-armor ${SIGNWITHKEY} "$dbfile" &>/dev/null || ret=$?
|
||||||
|
|
||||||
|
if (( ! ret )); then
|
||||||
|
msg2 "Created signature file '%s'" "${dbfile##*/.tmp.}.sig"
|
||||||
|
else
|
||||||
|
warning "Failed to sign package database file '%s'" "${dbfile##*/.tmp.}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# verify the existing package database signature
|
||||||
|
verify_signature() {
|
||||||
|
(( ! VERIFY )) && return
|
||||||
|
local dbfile=$1
|
||||||
|
local ret=0
|
||||||
|
msg "Verifying database signature..."
|
||||||
|
|
||||||
|
if [[ ! -f $dbfile.sig ]]; then
|
||||||
|
warning "No existing signature found, skipping verification."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
gpg --verify "$dbfile.sig" || ret=$?
|
||||||
|
if (( ! ret )); then
|
||||||
|
msg2 "Database signature file verified."
|
||||||
|
else
|
||||||
|
error "Database signature was NOT valid!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
verify_repo_extension() {
|
||||||
|
local repofile=$1
|
||||||
|
|
||||||
|
case $repofile in
|
||||||
|
*.links.tar.gz) TAR_OPT="z" ;;
|
||||||
|
*.links.tar.bz2) TAR_OPT="j" ;;
|
||||||
|
*.links.tar.xz) TAR_OPT="J" ;;
|
||||||
|
*.links.tar.zst) TAR_OPT="--zstd" ;;
|
||||||
|
*.links.tar.Z) TAR_OPT="Z" ;;
|
||||||
|
*.links.tar) TAR_OPT="" ;;
|
||||||
|
*) error "'%s' does not have a valid database archive extension." \
|
||||||
|
"$repofile"
|
||||||
|
exit 1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
printf '%s' "$TAR_OPT"
|
||||||
|
}
|
||||||
|
|
||||||
|
# write an entry to the pacman database
|
||||||
|
# arg1 - path to package
|
||||||
|
db_write_entry() {
|
||||||
|
# blank out all variables
|
||||||
|
local pkgfile=$1
|
||||||
|
|
||||||
|
local pkgname pkgver
|
||||||
|
|
||||||
|
# read info from the zipped package
|
||||||
|
local line var val
|
||||||
|
while read -r line; do
|
||||||
|
[[ ${line:0:1} = '#' ]] && continue
|
||||||
|
IFS=' =' read -r var val < <(printf '%s\n' "$line")
|
||||||
|
# normalize whitespace with an extglob
|
||||||
|
declare "$var=${val//+([[:space:]])/ }"
|
||||||
|
|
||||||
|
done< <(bsdtar -xOqf "$pkgfile" .PKGINFO)
|
||||||
|
|
||||||
|
# ensure $pkgname and $pkgver variables were found
|
||||||
|
if [[ -z $pkgname || -z $pkgver ]]; then
|
||||||
|
error "Invalid package file '%s'." "$pkgfile"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -d $tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver ]]; then
|
||||||
|
warning "An entry for '%s' already existed" "$pkgname-$pkgver"
|
||||||
|
if (( ONLYADDNEW )); then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# remove an existing entry if it exists, ignore failures
|
||||||
|
db_remove_entry "$pkgname"
|
||||||
|
|
||||||
|
local tmppkg=$tmpdir/pkg/$pkgname-$pkgver
|
||||||
|
|
||||||
|
mkdir "$tmppkg"
|
||||||
|
|
||||||
|
bsdtar -xof $pkgfile -C $tmppkg --include={opt,{,usr/}{lib{,32},{s,}bin}}'/*' 2>/dev/null
|
||||||
|
|
||||||
|
pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null
|
||||||
|
mkdir "$pkgname-$pkgver"
|
||||||
|
pushd "$pkgname-$pkgver" >/dev/null
|
||||||
|
|
||||||
|
# create links entry
|
||||||
|
msg2 "Creating '%s' db entry..." "${REPO_DB_NAME}"
|
||||||
|
|
||||||
|
local linksentry=$tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver/${REPO_DB_NAME}
|
||||||
|
|
||||||
|
for f in $(find $tmppkg -type f); do
|
||||||
|
readelf -d "$f" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'
|
||||||
|
done | sort -u > $linksentry
|
||||||
|
|
||||||
|
popd >/dev/null
|
||||||
|
popd >/dev/null
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# remove existing entries from the DB
|
||||||
|
# arg1 - package name
|
||||||
|
db_remove_entry() {
|
||||||
|
local pkgname=$1
|
||||||
|
local notfound=1
|
||||||
|
local pkgentry=$(find_pkgentry "$pkgname")
|
||||||
|
while [[ -n $pkgentry ]]; do
|
||||||
|
notfound=0
|
||||||
|
|
||||||
|
msg2 "Removing existing entry '%s'..." \
|
||||||
|
"${pkgentry##*/}"
|
||||||
|
rm -rf "$pkgentry"
|
||||||
|
|
||||||
|
# remove entries in "links" database
|
||||||
|
local linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//')
|
||||||
|
rm -rf "$linksentry"
|
||||||
|
|
||||||
|
pkgentry=$(find_pkgentry "$pkgname")
|
||||||
|
done
|
||||||
|
return $notfound
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare_repo_db() {
|
||||||
|
local repodir dbfile
|
||||||
|
|
||||||
|
# ensure the path to the DB exists; $LOCKFILE is always an absolute path
|
||||||
|
repodir=${LOCKFILE%/*}/
|
||||||
|
|
||||||
|
if [[ ! -d $repodir ]]; then
|
||||||
|
error "%s does not exist or is not a directory." "$repodir"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# check lock file
|
||||||
|
if ( set -o noclobber; echo "$$" > "$LOCKFILE") 2> /dev/null; then
|
||||||
|
CLEAN_LOCK=1
|
||||||
|
else
|
||||||
|
error "Failed to acquire lockfile: %s." "$LOCKFILE"
|
||||||
|
[[ -f $LOCKFILE ]] && error "Held by process %s" "$(cat "$LOCKFILE")"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX
|
||||||
|
|
||||||
|
if [[ -f $dbfile ]]; then
|
||||||
|
# there are two situations we can have here:
|
||||||
|
# a DB with some entries, or a DB with no contents at all.
|
||||||
|
if ! bsdtar -tqf "$dbfile" '*/links' >/dev/null 2>&1; then
|
||||||
|
# check empty case
|
||||||
|
if [[ -n $(bsdtar -tqf "$dbfile" '*' 2>/dev/null) ]]; then
|
||||||
|
error "Repository file '%s' is not a proper links database." "$dbfile"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
verify_signature "$dbfile"
|
||||||
|
msg "Extracting %s to a temporary location..." "${dbfile##*/}"
|
||||||
|
bsdtar -xf "$dbfile" -C "$tmpdir/${REPO_DB_NAME}"
|
||||||
|
else
|
||||||
|
case $cmd in
|
||||||
|
links-remove)
|
||||||
|
# only a missing "db" database is currently an error
|
||||||
|
# TODO: remove if statement
|
||||||
|
if [[ ${REPO_DB_NAME} == "links" ]]; then
|
||||||
|
error "Repository file '%s' was not found." "$dbfile"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
links-add)
|
||||||
|
# check if the file can be created (write permission, directory existence, etc)
|
||||||
|
if ! touch "$dbfile"; then
|
||||||
|
error "Repository file '%s' could not be created." "$dbfile"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
rm -f "$dbfile"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
add() {
|
||||||
|
if [[ ! -f $1 ]]; then
|
||||||
|
error "File '%s' not found." "$1"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
pkgfile=$1
|
||||||
|
if ! bsdtar -tqf "$pkgfile" .PKGINFO >/dev/null 2>&1; then
|
||||||
|
error "'%s' is not a package file, skipping" "$pkgfile"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg "Adding package '%s'" "$pkgfile"
|
||||||
|
|
||||||
|
db_write_entry "$pkgfile"
|
||||||
|
}
|
||||||
|
|
||||||
|
remove() {
|
||||||
|
pkgname=$1
|
||||||
|
msg "Searching for package '%s'..." "$pkgname"
|
||||||
|
|
||||||
|
if ! db_remove_entry "$pkgname"; then
|
||||||
|
error "Package matching '%s' not found." "$pkgname"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
rotate_db() {
|
||||||
|
dirname=${LOCKFILE%/*}
|
||||||
|
|
||||||
|
pushd "$dirname" >/dev/null
|
||||||
|
|
||||||
|
filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX}
|
||||||
|
tempname=$dirname/.tmp.$filename
|
||||||
|
|
||||||
|
# hardlink or move the previous version of the database and signature to .old
|
||||||
|
# extension as a backup measure
|
||||||
|
if [[ -f $filename ]]; then
|
||||||
|
ln -f "$filename" "$filename.old" 2>/dev/null || \
|
||||||
|
mv -f "$filename" "$filename.old"
|
||||||
|
|
||||||
|
if [[ -f $filename.sig ]]; then
|
||||||
|
ln -f "$filename.sig" "$filename.old.sig" 2>/dev/null || \
|
||||||
|
mv -f "$filename.sig" "$filename.old.sig"
|
||||||
|
else
|
||||||
|
rm -f "$filename.old.sig"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# rotate the newly-created database and signature into place
|
||||||
|
mv "$tempname" "$filename"
|
||||||
|
if [[ -f $tempname.sig ]]; then
|
||||||
|
mv "$tempname.sig" "$filename.sig"
|
||||||
|
fi
|
||||||
|
|
||||||
|
dblink=${filename%.tar*}
|
||||||
|
rm -f "$dblink" "$dblink.sig"
|
||||||
|
ln -s "$filename" "$dblink" 2>/dev/null || \
|
||||||
|
ln "$filename" "$dblink" 2>/dev/null || \
|
||||||
|
cp "$filename" "$dblink"
|
||||||
|
if [[ -f "$filename.sig" ]]; then
|
||||||
|
ln -s "$filename.sig" "$dblink.sig" 2>/dev/null || \
|
||||||
|
ln "$filename.sig" "$dblink.sig" 2>/dev/null || \
|
||||||
|
cp "$filename.sig" "$dblink.sig"
|
||||||
|
fi
|
||||||
|
|
||||||
|
popd >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
create_db() {
|
||||||
|
TAR_OPT=$(verify_repo_extension "$REPO_DB_FILE")
|
||||||
|
# $LOCKFILE is already guaranteed to be absolute so this is safe
|
||||||
|
dirname=${LOCKFILE%/*}
|
||||||
|
|
||||||
|
filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX}
|
||||||
|
# this ensures we create it on the same filesystem, making moves atomic
|
||||||
|
tempname=$dirname/.tmp.$filename
|
||||||
|
|
||||||
|
pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null
|
||||||
|
if ( shopt -s nullglob; files=(*); (( ${#files[*]} )) ); then
|
||||||
|
bsdtar -c${TAR_OPT}f "$tempname" *
|
||||||
|
else
|
||||||
|
# we have no packages remaining? zip up some emptyness
|
||||||
|
warning "No packages remain, creating empty database."
|
||||||
|
bsdtar -c${TAR_OPT}f "$tempname" -T /dev/null
|
||||||
|
fi
|
||||||
|
popd >/dev/null
|
||||||
|
|
||||||
|
create_signature "$tempname"
|
||||||
|
}
|
||||||
|
|
||||||
|
trap_exit() {
|
||||||
|
# unhook all traps to avoid race conditions
|
||||||
|
trap '' EXIT TERM HUP QUIT INT ERR
|
||||||
|
|
||||||
|
echo
|
||||||
|
error "$@"
|
||||||
|
clean_up 1
|
||||||
|
}
|
||||||
|
|
||||||
|
clean_up() {
|
||||||
|
local exit_code=${1:-$?}
|
||||||
|
|
||||||
|
# unhook all traps to avoid race conditions
|
||||||
|
trap '' EXIT TERM HUP QUIT INT ERR
|
||||||
|
|
||||||
|
[[ -d $tmpdir ]] && rm -rf "$tmpdir"
|
||||||
|
(( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE"
|
||||||
|
|
||||||
|
exit $exit_code
|
||||||
|
}
|
||||||
|
|
||||||
|
# PROGRAM START
|
||||||
|
case $1 in
|
||||||
|
-h|--help) usage; exit 0;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# figure out what program we are
|
||||||
|
cmd=${0##*/}
|
||||||
|
|
||||||
|
if [[ $cmd != "links-add" && $cmd != "links-remove" ]]; then
|
||||||
|
error "Invalid command name '%s' specified." "$cmd"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/repo-tools.XXXXXXXXXX") || (\
|
||||||
|
error "Cannot create temp directory for database building."; \
|
||||||
|
exit 1)
|
||||||
|
|
||||||
|
for repo in "pkg" "${REPO_DB_NAME}"; do
|
||||||
|
mkdir "$tmpdir/$repo"
|
||||||
|
done
|
||||||
|
|
||||||
|
trap 'clean_up' EXIT
|
||||||
|
for signal in TERM HUP QUIT; do
|
||||||
|
trap "trap_exit \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal"
|
||||||
|
done
|
||||||
|
trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT
|
||||||
|
trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR
|
||||||
|
|
||||||
|
declare -a args
|
||||||
|
# parse arguments
|
||||||
|
while (( $# )); do
|
||||||
|
case $1 in
|
||||||
|
-q|--quiet) QUIET=1 ;;
|
||||||
|
-n|--new) ONLYADDNEW=1 ;;
|
||||||
|
-s|--sign) SIGN=1 ;;
|
||||||
|
-k|--key) KEY=1 ; shift; GPGKEY=$1 ;;
|
||||||
|
-v|--verify) VERIFY=1 ;;
|
||||||
|
*) args+=("$1") ;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
REPO_DB_FILE=${args[0]}
|
||||||
|
if [[ -z $REPO_DB_FILE ]]; then
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $REPO_DB_FILE == /* ]]; then
|
||||||
|
LOCKFILE=$REPO_DB_FILE.lck
|
||||||
|
else
|
||||||
|
LOCKFILE=$PWD/$REPO_DB_FILE.lck
|
||||||
|
fi
|
||||||
|
|
||||||
|
verify_repo_extension "$REPO_DB_FILE" >/dev/null
|
||||||
|
|
||||||
|
REPO_DB_PREFIX=${REPO_DB_FILE##*/}
|
||||||
|
REPO_DB_PREFIX=${REPO_DB_PREFIX%.links.*}
|
||||||
|
REPO_DB_SUFFIX=${REPO_DB_FILE##*.links.}
|
||||||
|
|
||||||
|
if (( SIGN || VERIFY )); then
|
||||||
|
check_gpg
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( VERIFY && ${#args[@]} == 1 )); then
|
||||||
|
dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX
|
||||||
|
|
||||||
|
if [[ -f $dbfile ]]; then
|
||||||
|
verify_signature "$dbfile"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
prepare_repo_db
|
||||||
|
|
||||||
|
fail=0
|
||||||
|
for arg in "${args[@]:1}"; do
|
||||||
|
case $cmd in
|
||||||
|
links-add) add "$arg" ;;
|
||||||
|
links-remove) remove "$arg" ;;
|
||||||
|
esac || fail=1
|
||||||
|
done
|
||||||
|
|
||||||
|
# if the whole operation was a success, re-zip and rotate databases
|
||||||
|
if (( !fail )); then
|
||||||
|
msg "Creating updated database file '%s'" "$REPO_DB_FILE"
|
||||||
|
create_db
|
||||||
|
rotate_db
|
||||||
|
else
|
||||||
|
msg "No packages modified, nothing to do."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
@@ -83,9 +83,11 @@ write_pkg_yaml(){
|
|||||||
Yaml=$(write_yaml_header)
|
Yaml=$(write_yaml_header)
|
||||||
|
|
||||||
Yaml+=$(write_empty_line)
|
Yaml+=$(write_empty_line)
|
||||||
|
|
||||||
local ver=$(get_full_version)
|
local full=$(get_full_version)
|
||||||
|
|
||||||
|
local ver=${full:-0}
|
||||||
|
|
||||||
pkgbase=${pkgbase:-${pkgname[0]}}
|
pkgbase=${pkgbase:-${pkgname[0]}}
|
||||||
|
|
||||||
Yaml+=$(write_yaml_map 0 "pkgbase")
|
Yaml+=$(write_yaml_map 0 "pkgbase")
|
||||||
|
@@ -41,6 +41,9 @@
|
|||||||
# default repos root
|
# default repos root
|
||||||
# REPOS_ROOT=${WORKSPACE_DIR}/repos
|
# REPOS_ROOT=${WORKSPACE_DIR}/repos
|
||||||
|
|
||||||
|
# default mirror for sogrep
|
||||||
|
# REPOS_MIRROR="http://mirror1.artixlinux.org/repos"
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
################ artools-iso ################
|
################ artools-iso ################
|
||||||
#############################################
|
#############################################
|
||||||
|
@@ -21,7 +21,7 @@ is_subvolume() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
is_same_fs() {
|
is_same_fs() {
|
||||||
[[ "$(stat -c %d "$1")" == "$(stat -c %d "$1")" ]]
|
[[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
subvolume_delete_recursive() {
|
subvolume_delete_recursive() {
|
||||||
|
@@ -102,6 +102,14 @@ init_artools_pkg(){
|
|||||||
CHROOTS_PKG="${CHROOTS_DIR}/buildpkg"
|
CHROOTS_PKG="${CHROOTS_DIR}/buildpkg"
|
||||||
|
|
||||||
REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
|
REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
|
||||||
|
|
||||||
|
REPOS_MIRROR=${REPOS_MIRROR:-'http://mirror1.artixlinux.org/repos'}
|
||||||
|
|
||||||
|
DBEXT=${DBEXT:-'xz'}
|
||||||
|
|
||||||
|
LINKSDBEXT=${LINKSDBEXT:-"links.tar.${DBEXT}"}
|
||||||
|
|
||||||
|
PKGDBEXT=${PKGDBEXT:-"db.tar.${DBEXT}"}
|
||||||
}
|
}
|
||||||
|
|
||||||
init_artools_iso(){
|
init_artools_iso(){
|
||||||
@@ -167,6 +175,8 @@ load_user_info(){
|
|||||||
|
|
||||||
USERCONFDIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}"
|
USERCONFDIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}"
|
||||||
prepare_dir "${USERCONFDIR}"
|
prepare_dir "${USERCONFDIR}"
|
||||||
|
|
||||||
|
USERCACHEDIR="${XDG_CACHE_HOME:-$USER_HOME/.cache}/artools"
|
||||||
}
|
}
|
||||||
|
|
||||||
# orig_argv=("$0" "$@")
|
# orig_argv=("$0" "$@")
|
||||||
|
@@ -136,12 +136,24 @@ write_servicescfg_conf(){
|
|||||||
printf '%s' "${yaml}"
|
printf '%s' "${yaml}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
write_unpackfs_conf(){
|
||||||
|
local yaml=$(write_yaml_header)
|
||||||
|
yaml+=$(write_empty_line)
|
||||||
|
yaml+=$(write_yaml_map 0 'unpack')
|
||||||
|
yaml+=$(write_yaml_seq_map 2 'source' "/run/artix/bootmnt/artix/x86_64/rootfs.sfs")
|
||||||
|
yaml+=$(write_yaml_map 4 'sourcefs' 'squashfs')
|
||||||
|
yaml+=$(write_yaml_map 4 'destination' '')
|
||||||
|
yaml+=$(write_empty_line)
|
||||||
|
printf '%s' "${yaml}"
|
||||||
|
}
|
||||||
|
|
||||||
configure_calamares(){
|
configure_calamares(){
|
||||||
local mods="$1/etc/calamares/modules"
|
local mods="$1/etc/calamares/modules"
|
||||||
if [[ -d "$mods" ]];then
|
if [[ -d "$mods" ]];then
|
||||||
msg2 "Configuring Calamares"
|
msg2 "Configuring Calamares"
|
||||||
write_users_conf > "$mods"/users.conf
|
write_users_conf > "$mods"/users.conf
|
||||||
write_servicescfg_conf > "$mods"/services-"${INITSYS}".conf
|
write_servicescfg_conf > "$mods"/services-"${INITSYS}".conf
|
||||||
|
[[ -z ${DESKTOP_LIST} ]] && write_unpackfs_conf > "$mods"/unpackfs.conf
|
||||||
sed -e "s|openrc|${INITSYS}|" -i "$mods"/postcfg.conf
|
sed -e "s|openrc|${INITSYS}|" -i "$mods"/postcfg.conf
|
||||||
sed -e "s|services-openrc|services-${INITSYS}|" -i "$1"/etc/calamares/settings.conf
|
sed -e "s|services-openrc|services-${INITSYS}|" -i "$1"/etc/calamares/settings.conf
|
||||||
fi
|
fi
|
||||||
|
@@ -69,6 +69,25 @@ patch_pkg(){
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
arch2artix(){
|
||||||
|
local repo="$1" artix=none
|
||||||
|
case "$repo" in
|
||||||
|
core) artix=system ;;
|
||||||
|
extra) artix=world ;;
|
||||||
|
community) artix=galaxy ;;
|
||||||
|
multilib) artix=lib32 ;;
|
||||||
|
staging) artix=goblins ;;
|
||||||
|
testing) artix=gremlins ;;
|
||||||
|
community-staging) artix=galaxy-goblins ;;
|
||||||
|
community-testing) artix=galaxy-gremlins ;;
|
||||||
|
multilib-staging) artix=lib32-goblins ;;
|
||||||
|
multilib-testing) artix=lib32-gremlins ;;
|
||||||
|
kde-unstable) artix=kde-wobble ;;
|
||||||
|
gnome-unstable) artix=gnome-wobble ;;
|
||||||
|
esac
|
||||||
|
echo $artix
|
||||||
|
}
|
||||||
|
|
||||||
find_tree(){
|
find_tree(){
|
||||||
local tree="$1" pkg="$2"
|
local tree="$1" pkg="$2"
|
||||||
local result=$(find $tree -mindepth 2 -maxdepth 2 -type d -name "$pkg")
|
local result=$(find $tree -mindepth 2 -maxdepth 2 -type d -name "$pkg")
|
||||||
@@ -76,20 +95,37 @@ find_tree(){
|
|||||||
echo ${result##*/}
|
echo ${result##*/}
|
||||||
}
|
}
|
||||||
|
|
||||||
find_repo(){
|
arch_repos(){
|
||||||
local pkg="$1" stag="$2" unst="$3" repo=
|
local stag="$1" unst="$2"
|
||||||
local repos=(core extra testing community community-testing multilib multilib-testing)
|
local repos=(core extra testing community community-testing multilib multilib-testing)
|
||||||
|
|
||||||
$stag && repos+=(staging community-staging multilib-staging)
|
$stag && repos+=(staging community-staging multilib-staging)
|
||||||
$unst && repos+=(gnome-unstable kde-unstable)
|
$unst && repos+=(gnome-unstable kde-unstable)
|
||||||
|
|
||||||
for r in ${repos[@]};do
|
echo ${repos[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
find_repo(){
|
||||||
|
local pkg="$1" stag="$2" unst="$3" repo=
|
||||||
|
|
||||||
|
for r in $(arch_repos "$stag" "$unst");do
|
||||||
[[ -f $pkg/repos/$r-x86_64/PKGBUILD ]] && repo=$r-x86_64
|
[[ -f $pkg/repos/$r-x86_64/PKGBUILD ]] && repo=$r-x86_64
|
||||||
[[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=$r-any
|
[[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=$r-any
|
||||||
done
|
done
|
||||||
echo $repo
|
echo $repo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_valid_repo(){
|
||||||
|
local src="$1" cases=
|
||||||
|
for r in $(arch_repos true true);do
|
||||||
|
cases=${cases:-}${cases:+|}${r}
|
||||||
|
done
|
||||||
|
eval "case $src in
|
||||||
|
${cases}|trunk) return 0 ;;
|
||||||
|
*) return 1 ;;
|
||||||
|
esac"
|
||||||
|
}
|
||||||
|
|
||||||
get_cases(){
|
get_cases(){
|
||||||
local pkglist="${DATADIR}/pkglists/$1.list"
|
local pkglist="${DATADIR}/pkglists/$1.list"
|
||||||
local _space="s| ||g" _clean=':a;N;$!ba;s/\n/ /g' _com_rm="s|#.*||g"
|
local _space="s| ||g" _clean=':a;N;$!ba;s/\n/ /g' _com_rm="s|#.*||g"
|
||||||
@@ -122,13 +158,13 @@ get_artix_tree(){
|
|||||||
# $(get_cases freedesktop)) tree=packages-desktop ;;
|
# $(get_cases freedesktop)) tree=packages-desktop ;;
|
||||||
# $(get_cases kde)) tree=packages-kde ;;
|
# $(get_cases kde)) tree=packages-kde ;;
|
||||||
# $(get_cases gnome)) tree=packages-gnome ;;
|
# $(get_cases gnome)) tree=packages-gnome ;;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get_import_path(){
|
get_import_path(){
|
||||||
local pkg="$1" import_path=
|
local pkg="$1" import_path=
|
||||||
for tree in ${TREE_NAMES_ARCH[@]};do
|
for tree in ${TREE_NAMES_ARCH[@]};do
|
||||||
[[ -d ${TREE_DIR_ARCH}/$tree/$pkg ]] && import_path=${TREE_DIR_ARCH}/$tree/$pkg
|
[[ -d ${TREE_DIR_ARCH}/$tree/$pkg/repos ]] && import_path=${TREE_DIR_ARCH}/$tree/$pkg
|
||||||
done
|
done
|
||||||
echo $import_path
|
echo $import_path
|
||||||
}
|
}
|
||||||
@@ -143,14 +179,6 @@ pkgver_equal() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
is_valid_repo(){
|
|
||||||
local src="$1"
|
|
||||||
case $src in
|
|
||||||
core|extra|community|multilib|testing|staging|community-testing|community-staging|multilib-testing|multilib-staging|trunk) return 0 ;;
|
|
||||||
*) return 1 ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
find_cached_package() {
|
find_cached_package() {
|
||||||
local searchdirs=("$PKGDEST" "$PWD") results=()
|
local searchdirs=("$PKGDEST" "$PWD") results=()
|
||||||
local targetname=$1 targetver=$2 targetarch=$3
|
local targetname=$1 targetver=$2 targetarch=$3
|
||||||
|
Reference in New Issue
Block a user