Compare commits

...

15 Commits

Author SHA1 Message Date
6787d5fafb merge branch 'artixpkg' 2023-05-25 20:57:42 +02:00
2a0c08e34b artixpkg git: fix config help examples 2023-05-25 17:02:57 +02:00
b48b056194 merge branch 'arch-patches' 2023-05-24 21:30:43 +02:00
50b71dfb55 artixpkg: add special rebuild repo names 2023-05-24 16:02:20 +02:00
f8075b7bd4 artixpkg: fix more help examples 2023-05-23 21:53:02 +02:00
0912e6f74a artixpkg: update all help 2023-05-22 23:31:01 +02:00
9af4fe14f2 artixpkg: fix repo help examples 2023-05-22 23:25:23 +02:00
943350f4ec artixpkg: fix repo help cmd 2023-05-22 23:17:08 +02:00
e8075e436d merge branch 'bug-fixes' 2023-05-22 22:49:35 +02:00
48804b67f1 artixpkg git: fix redirection 2023-05-22 22:22:47 +02:00
cf60c6f544 artixpkg repo import: fix typo 2023-05-22 17:38:16 +02:00
e39aeb62ca merge branch 'import' 2023-05-22 17:26:27 +02:00
8dbe5a1c19 merge branch 'artools/0.30' 2023-05-22 01:24:01 +02:00
689e0d5e62 merge branch 'arch-git' 2023-05-21 20:16:55 +02:00
d1b620945a remove pacman-docker.conf 2023-05-13 16:22:30 +02:00
62 changed files with 2064 additions and 1840 deletions

2
.gitignore vendored
View File

@@ -6,3 +6,5 @@ data/schemas/*.conf
.project
iso-profiles
live-services
artixpkg_cmds
PKGBUILD

110
Makefile
View File

@@ -1,9 +1,10 @@
V=0.28
V=0.30
TOOLS = artools
PREFIX ?= /usr
SYSCONFDIR = /etc
BINDIR = $(PREFIX)/bin
LIBDIR = $(PREFIX)/share
DATADIR = $(PREFIX)/share
BASE_CONF = \
@@ -16,8 +17,11 @@ BASE_BIN = \
bin/base/artix-chroot \
bin/base/fstabgen
BASE_DATA = \
$(wildcard data/pacman/pacman*.conf)
BASE_LIB =\
$(wildcard lib/base/*.sh)
PACMAN_CONF = \
$(wildcard data/pacman/*.conf)
PKG_CONF = \
data/conf/artools-pkg.conf
@@ -27,58 +31,54 @@ SETARCH_ALIASES = \
PKG_BIN = \
bin/pkg/buildpkg \
bin/pkg/deploypkg \
bin/pkg/commitpkg \
bin/pkg/comparepkg \
bin/pkg/links-add \
bin/pkg/mkchrootpkg \
bin/pkg/pkg2yaml \
bin/pkg/buildtree \
bin/pkg/makerepropkg \
bin/pkg/lddd \
bin/pkg/links-add \
bin/pkg/checkpkg \
bin/pkg/finddeps \
bin/pkg/find-libdeps \
bin/pkg/batchpkg \
bin/pkg/signpkg \
bin/pkg/checkrepo \
bin/pkg/gitearepo \
bin/pkg/tidyarch \
bin/pkg/artixpkg \
bin/pkg/mkdepgraph \
bin/pkg/diffpkg \
bin/pkg/makerepropkg \
bin/pkg/export-pkgbuild-keys
LN_COMMITPKG = \
extrapkg \
corepkg \
testingpkg \
stagingpkg \
communitypkg \
community-testingpkg \
community-stagingpkg \
multilibpkg \
multilib-testingpkg \
multilib-stagingpkg \
kde-unstablepkg \
gnome-unstablepkg \
rebuildpkg
LN_BUILDPKG = \
buildpkg-system \
buildpkg-system-gremlins \
buildpkg-system-goblins \
buildpkg-world \
buildpkg-gremlins \
buildpkg-goblins \
buildpkg-galaxy \
buildpkg-galaxy-gremlins \
buildpkg-galaxy-goblins \
buildpkg-world-gremlins \
buildpkg-world-goblins \
buildpkg-lib32 \
buildpkg-lib32-gremlins \
buildpkg-lib32-goblins \
buildpkg-kde-wobble \
buildpkg-gnome-wobble
PKG_DATA = \
data/pacman/makepkg.conf \
data/valid-names.conf
PKG_LIB =\
$(wildcard lib/pkg/*.sh)
PKG_LIB_API =\
$(wildcard lib/pkg/api/*.sh)
PKG_LIB_CI =\
$(wildcard lib/pkg/ci/*.sh) \
PKG_LIB_GIT =\
$(wildcard lib/pkg/git/*.sh) \
PKG_LIB_REPO =\
$(wildcard lib/pkg/repo/*.sh)
# PKG_DATA = \
# data/valid-names.conf
MAKEPKG_CONF = \
data/makepkg/x86_64.conf \
PATCHES = \
$(wildcard data/patches/*.patch)
@@ -89,6 +89,9 @@ ISO_CONF = \
ISO_BIN = \
bin/iso/buildiso
ISO_LIB =\
$(wildcard lib/iso/*.sh)
LN_BUILDISO = \
buildiso-gremlins \
buildiso-goblins
@@ -107,12 +110,13 @@ BIN = $(BASE_BIN) $(PKG_BIN) $(ISO_BIN)
all: $(BIN)
EDIT = sed -e "s|@datadir[@]|$(DATADIR)|g" \
-e "s|@libdir[@]|$(LIBDIR)|g" \
-e "s|@sysconfdir[@]|$(SYSCONFDIR)|g"
%: %.in Makefile lib/util-base.sh
%: %.in Makefile
@echo "GEN $@"
@$(RM) "$@"
@{ echo -n 'm4_changequote([[[,]]])'; cat $@.in; } | $(M4) | $(EDIT) >$@
@$(M4) $@.in | $(EDIT) >$@
@$(CHMODAW) "$@"
@$(CHMODX) "$@"
@bash -O extglob -n "$@"
@@ -127,8 +131,11 @@ install_base:
install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(BASE_BIN) $(DESTDIR)$(BINDIR)
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(BASE_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/base
install $(FILEMODE) $(BASE_LIB) $(DESTDIR)$(LIBDIR)/$(TOOLS)/base
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/pacman.conf.d
install $(FILEMODE) $(PACMAN_CONF) $(DESTDIR)$(DATADIR)/$(TOOLS)/pacman.conf.d
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/setarch-aliases.d
for a in ${SETARCH_ALIASES}; do install $(FILEMODE) setarch-aliases.d/$$a $(DESTDIR)$(DATADIR)/$(TOOLS)/setarch-aliases.d; done
@@ -140,23 +147,40 @@ install_pkg:
install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(PKG_BIN) $(DESTDIR)$(BINDIR)
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg
install $(FILEMODE) $(PKG_LIB) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg/api
install $(FILEMODE) $(PKG_LIB_API) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg/api
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg/ci
install $(FILEMODE) $(PKG_LIB_CI) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg/ci
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg/git
install $(FILEMODE) $(PKG_LIB_GIT) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg/git
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg/repo
install $(FILEMODE) $(PKG_LIB_REPO) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg/repo
$(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_BUILDPKG); do $(LN) buildpkg $(DESTDIR)$(BINDIR)/$$l; done
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(PKG_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
# install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
# install $(FILEMODE) $(PKG_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
install $(FILEMODE) $(PATCHES) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/makepkg.conf.d
install $(FILEMODE) $(MAKEPKG_CONF) $(DESTDIR)$(DATADIR)/$(TOOLS)/makepkg.conf.d
install_iso:
install $(DIRMODE) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
install $(FILEMODE) $(ISO_CONF) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
install $(FILEMODE) $(ISO_LIB) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(ISO_BIN) $(DESTDIR)$(BINDIR)

View File

@@ -23,8 +23,8 @@ artools
- pkg:
* namcap
* ruby-braid
* rsync
* jq
* parallel
- iso:
* dosfstools
@@ -59,11 +59,25 @@ Specifying args will override artools-{base,pkg,iso}.conf settings.
Both, pacman.conf and makepkg.conf for chroots are loaded from
```bash
usr/share/artools/{makepkg,pacman-*}.conf
usr/share/artools/makepkg.conf.d/makepkg.conf
```
```bash
usr/share/artools/pacmanconf.d/${repo}.conf
```
and can be overridden dropping them in
```bash
$HOME/.config/artools/makepkg.conf.d/
```
```bash
$HOME/.config/artools/pacman.conf.d/
```
artools-*.conf:
```bash
$HOME/.config/artools/
```

View File

@@ -14,10 +14,11 @@
shopt -s extglob
m4_include(lib/base/message.sh)
m4_include(lib/base/chroot.sh)
m4_include(lib/base/mount.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/base/chroot.sh
source "${LIBDIR}"/base/mount.sh
usage() {
printf 'usage: %s chroot-dir [command]\n' "${0##*/}"

View File

@@ -22,9 +22,11 @@
shopt -s extglob
m4_include(lib/base/message.sh)
m4_include(lib/base/mount.sh)
m4_include(lib/base/chroot.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/base/mount.sh
source "${LIBDIR}"/base/chroot.sh
#{{{ functions

View File

@@ -12,10 +12,12 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/base/message.sh)
m4_include(lib/base/mount.sh)
m4_include(lib/base/chroot.sh)
m4_include(lib/base/chroot-version.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/base/mount.sh
source "${LIBDIR}"/base/chroot.sh
source "${LIBDIR}"/base/chroot-version.sh
# $1: chroot
kill_chroot_process(){

View File

@@ -14,7 +14,9 @@
shopt -s extglob
m4_include(lib/base/message.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
#{{{ filesystems

View File

@@ -12,9 +12,11 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/base/message.sh)
m4_include(lib/base/chroot.sh)
m4_include(lib/base/chroot-version.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/base/chroot.sh
source "${LIBDIR}"/base/chroot-version.sh
working_dir=''
umode=''

View File

@@ -12,24 +12,27 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/util-base.sh)
m4_include(lib/util-iso.sh)
m4_include(lib/base/message.sh)
m4_include(lib/base/common.sh)
m4_include(lib/base/chroot.sh)
m4_include(lib/iso/mount.sh)
m4_include(lib/iso/services.sh)
m4_include(lib/base/yaml.sh)
m4_include(lib/iso/calamares.sh)
m4_include(lib/iso/config.sh)
m4_include(lib/iso/firmware.sh)
m4_include(lib/iso/dracut.sh)
m4_include(lib/iso/initcpio.sh)
m4_include(lib/iso/grub.sh)
m4_include(lib/iso/squash.sh)
m4_include(lib/iso/iso.sh)
m4_include(lib/iso/profile.sh)
m4_include(lib/iso/trap.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
DATADIR=${DATADIR:-'@datadir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
source "${LIBDIR}"/base/util.sh
source "${LIBDIR}"/iso/util.sh
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/base/chroot.sh
source "${LIBDIR}"/iso/mount.sh
source "${LIBDIR}"/iso/services.sh
source "${LIBDIR}"/base/yaml.sh
source "${LIBDIR}"/iso/calamares.sh
source "${LIBDIR}"/iso/config.sh
source "${LIBDIR}"/iso/firmware.sh
source "${LIBDIR}"/iso/dracut.sh
source "${LIBDIR}"/iso/initcpio.sh
source "${LIBDIR}"/iso/grub.sh
source "${LIBDIR}"/iso/squash.sh
source "${LIBDIR}"/iso/iso.sh
source "${LIBDIR}"/iso/profile.sh
source "${LIBDIR}"/iso/trap.sh
clean_up_chroot(){
local path mnt="$1"
@@ -192,7 +195,8 @@ prepare_build(){
*) repo=default ;;
esac
get_pacman_conf "${repo}"
pacman_conf="${DATADIR}/pacman.conf.d/${repo}.conf"
[[ -f "${USER_CONF_DIR}/pacman.conf.d/${repo}.conf" ]] && pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${repo}.conf"
iso_file=$(gen_iso_fn).iso

80
bin/pkg/artixpkg.in Normal file
View File

@@ -0,0 +1,80 @@
#!/bin/bash
#
# Copyright (C) 2018-23 artoo@artixlinux.org
# Copyright (C) 2021 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=${LIBDIR:-'@libdir@/artools'}
DATADIR=${DATADIR:-'@datadir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/pkg/api/gitea.sh
set -e
usage() {
local -r COMMAND=${BASH_SOURCE[0]##*/}
cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS]
COMMANDS
repo Pacman database modification for packge update, move etc
git Manage Git packaging repositories and their configuration
OPTIONS
-h, --help Show this help text
_EOF_
}
if (( $# < 1 )); then
usage
exit 1
fi
export _ARTOOLS_COMMAND='artixpkg'
source "${LIBDIR}"/base/util.sh
source "${LIBDIR}"/pkg/util.sh
load_makepkg_config
cd "${TREE_DIR_ARTIX}"
# command checking
while (( $# )); do
case $1 in
-h|--help)
usage
exit 0
;;
repo)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/repo.sh
source "${LIBDIR}"/pkg/repo.sh
artixpkg_repo "$@"
exit 0
;;
git)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/git.sh
source "${LIBDIR}"/pkg/git.sh
artixpkg_git "$@"
exit 0
;;
*)
die "invalid command: %s" "$1"
;;
esac
done

View File

@@ -1,114 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-20 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.
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
#{{{ functions
batch_move() {
local name="${1:-pkg_moves}"
local pkglist="${TREE_DIR_ARTIX}"/"$name".list
[[ -f $pkglist ]] || die "%s does not exist!" "$pkglist"
while read -r entry; do
local pkg=${entry##*:}
local src=${entry%:*}
src=${src#*:}
local dest=${entry%%:*}
if ${runlist}; then
"${dest}"pkg -s "${src}" -p "${pkg}"
else
msg "%s" "${dest}pkg -s ${src} -p ${pkg}"
fi
done < "$pkglist"
}
batch_create() {
local name="${1:-pkg_create}"
local pkglist="${TREE_DIR_ARTIX}"/"$name".list
[[ -f $pkglist ]] || die "%s does not exist!" "$pkglist"
while read -r entry; do
local pkg=${entry##*:}
local group=${entry%:*}
group=${group#*:}
local team=${entry%%:*}
if ${runlist}; then
buildtree -n -p "${pkg}" -t "${team}" -g "${group}"
buildtree -i -p "${pkg}"
commitpkg -p "${pkg}"
else
msg "%s" "buildtree -n -p ${pkg} -t ${team} -g ${group}"
msg2 "%s" "buildtree -i -p ${pkg}"
msg2 "%s" "commitpkg -p ${pkg}"
fi
done < "$pkglist"
}
batch_update() {
local name="${1:-pkg_upgrades}"
local pkglist=${TREE_DIR_ARTIX}/$name.list
[[ -f $pkglist ]] || die "%s does not exist!" "$pkglist"
while read -r entry; do
local pkg=${entry#*:}
local dest=${entry%:*}
if ${runlist}; then
buildtree -i -p "${pkg}"
"${dest}"pkg -p "${pkg}"
else
msg "buildtree -i -p ${pkg}"
msg2 "${dest}pkg -p ${pkg}"
fi
done < "$pkglist"
}
#}}}
usage() {
printf 'Usage: %s [optional listname]\n' "${0##*/}"
printf ' -r Run generated commands\n'
printf ' -c Create pkgrepos from list\n'
printf ' -u Update pkgrepos from list\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
runlist=false
create=false
update=false
opts='rcuh'
while getopts "${opts}" arg; do
case "${arg}" in
r) runlist=true ;;
c) create=true ;;
u) update=true ;;
h|?) usage 0 ;;
esac
done
shift $(( OPTIND - 1 ))
listname="$1"; shift
if ${create}; then
batch_create "${listname}"
elif ${update}; then
batch_update "${listname}"
else
batch_move "${listname}"
fi

View File

@@ -1,6 +1,6 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018-23 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
@@ -12,10 +12,13 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/util-base.sh)
m4_include(lib/base/message.sh)
m4_include(lib/base/common.sh)
m4_include(lib/base/chroot.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
DATADIR=${DATADIR:-'@datadir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
source "${LIBDIR}"/base/util.sh
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/base/chroot.sh
create_first=false
rebuild=false
@@ -63,20 +66,37 @@ else
case ${repo} in
system|world|galaxy) repo='default' ;;
lib32*) base_devel+=('multilib-devel') ;;
galaxy-gremlins|galaxy-goblins) repo=${repo#*-} ;;
*-gremlins|*-goblins) repo=${repo#*-} ;;
esac
fi
get_pacman_conf "${repo}"
pacman_conf="${DATADIR}/pacman.conf.d/${repo}.conf"
[[ -f "${USER_CONF_DIR}/pacman.conf.d/${repo}.conf" ]] && pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${repo}.conf"
get_makepkg_conf
makepkg_conf="${DATADIR}/makepkg.conf.d/${arch}.conf"
[[ -f ${USER_CONF_DIR}/makepkg.conf.d/${arch}.conf ]] && makepkg_conf="${USER_CONF_DIR}/makepkg.conf.d/${arch}.conf"
if [[ -f "${DATADIR}/setarch-aliases.d/${arch}" ]]; then
read -r set_arch < "${DATADIR}/setarch-aliases.d/${arch}"
read -r set_arch < "${DATADIR}/setarch-aliases.d/${arch}"
else
set_arch="${arch}"
set_arch="${arch}"
fi
# Architecture-specific Mount
# arch_mounts=()
# if [[ -f "${DATADIR}/mount.d/${arch}" ]]; then
# mapfile -t arch_mounts < "${DATADIR}/mount.d/${arch}"
# fi
# for arch_mount in "${arch_mounts[@]}"; do
# if [[ $arch_mount = rw* ]]; then
# arch_mount=${arch_mount#rw }
# in_array "$arch_mount" "${mkchrootpkg_args[@]}" || mkchrootpkg_args+=("-d" "$arch_mount")
# elif [[ $arch_mount = ro* ]]; then
# arch_mount=${arch_mount#ro }
# in_array "$arch_mount" "${mkchrootpkg_args[@]}" || mkchrootpkg_args+=("-D" "$arch_mount")
# fi
# done
check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME
mkchrootpkg_args+=("${@:$OPTIND}")

View File

@@ -1,347 +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.
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/common.sh)
m4_include(lib/pkg/git.sh)
m4_include(lib/pkg/gitea.sh)
m4_include(lib/pkg/repo.sh)
m4_include(lib/pkg/jenkins.sh)
#{{{ new git repo
pkgrepo_new(){
cd "${TREE_DIR_ARTIX}/${group}" || return
local org gitname
org=$(get_pkg_org "${package}")
gitname=$(get_compliant_name "${package}")
if [[ ! -d "${package}" ]]; then
gitearepo -cr "$gitname"
add_team_to_repo "$gitname" "$org" "${team}"
msg2 "Adding [%s] from (%s)" "${package}" "$org/$gitname"
braid add "${GIT_SSH}":"$org/$gitname".git "${package}"
prepare_dir "${TREE_DIR_ARTIX}/${group}/${package}/trunk"
commit_ci "${package}"
# if braid push "${package}"; then
# braid update "${package}"
# fi
else
die "Package %s already exists!" "${package}"
fi
}
#}}}
#{{{ pull
config_tree() {
local dist="$1" vars="${2:-false}"
case "$dist" in
Artix)
if "$vars"; then
dist_tree=("${ARTIX_TREE[@]}")
dist_url="${GIT_SSH}:pkgbuild"
dist_dir=${TREE_DIR_ARTIX}
else
git config --bool pull.rebase true
git config commit.gpgsign true
if [[ -n "${GPGKEY}" ]];then
git config user.signingkey "${GPGKEY}"
else
warning "No GPGKEY configured in makepkg.conf!"
fi
fi
;;
Arch)
if "$vars"; then
dist_tree=("${ARCH_TREE[@]}")
dist_url="${HOST_TREE_ARCH}"
dist_dir=${TREE_DIR_ARCH}
else
git config --bool pull.rebase false
git config branch.master.mergeoptions --no-edit
fi
;;
esac
}
update_tree() {
local dist="${1:-Artix}"
config_tree "$dist" true
cd "$dist_dir" || return
for tree in "${dist_tree[@]}"; do
if [[ -d "$tree" ]]; then
( cd "$tree" || return
config_tree "$dist"
msg "Checking (%s) (%s)" "$tree" "$dist"
pull_tree "$tree" "$(get_local_head)"
)
else
msg "Cloning (%s) (%s) ..." "$tree" "$dist"
git clone "$dist_url/$tree".git
( cd "$tree" || return
config_tree "$dist"
)
fi
done
}
#}}}
#{{{ patch
set_maintainer() {
local name email path="$1"
name=$(git -C $path config --get user.name)
email=$(git -C $path config --get user.email)
firstline=$(head -n 1 "$path"/PKGBUILD)
sed "2i ${firstline}" -i "$path"/PKGBUILD
sed -e "1s|Maintainer:.*|Maintainer: $name <$email>|" \
-i "$path"/PKGBUILD
sed -e "2s|Maintainer|Contributor|" -i "$path"/PKGBUILD
}
patch_pkg(){
local pkgpath="$1"
local pkg=${pkgpath%/*}
pkg=${pkg##*/}
sed -e 's|arch-meson|artix-meson|' -i "$pkgpath"/PKGBUILD
set_maintainer "$pkgpath"
case $pkg in
glibc)
msg2 "Patching %s" "$pkg"
sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \
-e '/nscd.service/d' \
-i "$pkgpath"/PKGBUILD
;;
linux|linux-lts)
msg2 "Patching %s" "$pkg"
sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i "$pkgpath"/PKGBUILD
sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
-i "$pkgpath"/config
;;
bash)
msg2 "Patching %s" "$pkg"
# shellcheck disable=2016
sed -e 's|system.bash_logout)|system.bash_logout artix.bashrc)|' \
-e "s|etc/bash.|etc/bash/|g" \
-e 's|"$pkgdir/etc/skel/.bash_logout"|"$pkgdir/etc/skel/.bash_logout"\n install -Dm644 artix.bashrc $pkgdir/etc/bash/bashrc.d/artix.bashrc|' \
-i "$pkgpath"/PKGBUILD
( cd "$pkgpath" || return
patch -Np 1 -i "${DATADIR}"/patches/artix-bash.patch
updpkgsums
)
;;
gstreamer|gst-plugins-*|licenses)
msg2 "Patching %s" "$pkg"
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \
-e 's|(Arch Linux)|(Artix Linux)|' \
-i "$pkgpath"/PKGBUILD
;;
esac
}
#}}}
#{{{ pkgbuild import
sync_pkg(){
local rsync_args=(-aWxvci --progress --delete-before --no-R --no-implied-dirs)
local src="$1" dest="$2"
msg "Sync from Arch [%s] to Artix [%s]" "${src##*archlinux/}" "${dest##*artixlinux/}"
rsync "${rsync_args[@]}" "$src"/ "$dest"/
}
show_deps(){
local src="$1" archver
# shellcheck disable=1090
. "$src"/PKGBUILD 2>/dev/null
archver=$(get_full_version)
# shellcheck disable=2154
[[ -n ${pkgbase} ]] && msg2 "pkgbase: %s" "${pkgbase}"
# shellcheck disable=2154
msg2 "pkgname: %s" "${pkgname[*]}"
# shellcheck disable=2154
[[ -n "${pkgdesc}" ]] && msg2 "pkgdesc: %s" "${pkgdesc}"
# shellcheck disable=2154
msg2 "Arch Version: %s" "$archver"
# shellcheck disable=2154
msg2 "arch: %s" "$arch"
# shellcheck disable=2154
[[ -n ${makedepends[*]} ]] && msg2 "makedepends: %s" "${makedepends[*]}"
# shellcheck disable=2154
[[ -n ${checkdepends[*]} ]] && msg2 "checkdepends: %s" "${checkdepends[*]}"
# shellcheck disable=2154
[[ -n ${depends[*]} ]] && msg2 "depends: %s" "${depends[*]}"
# shellcheck disable=2154
[[ -n ${optdepends[*]} ]] && msg2 "optdepends: %s" "${optdepends[@]}"
}
from_arch(){
cd "${TREE_DIR_ARTIX}" || return
local srcpath repo archpath artixpath
srcpath=$(find_pkg "${TREE_DIR_ARCH}" "${package}")
[[ -z $srcpath ]] && die "Package '%s' does not exist!" "${package}"
repo=$(find_repo "$srcpath")
msg "repo: %s" "$repo"
archpath=$srcpath/repos/$repo
artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}")
show_deps "$archpath"
if [[ -f "$artixpath"/Jenkinsfile ]]; then
artixpath="$artixpath"/trunk
if [[ -d "$artixpath" ]];then
sync_pkg "$archpath" "$artixpath"
patch_pkg "$artixpath"
fi
else
die "Package '%s' does not exist!" "${package}"
fi
}
#}}}
view_build(){
local archpath repo
archpath=$(find_pkg "${TREE_DIR_ARCH}" "${package}")
[[ -z $archpath ]] && die "Package '%s' does not exist!" "${package}"
repo=$(find_repo "${archpath}")
archpath=$archpath/repos/$repo
msg "repo: %s" "${repo#*/}"
show_deps "$archpath"
}
check_tree(){
local archpath artixpath group
archpath=$(find_pkg "${TREE_DIR_ARCH}" "${package}")
[[ -z $archpath ]] && die "Package '%s' does not exist!" "${package}"
artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}")
group=${artixpath%/*}
msg "group: %s" "${group##*/}"
[[ -z $artixpath ]] && msg2 "exists: %s" "no"
[[ -n $artixpath ]] && msg2 "exists: %s" "yes"
}
sync_repos(){
${sync_arch} && update_tree "Arch"
${sync_artix} && update_tree
}
load_makepkg_config
load_valid_names
testing=true
staging=true
unstable=false
sync=false
sync_arch=true
sync_artix=true
import=false
view=false
createnew=false
check=false
package=''
team='community'
group="${ARTIX_TREE[0]}"
usage() {
printf "Usage: %s [options]\n" "${0##*/}"
printf ' -p <pkg> Package name\n'
printf ' -t <team> Team name (only with -n)\n'
printf ' Possible values: core,extra,community,multilib\n'
printf " [default: %s]\n" "${team}"
printf ' -g <group> Group name, the superrepo (only with -n)\n'
printf " [default: %s]\n" "${group}"
printf " -s Clone or pull repos\n"
printf " -a Don't clone or pull arch repos\n"
printf " -b Don't clone or pull artix repos\n"
printf ' -i Import a package from arch repos\n'
printf ' -n New remote pkgrepo and add it\n'
printf ' -v Check if a package is in the artix tree(s)\n'
printf ' -c View package depends\n'
printf ' -x Exclude testing (only with -i)\n'
printf ' -y Exclude staging (only with -i)\n'
printf ' -z Include kde & gnome unstable (only with -i)\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
opts='p:t:g:sinabcvxyzh'
while getopts "${opts}" arg; do
case "${arg}" in
p) package="$OPTARG" ;;
t) team="$OPTARG" ;;
g) group="$OPTARG" ;;
s) sync=true ;;
a) sync_arch=false ;;
b) sync_artix=false ;;
i) import=true ;;
n) createnew=true ;;
c) check=true ;;
v) view=true ;;
x) testing=false ;;
y) staging=false ;;
z) unstable=true ;;
h|?) usage 0 ;;
esac
done
shift $(( OPTIND - 1 ))
set_arch_repos "$testing" "$staging" "$unstable"
if ${sync}; then
sync_repos
fi
if ${view}; then
view_build
fi
if ${check}; then
check_tree
fi
if ${import}; then
from_arch
fi
if ${createnew}; then
pkgrepo_new
fi

View File

@@ -12,8 +12,10 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/base/message.sh)
m4_include(lib/pkg/diff.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/pkg/diff.sh
load_makepkg_config

View File

@@ -12,14 +12,129 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/repo.sh)
m4_include(lib/pkg/table.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
DATADIR=${DATADIR:-'@datadir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
source "${LIBDIR}"/base/util.sh
source "${LIBDIR}"/pkg/util.sh
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/pkg/table.sh
#{{{ db libs
# shopt -s extglob
# load_valid_names(){
# local conf
# conf="${DATADIR}"/valid-names.conf
# [[ -f "$conf" ]] || return 1
# # shellcheck source=/usr/share/artools/valid-names.conf
# [[ -r "$conf" ]] && . "$conf"
# return 0
# }
# tree_loop(){
# local func="$1" pkgs
# for tree in "${ARTIX_TREE[@]}"; do
# mapfile -t pkgs < <(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort)
# for p in "${pkgs[@]}"; do
# "$func" "$p"
# done
# done
# }
#
# show_db_table(){
# msg_table_header "${tableU}" "Repo" "Package" "Version" "Database"
# tree_loop check_db
# }
#{{{ check db
# is_db_entry() {
# local pkgname="$1" repo="${REPOS[$2]}" entry
# entry=${db_cache_dir}/linksdb/$repo/$pkgname
#
# if [[ -d "$entry" ]];then
# return 0
# fi
# return 1
# }
#
# check_db(){
# local pkgpath="${1}"
#
# for repo in "${!REPOS[@]}"; do
#
# local pkgbuild artixver
# if [[ -f $pkgpath/$repo/PKGBUILD ]]; then
# pkgbuild=$pkgpath/$repo/PKGBUILD
#
# # shellcheck disable=1090
# . "$pkgbuild" 2>/dev/null
# artixver=$(get_full_version)
# for name in "${pkgname[@]}"; do
# if ! is_db_entry "$name-$artixver" "$repo"; then
# msg_row_red "${tableU}" "$repo" "$name" "$artixver" "false"
# else
# ${all_db} && msg_row "${tableU}" "$repo" "$name" "$artixver" "true"
# fi
# done
# unset artixver pkgbuild pkgver epoch pkgname pkgbase
# fi
# done
# }
#}}}
# {{{ check obsolete
# show_obsolete_table() {
# local arch_mirror='https://mirror.f4st.host/archlinux'
#
# local arch_repo artix_repo artix_db arch_db url
# arch_repo="${searchrepos[@]}"
# artix_repo="${REPOS[$arch_repo]}"
#
# artix_db="${db_cache_dir}/artixdb/${artix_repo}"
# arch_db="${db_cache_dir}/archdb/${arch_repo}"
#
# msg "Updating database cache ..."
# url=${REPOS_MIRROR}/${artix_repo}/os/$CARCH/${artix_repo}.${db_ext}
# extract_db "$url" "${artix_db}"
#
# url=${arch_mirror}/${arch_repo}/os/$CARCH/${arch_repo}.${db_ext}
# extract_db "$url" "${arch_db}"
# msg "Done"
#
# msg_table_header "${tableQ}" "Repo" "Package" "Obsolete"
# for p in "${artix_db}"/*; do
# local pkg rel
# pkg=${p##*/}
# rel=${pkg##*-}
# rel=${rel%.*}
# pkg=${pkg%-*}
# local p="$pkg-$rel"
#
# if [[ "$p" != *openrc* ]] && [[ "$p" != *runit* ]] \
# && [[ "$p" != *s6* ]] && [[ "$p" != *suite66* ]] \
# && [[ "$p" != *udev* ]] && [[ "$p" != *elogind* ]] \
# && [[ "$p" != *sysusers* ]] && [[ "$p" != *tmpfiles* ]] \
# && [[ "$p" != *execline* ]] && [[ "$p" != *skalibs* ]] \
# && [[ "$p" != *netifrc* ]] && [[ "$p" != *bootlogd* ]] \
# && [[ "$p" != *pam_rundir* ]] && [[ "$p" != *artools* ]] \
# && [[ "$p" != *archlinux* ]] && [[ "$p" != *iso-profiles* ]] \
# && [[ "$p" != *calamares* ]] && [[ "$p" != *iso-initcpio* ]] \
# && [[ "$p" != *dinit* ]] && [[ "$p" != *artix* ]] && [[ "$p" != *blocaled* ]]; then
# if [[ ! -d "${arch_db}/$p" ]]; then
# msg_row "${tableQ}" "${artix_repo}" "$p" "true"
# fi
# fi
# done
# }
#}}}
extract_db() {
local u="$1" cdir="$2"
rm -rf "$cdir"
@@ -28,10 +143,10 @@ extract_db() {
curl -L -s "$u" | bsdtar -xf - -C "$cdir"
}
update_db_cache(){
update_linksdb_cache(){
msg "Updating database cache ..."
local cachedir url
for repo in "${searchrepos[@]}"; do
for repo in "${ARTIX_REPOS[@]}"; do
cachedir=${db_cache_dir}/linksdb/$repo
url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext}
extract_db "$url" "$cachedir"
@@ -44,7 +159,10 @@ update_db_cache(){
#{{{ sogrep
query_db() {
for repo in "${searchrepos[@]}"; do
if ${sync}; then
update_linksdb_cache
fi
for repo in "${ARTIX_REPOS[@]}"; do
local db
db=${db_cache_dir}/linksdb/$repo/
if [[ -d ${db} ]]; then
@@ -60,102 +178,50 @@ query_db() {
#}}}
#{{{ check db
update_db_cache() {
local arch_mirror='https://mirror.netcologne.de/archlinux'
is_db_entry() {
local pkgname="$1" repo="${REPOS[$2]}" entry
entry=${db_cache_dir}/linksdb/$repo/$pkgname
for repo in ${searchrepos[@]}; do
local arch_repo
local artix_db
local arch_db
local artix_url
local arch_url
arch_repo=${REPOS[${repo}]}
artix_db=${db_cache_dir}/artixdb/${repo}
arch_db=${db_cache_dir}/archdb/${arch_repo}
artix_url=${REPOS_MIRROR}/${repo}/os/$CARCH/${repo}.${db_ext}
arch_url=${arch_mirror}/${arch_repo}/os/$CARCH/${arch_repo}.${db_ext}
if [[ -d "$entry" ]];then
return 0
msg "Updating database cache ..."
extract_db "${artix_url}" "${artix_db}"
extract_db "${arch_url}" "${arch_db}"
msg "Done"
done
}
show_updates() {
if ${sync}; then
update_db_cache
fi
return 1
}
check_db(){
local pkgpath="${1}"
for repo in ${searchrepos[@]}; do
local arch_repo
local artix_db
local arch_db
arch_repo=${REPOS[${repo}]}
artix_db=${db_cache_dir}/artixdb/${repo}
arch_db=${db_cache_dir}/archdb/${arch_repo}
for repo in "${!REPOS[@]}"; do
local pkgbuild artixver
if [[ -f $pkgpath/$repo/PKGBUILD ]]; then
pkgbuild=$pkgpath/$repo/PKGBUILD
# shellcheck disable=1090
. "$pkgbuild" 2>/dev/null
artixver=$(get_full_version)
for name in "${pkgname[@]}"; do
if ! is_db_entry "$name-$artixver" "$repo"; then
msg_row_red "${tableU}" "$repo" "$name" "$artixver" "false"
else
${all_db} && msg_row "${tableU}" "$repo" "$name" "$artixver" "true"
fi
done
unset artixver pkgbuild pkgver epoch pkgname pkgbase
fi
diff -ur $artix_db/ $arch_db/ | grep -A2 '%NAME%\|%VERSION%'
done
}
#}}}
# {{{ check obsolete
show_obsolete_table() {
local arch_mirror='https://mirror.f4st.host/archlinux'
local arch_repo artix_repo artix_db arch_db url
arch_repo="${searchrepos[@]}"
artix_repo="${REPOS[$arch_repo]}"
artix_db="${db_cache_dir}/artixdb/${artix_repo}"
arch_db="${db_cache_dir}/archdb/${arch_repo}"
msg "Updating database cache ..."
url=${REPOS_MIRROR}/${artix_repo}/os/$CARCH/${artix_repo}.${db_ext}
extract_db "$url" "${artix_db}"
url=${arch_mirror}/${arch_repo}/os/$CARCH/${arch_repo}.${db_ext}
extract_db "$url" "${arch_db}"
msg "Done"
msg_table_header "${tableQ}" "Repo" "Package" "Obsolete"
for p in "${artix_db}"/*; do
local pkg rel
pkg=${p##*/}
rel=${pkg##*-}
rel=${rel%.*}
pkg=${pkg%-*}
local p="$pkg-$rel"
if [[ "$p" != *openrc* ]] && [[ "$p" != *runit* ]] \
&& [[ "$p" != *s6* ]] && [[ "$p" != *suite66* ]] \
&& [[ "$p" != *udev* ]] && [[ "$p" != *elogind* ]] \
&& [[ "$p" != *sysusers* ]] && [[ "$p" != *tmpfiles* ]] \
&& [[ "$p" != *execline* ]] && [[ "$p" != *skalibs* ]] \
&& [[ "$p" != *netifrc* ]] && [[ "$p" != *bootlogd* ]] \
&& [[ "$p" != *pam_rundir* ]] && [[ "$p" != *artools* ]] \
&& [[ "$p" != *archlinux* ]] && [[ "$p" != *iso-profiles* ]] \
&& [[ "$p" != *calamares* ]] && [[ "$p" != *iso-initcpio* ]] \
&& [[ "$p" != *dinit* ]] && [[ "$p" != *artix* ]] && [[ "$p" != *blocaled* ]]; then
if [[ ! -d "${arch_db}/$p" ]]; then
msg_row "${tableQ}" "${artix_repo}" "$p" "true"
fi
fi
done
}
#}}}
show_lib_table() {
msg_table_header "${tableQ}" "Repo" "Package" "Library"
query_db
}
show_db_table(){
msg_table_header "${tableU}" "Repo" "Package" "Version" "Database"
tree_loop check_db
}
db_cache_dir="${XDG_CACHE_HOME:-$USER_HOME/.cache}/artools"
linksdb_ext="links.tar.${DBEXT}"
@@ -164,87 +230,106 @@ db_ext="db.tar.${DBEXT}"
load_makepkg_config
sync=false
check=false
# check=false
query=false
all_db=false
obsolete=false
updates=false
readonly tableU="%-20s %-35s %-30s %-10s"
# readonly tableU="%-20s %-35s %-30s %-10s"
readonly tableQ="%-20s %-55s %s"
load_valid_names
#{{{ repo names arrays
declare -A REPOS=(
[${valid_names[0]}]=system
[${valid_names[1]}]=world
[${valid_names[2]}]=galaxy
[${valid_names[3]}]=lib32
[${valid_names[4]}]=gremlins
[${valid_names[5]}]=galaxy-gremlins
[${valid_names[6]}]=lib32-gremlins
[${valid_names[7]}]=goblins
[${valid_names[8]}]=galaxy-goblins
[${valid_names[9]}]=lib32-goblins
[${valid_names[11]}]=kde-wobble
[${valid_names[12]}]=gnome-wobble
searchrepos=(
system #0
world #1
# galaxy #2
lib32 #3
system-gremlins #4
world-gremlins #5
# galaxy-gremlins #6
lib32-gremlins #7
system-goblins #8
world-goblins #9
# galaxy-goblins #10
lib32-goblins #11
# system-rebuild #12
# world-rebuild #13
# gnome-wobble #14
# kde-wobble #15
)
searchrepos=(
"${REPOS[${valid_names[11]}]}"
"${REPOS[${valid_names[12]}]}"
"${REPOS[${valid_names[7]}]}"
"${REPOS[${valid_names[8]}]}"
"${REPOS[${valid_names[9]}]}"
"${REPOS[${valid_names[4]}]}"
"${REPOS[${valid_names[5]}]}"
"${REPOS[${valid_names[6]}]}"
"${REPOS[${valid_names[0]}]}"
"${REPOS[${valid_names[1]}]}"
"${REPOS[${valid_names[2]}]}"
"${REPOS[${valid_names[3]}]}"
ARTIX_REPOS=(
system #0
world #1
galaxy #2
lib32 #3
system-gremlins #4
world-gremlins #5
galaxy-gremlins #6
lib32-gremlins #7
system-goblins #8
world-goblins #9
galaxy-goblins #10
lib32-goblins #11
# system-rebuild #12
# world-rebuild #13
gnome-wobble #14
kde-wobble #15
)
declare -A REPOS=(
[${searchrepos[0]}]=core
[${searchrepos[1]}]=extra
# [${searchrepos[2]}]=galaxy
[${searchrepos[2]}]=multilib
[${searchrepos[3]}]=core-testing
[${searchrepos[4]}]=extra-testing
# [${searchrepos[6]}]=galaxy-testing
[${searchrepos[5]}]=multilib-testing
[${searchrepos[6]}]=core-staging
[${searchrepos[7]}]=extra-staging
# [${searchrepos[10]}]=galaxy-staging
[${searchrepos[8]}]=multilib-staging
# [${searchrepos[14]}]=gnome-unstable
# [${searchrepos[15]}]=kde-unstable
)
#}}}
usage() {
printf "Usage: %s [options] (with -q [libname])\n" "${0##*/}"
printf ' -r <repo> Repo name to query\n'
printf ' [default: all]\n'
printf "Usage: ${0##*/} [options] [query library]\n"
printf " -s Sync repo databases\n"
printf ' -c Check repos\n'
printf ' -a Show repo db (-c)\n'
printf ' -o Check for obsolete packages\n'
# printf ' -c Check repos\n'
printf " -q Query repo databases for so libs\n"
printf " -u Show updates\n"
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
opts='r:qcsaoh'
#
opts='squh'
while getopts "${opts}" arg; do
case "${arg}" in
r) searchrepos=("$OPTARG") ;;
s) sync=true ;;
c) check=true ;;
a) all_db=true ;;
# c) check=true ;;
q) query=true ;;
o) obsolete=true ;;
u) updates=true ;;
h|?) usage 0 ;;
esac
done
#
shift $(( OPTIND - 1 ))
#
library="$1"; shift
${sync} && update_db_cache
# ${check} && show_db_table
${check} && show_db_table
if ${query}; then
show_lib_table
fi
${query} && show_lib_table
${obsolete} && show_obsolete_table
if ${updates}; then
show_updates
fi

View File

@@ -1,192 +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.
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/common.sh)
m4_include(lib/pkg/git.sh)
m4_include(lib/pkg/gitea.sh)
m4_include(lib/pkg/repo.sh)
#{{{ functions
check_team(){
if [[ "${repo_src}" == "${valid_names[0]}" && "${repo_dest}" == "${valid_names[1]}" ]] || \
[[ "${repo_src}" == "${valid_names[1]}" && "${repo_dest}" == "${valid_names[0]}" ]] || \
[[ "${repo_src}" == "${valid_names[1]}" && "${repo_dest}" == "${valid_names[2]}" ]] || \
[[ "${repo_src}" == "${valid_names[2]}" && "${repo_dest}" == "${valid_names[1]}" ]] || \
[[ "${repo_src}" == "${valid_names[0]}" && "${repo_dest}" == "${valid_names[2]}" ]] || \
[[ "${repo_src}" == "${valid_names[2]}" && "${repo_dest}" == "${valid_names[0]}" ]]; then
local org gitname
org=$(get_pkg_org "${package}")
gitname=$(get_compliant_name "${package}")
add_team_to_repo "$gitname" "${org}" "${repo_dest}"
remove_team_from_repo "$gitname" "${org}" "${repo_src}"
fi
}
push_super() {
local name="$1"
msg "Update (%s)" "$name"
git push origin master
git prune
[[ "${cmd}" != 'commitpkg' ]] && check_team
}
push_pkg() {
local name="$1"
if braid push "${package}"; then
braid update "${package}"
push_super "$name"
else
error "'braid push %s' failed.\n" "${package}"
fi
}
get_repo_commit_msg() {
printf "[%s] -> [%s] '%s' %s\n" "${repo_src}" "${repo_dest}" "${package}-$(get_full_version)" "${action}"
}
get_commit_msg() {
printf "[%s] '%s' %s\n" "${repo_src}" "${package}-$(get_full_version)" "${action}"
}
commit_pkg() {
local commit_msg pkg
if ${remove}; then
action='remove'
commit_msg=$(get_commit_msg)
msg "Action: %s" "$commit_msg"
if [[ "${repo_src}" == 'trunk' ]];then
git rm -r $package/trunk
else
git rm -r "$package/$CARCH/${repo_src}"
fi
else
action='modify'
commit_msg=$(get_commit_msg)
msg "Action: %s" "$commit_msg"
git add "$package"
fi
git commit -m "$commit_msg"
}
repo_commit_pkg() {
local commit_msg
[[ -d "$package/$CARCH/${repo_dest}" ]] && git rm -r "$package/$CARCH/${repo_dest}"
[[ ! -d "$package/$CARCH" ]] && mkdir "$package/$CARCH"
[[ ! -d "$package/$CARCH/${repo_dest}" ]] && mkdir "$package/$CARCH/${repo_dest}"
if [[ "${repo_src}" == 'trunk' ]]; then
action='add'
commit_msg=$(get_repo_commit_msg)
msg "Action: %s" "$commit_msg"
cp -r "$package"/trunk/* "$package/$CARCH/${repo_dest}"/
else
action='move'
[[ ! -f $pkgbuild ]] && die "%s does not exist!" "$pkgbuild"
commit_msg=$(get_repo_commit_msg)
msg "Action: %s" "$commit_msg"
cp -r "$package/$CARCH/${repo_src}"/* "$package/$CARCH/${repo_dest}"/
git rm -r "$package/$CARCH/${repo_src}"
fi
git add "$package"
git commit -m "$commit_msg"
}
run(){
local artixpath head tree tree_name
artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}")
if [[ -n ${artixpath} ]];then
tree=${artixpath%/*}
tree_name=${tree##*/}
cd "$tree" || return
head=$(get_local_head)
pkgbuild="$package"/trunk/PKGBUILD
if [[ "${repo_src}" != 'trunk' ]]; then
pkgbuild="$package/$CARCH/${repo_src}"/PKGBUILD
fi
# shellcheck disable=1090
. "$pkgbuild"
case "${cmd}" in
'commitpkg') commit_pkg ;;
*) repo_commit_pkg ;;
esac
msg "Checking (%s) (Artix)" "$tree_name"
pull_tree "$tree_name" "$head"
push_pkg "$tree_name"
else
die "Package '%s' does not exist!" "${package}"
fi
}
is_valid_repo(){
local _valid=trunk
for repo in "${valid_names[@]}"; do
_valid=${repo:-}${repo:+|}$_valid
done
eval "case ${repo_src} in
${_valid}) return 0 ;;
*) return 1 ;;
esac"
}
#}}}
load_makepkg_config
load_valid_names
repo_src='trunk'
package=''
remove=false
cmd=${0##*/}
repo_dest=${cmd%pkg}
usage() {
printf "Usage: %s [options]\n" "${0##*/}"
printf " -s <name> Source repository [default: %s]\n" "${repo_src}"
printf ' -p <pkg> Package name\n'
printf ' -r Delete from repo (commitpkg only)\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
opts='p:s:rh'
while getopts "${opts}" arg; do
case "${arg}" in
s) repo_src="$OPTARG" ;;
p) package="$OPTARG" ;;
r) remove=true ;;
h|?) usage 0 ;;
esac
done
shift $(( OPTIND - 1 ))
if is_valid_repo;then
run
else
die "source repository '%s' is not valid!" "${repo_src}"
fi

View File

@@ -1,209 +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.
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/repo.sh)
m4_include(lib/pkg/table.sh)
#{{{ upgrades, downgrades, moves
remove_list(){
local name="$1"
[[ -f "${TREE_DIR_ARTIX}"/$name.list ]] && rm "${TREE_DIR_ARTIX}"/"$name".list
}
write_list(){
local line="$1" name="$2"
printf "%s\n" "$line" >> "${TREE_DIR_ARTIX}"/"$name".list
}
get_group() {
local group
group="${artixpath%/*}"
group=${group##*/}
printf "%s\n" "${group#*-}"
}
compare_m(){
# if [ "$result" -eq 0 ];then
case "$artixrepo" in
*testing*|*staging*|*rebuild)
if [[ "${archrepo}" == "${artixrepo}" ]]; then
msg_row "${table}" "${archrepo}" "${artixrepo}" "$pkg" "$archver" "$artixver" "$(get_group)"
elif [[ "${archrepo}" == 'staging' && "${artixrepo}" == 'rebuild' ]]; then
msg_row_yellow "${table}" "${archrepo}" "${artixrepo}" "$pkg" "$archver" "$artixver" "$(get_group)"
else
msg_row_green "${table}" "${archrepo}" "${artixrepo}" "$pkg" "$archver" "$artixver" "$(get_group)"
if [[ -n "${archrepo}" ]]; then
write_list "${archrepo}:${artixrepo}:$pkg" pkg_moves
else
write_list "@repo@:${artixrepo}:$pkg" artix
fi
fi
;;
esac
# fi
}
compare_u(){
if [ "$result" -eq -1 ];then
# local arel=${archver##*-} brel=${artixver##*-}
# local reldiff
# reldiff=$(( $arel-${brel%.*} ))
msg_row_red "${table}" "${archrepo}" "${artixrepo}" "$pkg" "$archver" "$artixver" "$(get_group)"
write_list "${archrepo}:$pkg" pkg_upgrades
fi
}
compare_d(){
if [ "$result" -eq 1 ];then
if [[ -n "$archver" ]] && [[ -n "${archrepo}" ]];then
msg_row_yellow "${table}" "${archrepo}" "${artixrepo}" "$pkg" "$archver" "$artixver" "$(get_group)"
fi
fi
}
get_archpath(){
local pkg="$1" archpath
for tree in "${ARCH_TREE[@]}"; do
[[ -d ${TREE_DIR_ARCH}/$tree/$pkg/repos ]] && archpath=${TREE_DIR_ARCH}/$tree/$pkg
done
printf "%s\n" "$archpath"
}
pre_compare(){
local artixpath="$1" func="$2" pkg
pkg=${artixpath##*/}
local artixrepo archrepo pkgbuild artixver archver archpath epoch
artixrepo=$(find_repo "$artixpath")
pkgbuild=$artixpath/$CARCH/$artixrepo/PKGBUILD
if [[ -f "$pkgbuild" ]]; then
# shellcheck disable=1090
. "$pkgbuild" 2>/dev/null
artixver=$(get_full_version)
archpath=$(get_archpath "$pkg")
archrepo=$(find_repo "$archpath")
pkgbuild=$archpath/repos/$archrepo/PKGBUILD
archrepo="${archrepo%-*}"
if [[ -f "$pkgbuild" ]]; then
# shellcheck disable=1090
. "$pkgbuild" 2>/dev/null
archver=$(get_full_version)
fi
local result
result=$(vercmp "$artixver" "$archver")
"$func"
fi
}
compare_upgrades(){
local artixpath="${1%/*}"
pre_compare "$artixpath" compare_u
}
compare_downgrades(){
local artixpath="${1%/*}"
pre_compare "$artixpath" compare_d
}
compare_move(){
local artixpath="${1%/*}"
pre_compare "$artixpath" compare_m
}
#}}}
show_compare_header(){
msg_table_header "${table}" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version" "Group"
}
show_upgrades_table(){
show_compare_header
remove_list pkg_upgrades
tree_loop compare_upgrades
}
show_downgrades_table(){
show_compare_header
tree_loop compare_downgrades
}
show_move_table(){
show_compare_header
remove_list pkg_moves
remove_list artix
tree_loop compare_move
}
load_makepkg_config
load_valid_names
testing=true
staging=true
unstable=false
upgrades=false
downgrades=false
move=false
readonly table="%-18s %-18s %-29s %-27s %-27s %-7s"
usage() {
printf 'Usage: %s [options]\n' "${0##*/}"
printf ' -u Show upgrade packages\n'
printf ' -d Show downgrade packages\n'
printf ' -m Show packages to move\n'
printf ' -x Do not inlcude testing packages\n'
printf ' -y Do not inlcude staging packages\n'
printf ' -z Include unstable kde and gnome\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
opts='udmxyzh'
while getopts "${opts}" arg; do
case "${arg}" in
u) upgrades=true ;;
d) downgrades=true ;;
m) move=true ;;
x) testing=false ;;
y) staging=false ;;
z) unstable=true ;;
h|?) usage 0 ;;
esac
done
shift $(( OPTIND - 1 ))
set_arch_repos "$testing" "$staging" "$unstable"
${move} && show_move_table
${upgrades} && show_upgrades_table
${downgrades} && show_downgrades_table

View File

@@ -1,6 +1,6 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018-23 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
@@ -12,10 +12,14 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/deploy.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
DATADIR=${DATADIR:-'@datadir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
source "${LIBDIR}"/base/util.sh
source "${LIBDIR}"/pkg/util.sh
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/pkg/deploy.sh
#{{{ deploy

View File

@@ -2,8 +2,10 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
m4_include(lib/base/message.sh)
m4_include(lib/pkg/diff.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/pkg/diff.sh
usage() {
cat <<- _EOF_
@@ -203,7 +205,8 @@ diff_pkgs() {
[[ -f $oldpkg ]] || die "No such file: %s" "${oldpkg}"
[[ -f $newpkg ]] || die "No such file: %s" "${newpkg}"
DIFFOPTIONS+=(--label "${oldpkg}" --label "${newpkg}")
local -a diffoptions
diffoptions=("${DIFFOPTIONS[@]}" --label "${oldpkg}" --label "${newpkg}")
if (( TARLIST )); then
tar_list "$oldpkg" > "$TMPDIR/old"
@@ -224,7 +227,7 @@ diff_pkgs() {
# Resolve dynamic auto width one we know the content to diff
if [[ $DIFFWIDTH == --width=auto ]]; then
AUTOLENGTH=$(file_diff_columns "$TMPDIR/old" "$TMPDIR/new")
DIFFOPTIONS+=("--width=${AUTOLENGTH}")
diffoptions+=("--width=${AUTOLENGTH}")
fi
# Print a header for side-by-side view as it lacks labels
@@ -232,7 +235,7 @@ diff_pkgs() {
printf -- "--- %s\n+++ %s\n" "${oldpkg}" "${newpkg}"
fi
diff "${DIFFOPTIONS[@]}" "$TMPDIR/old" "$TMPDIR/new"
diff "${diffoptions[@]}" "$TMPDIR/old" "$TMPDIR/new"
fi
if (( DIFFOSCOPE )); then

View File

@@ -2,7 +2,9 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
m4_include(lib/base/message.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
usage() {
cat <<- _EOF_

View File

@@ -12,7 +12,9 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/base/message.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
set -e

View File

@@ -12,7 +12,9 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/base/message.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
match=$1

View File

@@ -1,88 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-21 artoo@artixlinux.org
# Copyright (C) 2021 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.
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/common.sh)
#{{{ functions
create_repo() {
local name="$1"
local org="$2"
local json url
json="{ \"auto_init\": true, \"name\":\"$name\", \"gitignores\":\"ArchLinuxPackages\", \"readme\": \"Default\" }"
url="${GIT_URL}/api/v1/org/$org/repos?access_token=${GIT_TOKEN}"
msg2 "Create package repo [%s] in org (%s)" "$name" "$org"
api_post "$url" -H "accept: application/json" \
-H "content-type: application/json" \
-d "$json"
}
transfer_repo() {
local name="$1"
local old_owner="$2"
local new_owner="landfill" json url
local json url
json="{ \"new_owner\": \"$new_owner\", \"team_ids\": []}"
url="${GIT_URL}/api/v1/repos/$old_owner/$name/transfer?access_token=${GIT_TOKEN}"
msg2 "Transfer package repo [%s] in org (%s)" "$name" "$new_owner"
api_post "$url" -H "accept: application/json" \
-H "Content-Type: application/json" \
-d "$json"
}
#}}}
usage() {
printf "Usage: %s [options]\n" "${0##*/}"
printf ' -r <repo> Repo name\n'
printf ' -c Create git repo\n'
printf ' -t Transfer git repo to landfill org\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
create=false
transfer=false
opts='r:cth'
while getopts "${opts}" arg; do
case "${arg}" in
r) repo="$OPTARG" ;;
c) create=true ;;
t) transfer=true ;;
h|?) usage 0 ;;
esac
done
shift $(( OPTIND - 1 ))
org=$(get_pkg_org "${repo}")
${create} && create_repo "${repo}" "${org}"
${transfer} && transfer_repo "${repo}" "${org}"

View File

@@ -12,7 +12,9 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/base/message.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
ifs=$IFS
IFS="${IFS}:"

View File

@@ -19,7 +19,9 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
m4_include(lib/base/message.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
shopt -s extglob

View File

@@ -6,10 +6,13 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
m4_include(lib/util-base.sh)
m4_include(lib/base/message.sh)
m4_include(lib/base/chroot.sh)
m4_include(lib/base/chroot.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
DATADIR=${DATADIR:-'@datadir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
source "${LIBDIR}"/base/util.sh
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/base/chroot.sh
declare -A buildinfo
declare -a buildenv buildopts installed installpkgs
@@ -85,13 +88,14 @@ get_pkgfile() {
get_makepkg_conf() {
local fname=${1}
local makepkg_conf="${2}"
local arch="${2}"
local makepkg_conf="${3}"
if ! buildtool_file=$(get_pkgfile "${fname}"); then
error "failed to retrieve ${fname}"
return 1
fi
msg2 "using makepkg.conf from ${fname}"
bsdtar xOqf "${buildtool_file/file:\/\//}" usr/share/artools/makepkg.conf > "${makepkg_conf}"
bsdtar xOqf "${buildtool_file/file:\/\//}" usr/share/artools/makepkg.conf.d/${arch}.conf > "${makepkg_conf}"
return 0
}
@@ -212,10 +216,10 @@ TEMPDIR=$(mktemp -d --tmpdir makerepropkg.XXXXXXXXXX)
makepkg_conf="${TEMPDIR}/makepkg.conf"
# anything before buildtool support is pinned to the last none buildtool aware release
if [[ -z "${BUILDTOOL}" ]]; then
get_makepkg_conf "artools-pkg-0.28.2-1-any" "${makepkg_conf}" || exit 1
get_makepkg_conf "artools-pkg-0.28.2-1-any" "${CARCH}" "${makepkg_conf}" || exit 1
# prefere to assume artools-pkg up until matching makepkg version so repository packages remain reproducible
elif [[ "${BUILDTOOL}" = makepkg ]] && (( $(vercmp "${BUILDTOOLVER}" 6.0.1) <= 0 )); then
get_makepkg_conf "artools-pkg-0.28.2-1-any" "${makepkg_conf}" || exit 1
get_makepkg_conf "artools-pkg-0.28.2-1-any" "${CARCH}" "${makepkg_conf}" || exit 1
# all artools-pkg builds
elif [[ "${BUILDTOOL}" = artools-pkg ]] && get_makepkg_conf "${BUILDTOOL}-${BUILDTOOLVER}" "${makepkg_conf}"; then
true

View File

@@ -12,8 +12,10 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/base/message.sh)
m4_include(lib/base/chroot.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/base/chroot.sh
export BUILDTOOL=artools-pkg
export BUILDTOOLVER=m4_artools_pkg_version

View File

@@ -12,8 +12,10 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/base/message.sh)
m4_include(lib/base/yaml.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/base/yaml.sh
#{{{ functions

View File

@@ -12,8 +12,10 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/base/message.sh)
m4_include(lib/pkg/deploy.sh)
LIBDIR=${LIBDIR:-'@libdir@/artools'}
source "${LIBDIR}"/base/message.sh
source "${LIBDIR}"/pkg/deploy.sh
load_makepkg_config

View File

@@ -1,202 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-20 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.
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/repo.sh)
git_rm() {
local r="$1"
if ! "$run_f"; then
printf "git rm -r %s\n" "$r"
printf "git commit -m 'remove %s'\n" "${r##*/}"
else
git rm -r "$r"
git commit -m "remove ${r##*/}"
fi
}
compare_ver() {
local a="$1" b="$2" tree="$3" func="$4" va vb
# shellcheck disable=1090
source "$a"/PKGBUILD 2>/dev/null
va=$(get_full_version)
unset pkgver epoch pkgrel arch
# shellcheck disable=1090
source "$b"/PKGBUILD 2>/dev/null
vb=$(get_full_version)
unset pkgver epoch pkgrel arch
msg2 "a: %s b: %s" "$va" "$vb"
local ret
ret=$(vercmp "$va" "$vb")
msg2 "ret: %s" "$ret"
if [ "$ret" -gt 0 ]; then
git_rm "$b"
elif [ "$ret" -lt 0 ]; then
git_rm "$a"
else
case "$tree" in
"${ARCH_TREE[0]}") git_rm "$a" ;;
"${ARCH_TREE[1]}") git_rm "$b" ;;
esac
fi
}
check_duplicates() {
mapfile -t duplicates < <(find "${TREE_DIR_ARCH}" -mindepth 2 -maxdepth 2 -type d -not -path "*.git" -printf '%f\n' | sort | uniq -d)
for p in "${duplicates[@]}"; do
msg "%s" "$p"
local av bv a b
a="${TREE_DIR_ARCH}/${ARCH_TREE[0]}"
# shellcheck disable=1090
source "$a/$p"/trunk/PKGBUILD 2>/dev/null
av=$(get_full_version)
b="${TREE_DIR_ARCH}/${ARCH_TREE[1]}"
# shellcheck disable=1090
source "$b/$p"/trunk/PKGBUILD 2>/dev/null
bv=$(get_full_version)
msg2 "a: %s b: %s" "$av" "$bv"
ret=$(vercmp "$av" "$bv")
msg2 "ret: %s" "$ret"
if [ "$ret" -gt 0 ]; then
cd "$b"
msg2 "%s" "${b##*/}"
git_rm "$p"
elif [ "$ret" -lt 0 ]; then
cd "$a"
msg2 "%s" "${a##*/}"
git_rm "$p"
fi
done
}
# git config core.mergeoptions --no-edit
check_tree() {
for tree in "${ARCH_TREE[@]}"; do
cd "${TREE_DIR_ARCH}/$tree" || exit
mapfile -t pkgs < <(find . -mindepth 2 -maxdepth 2 -type d -name repos | sort)
for p in "${pkgs[@]}"; do
mapfile -t repos < <(find "$p" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort)
local repos_dir=$p
p=${p%/*}
p=${p##*/}
local size=${#repos[@]}
if (( "$size" > 1 )); then
if [[ "${repos[1]}" != "${valid_names[11]}"-* ]] || [[ "${repos[1]}" != "${valid_names[12]}"-* ]]; then
local a="$repos_dir/${repos[0]}" b="$repos_dir/${repos[1]}"
# repo mismatches
if [[ "${repos[0]}" == "${valid_names[2]}"-* ]] && [[ "${repos[1]}" == "${valid_names[1]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[2]}"-* ]] && [[ "${repos[1]}" == "${valid_names[7]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[2]}"-* ]] && [[ "${repos[1]}" == "${valid_names[4]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[0]}"-* ]] && [[ "${repos[1]}" == "${valid_names[1]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[2]}"-* ]] && [[ "${repos[1]}" == "${valid_names[0]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[3]}"-* ]] && [[ "${repos[1]}" == "${valid_names[7]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[3]}"-* ]] && [[ "${repos[1]}" == "${valid_names[4]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
fi
# same repo name but different arch
if [[ "${repos[0]}" == "${valid_names[0]}"-any ]] && [[ "${repos[1]}" == "${valid_names[0]}"-"$CARCH" ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[1]}"-any ]] && [[ "${repos[1]}" == "${valid_names[1]}"-"$CARCH" ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[2]}"-any ]] && [[ "${repos[1]}" == "${valid_names[2]}"-"$CARCH" ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
fi
fi
fi
done
done
}
usage() {
printf 'Usage: %s\n' "${0##*/}"
printf ' -f Apply filter\n'
printf ' -r Run removal\n'
printf ' -d Check for duplicates\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
load_makepkg_config
load_valid_names
filter=false
dupl=false
run_f=false
opts='hrfd'
while getopts ${opts} arg; do
case "${arg}" in
f) filter=true ;;
r) run_f=true ;;
d) dupl=true ;;
h|?) usage 0 ;;
esac
done
shift $(( OPTIND - 1 ))
"$filter" && check_tree
"$dupl" && check_duplicates

View File

@@ -16,16 +16,8 @@
# lib32
# )
# TREE_DIR_ARCH=${WORKSPACE_DIR}/archlinux
# default repos root for deploypkg
# REPOS_ROOT=${WORKSPACE_DIR}/repos
# default mirror for checkrepo
# REPOS_MIRROR="http://mirror1.artixlinux.org/repos"
# enable if trouble with default github arch mirror
# ARCH_TREE=(packages community)
# enable if trouble with default github arch mirror
# HOST_TREE_ARCH='https://git.archlinux.org/svntogit'

View File

@@ -70,12 +70,15 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
#[gremlins]
#[system-gremlins]
#Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
#[world-gremlins]
#Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist

View File

@@ -70,15 +70,24 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[goblins]
[gnome-wobble]
Include = /etc/pacman.d/mirrorlist
[gremlins]
[system-goblins]
Include = /etc/pacman.d/mirrorlist
[system-gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world-goblins]
Include = /etc/pacman.d/mirrorlist
[world-gremlins]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist

View File

@@ -70,18 +70,21 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[gnome-wobble]
[system-goblins]
Include = /etc/pacman.d/mirrorlist
[goblins]
Include = /etc/pacman.d/mirrorlist
[gremlins]
[system-gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world-goblins]
Include = /etc/pacman.d/mirrorlist
[world-gremlins]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist

View File

@@ -70,12 +70,15 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[gremlins]
[system-gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world-gremlins]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist

View File

@@ -73,15 +73,21 @@ LocalFileSigLevel = Optional
[kde-wobble]
Include = /etc/pacman.d/mirrorlist
[goblins]
[system-goblins]
Include = /etc/pacman.d/mirrorlist
[gremlins]
[system-gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world-goblins]
Include = /etc/pacman.d/mirrorlist
[world-gremlins]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist

View File

@@ -70,15 +70,21 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[goblins]
[system-goblins]
Include = /etc/pacman.d/mirrorlist
[gremlins]
[system-gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world-goblins]
Include = /etc/pacman.d/mirrorlist
[world-gremlins]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist

View File

@@ -70,12 +70,15 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[gremlins]
[system-gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world-gremlins]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist

View File

@@ -70,12 +70,15 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
#[gremlins]
#[system-gremlins]
#Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
#[world-gremlins]
#Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist

View File

@@ -1,99 +0,0 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
NoExtract = usr/share/help/* !usr/share/help/en*
NoExtract = usr/share/gtk-doc/html/* usr/share/doc/*
NoExtract = usr/share/locale/* usr/share/X11/locale/* usr/share/i18n/*
NoExtract = !*locale*/en*/* !usr/share/i18n/charmaps/UTF-8.gz !usr/share/*locale*/locale.*
NoExtract = !usr/share/*locales/en_?? !usr/share/*locales/i18n* !usr/share/*locales/iso*
NoExtract = !usr/share/*locales/trans*
NoExtract = usr/share/man/* usr/share/info/*
NoExtract = usr/share/vim/vim*/lang/*
# Misc options
#UseSyslog
#Color
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate artix`.
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
# - URLs will have $arch replaced by the name of the architecture
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The gremlins repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[system]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
#[lib32]
#Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -1,87 +0,0 @@
--- /dev/null
+++ b/artix.bashrc
@@ -0,0 +1,46 @@
+use_color=true
+
+# Set colorful PS1 only on colorful terminals.
+# dircolors --print-database uses its own built-in database
+# instead of using /etc/DIR_COLORS. Try to use the external file
+# first to take advantage of user additions. Use internal bash
+# globbing instead of external grep binary.
+safe_term=${TERM//[^[:alnum:]]/?} # sanitize TERM
+match_lhs=""
+[[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
+[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
+[[ -z ${match_lhs} ]] \
+ && type -P dircolors >/dev/null \
+ && match_lhs=$(dircolors --print-database)
+[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true
+
+if ${use_color} ; then
+ # Enable colors for ls, etc. Prefer ~/.dir_colors #64489
+ if type -P dircolors >/dev/null ; then
+ if [[ -f ~/.dir_colors ]] ; then
+ eval $(dircolors -b ~/.dir_colors)
+ elif [[ -f /etc/DIR_COLORS ]] ; then
+ eval $(dircolors -b /etc/DIR_COLORS)
+ fi
+ fi
+
+ if [[ ${EUID} == 0 ]] ; then
+ PS1='\[\033[01;31m\][\h\[\033[01;36m\] \W\[\033[01;31m\]]\$\[\033[00m\] '
+ else
+ PS1='\[\033[01;36m\][\u@\h\[\033[01;37m\] \W\[\033[01;36m\]]\$\[\033[00m\] '
+ fi
+
+ alias ls='ls --color=auto'
+ alias grep='grep --colour=auto'
+ alias egrep='egrep --colour=auto'
+ alias fgrep='fgrep --colour=auto'
+else
+ if [[ ${EUID} == 0 ]] ; then
+ # show root@ when we don't have colors
+ PS1='\u@\h \W \$ '
+ else
+ PS1='\u@\h \w \$ '
+ fi
+fi
+
+unset use_color safe_term match_lhs sh
--- a/dot.bashrc
+++ b/dot.bashrc
@@ -5,5 +5,5 @@
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
-alias ls='ls --color=auto'
-PS1='[\u@\h \W]\$ '
+# alias ls='ls --color=auto'
+# PS1='[\u@\h \W]\$ '
--- a/system.bashrc
+++ a/system.bashrc
@@ -1,5 +1,5 @@
#
-# /etc/bash.bashrc
+# /etc/bash/bashrc
#
# If not running interactively, don't do anything
@@ -19,4 +19,8 @@
;;
esac
+for sh in /etc/bash/bashrc.d/*.bashrc ; do
+ [[ -r ${sh} ]] && source "${sh}"
+done
+
[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
--- a/system.bash_logout
+++ a/system.bash_logout
@@ -1,3 +1,3 @@
#
-# /etc/bash.bash_logout
+# /etc/bash/bash_logout
#

View File

@@ -1,42 +0,0 @@
#!/hint/bash
valid_names=(
core
extra
community
multilib
testing
community-testing
multilib-testing
staging
community-staging
multilib-staging
rebuild
gnome-unstable
kde-unstable
)
stable=(
"${valid_names[0]}"
"${valid_names[1]}"
"${valid_names[2]}"
"${valid_names[3]}"
)
gremlins=(
"${valid_names[4]}"
"${valid_names[5]}"
"${valid_names[6]}"
)
goblins=(
"${valid_names[7]}"
"${valid_names[8]}"
"${valid_names[9]}"
"${valid_names[10]}"
)
wobble=(
"${valid_names[11]}"
"${valid_names[12]}"
)

View File

@@ -1,3 +1,3 @@
#!/hint/bash
CHROOTVERSION=0.10
CHROOTVERSION=0.11

View File

@@ -1,16 +0,0 @@
#!/hint/bash
#{{{ common
get_makepkg_conf() {
makepkg_conf="${DATADIR}/makepkg.conf"
[[ -f ${USER_CONF_DIR}/makepkg.conf ]] && makepkg_conf="${USER_CONF_DIR}/makepkg.conf"
}
get_pacman_conf() {
local repo="$1"
pacman_conf="${DATADIR}/pacman-${repo}.conf"
[[ -f "${USER_CONF_DIR}/pacman-${repo}.conf" ]] && pacman_conf="${USER_CONF_DIR}/pacman-${repo}.conf"
}
#}}}

View File

@@ -9,7 +9,7 @@
export LANG=C
if [[ -t 2 && "$TERM" != dumb ]]; then
if [[ -t 2 && "$TERM" != dumb ]] || [[ ${ARTOOLS_COLOR} == always ]]; then
colorize
else
# shellcheck disable=2034
@@ -22,14 +22,19 @@ stat_busy() {
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2
}
stat_progress() {
# shellcheck disable=2059
printf "${BOLD}.${ALL_OFF}" >&2
}
stat_done() {
# shellcheck disable=2059
printf "${BOLD}done${ALL_OFF}\n" >&2
}
lock_close() {
local fd=$1
exec {fd}>&-
local fd=$1
exec {fd}>&-
}
lock() {
@@ -92,4 +97,28 @@ die() {
cleanup 255
}
msg_success() {
local msg=$1
local padding
padding=$(echo "${msg}"|sed -E 's/( *).*/\1/')
msg=$(echo "${msg}"|sed -E 's/ *(.*)/\1/')
printf "%s %s\n" "${padding}${GREEN}${ALL_OFF}" "${msg}" >&2
}
msg_error() {
local msg=$1
local padding
padding=$(echo "${msg}"|sed -E 's/( *).*/\1/')
msg=$(echo "${msg}"|sed -E 's/ *(.*)/\1/')
printf "%s %s\n" "${padding}${RED}x${ALL_OFF}" "${msg}" >&2
}
msg_warn() {
local msg=$1
local padding
padding=$(echo "${msg}"|sed -E 's/( *).*/\1/')
msg=$(echo "${msg}"|sed -E 's/ *(.*)/\1/')
printf "%s %s\n" "${padding}${YELLOW}!${ALL_OFF}" "${msg}" >&2
}
#}}}

View File

@@ -2,8 +2,10 @@
#{{{ base conf
DATADIR=${DATADIR:-'@datadir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p "$1"
return 0
}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
@@ -13,9 +15,7 @@ fi
USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p "$1"
}
prepare_dir "${USER_CONF_DIR}"
load_base_config(){
@@ -35,7 +35,8 @@ load_base_config(){
#}}}
load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}"
prepare_dir "${WORKSPACE_DIR}"
prepare_dir "${USER_CONF_DIR}"

172
lib/pkg/api/gitea.sh Normal file
View File

@@ -0,0 +1,172 @@
#!/hint/bash
#{{{ gitea api
get_compliant() {
local name=$1
printf "%s" "${name}" \
| sed -E 's/([a-zA-Z0-9]+)\+([a-zA-Z]+)/\1-\2/g' \
| sed -E 's/\+/plus/g' \
| sed -E 's/[^a-zA-Z0-9_\-\.]/-/g' \
| sed -E 's/[_\-]{2,}/-/g'
}
get_compliant_name(){
local gitname="$1"
case "$gitname" in
*+) gitname=${gitname//+/plus} ;;
*+*) gitname=${gitname//+/-} ;;
esac
printf "%s\n" "$gitname"
}
api_put() {
curl -s -X PUT "$@"
}
api_delete() {
curl -s -X DELETE "$@"
}
api_post() {
curl -s -X POST "$@"
}
api_patch() {
curl -s -X PATCH "$@"
}
api_get() {
curl -s -X GET "$@"
}
add_team_to_repo() {
local pkgbase="$1"
local team="$2"
local url
url="${GIT_URL}/api/v1/repos/packages/$pkgbase/teams/$team"
stat_busy "Adding team ($team) to package repo [$pkgbase]"
api_put "$url" \
-H "accept: application/json" \
-H "Authorization: token ${GIT_TOKEN}"
stat_done
}
remove_team_from_repo() {
local pkgbase="$1"
local team="$2"
local url
url="${GIT_URL}/api/v1/repos/packages/$pkgbase/teams/$team"
stat_busy "Removing team ($team) from package repo [$pkgbase]"
api_delete "$url" \
-H "accept: application/json" \
-H "Authorization: token ${GIT_TOKEN}"
stat_done
}
create_repo() {
local pkgbase="$1"
local url json
url="${GIT_URL}/api/v1/org/packages/repos"
json="{ \"auto_init\": true, \"name\": \"$pkgbase\", \"gitignores\": \"ArchLinuxPackages\", \"readme\": \"Default\" }"
stat_busy "Create package repo [$pkgbase] in org (packages)"
api_post "$url" \
-H "accept: application/json" \
-H "content-type: application/json" \
-H "Authorization: token ${GIT_TOKEN}" \
-d "$json"
stat_done
}
transfer_repo() {
local pkgbase="$1"
local new_owner="$2"
local json url
json="{ \"new_owner\": \"$new_owner\", \"team_ids\": [] }"
url="${GIT_URL}/api/v1/repos/packages/$pkgbase/transfer"
stat_busy "Transfer package repo [$pkgbase] in org ($new_owner)"
api_post "$url" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: token ${GIT_TOKEN}" \
-d "$json"
stat_done
}
list_all_repos() {
local url
url="${GIT_URL}/api/v1/orgs/packages/repos?limit=10000"
api_get "$url" \
-H "accept: application/json"
}
replace_topic() {
local url
local repo="$1"
local maintainer="$2"
url="${GIT_URL}/api/v1/repos/packages/$repo/topics"
api_put "$url" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: token ${GIT_TOKEN}" \
-d "{
\"topics\": [
\"${maintainer}\"
]
}"
}
list_topics() {
local url
local pkgbase="$1"
url="${GIT_URL}/api/v1/repos/packages/$pkgbase/topics"
api_get "$url" \
-H "accept: application/json"
}
add_topic() {
local url
local pkgbase="$1"
local topic="$2"
url="${GIT_URL}/api/v1/repos/packages/$pkgbase/topics/$topic"
stat_busy "Add topic ($topic) to [$pkgbase]"
api_put "$url" \
-H "accept: application/json" \
-H "Authorization: token ${GIT_TOKEN}"
stat_done
}
remove_topic() {
local url
local pkgbase="$1"
local topic="$2"
url="${GIT_URL}/api/v1/repos/packages/$pkgbase/topics/$topic"
stat_busy "Remove topic ($topic) from [$pkgbase]"
api_delete "$url" \
-H "accept: application/json" \
-H "Authorization: token ${GIT_TOKEN}"
stat_done
}
search_topic() {
local search="$1"
local url
url="${GIT_URL}/api/v1/repos/search?q=${search}&topic=true&includeDesc=false&private=false&is_private=false&template=false&archived=false&order=asc"
stat_busy "Query for topic (${search})"
api_get "$url" \
-H 'accept: application/json'
stat_done
}
#}}}

View File

@@ -3,8 +3,7 @@
#{{{ jenkins
write_jenkinsfile(){
local pkg="$1"
local jenkins=$pkg/Jenkinsfile
local jenkins=Jenkinsfile
printf "@Library('artix-ci') import org.artixlinux.RepoPackage\n" > "$jenkins"
{
@@ -17,9 +16,8 @@ write_jenkinsfile(){
}
write_agentyaml(){
local pkg="$1"
local agent="$pkg"/.artixlinux/agent.yaml label='master'
[[ -d $pkg/.artixlinux ]] || mkdir "$pkg"/.artixlinux
local agent=.artixlinux/agent.yaml label='master'
[[ -d .artixlinux ]] || mkdir .artixlinux
printf '%s\n' '---' > "$agent"
{
@@ -32,10 +30,8 @@ write_agentyaml(){
}
commit_ci(){
local pkg="$1"
write_jenkinsfile "$pkg"
write_agentyaml "$pkg"
write_jenkinsfile
write_agentyaml
git commit -m "initial ci commit"
}

View File

@@ -1,37 +0,0 @@
#!/hint/bash
#{{{ common functions
get_compliant_name(){
local gitname="$1"
case "$gitname" in
*+) gitname=${gitname//+/plus} ;;
*+*) gitname=${gitname//+/-} ;;
esac
printf "%s\n" "$gitname"
}
get_pkg_org(){
local pkg="$1" org sub
case ${pkg} in
ruby-*) org="packagesRuby" ;;
perl-*) org="packagesPerl" ;;
python-*|python2-*) org="packagesPython" ;;
*) sub=${pkg:0:1}; org="packages${sub^^}" ;;
esac
printf "%s\n" "$org"
}
api_put() {
curl -s -X PUT "$@"
}
api_delete() {
curl -s -X DELETE "$@"
}
api_post() {
curl -s -X POST "$@"
}
#}}}

View File

@@ -1,32 +1,77 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
#{{{ git
[[ -z ${ARTOOLS_INCLUDE_GIT_SH:-} ]] || return 0
ARTOOLS_INCLUDE_GIT_SH=1
get_local_head(){
git log --pretty=%H ...refs/heads/master^ | head -n 1
set -e
artixpkg_git_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS]
COMMANDS
clone Clone a package repository
config Configure a clone according to artix specs
create Create a new Gitea package repository
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} clone libfoo linux libbar
$ ${COMMAND} clone --maintainer maintainer-mynickname
$ ${COMMAND} config -t libfoo
$ ${COMMAND} config -u libfoo
$ ${COMMAND} create libfoo
_EOF_
}
get_remote_head(){
git ls-remote origin -h refs/heads/master | cut -f1
}
has_changeset(){
local head_l="$1" head_r="$2"
if [[ "$head_l" == "$head_r" ]]; then
msg2 "remote changes: no"
return 1
else
msg2 "remote changes: yes"
return 0
artixpkg_git() {
if (( $# < 1 )); then
artixpkg_git_usage
exit 0
fi
}
pull_tree(){
local tree="$1" lh="$2" rh
rh=$(get_remote_head)
if has_changeset "${lh}" "${rh}";then
git pull origin master
fi
# option checking
while (( $# )); do
case $1 in
-h|--help)
artixpkg_git_usage
exit 0
;;
clone)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=lib/git/clone.sh
source "${LIBDIR}"/pkg/git/clone.sh
artixpkg_git_clone "$@"
exit 0
;;
config)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=lib/git/config.sh
source "${LIBDIR}"/pkg/git/config.sh
artixpkg_git_config "$@"
exit 0
;;
create)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=lib/git/create.sh
source "${LIBDIR}"/pkg/git/create.sh
artixpkg_git_create "$@"
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
die "invalid command: %s" "$1"
;;
esac
done
}
#}}}

165
lib/pkg/git/clone.sh Normal file
View File

@@ -0,0 +1,165 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_GIT_CLONE_SH:-} ]] || return 0
ARTOOLS_INCLUDE_GIT_CLONE_SH=1
source "${LIBDIR}"/pkg/git/config.sh
set -e
artixpkg_git_clone_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-m, --maintainer=NAME Clone all packages of the named maintainer
--protocol https Clone the repository over https
-t, --topic=NAME Clone all packages of the named topic
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
--universe Clone all existing packages, useful for cache warming
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} libfoo linux libbar
$ ${COMMAND} --maintainer maintainer-mynickname
$ ${COMMAND} --topic myopic
$ ${COMMAND} -j 8 --topic myopic
_EOF_
}
artixpkg_git_clone() {
if (( $# < 1 )); then
artixpkg_git_clone_usage
exit 0
fi
# options
local GIT_REPO_BASE_URL="${GIT_SSH}:"
local CLONE_ALL=0
local MAINTAINER=
local TOPIC=
local CONFIGURE_OPTIONS=()
local jobs=
jobs=$(nproc)
local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
while (( $# )); do
case $1 in
-h|--help)
artixpkg_git_clone_usage
exit 0
;;
--protocol=https)
GIT_REPO_BASE_URL="${GIT_URL}/"
CONFIGURE_OPTIONS+=("$1")
shift
;;
--protocol)
(( $# <= 1 )) && die "missing argument for %s" "$1"
if [[ $2 == https ]]; then
GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
else
die "unsupported protocol: %s" "$2"
fi
CONFIGURE_OPTIONS+=("$1" "$2")
shift 2
;;
-m|--maintainer)
(( $# <= 1 )) && die "missing argument for %s" "$1"
MAINTAINER="$2"
shift 2
;;
--maintainer=*)
MAINTAINER="${1#*=}"
shift
;;
-t|--topic)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TOPIC="$2"
shift 2
;;
--topic=*)
TOPIC="${1#*=}"
shift
;;
--universe)
CLONE_ALL=1
shift
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
pkgbases=("$@")
break
;;
esac
done
# Query packages of a maintainer
if [[ -n ${MAINTAINER} ]]; then
stat_busy "Query mantainer packages"
local maint
maint="maintainer-${MAINTAINER}"
mapfile -t pkgbases < <(search_topic "${maint}" | jq -r '.data | .[].name' | sort)
stat_done
fi
if [[ -n ${TOPIC} ]]; then
stat_busy "Query topic packages"
mapfile -t pkgbases < <(search_topic "${TOPIC}" | jq -r '.data | .[].name' | sort)
stat_done
fi
# Query all released packages
if (( CLONE_ALL )); then
stat_busy "Query all packages"
mapfile -t pkgbases < <(list_all_repos | jq -r '.[] | .name' | sort)
stat_done
fi
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then
# force colors in parallel if parent process is colorized
if [[ -n ${BOLD} ]]; then
export ARTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${pkgbases[@]}"; then
die 'Failed to clone some packages, please check the output'
exit 1
fi
exit 0
fi
for pkgbase in "${pkgbases[@]}"; do
if [[ ! -d ${pkgbase} ]]; then
msg "Cloning ${pkgbase} ..."
local gitname url
gitname=$(get_compliant_name "${pkgbase}")
url="${GIT_REPO_BASE_URL}packages/${gitname}.git"
if ! git clone "${url}" "${pkgbase}"; then
die 'failed to clone %s' "${pkgbase}"
fi
else
warning "Skip cloning ${pkgbase}: Directory exists"
fi
artixpkg_git_config "${CONFIGURE_OPTIONS[@]}" "${pkgbase}"
done
}

251
lib/pkg/git/config.sh Normal file
View File

@@ -0,0 +1,251 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_GIT_CONFIG_SH:-} ]] || return 0
ARTOOLS_INCLUDE_GIT_CONFIG_SH=1
set -e
artixpkg_git_config_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-t, --topic Set the maintainer topic via gitea api
-u, --upstream Add upstream arch remote
--protocol https Configure remote url to use https
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} -t libfoo
$ ${COMMAND} -u libfoo
$ ${COMMAND} *
_EOF_
}
get_packager_name() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local name
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
name=$(echo "${packager}"|sed -E "s/${packager_pattern}/\1/")
printf "%s" "${name}"
}
get_packager_email() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local email
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
email=$(echo "${packager}"|sed -E "s/${packager_pattern}/\2/")
printf "%s" "${email}"
}
is_packager_name_valid() {
local packager_name=$1
if [[ -z ${packager_name} ]]; then
return 1
elif [[ ${packager_name} == "John Tux" ]]; then
return 1
elif [[ ${packager_name} == "Unknown Packager" ]]; then
return 1
fi
return 0
}
is_packager_email_official() {
local packager_email=$1
if [[ -z ${packager_email} ]]; then
return 1
elif [[ $packager_email =~ .+@artixlinux.org ]]; then
return 0
fi
return 1
}
artixpkg_git_config() {
# options
local GIT_REPO_BASE_URL=${GIT_URL}
local official=0
local proto=https
local proto_force=0
local jobs=
jobs=$(nproc)
local paths=()
local SET_TOPIC=0
local UPSTREAM=0
# variables
local -r command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local path realpath pkgbase
local PACKAGER GPGKEY packager_name packager_email
while (( $# )); do
case $1 in
-h|--help)
artixpkg_git_config_usage
exit 0
;;
-t|--topic)
SET_TOPIC=1
shift
;;
-u|--upstream)
UPSTREAM=1
shift
;;
--protocol=https)
proto_force=1
shift
;;
--protocol)
(( $# <= 1 )) && die "missing argument for %s" "$1"
if [[ $2 == https ]]; then
proto_force=1
else
die "unsupported protocol: %s" "$2"
fi
shift 2
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
paths=("$@")
break
;;
esac
done
# check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then
if [[ -f PKGBUILD ]]; then
paths=(".")
else
artixpkg_git_config_usage
exit 1
fi
fi
# Load makepkg.conf variables to be available for packager identity
msg "Collecting packager identity from makepkg.conf"
# shellcheck disable=2119
load_makepkg_config
if [[ -n ${PACKAGER} ]]; then
if ! packager_name=$(get_packager_name "${PACKAGER}") || \
! packager_email=$(get_packager_email "${PACKAGER}"); then
die "invalid PACKAGER format '${PACKAGER}' in makepkg.conf"
fi
if ! is_packager_name_valid "${packager_name}"; then
die "invalid PACKAGER '${PACKAGER}' in makepkg.conf"
fi
if is_packager_email_official "${packager_email}"; then
official=1
if (( ! proto_force )); then
proto=ssh
GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH}
fi
fi
fi
msg2 "name : ${packager_name:-${YELLOW}undefined${ALL_OFF}}"
msg2 "email : ${packager_email:-${YELLOW}undefined${ALL_OFF}}"
msg2 "gpg-key : ${GPGKEY:-${YELLOW}undefined${ALL_OFF}}"
if [[ ${proto} == ssh ]]; then
msg2 "protocol: ${GREEN}${proto}${ALL_OFF}"
else
msg2 "protocol: ${YELLOW}${proto}${ALL_OFF}"
fi
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#paths[@]} > 1 )); then
if [[ -n ${BOLD} ]]; then
export ARTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${paths[@]}"; then
die 'Failed to configure some packages, please check the output'
exit 1
fi
exit 0
fi
for path in "${paths[@]}"; do
if ! realpath=$(realpath -e "${path}"); then
error "No such directory: ${path}"
# continue
fi
pkgbase=$(basename "${realpath}")
pkgbase=${pkgbase%.git}
msg "Configuring ${pkgbase}"
if [[ ! -d "${path}/.git" ]]; then
error "Not a Git repository: ${path}"
# continue
fi
( cd "${path}" || return
git config pull.rebase true
git config branch.autoSetupRebase always
# setup author identity
if [[ -n ${packager_name} ]]; then
git config user.name "${packager_name}"
git config user.email "${packager_email}"
fi
# force gpg for official packagers
if (( official )); then
git config commit.gpgsign true
fi
# set custom pgp key from makepkg.conf
if [[ -n $GPGKEY ]]; then
git config commit.gpgsign true
git config user.signingKey "${GPGKEY}"
fi
# topics meta
if (( SET_TOPIC )); then
if [[ -n ${GIT_TOKEN} ]]; then
local topic gitname
topic="maintainer-${packager_name}"
gitname=$(get_compliant_name "${pkgbase}")
if ! add_topic "${gitname}" "${topic}"; then
warning "failed to set the maintainer topic: ${topic}"
fi
fi
fi
if (( UPSTREAM )); then
local remote_url
remote_url="${GIT_UPSTREAM_URL}/$pkgbase".git
if ! git remote add upstream "${remote_url}"; then
warning "failed to set the upstream: ${remote_url}"
fi
fi
)
done
}

116
lib/pkg/git/create.sh Normal file
View File

@@ -0,0 +1,116 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_GIT_CREATE_SH:-} ]] || return 0
ARTOOLS_INCLUDE_GIT_CREATE_SH=1
source "${LIBDIR}"/pkg/git/clone.sh
source "${LIBDIR}"/pkg/git/config.sh
source "${LIBDIR}"/pkg/ci/jenkins.sh
set -e
artixpkg_git_create_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-c, --clone Clone the Git repository after creation
-t, --team=NAME Assign team name [default: world]
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} libfoo
_EOF_
}
artixpkg_git_create() {
# options
local pkgbases=()
local pkgbase
local clone=0
local config=0
local TEAM='extra'
# variables
local path
while (( $# )); do
case $1 in
-h|--help)
artixpkg_git_create_usage
exit 0
;;
-c|--clone)
clone=1
shift
;;
-t|--team)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TEAM="$2"
shift 2
;;
--team=*)
TEAM="${1#*=}"
shift
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
pkgbases=("$@")
break
;;
esac
done
# check if invoked without any path from within a packaging repo
if (( ${#pkgbases[@]} == 0 )); then
if [[ -f PKGBUILD ]]; then
if ! path=$(realpath -e .); then
die "failed to read path from current directory"
fi
pkgbases=("$(basename "${path}")")
clone=0
config=1
else
artixpkg_git_create_usage
exit 1
fi
fi
# create
for pkgbase in "${pkgbases[@]}"; do
local gitname=$(get_compliant_name "${pkgbase}")
if ! create_repo "${gitname}" >/dev/null; then
die "failed to create project: ${pkgbase}"
fi
if ! add_team_to_repo "${gitname}" "${TEAM}" >/dev/null; then
warning "failed to assign team: ${TEAM}"
fi
msg_success "Successfully created ${pkgbase}"
if (( clone )); then
artixpkg_git_clone "${pkgbase}"
( cd "${pkgbase}"
commit_ci
)
elif (( config )); then
artixpkg_git_config
fi
done
# some convenience hints if not in auto clone/config mode
if (( ! clone )) && (( ! config )); then
cat <<- _EOF_
For new clones:
$(msg2 "artixpkg git clone ${pkgbases[*]}")
For existing clones:
$(msg2 "artixpkg git config ${pkgbases[*]}")
_EOF_
fi
}

View File

@@ -1,31 +0,0 @@
#!/hint/bash
#{{{ gitea api
add_team_to_repo() {
local name="$1"
local org="$2"
local team="$3"
local url
url="${GIT_URL}/api/v1/repos/$org/$name/teams/$team?access_token=${GIT_TOKEN}"
msg2 "Adding team (%s) to package repo [%s]" "$team" "$name"
api_put "$url" -H "accept: application/json"
}
remove_team_from_repo() {
local name="$1"
local org="$2"
local team="$3"
local url
url="${GIT_URL}/api/v1/repos/$org/$name/teams/$team?access_token=${GIT_TOKEN}"
msg2 "Removing team (%s) from package repo [%s]" "$team" "$name"
api_delete "$url" -H "accept: application/json"
}
#}}}

View File

@@ -1,51 +1,104 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
##{{{ repo
[[ -z ${ARTOOLS_INCLUDE_REPO_SH:-} ]] || return 0
ARTOOLS_INCLUDE_REPO_SH=1
shopt -s extglob
set -e
load_valid_names(){
local conf
conf="${DATADIR}"/valid-names.conf
[[ -f "$conf" ]] || return 1
# shellcheck source=/usr/share/artools/valid-names.conf
[[ -r "$conf" ]] && . "$conf"
return 0
artixpkg_repo_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS]
COMMANDS
add add and commit pkg to repo
move move and commit pkg between repos
remove remove and commit pkg from repo
import import latest tag from arch upstream
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} add extra libfoo
$ ${COMMAND} remove extra libfoo
$ ${COMMAND} move extra-testing extra libfoo
$ ${COMMAND} import libfoo
_EOF_
}
set_arch_repos(){
local _testing="$1" _staging="$2" _unstable="$3"
[[ -z ${valid_names[*]} ]] && load_valid_names
ARCH_REPOS=("${stable[@]}")
$_testing && ARCH_REPOS+=("${gremlins[@]}")
$_staging && ARCH_REPOS+=("${goblins[@]}")
$_unstable && ARCH_REPOS+=("${wobble[@]}")
}
ARTIX_DB=(
core
extra
community
multilib
core-testing
extra-testing
community-testing
multilib-testing
core-staging
extra-staging
community-staging
multilib-staging
kde-unstable
gnome-unstable
core-rebuild
extra-rebuild
)
find_repo(){
local pkg="$1" pkgarch="${2:-${CARCH}}" repo
for r in "${ARCH_REPOS[@]}"; do
[[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo="$r-$pkgarch"
[[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo="$r"-any
[[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$r"
done
printf "%s\n" "$repo"
}
artixpkg_repo() {
if (( $# < 1 )); then
artixpkg_repo_usage
exit 0
fi
find_pkg(){
local searchdir="$1" pkg="$2" result
result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg")
printf "%s\n" "$result"
}
tree_loop(){
local func="$1" pkgs
for tree in "${ARTIX_TREE[@]}"; do
mapfile -t pkgs < <(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort)
for p in "${pkgs[@]}"; do
"$func" "$p"
done
# option checking
while (( $# )); do
case $1 in
-h|--help)
artixpkg_repo_usage
exit 0
;;
add)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=lib/pkg/repo/add.sh
source "${LIBDIR}"/pkg/repo/add.sh
artixpkg_repo_add "$@"
exit 0
;;
move)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=lib/pkg/repo/move.sh
source "${LIBDIR}"/pkg/repo/move.sh
artixpkg_repo_move "$@"
exit 0
;;
remove)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=lib/pkg/repo/remove.sh
source "${LIBDIR}"/pkg/repo/remove.sh
artixpkg_repo_remove "$@"
exit 0
;;
import)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=lib/pkg/repo/import.sh
source "${LIBDIR}"/pkg/repo/import.sh
artixpkg_repo_import "$@"
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
die "invalid command: %s" "$1"
;;
esac
done
}
#}}}

142
lib/pkg/repo/add.sh Normal file
View File

@@ -0,0 +1,142 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_REPO_ADD_SH:-} ]] || return 0
ARTOOLS_INCLUDE_REPO_ADD_SH=1
set -e
get_commit_msg() {
printf "[%s] -> [%s] '%s' %s\n" "trunk" "${DEST}" "${pkgbase}-$(get_full_version)" "add"
}
artixpkg_repo_add_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]...
OPTIONS
-p, --push Push pkgbase
-t, --topic Set the [DEST_REPO] topic via gitea api
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} extra-testing libfoo
$ ${COMMAND} -p extra-testing libfoo
$ ${COMMAND} -t -p extra-testing libfoo
_EOF_
}
artixpkg_repo_add() {
if (( $# < 1 )); then
artixpkg_repo_add_usage
exit 0
fi
# options
local pkgbases=()
local pkgbase
local PUSH=0
local SET_TOPIC=0
local DEST='trunk'
# variables
local path
while (( $# )); do
case $1 in
-h|--help)
artixpkg_repo_add_usage
exit 0
;;
-p|--push)
PUSH=1
shift
;;
-t|--topic)
SET_TOPIC=1
shift
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
DEST="$1"
pkgbases+=("$@")
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!"
fi
for pkgbase in "${pkgbases[@]}"; do
if [[ -d "${pkgbase}" ]];then
if [[ ! -d "${pkgbase}/.git" ]]; then
error "Not a Git repository: ${pkgbase}"
continue
fi
( cd "${pkgbase}" || return
local pkgbuild
pkgbuild=trunk/PKGBUILD
if [[ ! -f "$pkgbuild" ]]; then
die "No PKGBUILD found in (%s)" "trunk"
fi
[[ -d "$CARCH/${DEST}" ]] && git rm -r "$CARCH/${DEST}"
[[ ! -d "$CARCH" ]] && mkdir "$CARCH"
[[ ! -d "$CARCH/${DEST}" ]] && mkdir "$CARCH/${DEST}"
cp -r trunk/* "$CARCH/${DEST}"/
pkgbuild="$CARCH/${DEST}"/PKGBUILD
# shellcheck disable=1090
source "$pkgbuild"
local commit_msg
commit_msg=$(get_commit_msg)
if [[ -n $(git status --porcelain --untracked-files=normal) ]]; then
msg 'Staging files'
for f in $(git ls-files --modified -o --directory); do
git add "$f"
done
# stat_done
msg 'Commit'
git commit -m "${commit_msg}"
# stat_done
if (( PUSH )); then
msg "Push (${pkgbase})"
git push origin master
# stat_done
fi
if (( SET_TOPIC )); then
# topics meta
if [[ -n ${GIT_TOKEN} ]]; then
local topic="${DEST}"
local gitname=$(get_compliant_name "${pkgbase}")
if ! add_topic "${gitname}" "${topic}" >/dev/null; then
warning "failed to add pacman repo topic: ${topic}"
fi
fi
fi
fi
)
fi
done
}

135
lib/pkg/repo/import.sh Normal file
View File

@@ -0,0 +1,135 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_REPO_IMPORT_SH:-} ]] || return 0
ARTOOLS_INCLUDE_REPO_IMPORT_SH=1
set -e
patch_pkgbase(){
local name="$1"
local pkgbuild
pkgbuild=trunk/PKGBUILD
sed -e 's|arch-meson|artix-meson|' -i "${pkgbuild}"
case "${name}" in
glibc)
msg "Patching %s" "${name}"
sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \
-e '/nscd.service/d' \
-i "${pkgbuild}"
;;
linux|linux-lts)
msg "Patching %s" "${name}"
sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i "${pkgbuild}"
sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
-i "$pkgpath"/config
;;
gstreamer|gst-plugins-*|licenses)
msg "Patching %s" "${name}"
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \
-e 's|(Arch Linux)|(Artix Linux)|' \
-i "${pkgbuild}"
;;
esac
}
artixpkg_repo_import_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
--switch TAG Switch the current trunk to a specified version tag
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} libfoo
$ ${COMMAND} libfoo --switch TAG
_EOF_
}
artixpkg_repo_import() {
if (( $# < 1 )); then
artixpkg_repo_import_usage
exit 0
fi
# options
local pkgbases=()
local pkgbase
local upstream_url
upstream_url="https://gitlab.archlinux.org/archlinux/packaging/packages"
local TAG
local rsync_args=()
rsync_args+=(-aWxvci --progress --delete-before --no-R --no-implied-dirs --exclude '.git')
while (( $# )); do
case $1 in
--switch=*)
TAG="${1#*=}"
shift
;;
-h|--help)
artixpkg_repo_import_usage
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
pkgbases+=("$@")
for pkgbase in "${pkgbases[@]}"; do
if [[ -d "${pkgbase}" ]];then
if [[ ! -d "${pkgbase}/.git" ]]; then
error "Not a Git repository: ${pkgbase}"
continue
fi
( cd "${pkgbase}" || return
stat_busy "Checking for upstream url"
if ! git config --local --get remote.upstream.url &>/dev/null; then
git remote add upstream "${upstream_url}"/${pkgbase}.git
fi
stat_done
stat_busy "Fetching upstream tags"
git fetch upstream --tags
stat_done
local latest version
latest=$(git describe --tags FETCH_HEAD)
version="${latest}"
if [[ -n "${TAG}" ]]; then
version="${TAG}"
fi
stat_busy "Importing upstream changeset for ${version}"
git checkout "${version}" -b "${version}" &>/dev/null
local temp
temp=$(mktemp -d --tmpdir "${pkgbase}.XXXXXXXXXX")
rsync "${rsync_args[@]}" "$(pwd)"/ "${temp}"/ &>/dev/null
git checkout master &>/dev/null
git branch -D "${version}" &>/dev/null
rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/trunk/ &>/dev/null
patch_pkgbase "${pkgbase}"
stat_done
)
fi
done
}

157
lib/pkg/repo/move.sh Normal file
View File

@@ -0,0 +1,157 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_REPO_MOVE_SH:-} ]] || return 0
ARTOOLS_INCLUDE_REPO_MOVE_SH=1
set -e
artixpkg_repo_move_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [SOURCE_REPO] [DEST_REPO] [PKGBASE]...
OPTIONS
-p, --push Push pkgbase
-t, --topic Set the [DEST_REPO] topic via gitea api
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} extra-testing extra libfoo
$ ${COMMAND} -p extra-testing extra libfoo
$ ${COMMAND} -t -p extra-testing extra libfoo
_EOF_
}
get_commit_msg() {
printf "[%s] -> [%s] '%s' %s\n" "${SRC}" "${DEST}" "${pkgbase}-$(get_full_version)" "move"
}
artixpkg_repo_move() {
if (( $# < 1 )); then
artixpkg_repo_move_usage
exit 0
fi
# options
local pkgbases=()
local pkgbase
local PUSH=0
local SET_TOPIC=0
local DEST
local SRC
# variables
local path
while (( $# )); do
case $1 in
-h|--help)
artixpkg_repo_move_usage
exit 0
;;
-p|--push)
PUSH=1
shift
;;
-t|--topic)
SET_TOPIC=1
shift
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
SRC="$1"
DEST="$2"
shift 2
if ! in_array "${SRC}" "${ARTIX_DB[@]}"; then
die "${SRC} does not exist!"
fi
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!"
fi
pkgbases+=("$@")
for pkgbase in "${pkgbases[@]}"; do
if [[ -d "${pkgbase}" ]];then
if [[ ! -d "${pkgbase}/.git" ]]; then
error "Not a Git repository: ${pkgbase}"
continue
fi
( cd "${pkgbase}" || return
pkgbuild=trunk/PKGBUILD
if [[ ! -f "$pkgbuild" ]]; then
die "No PKGBUILD found in (%s)" "trunk"
fi
[[ -d "$CARCH/${DEST}" ]] && git rm -r "$CARCH/${DEST}"
[[ ! -d "$CARCH" ]] && mkdir "$CARCH"
[[ ! -d "$CARCH/${DEST}" ]] && mkdir "$CARCH/${DEST}"
mv -T "$CARCH/${SRC}" "$CARCH/${DEST}"
pkgbuild="$CARCH/${DEST}"/PKGBUILD
# shellcheck disable=1090
source "$pkgbuild"
local commit_msg
commit_msg=$(get_commit_msg)
if [[ -n $(git status --porcelain --untracked-files=normal) ]]; then
# git add .
msg 'Staging files'
for f in $(git ls-files --deleted); do
git rm "$f"
done
for f in $(git ls-files -o --unmerged); do
git add "$f"
done
# stat_done
msg 'Commit'
git commit -m "${commit_msg}"
# stat_done
if (( PUSH )); then
msg "Push (${pkgbase})"
git push origin master
# stat_done
fi
if (( SET_TOPIC )); then
# topics meta
if [[ -n ${GIT_TOKEN} ]]; then
local topic="${DEST}"
local gitname=$(get_compliant_name "${pkgbase}")
if ! add_topic "${gitname}" "${topic}" >/dev/null; then
warning "failed to add pacman repo topic: ${topic}"
fi
topic="${SRC}"
if ! remove_topic "${gitname}" "${topic}" >/dev/null; then
warning "failed to remove pacman repo topic: ${topic}"
fi
fi
fi
fi
)
fi
done
}

137
lib/pkg/repo/remove.sh Normal file
View File

@@ -0,0 +1,137 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_REPO_REMOVE_SH:-} ]] || return 0
ARTOOLS_INCLUDE_REPO_REMOVE_SH=1
set -e
artixpkg_repo_remove_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]...
OPTIONS
-p, --push Push pkgbase
-t, --topic Set the [DEST_REPO] topic via gitea api
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} extra-testing libfoo
$ ${COMMAND} -p extra-testing libfoo
$ ${COMMAND} -t -p extra-testing libfoo
_EOF_
}
get_commit_msg() {
printf "[%s] '%s' %s\n" "${DEST}" "${pkgbase}-$(get_full_version)" "remove"
}
artixpkg_repo_remove() {
if (( $# < 1 )); then
artixpkg_repo_remove_usage
exit 0
fi
# options
local pkgbases=()
local pkgbase
local PUSH=0
local SET_TOPIC=0
local DEST='trunk'
# variables
local path
while (( $# )); do
case $1 in
-h|--help)
artixpkg_repo_remove_usage
exit 0
;;
-p|--push)
PUSH=1
shift
;;
-t|--topic)
SET_TOPIC=1
shift
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
pkgbases=("$@")
break
;;
esac
done
DEST="$1"
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!"
fi
for pkgbase in "${pkgbases[@]}"; do
if [[ -d "${pkgbase}" ]];then
if [[ ! -d "${pkgbase}/.git" ]]; then
error "Not a Git repository: ${pkgbase}"
continue
fi
( cd "${pkgbase}" || return
pkgbuild=trunk/PKGBUILD
if [[ ! -f "$pkgbuild" ]]; then
die "No PKGBUILD found in (%s)" "trunk"
fi
pkgbuild="$CARCH/${DEST}"/PKGBUILD
# shellcheck disable=1090
source "$pkgbuild"
local commit_msg
commit_msg=$(get_commit_msg)
rm -r "$CARCH/${DEST}"
if [[ -n $(git status --porcelain --untracked-files=normal) ]]; then
msg 'Staging files'
for f in $(git ls-files --deleted); do
git rm "$f"
done
# stat_done
msg 'Commit'
git commit -m "${commit_msg}"
# stat_done
if (( PUSH )); then
msg "Push (${pkgbase})"
git push origin master
# stat_done
fi
if (( SET_TOPIC )); then
# topics meta
if [[ -n ${GIT_TOKEN} ]]; then
local topic="${SRC}"
if ! remove_topic "${gitname}" "${topic}" >/dev/null; then
warning "failed to remove pacman repo topic: ${topic}"
fi
fi
fi
fi
)
fi
done
}

View File

@@ -24,16 +24,11 @@ load_pkg_config(){
[[ -z ${ARTIX_TREE[*]} ]] && \
ARTIX_TREE=(main initsys desktop addons lib32)
TREE_DIR_ARCH=${TREE_DIR_ARCH:-"${WORKSPACE_DIR}/archlinux"}
[[ -z ${ARCH_TREE[*]} ]] && \
ARCH_TREE=(svntogit-{packages,community})
REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
REPOS_MIRROR=${REPOS_MIRROR:-'http://mirror1.artixlinux.org/repos'}
HOST_TREE_ARCH=${HOST_TREE_ARCH:-'https://github.com/archlinux'}
GIT_UPSTREAM_URL=${GIT_UPSTREAM_URL:-"https://gitlab.archlinux.org/archlinux/packaging/packages"}
DBEXT=${DBEXT:-'gz'}
@@ -46,4 +41,3 @@ load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}"
prepare_dir "${REPOS_ROOT}"
prepare_dir "${TREE_DIR_ARTIX}"
prepare_dir "${TREE_DIR_ARCH}"