Compare commits
38 Commits
Author | SHA1 | Date | |
---|---|---|---|
d8195e2288 | |||
bfe9130cfb | |||
8873a71824 | |||
bb86a05f2f | |||
bd611c1af2 | |||
f4e8f703ea | |||
aa83bc79bb | |||
1bb9687ece
|
|||
48ced03735 | |||
0437e66091 | |||
9af6d02dea | |||
685992cca3 | |||
816e13895f | |||
6a3f48f181 | |||
b4d9195c03 | |||
0123e6d044 | |||
e2b2a21ed1 | |||
0e2e2875db | |||
a4d006adef | |||
98926fbdd0 | |||
a1a2289e18 | |||
057cbf1691 | |||
0b05cbeba1 | |||
ed5dad3066 | |||
76cce316a2 | |||
7c152b4f60 | |||
79c831c616 | |||
6b27c82b86 | |||
2cc5047dda | |||
08ab8c2137 | |||
9ddd962c2c | |||
a8c07bd7f3 | |||
1fcf78bb47 | |||
167265944d | |||
7ef931026e | |||
bef2a0b3fa | |||
8d6f12f5a9 | |||
bf6fc3fcff |
13
Makefile
13
Makefile
@@ -1,4 +1,4 @@
|
|||||||
VERSION=0.12
|
VERSION=0.14
|
||||||
|
|
||||||
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 \
|
||||||
@@ -87,9 +85,6 @@ LN_DEPLOYPKG = \
|
|||||||
PKG_LIBS = \
|
PKG_LIBS = \
|
||||||
$(wildcard lib/pkg/*)
|
$(wildcard lib/pkg/*)
|
||||||
|
|
||||||
PKG_LISTS = \
|
|
||||||
$(wildcard data/pkglists/*.list)
|
|
||||||
|
|
||||||
PKG_UTIL = lib/util-pkg.sh
|
PKG_UTIL = lib/util-pkg.sh
|
||||||
|
|
||||||
PKG_DATA = \
|
PKG_DATA = \
|
||||||
@@ -169,7 +164,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
|
||||||
@@ -185,8 +180,6 @@ install_pkg:
|
|||||||
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
|
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
|
||||||
install $(FILEMODE) $(PATCHES) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
|
install $(FILEMODE) $(PATCHES) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
|
||||||
|
|
||||||
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/pkglists
|
|
||||||
install $(FILEMODE) $(PKG_LISTS) $(DESTDIR)$(DATADIR)/$(TOOLS)/pkglists
|
|
||||||
install_cpio:
|
install_cpio:
|
||||||
+make CPIODIR=$(CPIODIR) DESTDIR=$(DESTDIR) -C initcpio install
|
+make CPIODIR=$(CPIODIR) DESTDIR=$(DESTDIR) -C initcpio install
|
||||||
|
|
||||||
|
@@ -78,7 +78,7 @@ from_arch(){
|
|||||||
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "$pkg"
|
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "$pkg"
|
||||||
|
|
||||||
local package=${TREE_DIR_ARCH}/$git_tree_arch/$pkg
|
local package=${TREE_DIR_ARCH}/$git_tree_arch/$pkg
|
||||||
local repo=$(find_repo "$package")
|
local repo=$(find_repo "$package" "${staging}" "${unstable}")
|
||||||
|
|
||||||
src=$package/repos/$repo
|
src=$package/repos/$repo
|
||||||
|
|
||||||
@@ -114,7 +114,7 @@ view_build(){
|
|||||||
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "$pkg"
|
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "$pkg"
|
||||||
|
|
||||||
local pkg_path=${TREE_DIR_ARCH}/$git_tree_arch/$pkg
|
local pkg_path=${TREE_DIR_ARCH}/$git_tree_arch/$pkg
|
||||||
local repo=$(find_repo "$pkg_path")
|
local repo=$(find_repo "$pkg_path" "${staging}" "${unstable}")
|
||||||
|
|
||||||
src=$pkg_path/repos/$repo
|
src=$pkg_path/repos/$repo
|
||||||
|
|
||||||
@@ -139,6 +139,8 @@ import=false
|
|||||||
view=false
|
view=false
|
||||||
createnew=false
|
createnew=false
|
||||||
conf=false
|
conf=false
|
||||||
|
unstable=false
|
||||||
|
staging=true
|
||||||
|
|
||||||
PACKAGE=''
|
PACKAGE=''
|
||||||
|
|
||||||
@@ -157,6 +159,8 @@ usage() {
|
|||||||
echo " -y Don't clone or pull artix repos"
|
echo " -y Don't clone or pull artix repos"
|
||||||
echo ' -i Import a package from arch repos'
|
echo ' -i Import a package from arch repos'
|
||||||
echo ' -n Make new remote subrepo and clone it'
|
echo ' -n Make new remote subrepo and clone it'
|
||||||
|
echo ' -u Include kde & gnome unstable (only with -i)'
|
||||||
|
echo ' -w Exclude staging (only with -i)'
|
||||||
echo ' -v View package depends'
|
echo ' -v View package depends'
|
||||||
echo ' -h This help'
|
echo ' -h This help'
|
||||||
echo ''
|
echo ''
|
||||||
@@ -166,7 +170,7 @@ usage() {
|
|||||||
|
|
||||||
orig_argv=("$0" "$@")
|
orig_argv=("$0" "$@")
|
||||||
|
|
||||||
opts='p:t:g:sinzyvh'
|
opts='p:t:g:uwsinzyvh'
|
||||||
|
|
||||||
while getopts "${opts}" arg; do
|
while getopts "${opts}" arg; do
|
||||||
case "${arg}" in
|
case "${arg}" in
|
||||||
@@ -178,6 +182,8 @@ while getopts "${opts}" arg; do
|
|||||||
y) sync_artix=false ;;
|
y) sync_artix=false ;;
|
||||||
i) import=true ;;
|
i) import=true ;;
|
||||||
n) createnew=true ;;
|
n) createnew=true ;;
|
||||||
|
w) staging=false ;;
|
||||||
|
u) unstable=true ;;
|
||||||
v) view=true ;;
|
v) view=true ;;
|
||||||
h|?) usage 0 ;;
|
h|?) usage 0 ;;
|
||||||
*) echo "invalid argument '${arg}'"; usage 1 ;;
|
*) echo "invalid argument '${arg}'"; usage 1 ;;
|
||||||
|
@@ -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,6 +15,22 @@
|
|||||||
. @libdir@/artools/util-base.sh
|
. @libdir@/artools/util-base.sh
|
||||||
. @libdir@/artools/util-pkg.sh
|
. @libdir@/artools/util-pkg.sh
|
||||||
|
|
||||||
|
get_path(){
|
||||||
|
local repo="$1" pkg=trunk/PKGBUILD
|
||||||
|
if [[ $repo != trunk ]]; then
|
||||||
|
[[ -f repos/$repo-${ARCH}/PKGBUILD ]] && pkg=repos/$repo-${ARCH}/PKGBUILD
|
||||||
|
[[ -f repos/$repo-any/PKGBUILD ]] && pkg=repos/$repo-any/PKGBUILD
|
||||||
|
fi
|
||||||
|
echo $pkg
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare_commit(){
|
||||||
|
local dest="$1"
|
||||||
|
[[ -d repos/$dest ]] && git rm -r repos/$dest
|
||||||
|
[[ ! -d repos ]] && mkdir repos
|
||||||
|
[[ ! -d repos/$dest ]] && mkdir repos/$dest
|
||||||
|
}
|
||||||
|
|
||||||
commit_pkg(){
|
commit_pkg(){
|
||||||
local git_tree=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}")
|
local git_tree=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}")
|
||||||
if [[ -n ${git_tree} ]];then
|
if [[ -n ${git_tree} ]];then
|
||||||
@@ -25,9 +41,13 @@ commit_pkg(){
|
|||||||
|
|
||||||
cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE}
|
cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE}
|
||||||
|
|
||||||
. trunk/PKGBUILD
|
local pkgbuild=$(get_path "${REPO_SRC}")
|
||||||
|
|
||||||
|
. $pkgbuild
|
||||||
[[ $arch == 'any' ]] && CARCH=any
|
[[ $arch == 'any' ]] && CARCH=any
|
||||||
local ver=$(get_full_version "${PACKAGE}")
|
|
||||||
|
local version=$(get_full_version)
|
||||||
|
|
||||||
local commit_msg=""
|
local commit_msg=""
|
||||||
|
|
||||||
if ${remove};then
|
if ${remove};then
|
||||||
@@ -36,14 +56,14 @@ commit_pkg(){
|
|||||||
local pkg=${PACKAGE}
|
local pkg=${PACKAGE}
|
||||||
git rm -r trunk
|
git rm -r trunk
|
||||||
else
|
else
|
||||||
local pkg="${PACKAGE}-$ver"
|
local pkg="${PACKAGE}-$version"
|
||||||
git rm -r repos/"${REPO_SRC}-$CARCH"
|
git rm -r repos/"${REPO_SRC}-$CARCH"
|
||||||
fi
|
fi
|
||||||
commit_msg="[${REPO_SRC}] '$pkg' ${action}"
|
commit_msg="[${REPO_SRC}] '$pkg' ${action}"
|
||||||
msg "Action: %s" "$commit_msg"
|
msg "Action: %s" "$commit_msg"
|
||||||
else
|
else
|
||||||
local action='modify'
|
local action='modify'
|
||||||
commit_msg="[${REPO_SRC}] '${PACKAGE}-$ver' ${action}"
|
commit_msg="[${REPO_SRC}] '${PACKAGE}-$version' ${action}"
|
||||||
msg "Action: %s" "$commit_msg"
|
msg "Action: %s" "$commit_msg"
|
||||||
git add .
|
git add .
|
||||||
|
|
||||||
@@ -76,17 +96,18 @@ symlink_commit_pkg(){
|
|||||||
|
|
||||||
cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE}
|
cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE}
|
||||||
|
|
||||||
. trunk/PKGBUILD
|
local pkgbuild=$(get_path "${REPO_SRC}")
|
||||||
|
|
||||||
|
. $pkgbuild
|
||||||
[[ $arch == 'any' ]] && CARCH=any
|
[[ $arch == 'any' ]] && CARCH=any
|
||||||
local ver=$(get_full_version "${PACKAGE}")
|
|
||||||
|
local version=$(get_full_version)
|
||||||
|
|
||||||
if [[ ${REPO_SRC} == 'trunk' ]];then
|
if [[ ${REPO_SRC} == 'trunk' ]];then
|
||||||
local action='add'
|
local action='add'
|
||||||
local dest="${REPO_DEST}-$CARCH"
|
local dest="${REPO_DEST}-$CARCH"
|
||||||
|
|
||||||
[[ -d repos/$dest ]] && git rm -r repos/$dest
|
prepare_commit "$dest"
|
||||||
[[ ! -d repos ]] && mkdir repos
|
|
||||||
[[ ! -d repos/$dest ]] && mkdir repos/$dest
|
|
||||||
|
|
||||||
cp trunk/* repos/$dest/
|
cp trunk/* repos/$dest/
|
||||||
else
|
else
|
||||||
@@ -94,14 +115,12 @@ symlink_commit_pkg(){
|
|||||||
local src="${REPO_SRC}-$CARCH" dest="${REPO_DEST}-$CARCH"
|
local src="${REPO_SRC}-$CARCH" dest="${REPO_DEST}-$CARCH"
|
||||||
|
|
||||||
[[ ! -f repos/$src/PKGBUILD ]] && die "%s does not exist!" "repos/$src/PKGBUILD"
|
[[ ! -f repos/$src/PKGBUILD ]] && die "%s does not exist!" "repos/$src/PKGBUILD"
|
||||||
[[ -d repos/$dest ]] && git rm -r repos/$dest
|
prepare_commit "$dest"
|
||||||
[[ ! -d repos ]] && mkdir repos
|
|
||||||
[[ ! -d repos/$dest ]] && mkdir repos/$dest
|
|
||||||
|
|
||||||
cp repos/$src/* repos/$dest/
|
cp repos/$src/* repos/$dest/
|
||||||
git rm -r repos/$src
|
git rm -r repos/$src
|
||||||
fi
|
fi
|
||||||
local commit_msg="[${REPO_SRC}] -> [${REPO_DEST}] '${PACKAGE}-$ver' ${action}"
|
local commit_msg="[${REPO_SRC}] -> [${REPO_DEST}] '${PACKAGE}-$version' ${action}"
|
||||||
msg "Action: %s" "$commit_msg"
|
msg "Action: %s" "$commit_msg"
|
||||||
|
|
||||||
git add .
|
git add .
|
||||||
|
@@ -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" group="$2"
|
||||||
|
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 "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "$group"
|
||||||
|
else
|
||||||
|
msg_row_notify "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "$group"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif ${upgrades};then
|
||||||
|
|
||||||
|
if [ $result -eq -1 ];then
|
||||||
|
msg_row_upgrade "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "$group"
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif ${downgrades};then
|
||||||
|
|
||||||
|
if [ $result -eq 1 ];then
|
||||||
|
if [[ -n $archver ]] && [[ -n $archrepo ]];then
|
||||||
|
msg_row_downgrade "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "$group"
|
||||||
|
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 "${table2}" "$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 "${table3}" "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 "${table3}" "${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 "${table2}" "Repo" "Package" "Version" "Database"
|
||||||
|
elif ${query};then
|
||||||
|
${sync} && update_db_cache
|
||||||
|
query_db
|
||||||
|
else
|
||||||
|
msg_table_header "${table}" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version" "Group"
|
||||||
|
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" "$tree"
|
||||||
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,35 @@ 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'
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly table="%-20s %-20s %-25s %-25s %-25s %-20s"
|
||||||
|
readonly table2="%-20s %-35s %-20s %-10s"
|
||||||
|
readonly table3="%-20s %-45s %s"
|
||||||
|
|
||||||
|
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 +224,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 +233,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 +244,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")
|
||||||
|
@@ -25,11 +25,19 @@
|
|||||||
# packages-kernel
|
# packages-kernel
|
||||||
# packages-openrc
|
# packages-openrc
|
||||||
# packages-runit
|
# packages-runit
|
||||||
|
# packages-media
|
||||||
# packages-xorg
|
# packages-xorg
|
||||||
# packages-python
|
# packages-python
|
||||||
# packages-perl
|
# packages-perl
|
||||||
# packages-qt5
|
# packages-qt5
|
||||||
|
# packages-devel
|
||||||
# packages-ruby
|
# packages-ruby
|
||||||
|
# packages-gtk
|
||||||
|
# packages-gnome
|
||||||
|
# packages-cinnamon
|
||||||
|
# packages-lxqt
|
||||||
|
# packages-mate
|
||||||
|
# packages-kde
|
||||||
# )
|
# )
|
||||||
|
|
||||||
# HOST_TREE_ARCH=git://git.archlinux.org/svntogit
|
# HOST_TREE_ARCH=git://git.archlinux.org/svntogit
|
||||||
@@ -41,6 +49,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 ################
|
||||||
#############################################
|
#############################################
|
||||||
|
@@ -1,63 +0,0 @@
|
|||||||
accountsservice
|
|
||||||
cairo
|
|
||||||
colord
|
|
||||||
cppunit
|
|
||||||
dbus
|
|
||||||
dbus-glib
|
|
||||||
dbus-python
|
|
||||||
desktop-file-utils
|
|
||||||
fontconfig
|
|
||||||
geoclue2
|
|
||||||
glu
|
|
||||||
gst-plugins-bad
|
|
||||||
gst-plugins-base
|
|
||||||
gst-plugins-good
|
|
||||||
gst-plugins-ugly
|
|
||||||
gstreamer
|
|
||||||
harfbuzz
|
|
||||||
hicolor-icon-theme
|
|
||||||
libatasmart
|
|
||||||
libbsd
|
|
||||||
libdrm
|
|
||||||
libevdev
|
|
||||||
libinput
|
|
||||||
libmbim
|
|
||||||
libnice
|
|
||||||
libqmi
|
|
||||||
libvdpau
|
|
||||||
libxcb
|
|
||||||
libxft
|
|
||||||
libxi
|
|
||||||
media-player-info
|
|
||||||
mesa
|
|
||||||
modemmanager
|
|
||||||
networkmanager
|
|
||||||
orc
|
|
||||||
p11-kit
|
|
||||||
polkit
|
|
||||||
poppler
|
|
||||||
poppler-data
|
|
||||||
pulseaudio
|
|
||||||
pyxdg
|
|
||||||
r
|
|
||||||
sdl
|
|
||||||
shared-mime-info
|
|
||||||
sound-theme-freedesktop
|
|
||||||
startup-notification
|
|
||||||
systemdcompat
|
|
||||||
telepathy-glib
|
|
||||||
ttf-dejavu
|
|
||||||
udisks2
|
|
||||||
upower
|
|
||||||
wayland
|
|
||||||
wayland-protocols
|
|
||||||
webrtc-audio-processing
|
|
||||||
xcb-proto
|
|
||||||
xcb-util
|
|
||||||
xcb-util-cursor
|
|
||||||
xcb-util-image
|
|
||||||
xcb-util-keysyms
|
|
||||||
xcb-util-renderutil
|
|
||||||
xcb-util-wm
|
|
||||||
xdg-user-dirs
|
|
||||||
xdg-utils
|
|
@@ -1,63 +0,0 @@
|
|||||||
adwaita-icon-theme
|
|
||||||
atk
|
|
||||||
at-spi2-atk
|
|
||||||
at-spi2-core
|
|
||||||
babl
|
|
||||||
cantarell-fonts
|
|
||||||
cogl
|
|
||||||
dconf
|
|
||||||
flatpak
|
|
||||||
gamin
|
|
||||||
gcab
|
|
||||||
gconf
|
|
||||||
gcr
|
|
||||||
gdk-pixbuf2
|
|
||||||
gegl02
|
|
||||||
git
|
|
||||||
glade
|
|
||||||
glib2
|
|
||||||
glib-networking
|
|
||||||
gnome-common
|
|
||||||
gnome-keyring
|
|
||||||
gobject-introspection
|
|
||||||
gsettings-desktop-schemas
|
|
||||||
gssdp
|
|
||||||
gtk2
|
|
||||||
gtk3
|
|
||||||
gtk-doc
|
|
||||||
gtksourceview3
|
|
||||||
gupnp
|
|
||||||
gupnp-igd
|
|
||||||
gvfs
|
|
||||||
json-glib
|
|
||||||
libcloudproviders
|
|
||||||
libcroco
|
|
||||||
libgee
|
|
||||||
libglade
|
|
||||||
libgnome-keyring
|
|
||||||
libgudev
|
|
||||||
libnotify
|
|
||||||
librsvg
|
|
||||||
libsecret
|
|
||||||
libsoup
|
|
||||||
libxml2
|
|
||||||
libxslt
|
|
||||||
meld
|
|
||||||
mobile-broadband-provider-info
|
|
||||||
modemmanager
|
|
||||||
networkmanager
|
|
||||||
network-manager-applet
|
|
||||||
orca
|
|
||||||
ostree
|
|
||||||
pango
|
|
||||||
pyatspi
|
|
||||||
pygobject
|
|
||||||
pygobject2
|
|
||||||
pygtk
|
|
||||||
rest
|
|
||||||
ttf-bitstream-vera
|
|
||||||
vala
|
|
||||||
vte
|
|
||||||
vte3
|
|
||||||
yelp-tools
|
|
||||||
yelp-xsl
|
|
@@ -1,4 +0,0 @@
|
|||||||
phonon-gstreamer
|
|
||||||
polkit-qt
|
|
||||||
extra-cmake-modules
|
|
||||||
phonon
|
|
@@ -1,17 +0,0 @@
|
|||||||
linux
|
|
||||||
nvidia
|
|
||||||
nvidia-utils
|
|
||||||
acpi_call
|
|
||||||
bbswitch
|
|
||||||
broadcom-wl
|
|
||||||
tp_smapi
|
|
||||||
r8168
|
|
||||||
virtualbox-modules-artix
|
|
||||||
linux-lts
|
|
||||||
nvidia-lts
|
|
||||||
acpi_call-lts
|
|
||||||
bbswitch-lts
|
|
||||||
broadcom-wl-lts
|
|
||||||
tp_smapi-lts
|
|
||||||
r8168-lts
|
|
||||||
linux-firmware
|
|
@@ -1,31 +0,0 @@
|
|||||||
lxqt-about
|
|
||||||
lxqt-admin
|
|
||||||
lxqt-config
|
|
||||||
lxqt-globalkeys
|
|
||||||
lxqt-notificationd
|
|
||||||
lxqt-openssh-askpass
|
|
||||||
lxqt-panel
|
|
||||||
lxqt-policykit
|
|
||||||
lxqt-powermanagement
|
|
||||||
lxqt-qtplugin
|
|
||||||
lxqt-runner
|
|
||||||
lxqt-session
|
|
||||||
lxqt-sudo
|
|
||||||
lxqt-themes
|
|
||||||
lxqt-build-tools
|
|
||||||
|
|
||||||
compton-conf
|
|
||||||
lximage-qt
|
|
||||||
obconf-qt
|
|
||||||
openbox
|
|
||||||
pcmanfm-qt
|
|
||||||
qterminal
|
|
||||||
liblxqt
|
|
||||||
libqtxdg
|
|
||||||
lxmenu-data
|
|
||||||
libfm-qt
|
|
||||||
libfm
|
|
||||||
qtermwidget
|
|
||||||
libsysstat
|
|
||||||
libstatgrab
|
|
||||||
qps
|
|
@@ -1,37 +0,0 @@
|
|||||||
libdmx
|
|
||||||
libfontenc
|
|
||||||
libice
|
|
||||||
libpciaccess
|
|
||||||
libsm
|
|
||||||
libx11
|
|
||||||
libxau
|
|
||||||
libxaw
|
|
||||||
libxcomposite
|
|
||||||
libxcursor
|
|
||||||
libxdamage
|
|
||||||
libxdmcp
|
|
||||||
libxext
|
|
||||||
libxfixes
|
|
||||||
libxfont2
|
|
||||||
libxi|libxft
|
|
||||||
libxinerama
|
|
||||||
libxkbfile
|
|
||||||
libxkbui
|
|
||||||
libxmu
|
|
||||||
libxpm
|
|
||||||
libxrandr
|
|
||||||
libxrender
|
|
||||||
libxres
|
|
||||||
libxshmfence
|
|
||||||
libxss
|
|
||||||
libxt
|
|
||||||
libxtst
|
|
||||||
libxv
|
|
||||||
libxvmc
|
|
||||||
libxxf86vm
|
|
||||||
pixman
|
|
||||||
xbitmaps
|
|
||||||
xkeyboard-config
|
|
||||||
xorgproto
|
|
||||||
xterm
|
|
||||||
xtrans
|
|
@@ -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() {
|
||||||
|
@@ -76,19 +76,23 @@ init_artools_pkg(){
|
|||||||
|
|
||||||
[[ -z ${TREE_NAMES_ARTIX[@]} ]] && \
|
[[ -z ${TREE_NAMES_ARTIX[@]} ]] && \
|
||||||
TREE_NAMES_ARTIX=(
|
TREE_NAMES_ARTIX=(
|
||||||
packages
|
packages
|
||||||
community
|
community
|
||||||
packages-kernel
|
packages-kernel
|
||||||
packages-openrc
|
packages-openrc
|
||||||
packages-runit
|
packages-runit
|
||||||
packages-xorg
|
packages-xorg
|
||||||
packages-python
|
packages-python
|
||||||
packages-perl
|
packages-perl
|
||||||
packages-qt5
|
packages-qt5
|
||||||
packages-ruby
|
packages-devel
|
||||||
# packages-desktop
|
packages-ruby
|
||||||
# packages-kde
|
packages-gtk
|
||||||
# packages-gnome
|
packages-gnome
|
||||||
|
packages-cinnamon
|
||||||
|
packages-lxqt
|
||||||
|
packages-mate
|
||||||
|
packages-kde
|
||||||
)
|
)
|
||||||
|
|
||||||
HOST_TREE_ARTIX=${HOST_TREE_ARTIX:-"gitea@${GIT_DOMAIN}:artixlinux"}
|
HOST_TREE_ARTIX=${HOST_TREE_ARTIX:-"gitea@${GIT_DOMAIN}:artixlinux"}
|
||||||
@@ -102,6 +106,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 +179,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
|
||||||
|
@@ -23,14 +23,12 @@ get_remote_head(){
|
|||||||
get_pkg_org(){
|
get_pkg_org(){
|
||||||
local pkg="$1" org= sub=
|
local pkg="$1" org= sub=
|
||||||
case ${pkg} in
|
case ${pkg} in
|
||||||
ruby-*) org=${pkg:0:6}; sub="${org:5}"; echo "packagesRuby" ;;
|
ruby-*) org="packagesRuby" ;;
|
||||||
perl-*) org=${pkg:0:6}; sub="${org:5}"; echo "packagesPerl" ;;
|
perl-*) org="packagesPerl" ;;
|
||||||
python-*) org=${pkg:0:8}; sub="${org:7}"; echo "packagesPython" ;;
|
python-*|python2-*) org="packagesPython" ;;
|
||||||
python2-*) org=${pkg:0:9}; sub="${org:8}"; echo "packagesPython" ;;
|
*) sub=${pkg:0:1}; org="packages${sub^^}" ;;
|
||||||
lib32*) org=${pkg:0:7}; sub="${org:6}"; echo "packagesL" ;; #"packages${sub^^}" ;;
|
|
||||||
# lib*) org=${pkg:0:4}; sub="${org:3}"; echo "packagesLib${sub^^}" ;;
|
|
||||||
*) org=${pkg:0:1}; echo "packages${org^^}" ;;
|
|
||||||
esac
|
esac
|
||||||
|
echo $org
|
||||||
}
|
}
|
||||||
|
|
||||||
subrepo_push(){
|
subrepo_push(){
|
||||||
|
@@ -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,22 +95,40 @@ 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="${SYSCONFDIR}/pkglist.d/$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"
|
||||||
|
|
||||||
local pkgs=($(sed "$_com_rm" "$pkglist" | sed "$_space" | sed "$_clean"))
|
local pkgs=($(sed "$_com_rm" "$pkglist" | sed "$_space" | sed "$_clean"))
|
||||||
@@ -107,28 +144,30 @@ get_artix_tree(){
|
|||||||
local pkg="$1" artix_tree="${2:-$3}" tree
|
local pkg="$1" artix_tree="${2:-$3}" tree
|
||||||
eval "case $pkg in
|
eval "case $pkg in
|
||||||
$(get_cases kernel)) tree=packages-kernel ;;
|
$(get_cases kernel)) tree=packages-kernel ;;
|
||||||
python-*|python2-*) tree=packages-python ;;
|
$(get_cases python)) tree=packages-python ;;
|
||||||
perl-*) tree=packages-perl ;;
|
$(get_cases perl)) tree=packages-perl ;;
|
||||||
ruby-*) tree=packages-ruby ;;
|
$(get_cases ruby)) tree=packages-ruby ;;
|
||||||
xorg*|xf86*|$(get_cases xorg)) tree=packages-xorg ;;
|
$(get_cases openrc)) tree=packages-openrc ;;
|
||||||
*-openrc) tree=packages-openrc ;;
|
$(get_cases runit)) tree=packages-runit ;;
|
||||||
*-runit) tree=packages-runit ;;
|
$(get_cases media)) tree=packages-media ;;
|
||||||
qt5-*) tree=packages-qt5 ;;
|
$(get_cases xorg)) tree=packages-xorg ;;
|
||||||
lxqt*|$(get_cases lxqt)) tree=packages-lxqt ;;
|
$(get_cases qt5)) tree=packages-qt5 ;;
|
||||||
|
$(get_cases gtk)) tree=packages-gtk ;;
|
||||||
|
$(get_cases devel)) tree=packages-devel ;;
|
||||||
|
$(get_cases lxqt)) tree=packages-lxqt ;;
|
||||||
|
$(get_cases cinnamon)) tree=packages-cinnamon ;;
|
||||||
|
$(get_cases kde)) tree=packages-kde ;;
|
||||||
|
$(get_cases gnome)) tree=packages-gnome ;;
|
||||||
|
$(get_cases mate)) tree=packages-mate ;;
|
||||||
*) tree=$artix_tree
|
*) tree=$artix_tree
|
||||||
esac"
|
esac"
|
||||||
echo $tree
|
echo $tree
|
||||||
|
|
||||||
# $(get_cases freedesktop)) tree=packages-desktop ;;
|
|
||||||
# $(get_cases kde)) tree=packages-kde ;;
|
|
||||||
# $(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 +182,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