diff --git a/artools/0.26.1/artools/.gitignore b/artools/0.26.1/artools/.gitignore new file mode 100644 index 0000000..891f417 --- /dev/null +++ b/artools/0.26.1/artools/.gitignore @@ -0,0 +1,8 @@ +*~ +*.tar.gz +*.tar.xz +.kateproject.d +data/schemas/*.conf +.project +iso-profiles +live-services diff --git a/artools/0.26.1/artools/Makefile b/artools/0.26.1/artools/Makefile new file mode 100644 index 0000000..fbcaa70 --- /dev/null +++ b/artools/0.26.1/artools/Makefile @@ -0,0 +1,179 @@ +V=0.26 + +TOOLS = artools +PREFIX ?= /usr +SYSCONFDIR = /etc +BINDIR = $(PREFIX)/bin +DATADIR = $(PREFIX)/share + +BASE_CONF = \ + data/conf/artools-base.conf + +BASE_BIN = \ + bin/base/chroot-run \ + bin/base/mkchroot \ + bin/base/basestrap \ + bin/base/artix-chroot \ + bin/base/fstabgen + +BASE_DATA = \ + $(wildcard data/pacman/pacman*.conf) + +PKG_CONF = \ + data/conf/artools-pkg.conf + +SETARCH_ALIASES = \ + +PKG_BIN = \ + bin/pkg/buildpkg \ + bin/pkg/deploypkg \ + bin/pkg/commitpkg \ + bin/pkg/comparepkg \ + bin/pkg/mkchrootpkg \ + bin/pkg/pkg2yaml \ + bin/pkg/buildtree \ + 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 + +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-world \ + buildpkg-gremlins \ + buildpkg-goblins \ + buildpkg-galaxy \ + buildpkg-galaxy-gremlins \ + buildpkg-galaxy-goblins \ + buildpkg-lib32 \ + buildpkg-lib32-gremlins \ + buildpkg-lib32-goblins \ + buildpkg-kde-wobble \ + buildpkg-gnome-wobble + +LN_DEPLOYPKG = \ + deploypkg-system \ + deploypkg-world \ + deploypkg-gremlins \ + deploypkg-goblins \ + deploypkg-galaxy \ + deploypkg-galaxy-gremlins \ + deploypkg-galaxy-goblins \ + deploypkg-lib32 \ + deploypkg-lib32-gremlins \ + deploypkg-lib32-goblins \ + deploypkg-kde-wobble \ + deploypkg-gnome-wobble + +PKG_DATA = \ + data/pacman/makepkg.conf \ + data/valid-names.conf + +PATCHES = \ + $(wildcard data/patches/*.patch) + +ISO_CONF = \ + data/conf/artools-iso.conf + +ISO_BIN = \ + bin/iso/buildiso + +LN_BUILDISO = \ + buildiso-gremlins \ + buildiso-goblins + +DIRMODE = -dm0755 +FILEMODE = -m0644 +MODE = -m0755 +LN = ln -sf +RM = rm -f +M4 = m4 -P --define=m4_artools_pkg_version=$V +CHMODAW = chmod a-w +CHMODX = chmod +x + +BIN = $(BASE_BIN) $(PKG_BIN) $(ISO_BIN) + +all: $(BIN) + +EDIT = sed -e "s|@datadir[@]|$(DATADIR)|g" \ + -e "s|@sysconfdir[@]|$(SYSCONFDIR)|g" + +%: %.in Makefile lib/util-base.sh + @echo "GEN $@" + @$(RM) "$@" + @{ echo -n 'm4_changequote([[[,]]])'; cat $@.in; } | $(M4) | $(EDIT) >$@ + @$(CHMODAW) "$@" + @$(CHMODX) "$@" + @bash -O extglob -n "$@" + +clean: + $(RM) $(BIN) + +install_base: + install $(DIRMODE) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS) + install $(FILEMODE) $(BASE_CONF) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS) + + 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)$(DATADIR)/$(TOOLS)/setarch-aliases.d + for a in ${SETARCH_ALIASES}; do install $(FILEMODE) setarch-aliases.d/$$a $(DESTDIR)$(DATADIR)/$(TOOLS)/setarch-aliases.d; done + +install_pkg: + install $(DIRMODE) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS) + install $(FILEMODE) $(PKG_CONF) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS) + + install $(DIRMODE) $(DESTDIR)$(BINDIR) + install $(MODE) $(PKG_BIN) $(DESTDIR)$(BINDIR) + + $(LN) find-libdeps $(DESTDIR)$(BINDIR)/find-libprovides + + $(LN) links-add $(DESTDIR)$(BINDIR)/links-remove + + for l in $(LN_COMMITPKG); do $(LN) commitpkg $(DESTDIR)$(BINDIR)/$$l; done + for l in $(LN_BUILDPKG); do $(LN) buildpkg $(DESTDIR)$(BINDIR)/$$l; done + for l in $(LN_DEPLOYPKG); do $(LN) deploypkg $(DESTDIR)$(BINDIR)/$$l; done + + $(LN) artix-chroot $(DESTDIR)$(BINDIR)/artools-chroot + + 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_iso: + install $(DIRMODE) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS) + install $(FILEMODE) $(ISO_CONF) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS) + + install $(DIRMODE) $(DESTDIR)$(BINDIR) + install $(MODE) $(ISO_BIN) $(DESTDIR)$(BINDIR) + + for l in $(LN_BUILDISO); do $(LN) buildiso $(DESTDIR)$(BINDIR)/$$l; done + +install: install_base install_pkg install_iso + +.PHONY: all clean install install_base install_pkg install_iso diff --git a/artools/0.26.1/artools/README.md b/artools/0.26.1/artools/README.md new file mode 100644 index 0000000..f5bccd5 --- /dev/null +++ b/artools/0.26.1/artools/README.md @@ -0,0 +1,69 @@ +artools +============= + +#### Make flags + + +* PREFIX=/usr +* SYSCONFDIR=/etc + +#### Dependencies + +##### Buildtime: + +* make +* git +* m4 + +##### Runtime: + +- base: + * os-prober + * pacman + +- pkg: + * namcap + * git-subrepo + * rsync + +- iso: + * dosfstools + * libisoburn + * squashfs-tools + * grub + +#### Configuration + +artools-{base,pkg,iso}.conf are the configuration files for artools. +By default, the config files are installed in + +```bash +/etc/artools/artools-{base,pkg,iso}.conf +``` + +A user artools-{base,pkg,iso}.conf can be placed in + +```bash +$HOME/.config/artools/artools-{base,pkg,iso}.conf +``` + +If the userconfig is present, artools will load the userconfig values, however, if variables have been set in the systemwide + +These values take precedence over the userconfig. +Best practise is to leave systemwide file untouched. +By default it is commented and shows just initialization values done in code. + +Tools configuration is done in artools-{base,pkg,iso}.conf or by args. +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 +``` + +and can be overridden dropping them in + +```bash +$HOME/.config/artools/ +``` diff --git a/artools/0.26.1/artools/bin/base/artix-chroot b/artools/0.26.1/artools/bin/base/artix-chroot new file mode 100755 index 0000000..54dd3a2 --- /dev/null +++ b/artools/0.26.1/artools/bin/base/artix-chroot @@ -0,0 +1,381 @@ +#!/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. + +shopt -s extglob + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + +#!/hint/bash + +#{{{ mount + +ignore_error() { + "$@" 2>/dev/null + return 0 +} + +trap_setup(){ + [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' + trap "$1" EXIT +} + +chroot_mount() { +# msg2 "mount: [%s]" "$2" + mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") +} + +chroot_add_resolv_conf() { + local chrootdir=$1 resolv_conf=$1/etc/resolv.conf + + [[ -e /etc/resolv.conf ]] || return 0 + + # Handle resolv.conf as a symlink to somewhere else. + if [[ -L $chrootdir/etc/resolv.conf ]]; then + # readlink(1) should always give us *something* since we know at this point + # it's a symlink. For simplicity, ignore the case of nested symlinks. + resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") + if [[ $resolv_conf = /* ]]; then + resolv_conf=$chrootdir$resolv_conf + else + resolv_conf=$chrootdir/etc/$resolv_conf + fi + + # ensure file exists to bind mount over + if [[ ! -f $resolv_conf ]]; then + install -Dm644 /dev/null "$resolv_conf" || return 1 + fi + elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then + # The chroot might not have a resolv.conf. + return 0 + fi + + chroot_mount /etc/resolv.conf "$resolv_conf" --bind +} + +chroot_mount_conditional() { + local cond=$1; shift + if eval "$cond"; then + chroot_mount "$@" + fi +} + +chroot_setup(){ + local mnt="$1" os="$2" args='-t tmpfs -o nosuid,nodev,mode=0755' + $os && args='--bind' + chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && + chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && + chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && + ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \ + efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && + chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && + chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && + chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && + chroot_mount /run "$mnt/run" ${args} && + chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid +} + +chroot_api_mount() { + CHROOT_ACTIVE_MOUNTS=() + trap_setup chroot_api_umount + chroot_setup "$1" false +} + +chroot_api_umount() { + if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then +# msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" + umount "${CHROOT_ACTIVE_MOUNTS[@]}" + fi + unset CHROOT_ACTIVE_MOUNTS +} + +#}}} + + +#{{{ functions + +chroot_part_mount() { + msg2 "mount: [%s]" "$2" + mount "$@" && CHROOT_ACTIVE_PART_MOUNTS=("$2" "${CHROOT_ACTIVE_PART_MOUNTS[@]}") +} + +chroot_part_umount() { + chroot_api_umount + msg2 "umount: [%s]" "${CHROOT_ACTIVE_PART_MOUNTS[@]}" + umount "${CHROOT_ACTIVE_PART_MOUNTS[@]}" + unset CHROOT_ACTIVE_PART_MOUNTS +} + +detect(){ + local detected + detected="$(os-prober | tr ' ' '_' | paste -s -d ' ')" + echo "${detected}" +} + +# $1: os-prober array +get_os_name(){ + local str=$1 + str="${str#*:}" + str="${str#*:}" + str="${str%:*}" + echo "$str" +} + +mount_os(){ + CHROOT_ACTIVE_PART_MOUNTS=() + CHROOT_ACTIVE_MOUNTS=() + + trap_setup chroot_part_umount + + chroot_part_mount "$2" "$1" + + local mounts + mounts=$(perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^UUID=#;' "$1"/etc/fstab) + + for entry in ${mounts}; do + entry=${entry//UUID=} + local dev=${entry%:*} mp=${entry#*:} + case "${entry#*:}" in + '/'|'swap'|'none') continue ;; + *) chroot_part_mount "/dev/disk/by-uuid/${dev}" "$1${mp}" ;; + esac + done + + chroot_setup "$1" true + chroot_add_resolv_conf "$1" +} + +select_os(){ + local os_list=( "$(detect)" ) count=${#os_list[@]} + if [[ ${count} -gt 1 ]];then + msg "Detected systems:" + local i=0 + for os in "${os_list[@]}"; do + local last=${os##*:} + case $last in + 'efi') count=$((count-1)) ;; + *) msg2 "$i) $(get_os_name "$os")"; i=$((i+1)) ;; + esac + done + i=0 + msg "Select system to mount [0-%s] : " "$((count-1))" + read -r select + else + select=0 + fi + local os_str=${os_list[$select]} type + type=$os_str + root=${os_str%%:*} + type=${type##*:} + if [[ "${type##*:}" == 'linux' ]];then + msg "Mounting (%s) [%s]" "$(get_os_name "$os_str")" "$root" + mount_os "$1" "$root" + else + die "You can't mount %s!" "$select" + fi +} + +#}}} + +automount=false + +usage() { + echo "usage: ${0##*/} -a [or] ${0##*/} chroot-dir [command]" + echo ' -a Automount detected linux system' + echo ' -h Print this help message' + echo '' + echo " If 'command' is unspecified, ${0##*/} will launch /bin/sh." + echo '' + echo " If 'automount' is true, ${0##*/} will launch /bin/bash" + echo " and ${chrootdir}." + echo '' + echo '' + exit "$1" +} + +opts=':ha' + +while getopts ${opts} arg; do + case "${arg}" in + a) automount=true ;; + h|?) usage 0 ;; + *) echo "invalid argument ${arg}"; usage 1 ;; + esac +done +shift $(( OPTIND - 1 )) + +check_root + +if ${automount};then + chrootdir=/mnt + run_args=(/bin/bash) + + select_os "${chrootdir}" +else + chrootdir=$1 + shift + run_args=("$@") + + [[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}" + + chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}" + chroot_add_resolv_conf "${chrootdir}" +fi + +SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "${run_args[@]}" diff --git a/artools/0.26.1/artools/bin/base/artix-chroot.in b/artools/0.26.1/artools/bin/base/artix-chroot.in new file mode 100644 index 0000000..c6ad55f --- /dev/null +++ b/artools/0.26.1/artools/bin/base/artix-chroot.in @@ -0,0 +1,151 @@ +#!/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. + +shopt -s extglob + +m4_include(lib/base/message.sh) +m4_include(lib/base/chroot.sh) +m4_include(lib/base/mount.sh) + +#{{{ functions + +chroot_part_mount() { + msg2 "mount: [%s]" "$2" + mount "$@" && CHROOT_ACTIVE_PART_MOUNTS=("$2" "${CHROOT_ACTIVE_PART_MOUNTS[@]}") +} + +chroot_part_umount() { + chroot_api_umount + msg2 "umount: [%s]" "${CHROOT_ACTIVE_PART_MOUNTS[@]}" + umount "${CHROOT_ACTIVE_PART_MOUNTS[@]}" + unset CHROOT_ACTIVE_PART_MOUNTS +} + +detect(){ + local detected + detected="$(os-prober | tr ' ' '_' | paste -s -d ' ')" + echo "${detected}" +} + +# $1: os-prober array +get_os_name(){ + local str=$1 + str="${str#*:}" + str="${str#*:}" + str="${str%:*}" + echo "$str" +} + +mount_os(){ + CHROOT_ACTIVE_PART_MOUNTS=() + CHROOT_ACTIVE_MOUNTS=() + + trap_setup chroot_part_umount + + chroot_part_mount "$2" "$1" + + local mounts + mounts=$(perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^UUID=#;' "$1"/etc/fstab) + + for entry in ${mounts}; do + entry=${entry//UUID=} + local dev=${entry%:*} mp=${entry#*:} + case "${entry#*:}" in + '/'|'swap'|'none') continue ;; + *) chroot_part_mount "/dev/disk/by-uuid/${dev}" "$1${mp}" ;; + esac + done + + chroot_setup "$1" true + chroot_add_resolv_conf "$1" +} + +select_os(){ + local os_list=( "$(detect)" ) count=${#os_list[@]} + if [[ ${count} -gt 1 ]];then + msg "Detected systems:" + local i=0 + for os in "${os_list[@]}"; do + local last=${os##*:} + case $last in + 'efi') count=$((count-1)) ;; + *) msg2 "$i) $(get_os_name "$os")"; i=$((i+1)) ;; + esac + done + i=0 + msg "Select system to mount [0-%s] : " "$((count-1))" + read -r select + else + select=0 + fi + local os_str=${os_list[$select]} type + type=$os_str + root=${os_str%%:*} + type=${type##*:} + if [[ "${type##*:}" == 'linux' ]];then + msg "Mounting (%s) [%s]" "$(get_os_name "$os_str")" "$root" + mount_os "$1" "$root" + else + die "You can't mount %s!" "$select" + fi +} + +#}}} + +automount=false + +usage() { + echo "usage: ${0##*/} -a [or] ${0##*/} chroot-dir [command]" + echo ' -a Automount detected linux system' + echo ' -h Print this help message' + echo '' + echo " If 'command' is unspecified, ${0##*/} will launch /bin/sh." + echo '' + echo " If 'automount' is true, ${0##*/} will launch /bin/bash" + echo " and ${chrootdir}." + echo '' + echo '' + exit "$1" +} + +opts=':ha' + +while getopts ${opts} arg; do + case "${arg}" in + a) automount=true ;; + h|?) usage 0 ;; + *) echo "invalid argument ${arg}"; usage 1 ;; + esac +done +shift $(( OPTIND - 1 )) + +check_root + +if ${automount};then + chrootdir=/mnt + run_args=(/bin/bash) + + select_os "${chrootdir}" +else + chrootdir=$1 + shift + run_args=("$@") + + [[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}" + + chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}" + chroot_add_resolv_conf "${chrootdir}" +fi + +SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "${run_args[@]}" diff --git a/artools/0.26.1/artools/bin/base/basestrap b/artools/0.26.1/artools/bin/base/basestrap new file mode 100755 index 0000000..611bd60 --- /dev/null +++ b/artools/0.26.1/artools/bin/base/basestrap @@ -0,0 +1,356 @@ +#!/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. + +# +# Assumptions: +# 1) User has partitioned, formatted, and mounted partitions on /mnt +# 2) Network is functional +# 3) Arguments passed to the script are valid pacman targets +# 4) A valid mirror appears in /etc/pacman.d/mirrorlist +# + +shopt -s extglob + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ mount + +ignore_error() { + "$@" 2>/dev/null + return 0 +} + +trap_setup(){ + [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' + trap "$1" EXIT +} + +chroot_mount() { +# msg2 "mount: [%s]" "$2" + mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") +} + +chroot_add_resolv_conf() { + local chrootdir=$1 resolv_conf=$1/etc/resolv.conf + + [[ -e /etc/resolv.conf ]] || return 0 + + # Handle resolv.conf as a symlink to somewhere else. + if [[ -L $chrootdir/etc/resolv.conf ]]; then + # readlink(1) should always give us *something* since we know at this point + # it's a symlink. For simplicity, ignore the case of nested symlinks. + resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") + if [[ $resolv_conf = /* ]]; then + resolv_conf=$chrootdir$resolv_conf + else + resolv_conf=$chrootdir/etc/$resolv_conf + fi + + # ensure file exists to bind mount over + if [[ ! -f $resolv_conf ]]; then + install -Dm644 /dev/null "$resolv_conf" || return 1 + fi + elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then + # The chroot might not have a resolv.conf. + return 0 + fi + + chroot_mount /etc/resolv.conf "$resolv_conf" --bind +} + +chroot_mount_conditional() { + local cond=$1; shift + if eval "$cond"; then + chroot_mount "$@" + fi +} + +chroot_setup(){ + local mnt="$1" os="$2" args='-t tmpfs -o nosuid,nodev,mode=0755' + $os && args='--bind' + chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && + chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && + chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && + ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \ + efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && + chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && + chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && + chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && + chroot_mount /run "$mnt/run" ${args} && + chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid +} + +chroot_api_mount() { + CHROOT_ACTIVE_MOUNTS=() + trap_setup chroot_api_umount + chroot_setup "$1" false +} + +chroot_api_umount() { + if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then +# msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" + umount "${CHROOT_ACTIVE_MOUNTS[@]}" + fi + unset CHROOT_ACTIVE_MOUNTS +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + + +#{{{ functions + +copy_mirrorlist(){ + cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/" +} + +copy_keyring(){ + if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then + cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/" + fi +} + +create_min_fs(){ + msg "Creating install root at %s" "$1" + mkdir -m 0755 -p "$1"/var/{cache/pacman/pkg,lib/pacman,log} "$1"/{dev,run,etc/pacman.d} + mkdir -m 1777 -p "$1"/tmp + mkdir -m 0555 -p "$1"/{sys,proc} +} + +#}}} + +newroot=/mnt + +hostcache=0 +copykeyring=1 +copymirrorlist=1 +pacmode=-Sy + +usage() { + echo "usage: ${0##*/} [options] root [packages...]" + echo " -C Use an alternate config file for pacman" + echo " -c Use the package cache on the host, rather than the target" + echo " -G Avoid copying the host's pacman keyring to the target" + echo " -i Avoid auto-confirmation of package selections" + echo " -M Avoid copying the host's mirrorlist to the target" + echo ' -U Use pacman -U to install packages' + echo " -h Print this help message" + echo '' + echo ' basestrap installs packages to the specified new root directory.' + echo ' If no packages are given, basestrap defaults to the "base" group.' + echo '' + echo '' + exit "$1" +} + +opts=':C:cGiMU' + +while getopts ${opts} arg; do + case "${arg}" in + C) pacman_conf=$OPTARG ;; + c) hostcache=1 ;; + i) interactive=1 ;; + G) copykeyring=0 ;; + M) copymirrorlist=0 ;; + U) pacmode=-U ;; + :) echo "invalid argument ${arg}:$OPTARG"; usage 1;; + ?) usage 0 ;; + esac +done +shift $(( OPTIND - 1 )) + +check_root + +(( $# )) || die "No root directory specified" +newroot=$1; shift +pacman_args=("${@:-base}") + +if (( ! hostcache ));then + pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg") +fi + +if (( ! interactive )); then + pacman_args+=(--noconfirm) +fi + +[[ -n $pacman_conf ]] && pacman_args+=(--config="$pacman_conf") + +[[ -d $newroot ]] || die "%s is not a directory" "$newroot" + +# create obligatory directories +create_min_fs "$newroot" + +# mount API filesystems +chroot_api_mount "$newroot" || die "failed to setup API filesystems in new root" + +if (( copykeyring ));then + copy_keyring "$newroot" +fi + +msg2 'Installing packages to %s' "$newroot" +if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then + die 'Failed to install packages to new root' +fi + + +if (( copymirrorlist ));then + copy_mirrorlist "$newroot" +fi diff --git a/artools/0.26.1/artools/bin/base/basestrap.in b/artools/0.26.1/artools/bin/base/basestrap.in new file mode 100644 index 0000000..b2259bc --- /dev/null +++ b/artools/0.26.1/artools/bin/base/basestrap.in @@ -0,0 +1,126 @@ +#!/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. + +# +# Assumptions: +# 1) User has partitioned, formatted, and mounted partitions on /mnt +# 2) Network is functional +# 3) Arguments passed to the script are valid pacman targets +# 4) A valid mirror appears in /etc/pacman.d/mirrorlist +# + +shopt -s extglob + +m4_include(lib/base/message.sh) +m4_include(lib/base/mount.sh) +m4_include(lib/base/chroot.sh) + +#{{{ functions + +copy_mirrorlist(){ + cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/" +} + +copy_keyring(){ + if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then + cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/" + fi +} + +create_min_fs(){ + msg "Creating install root at %s" "$1" + mkdir -m 0755 -p "$1"/var/{cache/pacman/pkg,lib/pacman,log} "$1"/{dev,run,etc/pacman.d} + mkdir -m 1777 -p "$1"/tmp + mkdir -m 0555 -p "$1"/{sys,proc} +} + +#}}} + +newroot=/mnt + +hostcache=0 +copykeyring=1 +copymirrorlist=1 +pacmode=-Sy + +usage() { + echo "usage: ${0##*/} [options] root [packages...]" + echo " -C Use an alternate config file for pacman" + echo " -c Use the package cache on the host, rather than the target" + echo " -G Avoid copying the host's pacman keyring to the target" + echo " -i Avoid auto-confirmation of package selections" + echo " -M Avoid copying the host's mirrorlist to the target" + echo ' -U Use pacman -U to install packages' + echo " -h Print this help message" + echo '' + echo ' basestrap installs packages to the specified new root directory.' + echo ' If no packages are given, basestrap defaults to the "base" group.' + echo '' + echo '' + exit "$1" +} + +opts=':C:cGiMU' + +while getopts ${opts} arg; do + case "${arg}" in + C) pacman_conf=$OPTARG ;; + c) hostcache=1 ;; + i) interactive=1 ;; + G) copykeyring=0 ;; + M) copymirrorlist=0 ;; + U) pacmode=-U ;; + :) echo "invalid argument ${arg}:$OPTARG"; usage 1;; + ?) usage 0 ;; + esac +done +shift $(( OPTIND - 1 )) + +check_root + +(( $# )) || die "No root directory specified" +newroot=$1; shift +pacman_args=("${@:-base}") + +if (( ! hostcache ));then + pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg") +fi + +if (( ! interactive )); then + pacman_args+=(--noconfirm) +fi + +[[ -n $pacman_conf ]] && pacman_args+=(--config="$pacman_conf") + +[[ -d $newroot ]] || die "%s is not a directory" "$newroot" + +# create obligatory directories +create_min_fs "$newroot" + +# mount API filesystems +chroot_api_mount "$newroot" || die "failed to setup API filesystems in new root" + +if (( copykeyring ));then + copy_keyring "$newroot" +fi + +msg2 'Installing packages to %s' "$newroot" +if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then + die 'Failed to install packages to new root' +fi + + +if (( copymirrorlist ));then + copy_mirrorlist "$newroot" +fi diff --git a/artools/0.26.1/artools/bin/base/chroot-run b/artools/0.26.1/artools/bin/base/chroot-run new file mode 100755 index 0000000..3438224 --- /dev/null +++ b/artools/0.26.1/artools/bin/base/chroot-run @@ -0,0 +1,414 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ mount + +ignore_error() { + "$@" 2>/dev/null + return 0 +} + +trap_setup(){ + [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' + trap "$1" EXIT +} + +chroot_mount() { +# msg2 "mount: [%s]" "$2" + mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") +} + +chroot_add_resolv_conf() { + local chrootdir=$1 resolv_conf=$1/etc/resolv.conf + + [[ -e /etc/resolv.conf ]] || return 0 + + # Handle resolv.conf as a symlink to somewhere else. + if [[ -L $chrootdir/etc/resolv.conf ]]; then + # readlink(1) should always give us *something* since we know at this point + # it's a symlink. For simplicity, ignore the case of nested symlinks. + resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") + if [[ $resolv_conf = /* ]]; then + resolv_conf=$chrootdir$resolv_conf + else + resolv_conf=$chrootdir/etc/$resolv_conf + fi + + # ensure file exists to bind mount over + if [[ ! -f $resolv_conf ]]; then + install -Dm644 /dev/null "$resolv_conf" || return 1 + fi + elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then + # The chroot might not have a resolv.conf. + return 0 + fi + + chroot_mount /etc/resolv.conf "$resolv_conf" --bind +} + +chroot_mount_conditional() { + local cond=$1; shift + if eval "$cond"; then + chroot_mount "$@" + fi +} + +chroot_setup(){ + local mnt="$1" os="$2" args='-t tmpfs -o nosuid,nodev,mode=0755' + $os && args='--bind' + chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && + chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && + chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && + ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \ + efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && + chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && + chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && + chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && + chroot_mount /run "$mnt/run" ${args} && + chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid +} + +chroot_api_mount() { + CHROOT_ACTIVE_MOUNTS=() + trap_setup chroot_api_umount + chroot_setup "$1" false +} + +chroot_api_umount() { + if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then +# msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" + umount "${CHROOT_ACTIVE_MOUNTS[@]}" + fi + unset CHROOT_ACTIVE_MOUNTS +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + +#!/hint/bash + +CHROOTVERSION=0.10 + + +# $1: chroot +kill_chroot_process(){ + local prefix="$1" flink pid name + for root_dir in /proc/*/root; do + flink=$(readlink "$root_dir") + if [ "x$flink" != "x" ]; then + if [ "x${flink:0:${#prefix}}" = "x$prefix" ]; then + # this process is in the chroot... + pid=$(basename "$(dirname "$root_dir")") + name=$(ps -p "$pid" -o comm=) + msg2 "Killing chroot process: %s (%s)" "$name" "$pid" + kill -9 "$pid" + fi + fi + done + sleep 1 +} + +# umask might have been changed in /etc/profile +# ensure that sane default is set again +umask 0022 + +working_dir='' +files=() + +mount_args=("-B:/etc/hosts:/etc/hosts") + +usage() { + echo "Usage: ${0##*/} [options] working-dir [run arguments]" + echo "A wrapper around chroot. Provides support for pacman." + echo + echo ' options:' + echo ' -C Location of a pacman config file' + echo ' -M Location of a makepkg config file' + echo ' -c Set pacman cache' + echo ' -f Copy file from the host to the chroot' + echo ' -s Do not run setarch' + echo ' -b Bind mountargs' + echo ' List format [mntarg1:src1:dest1 ... mntargN:srcN:destN]' + echo ' -h This message' + exit 1 +} + +opts='hC:M:c:b:f:s' + +while getopts ${opts} arg; do + case "${arg}" in + C) pacman_conf="$OPTARG" ;; + M) makepkg_conf="$OPTARG" ;; + c) cache_dirs+=("$OPTARG") ;; + f) files+=("$OPTARG") ;; + s) nosetarch=1 ;; + b) bindmounts+=("$OPTARG"); mount_args+=(${bindmounts[@]}) ;; + h|?) usage ;; + *) error "invalid argument '$arg'"; usage ;; + esac +done +shift $(( OPTIND - 1 )) + +(( $# < 1 )) && die 'You must specify a directory.' + +check_root + +working_dir=$(readlink -f "$1") +shift 1 + +[[ -z $working_dir ]] && die 'Please specify a working directory.' + +if (( ${#cache_dirs[@]} == 0 )); then + mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir) +fi + +# shellcheck disable=2016 +host_mirrors=($(pacman-conf --repo world Server 2> /dev/null | sed -r 's#(.*/)world/os/.*#\1$repo/os/$arch#')) + +for host_mirror in "${host_mirrors[@]}"; do + if [[ $host_mirror == *file://* ]]; then + # shellcheck disable=2016 + host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g') + in_array "$host_mirror" "${cache_dirs[@]}" || cache_dirs+=("$host_mirror") + fi +done + +while read -r line; do + # shellcheck disable=2016 + mapfile -t lines < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" \ + --repo "$line" Server | sed -r 's#(.*/)[^/]+/os/.+#\1#') + for line in "${lines[@]}"; do + if [[ $line = file://* ]]; then + line=${line#file://} + in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line") + fi + done +done < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list) + +copy_hostconf () { + unshare --fork --pid gpg --homedir "$working_dir"/etc/pacman.d/gnupg/ --no-permission-warning --quiet --batch --import --import-options import-local-sigs "$(pacman-conf GpgDir)"/pubring.gpg >/dev/null 2>&1 + pacman-key --gpgdir "$working_dir"/etc/pacman.d/gnupg/ --import-trustdb "$(pacman-conf GpgDir)" >/dev/null 2>&1 + + printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist" + + [[ -n $pacman_conf ]] && cp "$pacman_conf" "${working_dir}/etc/pacman.conf" + + [[ -n $makepkg_conf ]] && cp "$makepkg_conf" "${working_dir}/etc/makepkg.conf" + + local file + for file in "${files[@]}"; do + mkdir -p "$(dirname "$working_dir$file")" + cp -T "$file" "$working_dir$file" + done + + sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "${working_dir}/etc/pacman.conf" +} + +mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}") + +for cache_dir in "${cache_dirs[@]:1}"; do + mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}") +done + +chroot_extra_mount() { + chroot_add_resolv_conf "${working_dir}" + + for arg in "${mount_args[@]}"; do + local flag=${arg%%:*} dest=${arg##*:} src=${arg%:*} + src=${src#*:} + chroot_mount "${src}" "${working_dir}${dest}" "${flag}" + done +} + +umask 0022 + +# Sanity check +if [[ ! -f "$working_dir/.artools" ]]; then + die "'%s' does not appear to be an artix chroot." "$working_dir" +elif [[ $(cat "$working_dir/.artools") != "${CHROOTVERSION}" ]]; then + die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}" +fi + +chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}" + +chroot_extra_mount + +copy_hostconf + +eval "$(grep '^CARCH=' "$working_dir/etc/makepkg.conf")" + +[[ -z $nosetarch ]] || unset CARCH + +if [[ -f "/usr/share/artools/setarch-aliases.d/${CARCH}" ]]; then + read -r set_arch < "/usr/share/artools/setarch-aliases.d/${CARCH}" +else + set_arch="${CARCH}" +fi + +${CARCH:+setarch "${set_arch}"} chroot "${working_dir}" "$@" + +ret=$? + +kill_chroot_process "${working_dir}" + +exit $ret diff --git a/artools/0.26.1/artools/bin/base/chroot-run.in b/artools/0.26.1/artools/bin/base/chroot-run.in new file mode 100644 index 0000000..fcd912d --- /dev/null +++ b/artools/0.26.1/artools/bin/base/chroot-run.in @@ -0,0 +1,181 @@ +#!/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/base/message.sh) +m4_include(lib/base/mount.sh) +m4_include(lib/base/chroot.sh) +m4_include(lib/base/chroot-version.sh) + +# $1: chroot +kill_chroot_process(){ + local prefix="$1" flink pid name + for root_dir in /proc/*/root; do + flink=$(readlink "$root_dir") + if [ "x$flink" != "x" ]; then + if [ "x${flink:0:${#prefix}}" = "x$prefix" ]; then + # this process is in the chroot... + pid=$(basename "$(dirname "$root_dir")") + name=$(ps -p "$pid" -o comm=) + msg2 "Killing chroot process: %s (%s)" "$name" "$pid" + kill -9 "$pid" + fi + fi + done + sleep 1 +} + +# umask might have been changed in /etc/profile +# ensure that sane default is set again +umask 0022 + +working_dir='' +files=() + +mount_args=("-B:/etc/hosts:/etc/hosts") + +usage() { + echo "Usage: ${0##*/} [options] working-dir [run arguments]" + echo "A wrapper around chroot. Provides support for pacman." + echo + echo ' options:' + echo ' -C Location of a pacman config file' + echo ' -M Location of a makepkg config file' + echo ' -c Set pacman cache' + echo ' -f Copy file from the host to the chroot' + echo ' -s Do not run setarch' + echo ' -b Bind mountargs' + echo ' List format [mntarg1:src1:dest1 ... mntargN:srcN:destN]' + echo ' -h This message' + exit 1 +} + +opts='hC:M:c:b:f:s' + +while getopts ${opts} arg; do + case "${arg}" in + C) pacman_conf="$OPTARG" ;; + M) makepkg_conf="$OPTARG" ;; + c) cache_dirs+=("$OPTARG") ;; + f) files+=("$OPTARG") ;; + s) nosetarch=1 ;; + b) bindmounts+=("$OPTARG"); mount_args+=(${bindmounts[@]}) ;; + h|?) usage ;; + *) error "invalid argument '$arg'"; usage ;; + esac +done +shift $(( OPTIND - 1 )) + +(( $# < 1 )) && die 'You must specify a directory.' + +check_root + +working_dir=$(readlink -f "$1") +shift 1 + +[[ -z $working_dir ]] && die 'Please specify a working directory.' + +if (( ${#cache_dirs[@]} == 0 )); then + mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir) +fi + +# shellcheck disable=2016 +host_mirrors=($(pacman-conf --repo world Server 2> /dev/null | sed -r 's#(.*/)world/os/.*#\1$repo/os/$arch#')) + +for host_mirror in "${host_mirrors[@]}"; do + if [[ $host_mirror == *file://* ]]; then + # shellcheck disable=2016 + host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g') + in_array "$host_mirror" "${cache_dirs[@]}" || cache_dirs+=("$host_mirror") + fi +done + +while read -r line; do + # shellcheck disable=2016 + mapfile -t lines < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" \ + --repo "$line" Server | sed -r 's#(.*/)[^/]+/os/.+#\1#') + for line in "${lines[@]}"; do + if [[ $line = file://* ]]; then + line=${line#file://} + in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line") + fi + done +done < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list) + +copy_hostconf () { + unshare --fork --pid gpg --homedir "$working_dir"/etc/pacman.d/gnupg/ --no-permission-warning --quiet --batch --import --import-options import-local-sigs "$(pacman-conf GpgDir)"/pubring.gpg >/dev/null 2>&1 + pacman-key --gpgdir "$working_dir"/etc/pacman.d/gnupg/ --import-trustdb "$(pacman-conf GpgDir)" >/dev/null 2>&1 + + printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist" + + [[ -n $pacman_conf ]] && cp "$pacman_conf" "${working_dir}/etc/pacman.conf" + + [[ -n $makepkg_conf ]] && cp "$makepkg_conf" "${working_dir}/etc/makepkg.conf" + + local file + for file in "${files[@]}"; do + mkdir -p "$(dirname "$working_dir$file")" + cp -T "$file" "$working_dir$file" + done + + sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "${working_dir}/etc/pacman.conf" +} + +mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}") + +for cache_dir in "${cache_dirs[@]:1}"; do + mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}") +done + +chroot_extra_mount() { + chroot_add_resolv_conf "${working_dir}" + + for arg in "${mount_args[@]}"; do + local flag=${arg%%:*} dest=${arg##*:} src=${arg%:*} + src=${src#*:} + chroot_mount "${src}" "${working_dir}${dest}" "${flag}" + done +} + +umask 0022 + +# Sanity check +if [[ ! -f "$working_dir/.artools" ]]; then + die "'%s' does not appear to be an artix chroot." "$working_dir" +elif [[ $(cat "$working_dir/.artools") != "${CHROOTVERSION}" ]]; then + die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}" +fi + +chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}" + +chroot_extra_mount + +copy_hostconf + +eval "$(grep '^CARCH=' "$working_dir/etc/makepkg.conf")" + +[[ -z $nosetarch ]] || unset CARCH + +if [[ -f "@datadir@/artools/setarch-aliases.d/${CARCH}" ]]; then + read -r set_arch < "@datadir@/artools/setarch-aliases.d/${CARCH}" +else + set_arch="${CARCH}" +fi + +${CARCH:+setarch "${set_arch}"} chroot "${working_dir}" "$@" + +ret=$? + +kill_chroot_process "${working_dir}" + +exit $ret diff --git a/artools/0.26.1/artools/bin/base/fstabgen b/artools/0.26.1/artools/bin/base/fstabgen new file mode 100755 index 0000000..0bff558 --- /dev/null +++ b/artools/0.26.1/artools/bin/base/fstabgen @@ -0,0 +1,529 @@ +#!/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. + +shopt -s extglob + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +#{{{ filesystems + +declare -A pseudofs_types=([anon_inodefs]=1 + [autofs]=1 + [bdev]=1 + [bpf]=1 + [binfmt_misc]=1 + [cgroup]=1 + [cgroup2]=1 + [configfs]=1 + [cpuset]=1 + [debugfs]=1 + [devfs]=1 + [devpts]=1 + [devtmpfs]=1 + [dlmfs]=1 + [efivarfs]=1 + [fuse.gvfs-fuse-daemon]=1 + [fusectl]=1 + [hugetlbfs]=1 + [mqueue]=1 + [nfsd]=1 + [none]=1 + [pipefs]=1 + [proc]=1 + [pstore]=1 + [ramfs]=1 + [rootfs]=1 + [rpc_pipefs]=1 + [securityfs]=1 + [sockfs]=1 + [spufs]=1 + [sysfs]=1 + [tmpfs]=1) + +declare -A fsck_types=([cramfs]=1 + [exfat]=1 + [ext2]=1 + [ext3]=1 + [ext4]=1 + [ext4dev]=1 + [jfs]=1 + [minix]=1 + [msdos]=1 + [reiserfs]=1 + [vfat]=1 + [xfs]=1) + +#}}} + +#{{{ functions + +fstype_is_pseudofs() { + (( pseudofs_types["$1"] )) +} + +fstype_has_fsck() { + (( fsck_types["$1"] )) +} + +valid_number_of_base() { + local base=$1 len=${#2} i + + for (( i = 0; i < len; i++ )); do + { _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null + done + + return 0 +} + +mangle() { + local i chr out + + local {a..f}= {A..F}= + + for (( i = 0; i < ${#1}; i++ )); do + chr=${1:i:1} + case $chr in + [[:space:]\\]) + printf -v chr '%03o' "'$chr" + out+=\\ + ;; + esac + out+=$chr + done + + printf '%s' "$out" +} + +unmangle() { + local i chr out len=$(( ${#1} - 4 )) + + local {a..f}= {A..F}= + + for (( i = 0; i < len; i++ )); do + chr=${1:i:1} + case $chr in + \\) + if valid_number_of_base 8 "${1:i+1:3}" || + valid_number_of_base 16 "${1:i+1:3}"; then + printf -v chr '%b' "${1:i:4}" + (( i += 3 )) + fi + ;; + esac + out+=$chr + done + + printf '%s' "$out${1:i}" +} + +dm_name_for_devnode() { + read -r dm_name <"/sys/class/block/${1#/dev/}/dm/name" + if [[ $dm_name ]]; then + printf '/dev/mapper/%s' "$dm_name" + else + # don't leave the caller hanging, just print the original name + # along with the failure. + print '%s' "$1" + error 'Failed to resolve device mapper name for: %s' "$1" + fi +} + +optstring_match_option() { + local candidate pat patterns + + IFS=, read -ra patterns <<<"$1" + for pat in "${patterns[@]}"; do + if [[ $pat = *=* ]]; then + # "key=val" will only ever match "key=val" + candidate=$2 + else + # "key" will match "key", but also "key=anyval" + candidate=${2%%=*} + fi + + [[ $pat = "$candidate" ]] && return 0 + done + + return 1 +} + +optstring_remove_option() { + local o options_ remove=$2 IFS=, + + read -ra options_ <<<"${!1}" + + for o in "${!options_[@]}"; do + optstring_match_option "$remove" "${options_[o]}" && unset 'options_[o]' + done + + declare -g "$1=${options_[*]}" +} + +optstring_normalize() { + local o options_ norm IFS=, + + read -ra options_ <<<"${!1}" + + # remove empty fields + for o in "${options_[@]}"; do + [[ $o ]] && norm+=("$o") + done + + # avoid empty strings, reset to "defaults" + declare -g "$1=${norm[*]:-defaults}" +} + +optstring_append_option() { + if ! optstring_has_option "$1" "$2"; then + declare -g "$1=${!1},$2" + fi + + optstring_normalize "$1" +} + +optstring_prepend_option() { + if ! optstring_has_option "$1" "$2"; then + declare -g "$1=$2,${!1}" + fi + + optstring_normalize "$1" +} + +optstring_get_option() { + local opts o + + IFS=, read -ra opts <<<"${!1}" + for o in "${opts[@]}"; do + if optstring_match_option "$2" "$o"; then + declare -g "$o" + return 0 + fi + done + + return 1 +} + +optstring_has_option() { + local "${2%%=*}" + + optstring_get_option "$1" "$2" +} + +write_source() { + local src=$1 spec label uuid comment=() + + label=$(lsblk -rno LABEL "$1" 2>/dev/null) + uuid=$(lsblk -rno UUID "$1" 2>/dev/null) + + # bind mounts do not have a UUID! + + case $bytag in + '') + [[ $uuid ]] && comment=("UUID=$uuid") + [[ $label ]] && comment+=("LABEL=$(mangle "$label")") + ;; + LABEL) + spec=$label + [[ $uuid ]] && comment=("$src" "UUID=$uuid") + ;; + UUID) + spec=$uuid + comment=("$src") + [[ $label ]] && comment+=("LABEL=$(mangle "$label")") + ;; + *) + [[ $uuid ]] && comment=("$1" "UUID=$uuid") + [[ $label ]] && comment+=("LABEL=$(mangle "$label")") + [[ $bytag ]] && spec=$(lsblk -rno "$bytag" "$1" 2>/dev/null) + ;; + esac + + [[ -n "${comment[*]}" ]] && printf '# %s\n' "${comment[*]}" + + if [[ $spec ]]; then + printf '%-20s' "$bytag=$(mangle "$spec")" + else + printf '%-20s' "$(mangle "$src")" + fi +} + +optstring_apply_quirks() { + local varname="$1" fstype="$2" + + # SELinux displays a 'seclabel' option in /proc/self/mountinfo. We can't know + # if the system we're generating the fstab for has any support for SELinux (as + # one might install Arch from a Fedora environment), so let's remove it. + optstring_remove_option "$varname" seclabel + + # Prune 'relatime' option for any pseudofs. This seems to be a rampant + # default which the kernel often exports even if the underlying filesystem + # doesn't support it. Example: https://bugs.archlinux.org/task/54554. + if awk -v fstype="$fstype" '$1 == fstype { exit 1 }' /proc/filesystems; then + optstring_remove_option "$varname" relatime + fi + + case $fstype in + f2fs) + # These are Kconfig options for f2fs. Kernels supporting the options will + # only provide the negative versions of these (e.g. noacl), and vice versa + # for kernels without support. + optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr + ;; + vfat) + # Before Linux v3.8, "cp" is prepended to the value of the codepage. + if optstring_get_option "$varname" codepage && [[ "$codepage" = cp* ]]; then + optstring_remove_option "$varname" codepage + optstring_append_option "$varname" "codepage=${codepage#cp}" + fi + ;; + esac +} + +#}}} + +usage() { + cat </dev/null; then + # this is root. we can't possibly have more than one... + pass=1 foundroot=1 + fi + + # if there's no fsck tool available, then only pass=0 makes sense. + if ! fstype_has_fsck "$fstype"; then + pass=0 + fi + + if [[ $fsroot != / && $fstype != btrfs ]]; then + # it's a bind mount + src=$(findmnt -funcevo TARGET "$src")$fsroot + if [[ $src -ef $target ]]; then + # hrmm, this is weird. we're probably looking at a file or directory + # that was bound into a chroot from the host machine. Ignore it, + # because this won't actually be a valid mount. Worst case, the user + # just re-adds it. + continue + fi + fstype=none + opts+=,bind + pass=0 + fi + + # filesystem quirks + case $fstype in + fuseblk) + # well-behaved FUSE filesystems will report themselves as fuse.$fstype. + # this is probably NTFS-3g, but let's just make sure. + if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then + # avoid blanking out fstype, leading to an invalid fstab + error 'Failed to derive real filesystem type for FUSE device on %s' "$target" + else + fstype=$newtype + fi + ;; + esac + + optstring_apply_quirks "opts" "$fstype" + + # write one line + write_source "$src" + printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts" + printf '\t%s %s' "$dump" "$pass" + printf '\n\n' +done + +# handle swaps devices +{ + # ignore header + read -r + + while read -r device type _ _ prio; do + options=defaults + if (( prio >= 0 )); then + options+=,pri=$prio + fi + + # skip files marked deleted by the kernel + [[ $device = *'\040(deleted)' ]] && continue + + if [[ $type = file ]]; then + printf '%-20s' "${device#${root%/}}" + elif [[ $device = /dev/dm-+([0-9]) ]]; then + # device mapper doesn't allow characters we need to worry + # about being mangled, and it does the escaping of dashes + # for us in sysfs. + write_source "$(dm_name_for_devnode "$device")" + else + write_source "$(unmangle "$device")" + fi + + printf '\t%-10s\t%-10s\t%-10s\t0 0\n\n' 'none' 'swap' "$options" + done +} /dev/null + done + + return 0 +} + +mangle() { + local i chr out + + local {a..f}= {A..F}= + + for (( i = 0; i < ${#1}; i++ )); do + chr=${1:i:1} + case $chr in + [[:space:]\\]) + printf -v chr '%03o' "'$chr" + out+=\\ + ;; + esac + out+=$chr + done + + printf '%s' "$out" +} + +unmangle() { + local i chr out len=$(( ${#1} - 4 )) + + local {a..f}= {A..F}= + + for (( i = 0; i < len; i++ )); do + chr=${1:i:1} + case $chr in + \\) + if valid_number_of_base 8 "${1:i+1:3}" || + valid_number_of_base 16 "${1:i+1:3}"; then + printf -v chr '%b' "${1:i:4}" + (( i += 3 )) + fi + ;; + esac + out+=$chr + done + + printf '%s' "$out${1:i}" +} + +dm_name_for_devnode() { + read -r dm_name <"/sys/class/block/${1#/dev/}/dm/name" + if [[ $dm_name ]]; then + printf '/dev/mapper/%s' "$dm_name" + else + # don't leave the caller hanging, just print the original name + # along with the failure. + print '%s' "$1" + error 'Failed to resolve device mapper name for: %s' "$1" + fi +} + +optstring_match_option() { + local candidate pat patterns + + IFS=, read -ra patterns <<<"$1" + for pat in "${patterns[@]}"; do + if [[ $pat = *=* ]]; then + # "key=val" will only ever match "key=val" + candidate=$2 + else + # "key" will match "key", but also "key=anyval" + candidate=${2%%=*} + fi + + [[ $pat = "$candidate" ]] && return 0 + done + + return 1 +} + +optstring_remove_option() { + local o options_ remove=$2 IFS=, + + read -ra options_ <<<"${!1}" + + for o in "${!options_[@]}"; do + optstring_match_option "$remove" "${options_[o]}" && unset 'options_[o]' + done + + declare -g "$1=${options_[*]}" +} + +optstring_normalize() { + local o options_ norm IFS=, + + read -ra options_ <<<"${!1}" + + # remove empty fields + for o in "${options_[@]}"; do + [[ $o ]] && norm+=("$o") + done + + # avoid empty strings, reset to "defaults" + declare -g "$1=${norm[*]:-defaults}" +} + +optstring_append_option() { + if ! optstring_has_option "$1" "$2"; then + declare -g "$1=${!1},$2" + fi + + optstring_normalize "$1" +} + +optstring_prepend_option() { + if ! optstring_has_option "$1" "$2"; then + declare -g "$1=$2,${!1}" + fi + + optstring_normalize "$1" +} + +optstring_get_option() { + local opts o + + IFS=, read -ra opts <<<"${!1}" + for o in "${opts[@]}"; do + if optstring_match_option "$2" "$o"; then + declare -g "$o" + return 0 + fi + done + + return 1 +} + +optstring_has_option() { + local "${2%%=*}" + + optstring_get_option "$1" "$2" +} + +write_source() { + local src=$1 spec label uuid comment=() + + label=$(lsblk -rno LABEL "$1" 2>/dev/null) + uuid=$(lsblk -rno UUID "$1" 2>/dev/null) + + # bind mounts do not have a UUID! + + case $bytag in + '') + [[ $uuid ]] && comment=("UUID=$uuid") + [[ $label ]] && comment+=("LABEL=$(mangle "$label")") + ;; + LABEL) + spec=$label + [[ $uuid ]] && comment=("$src" "UUID=$uuid") + ;; + UUID) + spec=$uuid + comment=("$src") + [[ $label ]] && comment+=("LABEL=$(mangle "$label")") + ;; + *) + [[ $uuid ]] && comment=("$1" "UUID=$uuid") + [[ $label ]] && comment+=("LABEL=$(mangle "$label")") + [[ $bytag ]] && spec=$(lsblk -rno "$bytag" "$1" 2>/dev/null) + ;; + esac + + [[ -n "${comment[*]}" ]] && printf '# %s\n' "${comment[*]}" + + if [[ $spec ]]; then + printf '%-20s' "$bytag=$(mangle "$spec")" + else + printf '%-20s' "$(mangle "$src")" + fi +} + +optstring_apply_quirks() { + local varname="$1" fstype="$2" + + # SELinux displays a 'seclabel' option in /proc/self/mountinfo. We can't know + # if the system we're generating the fstab for has any support for SELinux (as + # one might install Arch from a Fedora environment), so let's remove it. + optstring_remove_option "$varname" seclabel + + # Prune 'relatime' option for any pseudofs. This seems to be a rampant + # default which the kernel often exports even if the underlying filesystem + # doesn't support it. Example: https://bugs.archlinux.org/task/54554. + if awk -v fstype="$fstype" '$1 == fstype { exit 1 }' /proc/filesystems; then + optstring_remove_option "$varname" relatime + fi + + case $fstype in + f2fs) + # These are Kconfig options for f2fs. Kernels supporting the options will + # only provide the negative versions of these (e.g. noacl), and vice versa + # for kernels without support. + optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr + ;; + vfat) + # Before Linux v3.8, "cp" is prepended to the value of the codepage. + if optstring_get_option "$varname" codepage && [[ "$codepage" = cp* ]]; then + optstring_remove_option "$varname" codepage + optstring_append_option "$varname" "codepage=${codepage#cp}" + fi + ;; + esac +} + +#}}} + +usage() { + cat </dev/null; then + # this is root. we can't possibly have more than one... + pass=1 foundroot=1 + fi + + # if there's no fsck tool available, then only pass=0 makes sense. + if ! fstype_has_fsck "$fstype"; then + pass=0 + fi + + if [[ $fsroot != / && $fstype != btrfs ]]; then + # it's a bind mount + src=$(findmnt -funcevo TARGET "$src")$fsroot + if [[ $src -ef $target ]]; then + # hrmm, this is weird. we're probably looking at a file or directory + # that was bound into a chroot from the host machine. Ignore it, + # because this won't actually be a valid mount. Worst case, the user + # just re-adds it. + continue + fi + fstype=none + opts+=,bind + pass=0 + fi + + # filesystem quirks + case $fstype in + fuseblk) + # well-behaved FUSE filesystems will report themselves as fuse.$fstype. + # this is probably NTFS-3g, but let's just make sure. + if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then + # avoid blanking out fstype, leading to an invalid fstab + error 'Failed to derive real filesystem type for FUSE device on %s' "$target" + else + fstype=$newtype + fi + ;; + esac + + optstring_apply_quirks "opts" "$fstype" + + # write one line + write_source "$src" + printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts" + printf '\t%s %s' "$dump" "$pass" + printf '\n\n' +done + +# handle swaps devices +{ + # ignore header + read -r + + while read -r device type _ _ prio; do + options=defaults + if (( prio >= 0 )); then + options+=,pri=$prio + fi + + # skip files marked deleted by the kernel + [[ $device = *'\040(deleted)' ]] && continue + + if [[ $type = file ]]; then + printf '%-20s' "${device#${root%/}}" + elif [[ $device = /dev/dm-+([0-9]) ]]; then + # device mapper doesn't allow characters we need to worry + # about being mangled, and it does the escaping of dashes + # for us in sysfs. + write_source "$(dm_name_for_devnode "$device")" + else + write_source "$(unmangle "$device")" + fi + + printf '\t%-10s\t%-10s\t%-10s\t0 0\n\n' 'none' 'swap' "$options" + done +} ${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + +#!/hint/bash + +CHROOTVERSION=0.10 + + +working_dir='' +umode='' + +files=() +chroot_args=() + +usage() { + echo "Usage: ${0##*/} [options] working-dir package-list..." + echo ' options:' + echo ' -U Use pacman -U to install packages' + echo ' -C Location of a pacman config file' + echo ' -M Location of a makepkg config file' + echo ' -c Set pacman cache' + echo ' -f Copy file from the host to the chroot' + echo ' -s Do not run setarch' + echo ' -h This message' + exit 1 +} + +opts='hUC:M:c:f:s' + +while getopts ${opts} arg; do + case "${arg}" in + U) umode=U ;; + C) pacman_conf="$OPTARG" ;; + M) makepkg_conf="$OPTARG" ;; + c) cache_dir="$OPTARG" ;; + f) files+=("$OPTARG") ;; + s) nosetarch=1 ;; + h|?) usage ;; + *) error "invalid argument '%s'" "$arg"; usage ;; + esac + if [[ $arg != U ]]; then + chroot_args+=("-$arg") + [[ -v OPTARG ]] && chroot_args+=("$OPTARG") + fi +done +shift $(( OPTIND - 1 )) + +(( $# < 2 )) && die 'You must specify a directory and one or more packages.' + +check_root + +working_dir="$(readlink -f "$1")" +shift 1 + +[[ -z $working_dir ]] && die 'Please specify a working directory.' + +if (( ${#cache_dirs[@]} == 0 )); then + mapfile -t cache_dirs < <(pacman-conf CacheDir) +fi + +umask 0022 + +[[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir" + +mkdir -p "$working_dir" + +[[ ! -d $working_dir ]] && mkdir -p "$working_dir" + +lock 9 "${working_dir}.lock" "Locking chroot" + +if is_btrfs "$working_dir"; then + rmdir "$working_dir" + if ! btrfs subvolume create "$working_dir"; then + die "Couldn't create subvolume for '%s'" "$working_dir" + fi + chmod 0755 "$working_dir" +fi + +for f in "${files[@]}"; do + mkdir -p "$(dirname "$working_dir$f")" + cp "$f" "$working_dir$f" +done + +basestrap -${umode}Mc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" \ + "${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages' + +printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$working_dir/etc/locale.gen" +echo 'LANG=en_US.UTF-8' > "$working_dir/etc/locale.conf" +# echo 'KEYMAP=en' > "$working_dir/etc/vconsole.conf" +echo "${CHROOTVERSION}" > "$working_dir/.artools" + +dbus-uuidgen --ensure="$working_dir"/etc/machine-id + +exec chroot-run \ + "${chroot_args[@]}" \ + "$working_dir" locale-gen diff --git a/artools/0.26.1/artools/bin/base/mkchroot.in b/artools/0.26.1/artools/bin/base/mkchroot.in new file mode 100644 index 0000000..3657e28 --- /dev/null +++ b/artools/0.26.1/artools/bin/base/mkchroot.in @@ -0,0 +1,106 @@ +#!/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/base/message.sh) +m4_include(lib/base/chroot.sh) +m4_include(lib/base/chroot-version.sh) + +working_dir='' +umode='' + +files=() +chroot_args=() + +usage() { + echo "Usage: ${0##*/} [options] working-dir package-list..." + echo ' options:' + echo ' -U Use pacman -U to install packages' + echo ' -C Location of a pacman config file' + echo ' -M Location of a makepkg config file' + echo ' -c Set pacman cache' + echo ' -f Copy file from the host to the chroot' + echo ' -s Do not run setarch' + echo ' -h This message' + exit 1 +} + +opts='hUC:M:c:f:s' + +while getopts ${opts} arg; do + case "${arg}" in + U) umode=U ;; + C) pacman_conf="$OPTARG" ;; + M) makepkg_conf="$OPTARG" ;; + c) cache_dir="$OPTARG" ;; + f) files+=("$OPTARG") ;; + s) nosetarch=1 ;; + h|?) usage ;; + *) error "invalid argument '%s'" "$arg"; usage ;; + esac + if [[ $arg != U ]]; then + chroot_args+=("-$arg") + [[ -v OPTARG ]] && chroot_args+=("$OPTARG") + fi +done +shift $(( OPTIND - 1 )) + +(( $# < 2 )) && die 'You must specify a directory and one or more packages.' + +check_root + +working_dir="$(readlink -f "$1")" +shift 1 + +[[ -z $working_dir ]] && die 'Please specify a working directory.' + +if (( ${#cache_dirs[@]} == 0 )); then + mapfile -t cache_dirs < <(pacman-conf CacheDir) +fi + +umask 0022 + +[[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir" + +mkdir -p "$working_dir" + +[[ ! -d $working_dir ]] && mkdir -p "$working_dir" + +lock 9 "${working_dir}.lock" "Locking chroot" + +if is_btrfs "$working_dir"; then + rmdir "$working_dir" + if ! btrfs subvolume create "$working_dir"; then + die "Couldn't create subvolume for '%s'" "$working_dir" + fi + chmod 0755 "$working_dir" +fi + +for f in "${files[@]}"; do + mkdir -p "$(dirname "$working_dir$f")" + cp "$f" "$working_dir$f" +done + +basestrap -${umode}Mc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" \ + "${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages' + +printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$working_dir/etc/locale.gen" +echo 'LANG=en_US.UTF-8' > "$working_dir/etc/locale.conf" +# echo 'KEYMAP=en' > "$working_dir/etc/vconsole.conf" +echo "${CHROOTVERSION}" > "$working_dir/.artools" + +dbus-uuidgen --ensure="$working_dir"/etc/machine-id + +exec chroot-run \ + "${chroot_args[@]}" \ + "$working_dir" locale-gen diff --git a/artools/0.26.1/artools/bin/iso/buildiso b/artools/0.26.1/artools/bin/iso/buildiso new file mode 100755 index 0000000..d6f34b7 --- /dev/null +++ b/artools/0.26.1/artools/bin/iso/buildiso @@ -0,0 +1,1327 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ iso conf + +load_iso_config(){ + + local conf="$1/artools-iso.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-iso.conf + [[ -r "$conf" ]] && . "$conf" + + ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"} + + ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"} + + INITSYS=${INITSYS:-'openrc'} + + GPG_KEY=${GPG_KEY:-''} + + COMPRESSION="${COMPRESSION:-zstd}" + + COMPRESSION_LEVEL="${COMPRESSION_LEVEL:-15}" + + if [[ -z "${COMPRESSION_ARGS[*]}" ]]; then + COMPRESSION_ARGS=(-Xcompression-level "${COMPRESSION_LEVEL}") + fi + + if [[ "${COMPRESSION}" == 'xz' ]]; then + COMPRESSION_ARGS=(-Xbcj x86) + fi + + return 0 +} + +#}}} + +load_iso_config "${USER_CONF_DIR}" || load_iso_config "${SYSCONFDIR}" + +prepare_dir "${ISO_POOL}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/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" +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + +#!/hint/bash + +#{{{ mount + +track_img() { + msg2 "mount: [%s]" "$2" + mount "$@" && IMG_ACTIVE_MOUNTS=("$2" "${IMG_ACTIVE_MOUNTS[@]}") +} + +mount_img() { + IMG_ACTIVE_MOUNTS=() + mkdir -p "$2" + track_img "$1" "$2" +} + +umount_img() { + if [[ -n "${IMG_ACTIVE_MOUNTS[*]}" ]];then + msg2 "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}" + umount "${IMG_ACTIVE_MOUNTS[@]}" + unset IMG_ACTIVE_MOUNTS + rm -r "$1" + fi +} + +track_fs() { + msg2 "overlayfs mount: [%s]" "$5" + mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}") +} + +mount_overlayfs(){ + FS_ACTIVE_MOUNTS=() + local lower upper="$1" work="$2" + mkdir -p "${mnt_dir}/work" + mkdir -p "$upper" + case $upper in + */livefs) lower="$work/rootfs" ;; + */bootfs) + lower="$work/rootfs" + [[ -d "$work/livefs" ]] && lower="$work/livefs:$work/rootfs" + ;; + esac + # shellcheck disable=2140 + track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper" +} + +umount_overlayfs(){ + if [[ -n "${FS_ACTIVE_MOUNTS[*]}" ]];then + msg2 "overlayfs umount: [%s]" "${FS_ACTIVE_MOUNTS[@]}" + umount "${FS_ACTIVE_MOUNTS[@]}" + unset FS_ACTIVE_MOUNTS + rm -rf "${mnt_dir}/work" + fi +} + +#}}} + +#!/hint/bash + +#{{{ services + +add_svc_openrc(){ + local mnt="$1" names="$2" rlvl="${3:-default}" + for svc in $names; do + if [[ -f $mnt/etc/init.d/$svc ]];then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" rc-update add "$svc" "$rlvl" &>/dev/null + fi + done +} + +add_svc_runit(){ + local mnt="$1" names="$2" rlvl="${3:-default}" + for svc in $names; do + if [[ -d $mnt/etc/runit/sv/$svc ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" ln -s /etc/runit/sv/"$svc" /etc/runit/runsvdir/"$rlvl" &>/dev/null + fi + done +} + +add_svc_s6(){ + local mnt="$1" names="$2" rlvl="${3:-default}" error ret + local db=/etc/s6/rc/compiled + for svc in $names; do + error=false + chroot "$mnt" s6-rc-db -c "$db" type "$svc" &> /dev/null || error=true + ret="$?" + if [ $ret -eq 0 ] && [[ "$error" == false ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" s6-rc-bundle-update -c "$db" add "$rlvl" "$svc" + fi + done + + local rlvl=/etc/s6/current + # rebuild s6-linux-init binaries + chroot "$mnt" rm -r "$rlvl" + chroot "$mnt" s6-linux-init-maker -1 -N -f /etc/s6/skel -G "/usr/bin/agetty -L -8 tty7 115200" -c "$rlvl" "$rlvl" + chroot "$mnt" mv "$rlvl"/bin/init "$rlvl"/bin/s6-init + chroot "$mnt" cp -a "$rlvl"/bin /usr +} + +add_svc_suite66(){ + local mnt="$1" names="$2" + for svc in $names; do + if [[ -f "$mnt"/etc/66/service/"$svc" ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" 66-enable -t default "$svc" &>/dev/null + fi + done +} + +add_svc_dinit(){ + local mnt="$1" names="$2" + for svc in $names; do + if [[ -d $mnt/etc/dinit.d/boot.d ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" ln -s ../"$svc" /etc/dinit.d/boot.d/"$svc" &>/dev/null + fi + done +} + +#}}} + +#!/hint/bash + +#{{{ yaml + +write_yaml_header(){ + printf '%s' '---' +} + +write_empty_line(){ + printf '\n%s\n' ' ' +} + +write_yaml_map(){ + local ident="$1" key="$2" val="$3" + printf "\n%${ident}s%s: %s\n" '' "$key" "$val" +} + +write_yaml_seq(){ + local ident="$1" val="$2" + printf "\n%${ident}s- %s\n" '' "$val" +} + +write_yaml_seq_map(){ + local ident="$1" key="$2" val="$3" + printf "\n%${ident}s- %s: %s\n" '' "$key" "$val" +} + +#}}} + +#!/hint/bash + +#{{{ calamares + +write_services_conf(){ + local key1="$1" val1="$2" key2="$3" val2="$4" + local yaml + yaml=$(write_yaml_header) + yaml+=$(write_yaml_map 0 "$key1" "$val1") + yaml+=$(write_yaml_map 0 "$key2" "$val2") + yaml+=$(write_yaml_map 0 'services') + for svc in "${SERVICES[@]}"; do + yaml+=$(write_yaml_seq 2 "$svc") + done + yaml+=$(write_empty_line) + printf '%s' "${yaml}" +} + +write_services_openrc_conf(){ + local conf="$1"/services-openrc.conf + write_services_conf 'initdDir' '/etc/init.d' 'runlevelsDir' '/etc/runlevels' > "$conf" +} + +write_services_runit_conf(){ + local conf="$1"/services-runit.conf + write_services_conf 'svDir' '/etc/runit/sv' 'runsvDir' '/etc/runit/runsvdir' > "$conf" +} + +write_services_s6_conf(){ + local conf="$1"/services-s6.conf + write_services_conf 'svDir' '/etc/s6/sv' 'dbDir' '/etc/s6/rc/compiled' > "$conf" +} + +write_services_suite66_conf(){ + local conf="$1"/services-suite66.conf + write_services_conf 'svDir' '/etc/66/service' 'runsvDir' '/var/lib/66/system' > "$conf" +} + +write_services_dinit_conf(){ + local conf="$1"/services-dinit.conf + write_services_conf 'initdDir' '/etc/dinit.d' 'runsvDir' '/etc/dinit.d/boot.d' > "$conf" +} + +configure_calamares(){ + local mods="$1/etc/calamares/modules" + if [[ -d "$mods" ]];then + msg2 "Configuring: Calamares" + write_services_"${INITSYS}"_conf "$mods" + sed -e "s|services-openrc|services-${INITSYS}|" \ + -i "$1"/etc/calamares/settings.conf + fi +} + +#}}} + +#!/hint/bash + +#{{{ session + +configure_services(){ + local mnt="$1" + add_svc_"${INITSYS}" "$mnt" "${SERVICES[*]}" +} + + +write_live_session_conf(){ + local conf='' + conf+=$(printf '%s\n' '# live session configuration') + conf+=$(printf "\nAUTOLOGIN=%s\n" "${AUTOLOGIN}") + conf+=$(printf "\nPASSWORD=%s\n" "${PASSWORD}") + printf '%s' "$conf" +} + +configure_chroot(){ + local fs="$1" + msg "Configuring [%s]" "${fs##*/}" + configure_services "$fs" + configure_calamares "$fs" + [[ ! -d "$fs/etc/artools" ]] && mkdir -p "$fs/etc/artools" + msg2 "Writing: live.conf" + write_live_session_conf > "$fs/etc/artools/live.conf" + msg "Done configuring [%s]" "${fs##*/}" +} + +#}}} + +#!/hint/bash + +#{{{ firmware + +prepare_boot_extras(){ + local src="$1" dest + dest=${iso_root}/boot + + for fw in intel amd; do + cp "$src"/boot/"$fw"-ucode.img "$dest/$fw"-ucode.img + done + + cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest + cp "$src"/usr/share/licenses/common/GPL2/license.txt "$dest"/memtest.COPYING +} + +#}}} + +#!/hint/bash + +#{{{ dracut + +prepare_initramfs_dracut(){ + local mnt="$1" + local kver + kver=$(<"$mnt"/usr/src/linux/version) + + printf "%s\n" 'add_dracutmodules+=" dmsquash-live"' > "$mnt"/etc/dracut.conf.d/50-live.conf + + msg "Starting build: %s" "${kver}" + artix-chroot "$mnt" dracut -fqM /boot/initramfs.img "$kver" + msg "Image generation successful" + + cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img + + prepare_boot_extras "$mnt" +} + +configure_grub_dracut(){ + msg "Configuring grub kernel options ..." + local kopts=() + kopts=( + "root=live:LABEL=${iso_label}" + 'rd.live.squashimg=rootfs.img' + 'rd.live.image' + 'rootflags=auto' + ) + [[ "${profile}" != 'base' ]] && kopts+=("rd.live.join=livefs.img") + + local ro_opts=() + local rw_opts=() +# 'rd.writable.fsimg=1' + + sed -e "s|@kopts@|${kopts[*]}|" \ + -e "s|@ro_opts@|${ro_opts[*]}|" \ + -e "s|@rw_opts@|${rw_opts[*]}|" \ + -i "${iso_root}"/boot/grub/kernels.cfg +} + +#}}} + +#!/hint/bash + +#{{{ initcpio + +make_checksum(){ + local file="$1" + msg2 "Creating md5sum ..." + cd "${iso_root}${live_dir}" + md5sum "$file" > "$file".md5 + cd "${OLDPWD}" +} + +make_sig () { + local file="$1" + msg2 "Creating signature file..." + chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}" + su "${owner}" -c "gpg --detach-sign --output $file.sig --default-key ${GPG_KEY} $file" + chown "root:root" "${iso_root}${live_dir}" +} + +export_gpg_publickey() { + key_export=${WORKSPACE_DIR}/pubkey.gpg + if [[ ! -e "${key_export}" ]]; then + gpg --batch --output "${key_export}" --export "${GPG_KEY}" + fi +} + +prepare_initramfs_mkinitcpio() { + local mnt="$1" packages=() mkinitcpio_conf k + + mkinitcpio_conf=mkinitcpio-default.conf + [[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf + k=$(<"$mnt"/usr/src/linux/version) + + read_from_list "${common_dir}/Packages-boot" + basestrap "${basestrap_args[@]}" "$mnt" "${packages[@]}" + + if [[ -n "${GPG_KEY}" ]]; then + exec {ARTIX_GNUPG_FD}<>"${key_export}" + export ARTIX_GNUPG_FD + fi + + artix-chroot "$mnt" mkinitcpio -k "$k" \ + -c /etc/"$mkinitcpio_conf" \ + -g /boot/initramfs.img + + if [[ -n "${GPG_KEY}" ]]; then + exec {ARTIX_GNUPG_FD}<&- + unset ARTIX_GNUPG_FD + fi + if [[ -f "${key_export}" ]]; then + rm "${key_export}" + fi + cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img + prepare_boot_extras "$mnt" +} + +configure_grub_mkinitcpio() { + msg "Configuring grub kernel options ..." + local ro_opts=() + local rw_opts=() + local kopts=("label=${iso_label}") + + [[ "${profile}" != 'base' ]] && kopts+=('overlay=livefs') + + sed -e "s|@kopts@|${kopts[*]}|" \ + -e "s|@ro_opts@|${ro_opts[*]}|" \ + -e "s|@rw_opts@|${rw_opts[*]}|" \ + -i "${iso_root}"/boot/grub/kernels.cfg +} + +#}}} + +#!/hint/bash + +#{{{ grub + +prepare_grub(){ + local platform=i386-pc img='core.img' prefix=/boot/grub + local lib="$1"/usr/lib/grub + local theme="$1"/usr/share/grub + local livecfg="$2"/usr/share/grub + local grub=${iso_root}/boot/grub efi=${iso_root}/efi/boot + + prepare_dir "${grub}/${platform}" + + cp "${livecfg}"/cfg/*.cfg "${grub}" + + cp "${lib}/${platform}"/* "${grub}/${platform}" + + msg2 "Building %s ..." "${img}" + + grub-mkimage -d "${grub}/${platform}" -o "${grub}/${platform}/${img}" -O "${platform}" -p "${prefix}" biosdisk iso9660 + + cat "${grub}/${platform}"/cdboot.img "${grub}/${platform}/${img}" > "${grub}/${platform}"/eltorito.img + + platform=x86_64-efi + img=bootx64.efi + + prepare_dir "${efi}" + prepare_dir "${grub}/${platform}" + + cp "${lib}/${platform}"/* "${grub}/${platform}" + + msg2 "Building %s ..." "${img}" + + grub-mkimage -d "${grub}/${platform}" -o "${efi}/${img}" -O "${platform}" -p "${prefix}" iso9660 + + prepare_dir "${grub}"/themes + + cp -r "${theme}"/themes/artix "${grub}"/themes + cp -r "${livecfg}"/{locales,tz} "${grub}" + + if [[ -f /usr/share/grub/unicode.pf2 ]];then + msg2 "Copying %s ..." "unicode.pf2" + cp /usr/share/grub/unicode.pf2 "${grub}"/unicode.pf2 + else + msg2 "Creating %s ..." "unicode.pf2" + grub-mkfont -o "${grub}"/unicode.pf2 /usr/share/fonts/misc/unifont.bdf + fi + + local size=4M mnt="${mnt_dir}/efiboot" efi_img="${iso_root}/boot/efi.img" + msg2 "Creating fat image of %s ..." "${size}" + truncate -s "${size}" "${efi_img}" + mkfs.fat -n ARTIX_EFI "${efi_img}" &>/dev/null + prepare_dir "${mnt}" + mount_img "${efi_img}" "${mnt}" + prepare_dir "${mnt}"/efi/boot + msg2 "Building %s ..." "${img}" + grub-mkimage -d "${grub}/${platform}" -o "${mnt}"/efi/boot/"${img}" -O "${platform}" -p "${prefix}" iso9660 + umount_img "${mnt}" +} + +#}}} + +#!/hint/bash + +#{{{ squash + +make_ext_img(){ + local src="$1" + local size=32G + local mnt="${mnt_dir}/${src##*/}" + mkdir -p "${work_dir}"/embed"${live_dir}" + local extimg="${work_dir}/embed${live_dir}/${src##*/}".img + + msg2 "Creating ext4 image of %s ..." "${size}" + truncate -s ${size} "${extimg}" + local ext4_args=() + ext4_args+=("-O ^has_journal,^resize_inode" -E lazy_itable_init=0 -m 0) + mkfs.ext4 "${ext4_args[@]}" -F "${extimg}" &>/dev/null + tune2fs -c 0 -i 0 "${extimg}" &> /dev/null + mount_img "${extimg}" "${mnt}" + msg2 "Copying %s ..." "${src}/" + cp -aT "${src}/" "${mnt}/" + umount_img "${mnt}" +} + +has_changed(){ + local src="$1" dest="$2" + if [[ -f "${dest}" ]]; then + local has_changes + has_changes=$(find "${src}" -newer "${dest}") + if [[ -n "${has_changes}" ]]; then + msg2 "Possible changes for %s ..." "${src}" + msg2 "%s" "${has_changes}" + msg2 "SquashFS image %s is not up to date, rebuilding..." "${dest}" + rm "${dest}" + else + msg2 "SquashFS image %s is up to date, skipping." "${dest}" + return 1 + fi + fi +} + +# $1: image path +make_sfs() { + local sfs_in="$1" + if [[ ! -e "${sfs_in}" ]]; then + error "The path %s does not exist" "${sfs_in}" + retrun 1 + fi + + mkdir -p "${iso_root}${live_dir}" + + local img_name=${sfs_in##*/}.img + + local sfs_out="${iso_root}${live_dir}/${img_name}" + + if has_changed "${sfs_in}" "${sfs_out}"; then + + msg "Generating SquashFS image for %s" "${sfs_in}" + + local mksfs_args=() + + if ${persist};then + make_ext_img "${sfs_in}" + mksfs_args+=("${work_dir}/embed") + else + mksfs_args+=("${sfs_in}") + fi + + mksfs_args+=("${sfs_out}") + + mksfs_args+=(-comp "${COMPRESSION}" "${COMPRESSION_ARGS[@]}" -noappend) + + mksquashfs "${mksfs_args[@]}" + + if ! ${use_dracut}; then + make_checksum "${img_name}" + if [[ -n ${GPG_KEY} ]];then + make_sig "${iso_root}${live_dir}/${img_name}" + fi + fi + if ${persist}; then + rm -r "${work_dir}/embed" + fi + fi +} + +#}}} + +#!/hint/bash + +#{{{ iso + +get_disturl(){ + # shellcheck disable=1091 + . /usr/lib/os-release + echo "${HOME_URL}" +} + +get_osname(){ + # shellcheck disable=1091 + . /usr/lib/os-release + echo "${NAME}" +} + +assemble_iso(){ + msg "Creating ISO image..." + local mod_date + mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g) + local appid + appid="$(get_osname) Live/Rescue CD" + local publisher + publisher="$(get_osname) <$(get_disturl)>" + + xorriso -as mkisofs \ + --modification-date="${mod_date}" \ + --protective-msdos-label \ + -volid "${iso_label}" \ + -appid "${appid}" \ + -publisher "${publisher}" \ + -preparer "Prepared by artools/${0##*/}" \ + -r -graft-points -no-pad \ + --sort-weight 0 / \ + --sort-weight 1 /boot \ + --grub2-mbr "${iso_root}"/boot/grub/i386-pc/boot_hybrid.img \ + -partition_offset 16 \ + -b boot/grub/i386-pc/eltorito.img \ + -c boot.catalog \ + -no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \ + -eltorito-alt-boot \ + -append_partition 2 0xef "${iso_root}"/boot/efi.img \ + -e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \ + -no-emul-boot \ + -iso-level 3 \ + -o "${iso_dir}/${iso_file}" \ + "${iso_root}"/ +} + +#}}} + +#!/hint/bash + +#{{{ profile + +show_profile(){ + msg2 "iso_file: %s" "${iso_file}" + msg2 "AUTOLOGIN: %s" "${AUTOLOGIN}" + msg2 "PASSWORD: %s" "${PASSWORD}" + msg2 "SERVICES: %s" "${SERVICES[*]}" +} + +load_profile(){ + local profile_dir="${DATADIR}/iso-profiles" + [[ -d "${WORKSPACE_DIR}"/iso-profiles ]] && profile_dir="${WORKSPACE_DIR}"/iso-profiles + + root_list="$profile_dir/${profile}/Packages-Root" + root_overlay="$profile_dir/${profile}/root-overlay" + + [[ -f "$profile_dir/${profile}/Packages-Live" ]] && live_list="$profile_dir/${profile}/Packages-Live" + [[ -d "$profile_dir/${profile}/live-overlay" ]] && live_overlay="$profile_dir/${profile}/live-overlay" + + common_dir="${DATADIR}/iso-profiles/common" + [[ -d "$profile_dir"/common ]] && common_dir="${profile_dir}"/common + + [[ -f $profile_dir/${profile}/profile.conf ]] || return 1 + + # shellcheck disable=1090 + [[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf + + AUTOLOGIN=${AUTOLOGIN:-true} + + PASSWORD=${PASSWORD:-'artix'} + + if [[ -z "${SERVICES[*]}" ]];then + SERVICES=('acpid' 'bluetoothd' 'cronie' 'cupsd' 'syslog-ng' 'connmand') + fi + + return 0 +} + +read_from_list() { + local list="$1" + local _space="s| ||g" + local _clean=':a;N;$!ba;s/\n/ /g' + local _com_rm="s|#.*||g" + + local _init="s|@initsys@|${INITSYS}|g" + + msg2 "Loading Packages: [%s] ..." "${list##*/}" + packages+=($(sed "$_com_rm" "$list" \ + | sed "$_space" \ + | sed "$_init" \ + | sed "$_clean")) +} + +read_from_services() { + for svc in "${SERVICES[@]}"; do + case "$svc" in + sddm|gdm|lightdm|mdm|greetd|lxdm|xdm) packages+=("$svc-${INITSYS}") ;; + NetworkManager) packages+=("networkmanager-${INITSYS}") ;; + connmand) packages+=("connman-${INITSYS}") ;; + cupsd) packages+=("cups-${INITSYS}") ;; + bluetoothd) packages+=("bluez-${INITSYS}") ;; + syslog-ng|metalog) packages+=("$svc-${INITSYS}") ;; + esac + done +} + +load_pkgs(){ + local pkglist="$1" + packages=() + + if [[ "${pkglist##*/}" == "Packages-Root" ]]; then + read_from_list "${common_dir}/Packages-base" + read_from_list "${common_dir}/Packages-apps" + read_from_list "${common_dir}/Packages-${INITSYS}" + [[ -n "${live_list}" ]] && read_from_list "${common_dir}/Packages-xorg" + read_from_list "$pkglist" + read_from_services + else + read_from_list "$pkglist" + fi +} + +#}}} + +#!/hint/bash + +#{{{ trap + +error_function() { + local func="$1" + # first exit all subshells, then print the error + if (( ! BASH_SUBSHELL )); then + error "A failure occurred in %s()." "$func" + plain "Aborting..." + fi + umount_overlayfs + umount_img + exit 2 +} + +run_safe() { + local restoretrap func="$1" + set -e + set -E + restoretrap=$(trap -p ERR) + trap 'error_function $func' ERR + + "$func" + + eval "$restoretrap" + set +E + set +e +} + +trap_exit() { + local sig=$1; shift + error "$@" + umount_overlayfs + trap -- "$sig" + kill "-$sig" "$$" +} + +prepare_traps(){ + for sig in TERM HUP QUIT; do + # shellcheck disable=2064 + trap "trap_exit $sig \"$(gettext "%s signal caught. Exiting...")\" \"$sig\"" "$sig" + done + trap 'trap_exit INT "$(gettext "Aborted by user! Exiting...")"' INT +# trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR +} + +#}}} + + +clean_up_chroot(){ + local path mnt="$1" + msg2 "Cleaning [%s]" "${mnt##*/}" + + path=$mnt/boot + if [[ -d "$path" ]]; then + find "$path" -name 'initramfs*.img' -delete &> /dev/null + fi + path=$mnt/var/lib/pacman/sync + if [[ -d $path ]];then + find "$path" -type f -delete &> /dev/null + fi + path=$mnt/var/cache/pacman/pkg + if [[ -d $path ]]; then + find "$path" -type f -delete &> /dev/null + fi + path=$mnt/var/log + if [[ -d $path ]]; then + find "$path" -type f -delete &> /dev/null + fi + path=$mnt/var/tmp + if [[ -d $path ]];then + find "$path" -mindepth 1 -delete &> /dev/null + fi + path=$mnt/tmp + if [[ -d $path ]];then + find "$path" -mindepth 1 -delete &> /dev/null + fi + # shellcheck disable=2035 + find "$mnt" -name *.pacnew -name *.pacsave -name *.pacorig -delete + if [[ -f "$mnt/boot/grub/grub.cfg" ]]; then + rm "$mnt"/boot/grub/grub.cfg + fi + if [[ -f "$mnt/etc/machine-id" ]]; then + rm "$mnt"/etc/machine-id + fi +} + +copy_overlay(){ + local src="$1" dest="$2" + if [[ -e "$src" ]];then + msg2 "Copying [%s] ..." "${src##*/}" + cp -LR "$src"/* "$dest" + fi +} + +make_rootfs() { + if [[ ! -e "${work_dir}"/rootfs.lock ]]; then + msg "Prepare [Base installation] (rootfs)" + local rootfs="${work_dir}/rootfs" + + prepare_dir "${rootfs}" + + basestrap "${basestrap_args[@]}" "${rootfs}" "${packages[@]}" + + copy_overlay "${root_overlay}" "${rootfs}" + + [[ -z ${live_list} ]] && configure_chroot "${rootfs}" + + clean_up_chroot "${rootfs}" + + : > "${work_dir}"/rootfs.lock + + msg "Done [Base installation] (rootfs)" + fi +} + +make_livefs() { + if [[ ! -e ${work_dir}/livefs.lock ]]; then + msg "Prepare [Live installation] (livefs)" + local livefs="${work_dir}/livefs" + + prepare_dir "${livefs}" + + mount_overlayfs "${livefs}" "${work_dir}" + + basestrap "${basestrap_args[@]}" "${livefs}" "${packages[@]}" + + copy_overlay "${live_overlay}" "${livefs}" + + configure_chroot "${livefs}" + + umount_overlayfs + + clean_up_chroot "${livefs}" + + : > "${work_dir}"/livefs.lock + + msg "Done [Live installation] (livefs)" + fi +} + +make_bootfs() { + if [[ ! -e ${work_dir}/bootfs.lock ]]; then + msg "Prepare [/iso/boot]" + + prepare_dir "${iso_root}/boot" + + cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}" + + local bootfs="${work_dir}/bootfs" + + mount_overlayfs "${bootfs}" "${work_dir}" + + if "${use_dracut}"; then + prepare_initramfs_dracut "${bootfs}" + else + prepare_initramfs_mkinitcpio "${bootfs}" + fi + + umount_overlayfs + + rm -R "${bootfs}" + : > "${work_dir}"/bootfs.lock + msg "Done [/iso/boot]" + fi +} + +make_grub(){ + if [[ ! -e ${work_dir}/grub.lock ]]; then + msg "Prepare [/iso/boot/grub]" + + local layer=${work_dir}/rootfs + [[ -n ${live_list} ]] && layer=${work_dir}/livefs + + prepare_grub "${work_dir}/rootfs" "$layer" + + if ${use_dracut}; then + configure_grub_dracut + else + configure_grub_mkinitcpio + fi + + : > "${work_dir}"/grub.lock + msg "Done [/iso/boot/grub]" + fi +} + +gen_iso_fn(){ + local vars=("artix") name + vars+=("${profile}") + vars+=("${INITSYS}") + case "${repo}" in + 'gremlins'|'goblins') vars+=("${repo}") ;; + esac + vars+=("${ISO_VERSION}") + vars+=("${arch}") + for n in "${vars[@]}"; do + name=${name:-}${name:+-}${n} + done + echo "$name" +} + +prepare_build(){ + load_profile + + case "${repo}" in + 'gremlins'|'goblins') repo="${repo}" ;; + *) repo=default ;; + esac + + get_pacman_conf "${repo}" + + iso_file=$(gen_iso_fn).iso + + iso_label="ARTIX_$(date +%Y%m)" + + basestrap_args+=(-C "${pacman_conf}") + work_dir=${chroots_iso}/${profile}/artix + + iso_dir="${ISO_POOL}/${profile}" + + iso_root=${chroots_iso}/${profile}/iso + live_dir=/LiveOS + + mnt_dir=${chroots_iso}/${profile}/mnt + + if [[ -n "${GPG_KEY}" ]]; then + ${use_dracut} || export_gpg_publickey + fi +} + +display_settings(){ + msg "OPTIONS:" + msg2 "profile: %s" "${profile}" + msg2 "INITSYS: %s" "${INITSYS}" + [[ -n ${GPG_KEY} ]] && msg2 "GPG_KEY: %s" "${GPG_KEY}" + + msg "ISO SETTINGS:" + msg2 "ISO_VERSION: %s" "${ISO_VERSION}" + msg2 "COMPRESSION: %s" "${COMPRESSION}" + [[ "${COMPRESSION}" == 'zstd' ]] && msg2 "COMPRESSION_LEVEL: %s" "${COMPRESSION_LEVEL}" + + msg "BUILD:" + show_profile +} + +mk_squash(){ + make_sfs "${work_dir}/rootfs" + if [[ -d "${work_dir}/livefs" ]]; then + make_sfs "${work_dir}/livefs" + fi +} + +mk_iso(){ + touch "${iso_root}/.artix" + msg "Making bootable image" + # Sanity checks + [[ ! -d "${iso_root}" ]] && return 1 + if [[ -f "${iso_dir}/${iso_file}" ]]; then + msg2 "Removing existing bootable image..." + rm -rf "${iso_dir}/${iso_file}" + fi + assemble_iso + chown -R "${owner}:$(id --group "${owner}")" "${iso_dir}" +} + +mk_boot(){ + run_safe "make_bootfs" + run_safe "make_grub" +} + +mk_chroots(){ + load_pkgs "${root_list}" + run_safe "make_rootfs" + if [[ -n ${live_list} ]]; then + load_pkgs "${live_list}" + run_safe "make_livefs" + fi +} + +build(){ + msg "Start building [%s]" "${profile}" + if ${clean_first};then + for copy in "${work_dir}"/*; do + [[ -d $copy ]] || continue + msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")" + + lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy" + + subvolume_delete_recursive "${copy}" + rm -rf --one-file-system "${copy}" + done + lock_close 9 + + rm -rf --one-file-system "${work_dir}" + + msg "Deleting isoroot [%s] ..." "${iso_root##*/}" + rm -rf --one-file-system "${iso_root}" + fi + + if ${chroot_only}; then + mk_chroots + warning "Continue squash: %s -p %s -sc ..." "${cmd}" "${profile}" + exit 1 + elif ${boot_only}; then + mk_boot + warning "Continue iso: %s -p %s -zc ..." "${cmd}" "${profile}" + exit 1 + elif ${squash_only}; then + mk_squash + warning "Continue boot: %s -p %s -bc ..." "${cmd}" "${profile}" + exit 1 + elif ${iso_only}; then + [[ ! -d ${work_dir} ]] && die "Create chroot: %s -p %s -x" "${cmd}" "${profile}" + mk_iso + else + mk_chroots + mk_boot + mk_squash + mk_iso + fi + msg "Finished building [%s]" "${profile}" +} + +clean_first=true +pretend=false +chroot_only=false +iso_only=false +persist=false +use_dracut=false +squash_only=false +boot_only=false + +basestrap_args=(-GMc) +cmd=${0##*/} + +repo=${cmd##*-} +owner=${SUDO_USER:-$USER} +profile='base' +chroots_iso="${CHROOTS_DIR}/buildiso" +arch=$(uname -m) + +usage() { + echo "Usage: ${cmd} [options]" + echo " -p Profile [default: ${profile}]" + echo ' -r Chroots directory' + echo " [default: ${chroots_iso}]" + echo ' -t Target directory' + echo " [default: ${ISO_POOL}]" + echo ' -i Init system to use' + echo " [default: ${INITSYS}]" + echo ' -g The gpg key for img signing' + echo " [default: none]" + echo ' -m Set SquashFS image mode to persistence' + echo ' -c Disable clean work dir' + echo ' -x Build chroot only' + echo ' -s Squash chroot only' + echo ' -b Generate iso boot only' + echo ' -z Generate iso only' + echo ' Requires pre built images (-x)' + echo ' -d Use dracut instead of mkinitcpio for iso initramfs' + echo ' -q Query settings and pretend build' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='p:r:t:i:g:czsbxmdqh' + +while getopts "${opts}" arg; do + case "${arg}" in + p) profile="$OPTARG" ;; + r) chroots_iso="$OPTARG" ;; + t) ISO_POOL="$OPTARG" ;; + i) INITSYS="$OPTARG" ;; + g) GPG_KEY="$OPTARG" ;; + c) clean_first=false ;; + x) chroot_only=true ;; + z) iso_only=true ;; + s) squash_only=true ;; + b) boot_only=true ;; + m) persist=true ;; + d) use_dracut=true ;; + q) pretend=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +prepare_build + +${pretend} && display_settings && exit 1 + +check_root + +prepare_dir "${mnt_dir}" +prepare_dir "${iso_dir}" +prepare_dir "${iso_root}" + +prepare_traps + +build diff --git a/artools/0.26.1/artools/bin/iso/buildiso.in b/artools/0.26.1/artools/bin/iso/buildiso.in new file mode 100755 index 0000000..ec5d2af --- /dev/null +++ b/artools/0.26.1/artools/bin/iso/buildiso.in @@ -0,0 +1,389 @@ +#!/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-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) + +clean_up_chroot(){ + local path mnt="$1" + msg2 "Cleaning [%s]" "${mnt##*/}" + + path=$mnt/boot + if [[ -d "$path" ]]; then + find "$path" -name 'initramfs*.img' -delete &> /dev/null + fi + path=$mnt/var/lib/pacman/sync + if [[ -d $path ]];then + find "$path" -type f -delete &> /dev/null + fi + path=$mnt/var/cache/pacman/pkg + if [[ -d $path ]]; then + find "$path" -type f -delete &> /dev/null + fi + path=$mnt/var/log + if [[ -d $path ]]; then + find "$path" -type f -delete &> /dev/null + fi + path=$mnt/var/tmp + if [[ -d $path ]];then + find "$path" -mindepth 1 -delete &> /dev/null + fi + path=$mnt/tmp + if [[ -d $path ]];then + find "$path" -mindepth 1 -delete &> /dev/null + fi + # shellcheck disable=2035 + find "$mnt" -name *.pacnew -name *.pacsave -name *.pacorig -delete + if [[ -f "$mnt/boot/grub/grub.cfg" ]]; then + rm "$mnt"/boot/grub/grub.cfg + fi + if [[ -f "$mnt/etc/machine-id" ]]; then + rm "$mnt"/etc/machine-id + fi +} + +copy_overlay(){ + local src="$1" dest="$2" + if [[ -e "$src" ]];then + msg2 "Copying [%s] ..." "${src##*/}" + cp -LR "$src"/* "$dest" + fi +} + +make_rootfs() { + if [[ ! -e "${work_dir}"/rootfs.lock ]]; then + msg "Prepare [Base installation] (rootfs)" + local rootfs="${work_dir}/rootfs" + + prepare_dir "${rootfs}" + + basestrap "${basestrap_args[@]}" "${rootfs}" "${packages[@]}" + + copy_overlay "${root_overlay}" "${rootfs}" + + [[ -z ${live_list} ]] && configure_chroot "${rootfs}" + + clean_up_chroot "${rootfs}" + + : > "${work_dir}"/rootfs.lock + + msg "Done [Base installation] (rootfs)" + fi +} + +make_livefs() { + if [[ ! -e ${work_dir}/livefs.lock ]]; then + msg "Prepare [Live installation] (livefs)" + local livefs="${work_dir}/livefs" + + prepare_dir "${livefs}" + + mount_overlayfs "${livefs}" "${work_dir}" + + basestrap "${basestrap_args[@]}" "${livefs}" "${packages[@]}" + + copy_overlay "${live_overlay}" "${livefs}" + + configure_chroot "${livefs}" + + umount_overlayfs + + clean_up_chroot "${livefs}" + + : > "${work_dir}"/livefs.lock + + msg "Done [Live installation] (livefs)" + fi +} + +make_bootfs() { + if [[ ! -e ${work_dir}/bootfs.lock ]]; then + msg "Prepare [/iso/boot]" + + prepare_dir "${iso_root}/boot" + + cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}" + + local bootfs="${work_dir}/bootfs" + + mount_overlayfs "${bootfs}" "${work_dir}" + + if "${use_dracut}"; then + prepare_initramfs_dracut "${bootfs}" + else + prepare_initramfs_mkinitcpio "${bootfs}" + fi + + umount_overlayfs + + rm -R "${bootfs}" + : > "${work_dir}"/bootfs.lock + msg "Done [/iso/boot]" + fi +} + +make_grub(){ + if [[ ! -e ${work_dir}/grub.lock ]]; then + msg "Prepare [/iso/boot/grub]" + + local layer=${work_dir}/rootfs + [[ -n ${live_list} ]] && layer=${work_dir}/livefs + + prepare_grub "${work_dir}/rootfs" "$layer" + + if ${use_dracut}; then + configure_grub_dracut + else + configure_grub_mkinitcpio + fi + + : > "${work_dir}"/grub.lock + msg "Done [/iso/boot/grub]" + fi +} + +gen_iso_fn(){ + local vars=("artix") name + vars+=("${profile}") + vars+=("${INITSYS}") + case "${repo}" in + 'gremlins'|'goblins') vars+=("${repo}") ;; + esac + vars+=("${ISO_VERSION}") + vars+=("${arch}") + for n in "${vars[@]}"; do + name=${name:-}${name:+-}${n} + done + echo "$name" +} + +prepare_build(){ + load_profile + + case "${repo}" in + 'gremlins'|'goblins') repo="${repo}" ;; + *) repo=default ;; + esac + + get_pacman_conf "${repo}" + + iso_file=$(gen_iso_fn).iso + + iso_label="ARTIX_$(date +%Y%m)" + + basestrap_args+=(-C "${pacman_conf}") + work_dir=${chroots_iso}/${profile}/artix + + iso_dir="${ISO_POOL}/${profile}" + + iso_root=${chroots_iso}/${profile}/iso + live_dir=/LiveOS + + mnt_dir=${chroots_iso}/${profile}/mnt + + if [[ -n "${GPG_KEY}" ]]; then + ${use_dracut} || export_gpg_publickey + fi +} + +display_settings(){ + msg "OPTIONS:" + msg2 "profile: %s" "${profile}" + msg2 "INITSYS: %s" "${INITSYS}" + [[ -n ${GPG_KEY} ]] && msg2 "GPG_KEY: %s" "${GPG_KEY}" + + msg "ISO SETTINGS:" + msg2 "ISO_VERSION: %s" "${ISO_VERSION}" + msg2 "COMPRESSION: %s" "${COMPRESSION}" + [[ "${COMPRESSION}" == 'zstd' ]] && msg2 "COMPRESSION_LEVEL: %s" "${COMPRESSION_LEVEL}" + + msg "BUILD:" + show_profile +} + +mk_squash(){ + make_sfs "${work_dir}/rootfs" + if [[ -d "${work_dir}/livefs" ]]; then + make_sfs "${work_dir}/livefs" + fi +} + +mk_iso(){ + touch "${iso_root}/.artix" + msg "Making bootable image" + # Sanity checks + [[ ! -d "${iso_root}" ]] && return 1 + if [[ -f "${iso_dir}/${iso_file}" ]]; then + msg2 "Removing existing bootable image..." + rm -rf "${iso_dir}/${iso_file}" + fi + assemble_iso + chown -R "${owner}:$(id --group "${owner}")" "${iso_dir}" +} + +mk_boot(){ + run_safe "make_bootfs" + run_safe "make_grub" +} + +mk_chroots(){ + load_pkgs "${root_list}" + run_safe "make_rootfs" + if [[ -n ${live_list} ]]; then + load_pkgs "${live_list}" + run_safe "make_livefs" + fi +} + +build(){ + msg "Start building [%s]" "${profile}" + if ${clean_first};then + for copy in "${work_dir}"/*; do + [[ -d $copy ]] || continue + msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")" + + lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy" + + subvolume_delete_recursive "${copy}" + rm -rf --one-file-system "${copy}" + done + lock_close 9 + + rm -rf --one-file-system "${work_dir}" + + msg "Deleting isoroot [%s] ..." "${iso_root##*/}" + rm -rf --one-file-system "${iso_root}" + fi + + if ${chroot_only}; then + mk_chroots + warning "Continue squash: %s -p %s -sc ..." "${cmd}" "${profile}" + exit 1 + elif ${boot_only}; then + mk_boot + warning "Continue iso: %s -p %s -zc ..." "${cmd}" "${profile}" + exit 1 + elif ${squash_only}; then + mk_squash + warning "Continue boot: %s -p %s -bc ..." "${cmd}" "${profile}" + exit 1 + elif ${iso_only}; then + [[ ! -d ${work_dir} ]] && die "Create chroot: %s -p %s -x" "${cmd}" "${profile}" + mk_iso + else + mk_chroots + mk_boot + mk_squash + mk_iso + fi + msg "Finished building [%s]" "${profile}" +} + +clean_first=true +pretend=false +chroot_only=false +iso_only=false +persist=false +use_dracut=false +squash_only=false +boot_only=false + +basestrap_args=(-GMc) +cmd=${0##*/} + +repo=${cmd##*-} +owner=${SUDO_USER:-$USER} +profile='base' +chroots_iso="${CHROOTS_DIR}/buildiso" +arch=$(uname -m) + +usage() { + echo "Usage: ${cmd} [options]" + echo " -p Profile [default: ${profile}]" + echo ' -r Chroots directory' + echo " [default: ${chroots_iso}]" + echo ' -t Target directory' + echo " [default: ${ISO_POOL}]" + echo ' -i Init system to use' + echo " [default: ${INITSYS}]" + echo ' -g The gpg key for img signing' + echo " [default: none]" + echo ' -m Set SquashFS image mode to persistence' + echo ' -c Disable clean work dir' + echo ' -x Build chroot only' + echo ' -s Squash chroot only' + echo ' -b Generate iso boot only' + echo ' -z Generate iso only' + echo ' Requires pre built images (-x)' + echo ' -d Use dracut instead of mkinitcpio for iso initramfs' + echo ' -q Query settings and pretend build' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='p:r:t:i:g:czsbxmdqh' + +while getopts "${opts}" arg; do + case "${arg}" in + p) profile="$OPTARG" ;; + r) chroots_iso="$OPTARG" ;; + t) ISO_POOL="$OPTARG" ;; + i) INITSYS="$OPTARG" ;; + g) GPG_KEY="$OPTARG" ;; + c) clean_first=false ;; + x) chroot_only=true ;; + z) iso_only=true ;; + s) squash_only=true ;; + b) boot_only=true ;; + m) persist=true ;; + d) use_dracut=true ;; + q) pretend=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +prepare_build + +${pretend} && display_settings && exit 1 + +check_root + +prepare_dir "${mnt_dir}" +prepare_dir "${iso_dir}" +prepare_dir "${iso_root}" + +prepare_traps + +build diff --git a/artools/0.26.1/artools/bin/pkg/batchpkg b/artools/0.26.1/artools/bin/pkg/batchpkg new file mode 100755 index 0000000..fa0dafa --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/batchpkg @@ -0,0 +1,328 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +#{{{ 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}" -u -p "${pkg}" + else + msg "%s" "${dest}pkg -s ${src} -u -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 -u -p "${pkg}" + else + msg "buildtree -i -p ${pkg}" + msg2 "${dest}pkg -u -p ${pkg}" + fi + done < "$pkglist" +} + +#}}} + +usage() { + echo "Usage: ${0##*/} [optional listname]" + echo ' -r Run generated commands' + echo ' -c Create subrepos from list' + echo ' -u Update subrepos from list' + echo ' -h This help' + echo '' + echo '' + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + 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 diff --git a/artools/0.26.1/artools/bin/pkg/batchpkg.in b/artools/0.26.1/artools/bin/pkg/batchpkg.in new file mode 100644 index 0000000..2c328ac --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/batchpkg.in @@ -0,0 +1,115 @@ +#!/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}" -u -p "${pkg}" + else + msg "%s" "${dest}pkg -s ${src} -u -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 -u -p "${pkg}" + else + msg "buildtree -i -p ${pkg}" + msg2 "${dest}pkg -u -p ${pkg}" + fi + done < "$pkglist" +} + +#}}} + +usage() { + echo "Usage: ${0##*/} [optional listname]" + echo ' -r Run generated commands' + echo ' -c Create subrepos from list' + echo ' -u Update subrepos from list' + echo ' -h This help' + echo '' + echo '' + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + 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 diff --git a/artools/0.26.1/artools/bin/pkg/buildpkg b/artools/0.26.1/artools/bin/pkg/buildpkg new file mode 100755 index 0000000..091fb8e --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/buildpkg @@ -0,0 +1,324 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/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" +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + + +create_first=false +rebuild=false + +mkchrootpkg_args=(-c -n) + +cmd=${0##*/} +repo=${cmd#*-} +base_devel=('base-devel') +chroots_pkg="${CHROOTS_DIR}/buildpkg" +arch=$(uname -m) + +usage() { + echo "Usage: ${0##*/} [options] -- [mkchrootpkg_args]" + echo " -r Create chroots in this directory" + echo " -d Destination repo chroot" + echo ' -c Recreate the chroot before building' + echo ' -m Major rebuild' + echo ' -N Disable check() function' + echo ' -C Run checkpkg after built' + echo ' -h This help' + echo '' + echo "Default mkchrootpkg_args args: ${mkchrootpkg_args[*]}" + echo '' + exit "$1" +} + +opts='hcCNmr:d:' + +while getopts "${opts}" arg; do + case "${arg}" in + r) chroots_pkg="$OPTARG" ;; + d) repo="$OPTARG" ;; + c) create_first=true ;; + m) rebuild=true ;; + C) mkchrootpkg_args+=(-C) ;; + N) mkchrootpkg_args+=(-N) ;; + h|?) usage 0 ;; + *) echo "invalid argument '%s'" "${arg}"; usage 1 ;; + esac +done + +if ${rebuild};then + repo='default' +else + case ${repo} in + system|world|galaxy) repo='default' ;; + lib32*) base_devel+=('multilib-devel') ;; + galaxy-gremlins|galaxy-goblins) repo=${repo#*-} ;; + esac +fi + +get_pacman_conf "${repo}" + +get_makepkg_conf + +if [[ -f "${DATADIR}/setarch-aliases.d/${arch}" ]]; then + read -r set_arch < "${DATADIR}/setarch-aliases.d/${arch}" +else + set_arch="${arch}" +fi + +check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME + +mkchrootpkg_args+=("${@:$OPTIND}") + +if ${create_first} || [[ ! -d "${chroots_pkg}/${repo}-${arch}" ]];then + msg "Creating chroot for [%s] (%s)..." "${repo}" "${arch}" + + for copy in "${chroots_pkg}/${repo}-${arch}"/*; do + [[ -d $copy ]] || continue + msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")" + + lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy" + + subvolume_delete_recursive "${copy}" + rm -rf --one-file-system "${copy}" + done + lock_close 9 + + rm -rf --one-file-system "${chroots_pkg}/${repo}-${arch}" + (umask 0022; mkdir -p "${chroots_pkg}/${repo}-${arch}") + setarch "${set_arch}" mkchroot \ + -C "${pacman_conf}" \ + -M "${makepkg_conf}" \ + "${chroots_pkg}/${repo}-${arch}/root" \ + "${base_devel[@]}" || abort +else + lock 9 "${chroots_pkg}/${repo}-${arch}/root.lock" "Locking clean chroot" + chroot-run \ + -C "${pacman_conf}" \ + -M "${makepkg_conf}" \ + "${chroots_pkg}/${repo}-${arch}/root" \ + pacman -Syuu --noconfirm || abort +fi + +# Always build official packages reproducibly +if [[ ! -v SOURCE_DATE_EPOCH ]]; then + export SOURCE_DATE_EPOCH=$(date +%s) +fi + +msg "Building in chroot for [%s] (%s)..." "${repo}" "${arch}" +exec mkchrootpkg -r "${chroots_pkg}/${repo}-${arch}" "${mkchrootpkg_args[@]}" diff --git a/artools/0.26.1/artools/bin/pkg/buildpkg.in b/artools/0.26.1/artools/bin/pkg/buildpkg.in new file mode 100644 index 0000000..45ce33b --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/buildpkg.in @@ -0,0 +1,121 @@ +#!/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/base/message.sh) +m4_include(lib/base/common.sh) +m4_include(lib/base/chroot.sh) + +create_first=false +rebuild=false + +mkchrootpkg_args=(-c -n) + +cmd=${0##*/} +repo=${cmd#*-} +base_devel=('base-devel') +chroots_pkg="${CHROOTS_DIR}/buildpkg" +arch=$(uname -m) + +usage() { + echo "Usage: ${0##*/} [options] -- [mkchrootpkg_args]" + echo " -r Create chroots in this directory" + echo " -d Destination repo chroot" + echo ' -c Recreate the chroot before building' + echo ' -m Major rebuild' + echo ' -N Disable check() function' + echo ' -C Run checkpkg after built' + echo ' -h This help' + echo '' + echo "Default mkchrootpkg_args args: ${mkchrootpkg_args[*]}" + echo '' + exit "$1" +} + +opts='hcCNmr:d:' + +while getopts "${opts}" arg; do + case "${arg}" in + r) chroots_pkg="$OPTARG" ;; + d) repo="$OPTARG" ;; + c) create_first=true ;; + m) rebuild=true ;; + C) mkchrootpkg_args+=(-C) ;; + N) mkchrootpkg_args+=(-N) ;; + h|?) usage 0 ;; + *) echo "invalid argument '%s'" "${arg}"; usage 1 ;; + esac +done + +if ${rebuild};then + repo='default' +else + case ${repo} in + system|world|galaxy) repo='default' ;; + lib32*) base_devel+=('multilib-devel') ;; + galaxy-gremlins|galaxy-goblins) repo=${repo#*-} ;; + esac +fi + +get_pacman_conf "${repo}" + +get_makepkg_conf + +if [[ -f "${DATADIR}/setarch-aliases.d/${arch}" ]]; then + read -r set_arch < "${DATADIR}/setarch-aliases.d/${arch}" +else + set_arch="${arch}" +fi + +check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME + +mkchrootpkg_args+=("${@:$OPTIND}") + +if ${create_first} || [[ ! -d "${chroots_pkg}/${repo}-${arch}" ]];then + msg "Creating chroot for [%s] (%s)..." "${repo}" "${arch}" + + for copy in "${chroots_pkg}/${repo}-${arch}"/*; do + [[ -d $copy ]] || continue + msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")" + + lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy" + + subvolume_delete_recursive "${copy}" + rm -rf --one-file-system "${copy}" + done + lock_close 9 + + rm -rf --one-file-system "${chroots_pkg}/${repo}-${arch}" + (umask 0022; mkdir -p "${chroots_pkg}/${repo}-${arch}") + setarch "${set_arch}" mkchroot \ + -C "${pacman_conf}" \ + -M "${makepkg_conf}" \ + "${chroots_pkg}/${repo}-${arch}/root" \ + "${base_devel[@]}" || abort +else + lock 9 "${chroots_pkg}/${repo}-${arch}/root.lock" "Locking clean chroot" + chroot-run \ + -C "${pacman_conf}" \ + -M "${makepkg_conf}" \ + "${chroots_pkg}/${repo}-${arch}/root" \ + pacman -Syuu --noconfirm || abort +fi + +# Always build official packages reproducibly +if [[ ! -v SOURCE_DATE_EPOCH ]]; then + export SOURCE_DATE_EPOCH=$(date +%s) +fi + +msg "Building in chroot for [%s] (%s)..." "${repo}" "${arch}" +exec mkchrootpkg -r "${chroots_pkg}/${repo}-${arch}" "${mkchrootpkg_args[@]}" diff --git a/artools/0.26.1/artools/bin/pkg/buildtree b/artools/0.26.1/artools/bin/pkg/buildtree new file mode 100755 index 0000000..1005a72 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/buildtree @@ -0,0 +1,741 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ common functions + +get_compliant_name(){ + local gitname="$1" + case "$gitname" in + *+) gitname=${gitname//+/plus} + esac + echo "$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 + echo "$org" +} + +api_put() { + curl -s -X PUT "$@" +} + +api_delete() { + curl -s -X DELETE "$@" +} + +api_post() { + curl -s -X POST "$@" +} + +#}}} + +#!/hint/bash + +#{{{ git + +get_local_head(){ + git log --pretty=%H ...refs/heads/master^ | head -n 1 +} + +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 + fi +} + +pull_tree(){ + local tree="$1" local_head="$2" os="${3:-Artix}" + local remote_head + remote_head=$(get_remote_head) + + msg "Checking (%s) (%s)" "${tree}" "$os" + if has_changeset "${local_head}" "${remote_head}";then + git pull origin master + fi +} + +#}}} + +#!/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" +} + +#}}} + +#!/hint/bash + +##{{{ repo + +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 +} + +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[@]}") +} + +find_repo(){ + local pkg="$1" pkgarch="${2:-${CARCH}}" repo + for r in "${ARCH_REPOS[@]}"; do + [[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo=repos/"$r-$pkgarch" + [[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=repos/"$r"-any + [[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$pkgarch/$r" + done + echo "$repo" +} + +find_pkg(){ + local searchdir="$1" pkg="$2" result + result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg") + echo "$result" +} + +tree_loop(){ + local func="$1" pkgs + for tree in "${ARTIX_TREE[@]}"; do + pkgs=$(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort) + for _package in ${pkgs}; do + "$func" "$_package" + done + done +} + +#}}} + +#!/hint/bash + +#{{{ jenkins + +write_jenkinsfile(){ + local pkg="$1" + local jenkins=$pkg/Jenkinsfile + + echo "@Library('artix-ci') import org.artixlinux.RepoPackage" > "$jenkins" + { + echo '' + echo 'PackagePipeline(new RepoPackage(this))' + echo '' + } >> "$jenkins" + + git add "$jenkins" +} + +write_agentyaml(){ + local pkg="$1" + local agent="$pkg"/.artixlinux/agent.yaml label='master' + [[ -d $pkg/.artixlinux ]] || mkdir "$pkg"/.artixlinux + + echo '---' > "$agent" + { + echo '' + echo "label: $label" + echo '' + } >> "$agent" + + git add "$agent" +} + +commit_jenkins_files(){ + local pkg="$1" + + write_jenkinsfile "$pkg" + write_agentyaml "$pkg" + + git commit -m "initial commit" +} + +#}}} + + +#{{{ new git repo + +subrepo_clone(){ + local pkg="$1" + local org="$2" + local name="$3" + + msg2 "Subrepo clone [%s] from (%s)" "$pkg" "$org/$name" + git subrepo clone "${GIT_SSH}":"$org"/"$name".git "$pkg" +} + +subrepo_new(){ + cd "${TREE_DIR_ARTIX}/${group}" || return + + local org gitname + org=$(get_pkg_org "${package}") + gitname=$(get_compliant_name "${package}") + + gitearepo -cr "$gitname" + + add_team_to_repo "$gitname" "$org" "${team}" + + subrepo_clone "${package}" "$org" "$gitname" + + mkdir -p "${TREE_DIR_ARTIX}/${group}/${package}/trunk" + + commit_jenkins_files "${package}" +} + +#}}} + +#{{{ pull + +clone_tree(){ + local url="$1" tree="$2" os="${3:-Artix}" + + msg "Cloning %s (%s) ..." "$tree" "$os" + + git clone "$url/$tree".git +} + +pull_tree_arch(){ + cd "${TREE_DIR_ARCH}" || return + for tree in "${ARCH_TREE[@]}";do + if [[ -d "${tree}" ]];then + ( cd "${tree}" || return + pull_tree "${tree}" "$(get_local_head)" "Arch" + ) + else + clone_tree "${HOST_TREE_ARCH}" "${tree}" "Arch" + fi + done +} + +config_tree(){ + local tree="$1" + cd "$tree" || return + 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 + cd .. +} + +pull_tree_artix(){ + local repos=() + if ${sync_group}; then + repos=("${group}") + else + repos=("${ARTIX_TREE[@]}") + fi + cd "${TREE_DIR_ARTIX}" || return + for tree in "${repos[@]}"; do + if [[ -d "${tree}" ]];then + config_tree "${tree}" + ( cd "${tree}" || return + pull_tree "${tree}" "$(get_local_head)" + ) + else + clone_tree "${host_tree_artix}" "${tree}" + config_tree "${tree}" + fi + done +} + +#}}} + +#{{{ patch + +patch_pkg(){ + local pkgpath="$1" + local pkg=${pkgpath%/*} + pkg=${pkg##*/} + sed -e 's|arch-meson|artix-meson|' -i "$pkgpath"/PKGBUILD + 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/$repo + artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}") + + show_deps "$archpath" + + if [[ -f "$artixpath"/.gitrepo ]]; 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/$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} && pull_tree_arch + ${sync_artix} && pull_tree_artix +} + +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 +sync_group=false +check=false + +package='' + +team='community' +group="${ARTIX_TREE[0]}" + +host_tree_artix="${GIT_SSH}:artixlinux" + +usage() { + echo "Usage: ${0##*/} [options]" + echo ' -p Package name' + echo ' -t Team name (only with -n)' + echo ' Possible values: core,extra,community,multilib' + echo " [default: ${team}]" + echo ' -g Group name, the superrepo (only with -n or -s)' + echo " [default: ${group}]" + echo " -s Clone or pull repos" + echo " -a Don't clone or pull arch repos" + echo " -b Don't clone or pull artix repos" + echo ' -i Import a package from arch repos' + echo ' -n New remote subrepo and clone it' + echo ' -v Check if a package is in the artix tree(s)' + echo ' -c View package depends' + echo ' -x Exclude testing (only with -i)' + echo ' -y Exclude staging (only with -i)' + echo ' -z Include kde & gnome unstable (only with -i)' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='p:t:g:sinabcvxyzh' + +while getopts "${opts}" arg; do + case "${arg}" in + p) package="$OPTARG" ;; + t) team="$OPTARG" ;; + g) group="$OPTARG"; sync_group=true ;; + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +set_arch_repos "$testing" "$staging" "$unstable" + +${sync} && sync_repos + +${view} && view_build + +${check} && check_tree + +${import} && from_arch + +${createnew} && subrepo_new diff --git a/artools/0.26.1/artools/bin/pkg/buildtree.in b/artools/0.26.1/artools/bin/pkg/buildtree.in new file mode 100644 index 0000000..9831412 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/buildtree.in @@ -0,0 +1,332 @@ +#!/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 + +subrepo_clone(){ + local pkg="$1" + local org="$2" + local name="$3" + + msg2 "Subrepo clone [%s] from (%s)" "$pkg" "$org/$name" + git subrepo clone "${GIT_SSH}":"$org"/"$name".git "$pkg" +} + +subrepo_new(){ + cd "${TREE_DIR_ARTIX}/${group}" || return + + local org gitname + org=$(get_pkg_org "${package}") + gitname=$(get_compliant_name "${package}") + + gitearepo -cr "$gitname" + + add_team_to_repo "$gitname" "$org" "${team}" + + subrepo_clone "${package}" "$org" "$gitname" + + mkdir -p "${TREE_DIR_ARTIX}/${group}/${package}/trunk" + + commit_jenkins_files "${package}" +} + +#}}} + +#{{{ pull + +clone_tree(){ + local url="$1" tree="$2" os="${3:-Artix}" + + msg "Cloning %s (%s) ..." "$tree" "$os" + + git clone "$url/$tree".git +} + +pull_tree_arch(){ + cd "${TREE_DIR_ARCH}" || return + for tree in "${ARCH_TREE[@]}";do + if [[ -d "${tree}" ]];then + ( cd "${tree}" || return + pull_tree "${tree}" "$(get_local_head)" "Arch" + ) + else + clone_tree "${HOST_TREE_ARCH}" "${tree}" "Arch" + fi + done +} + +config_tree(){ + local tree="$1" + cd "$tree" || return + 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 + cd .. +} + +pull_tree_artix(){ + local repos=() + if ${sync_group}; then + repos=("${group}") + else + repos=("${ARTIX_TREE[@]}") + fi + cd "${TREE_DIR_ARTIX}" || return + for tree in "${repos[@]}"; do + if [[ -d "${tree}" ]];then + config_tree "${tree}" + ( cd "${tree}" || return + pull_tree "${tree}" "$(get_local_head)" + ) + else + clone_tree "${host_tree_artix}" "${tree}" + config_tree "${tree}" + fi + done +} + +#}}} + +#{{{ patch + +patch_pkg(){ + local pkgpath="$1" + local pkg=${pkgpath%/*} + pkg=${pkg##*/} + sed -e 's|arch-meson|artix-meson|' -i "$pkgpath"/PKGBUILD + 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/$repo + artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}") + + show_deps "$archpath" + + if [[ -f "$artixpath"/.gitrepo ]]; 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/$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} && pull_tree_arch + ${sync_artix} && pull_tree_artix +} + +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 +sync_group=false +check=false + +package='' + +team='community' +group="${ARTIX_TREE[0]}" + +host_tree_artix="${GIT_SSH}:artixlinux" + +usage() { + echo "Usage: ${0##*/} [options]" + echo ' -p Package name' + echo ' -t Team name (only with -n)' + echo ' Possible values: core,extra,community,multilib' + echo " [default: ${team}]" + echo ' -g Group name, the superrepo (only with -n or -s)' + echo " [default: ${group}]" + echo " -s Clone or pull repos" + echo " -a Don't clone or pull arch repos" + echo " -b Don't clone or pull artix repos" + echo ' -i Import a package from arch repos' + echo ' -n New remote subrepo and clone it' + echo ' -v Check if a package is in the artix tree(s)' + echo ' -c View package depends' + echo ' -x Exclude testing (only with -i)' + echo ' -y Exclude staging (only with -i)' + echo ' -z Include kde & gnome unstable (only with -i)' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='p:t:g:sinabcvxyzh' + +while getopts "${opts}" arg; do + case "${arg}" in + p) package="$OPTARG" ;; + t) team="$OPTARG" ;; + g) group="$OPTARG"; sync_group=true ;; + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +set_arch_repos "$testing" "$staging" "$unstable" + +${sync} && sync_repos + +${view} && view_build + +${check} && check_tree + +${import} && from_arch + +${createnew} && subrepo_new diff --git a/artools/0.26.1/artools/bin/pkg/checkpkg b/artools/0.26.1/artools/bin/pkg/checkpkg new file mode 100755 index 0000000..0c94b49 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/checkpkg @@ -0,0 +1,303 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +shopt -s extglob + +load_makepkg_config + +#{{{ functions + +pkgver_equal() { + if [[ $1 = *-* && $2 = *-* ]]; then + # if both versions have a pkgrel, then they must be an exact match + [[ $1 = "$2" ]] + else + # otherwise, trim any pkgrel and compare the bare version. + [[ ${1%%-*} = "${2%%-*}" ]] + fi +} + +find_cached_package() { + local searchdirs=("$PKGDEST" "$PWD") results=() + local targetname=$1 targetver=$2 targetarch=$3 + local dir pkg pkgbasename name ver rel arch r results + + for dir in "${searchdirs[@]}"; do + [[ -d $dir ]] || continue + + for pkg in "$dir"/*.pkg.tar?(.!(sig|*.*)); do + [[ -f $pkg ]] || continue + + # avoid adding duplicates of the same inode + for r in "${results[@]}"; do + [[ $r -ef $pkg ]] && continue 2 + done + + # split apart package filename into parts + pkgbasename=${pkg##*/} + pkgbasename=${pkgbasename%.pkg.tar*} + + arch=${pkgbasename##*-} + pkgbasename=${pkgbasename%-"$arch"} + + rel=${pkgbasename##*-} + pkgbasename=${pkgbasename%-"$rel"} + + ver=${pkgbasename##*-} + name=${pkgbasename%-"$ver"} + + if [[ $targetname = "$name" && $targetarch = "$arch" ]] && + pkgver_equal "$targetver" "$ver-$rel"; then + results+=("$pkg") + fi + done + done + + case ${#results[*]} in + 0) + return 1 + ;; + 1) + printf '%s\n' "${results[0]}" + return 0 + ;; + *) + error 'Multiple packages found:' + printf '\t%s\n' "${results[@]}" >&2 + return 1 + ;; + esac +} + +#}}} + +usage() { + cat <<- _EOF_ + Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] + + Searches for a locally built package corresponding to the PKGBUILD, and + downloads the last version of that package from the Pacman repositories. + It then compares the list of .so files provided by each version of the + package and outputs if there are soname differences for the new package. + A directory is also created using mktemp with files containing a file + list for both packages and a library list for both packages. + + OPTIONS + -r, --rmdir Remove the temporary directory + -w, --warn Print a warning in case of differences + -h, --help Show this help text +_EOF_ +} + +RMDIR=0 +WARN=0 + +OPT_SHORT='rwh' +OPT_LONG=('rmdir' 'warn' 'help') +if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then + exit 1 +fi +set -- "${OPTRET[@]}" + +while :; do + case $1 in + -r|--rmdir) + RMDIR=1 + ;; + -w|--warn) + WARN=1 + ;; + -h|--help) + usage + exit 0 + ;; + --) + shift; break + ;; + esac + shift +done + +if [[ ! -f PKGBUILD ]]; then + die 'This must be run in the directory of a built package.' +fi + +# shellcheck source=PKGBUILD.proto +. ./PKGBUILD +if [[ ${arch[0]} == 'any' ]]; then + CARCH='any' +fi + +STARTDIR=$(pwd) +(( RMDIR )) && trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT +TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX) + +for _pkgname in "${pkgname[@]}"; do + comparepkg=$_pkgname + pkgurl= + target_pkgver=$(get_full_version "$_pkgname") + if ! pkgfile=$(find_cached_package "$_pkgname" "$target_pkgver" "$CARCH"); then + die 'tarball not found for package: %s' "${_pkgname}-$target_pkgver" + fi + + ln -s "$pkgfile" "$TEMPDIR" + + if (( $# )); then + case $1 in + /*|*/*) + pkgurl=file://$(readlink -m "$1") ;; + *.pkg.tar*) + pkgurl=$1 ;; + '') + ;; + *) + comparepkg=$1 ;; + esac + shift + fi + [[ -n $pkgurl ]] || pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$comparepkg") || + die "Couldn't download previous package for %s." "$comparepkg" + + oldpkg=${pkgurl##*/} + + if [[ ${oldpkg} = "${pkgfile##*/}" ]]; then + die "The built package (%s) is the one in the repo right now!" "$_pkgname" + fi + + if [[ $pkgurl = file://* || ( $pkgurl = /* && -f $pkgurl ) ]]; then + ln -s "${pkgurl#file://}" "$TEMPDIR/$oldpkg" + elif [[ -f "$PKGDEST/$oldpkg" ]]; then + ln -s "$PKGDEST/$oldpkg" "$TEMPDIR/$oldpkg" + elif [[ -f "$STARTDIR/$oldpkg" ]]; then + ln -s "$STARTDIR/$oldpkg" "$TEMPDIR/$oldpkg" + else + curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl" + fi + + bsdtar tf "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old" + bsdtar tf "$pkgfile" | sort > "$TEMPDIR/filelist-$_pkgname" + + sdiff -s "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname" + + find-libprovides "$TEMPDIR/$oldpkg" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname-old" + find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname" + if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then + message="Sonames differ in $_pkgname!" + (( WARN )) && warning "$message" || msg "$message" + echo "$diff_output" + else + msg "No soname differences for %s." "$_pkgname" + fi +done + +(( RMDIR )) || msg "Files saved to %s" "$TEMPDIR" diff --git a/artools/0.26.1/artools/bin/pkg/checkpkg.in b/artools/0.26.1/artools/bin/pkg/checkpkg.in new file mode 100644 index 0000000..737dac2 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/checkpkg.in @@ -0,0 +1,206 @@ +#!/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/base/message.sh) + +shopt -s extglob + +load_makepkg_config + +#{{{ functions + +pkgver_equal() { + if [[ $1 = *-* && $2 = *-* ]]; then + # if both versions have a pkgrel, then they must be an exact match + [[ $1 = "$2" ]] + else + # otherwise, trim any pkgrel and compare the bare version. + [[ ${1%%-*} = "${2%%-*}" ]] + fi +} + +find_cached_package() { + local searchdirs=("$PKGDEST" "$PWD") results=() + local targetname=$1 targetver=$2 targetarch=$3 + local dir pkg pkgbasename name ver rel arch r results + + for dir in "${searchdirs[@]}"; do + [[ -d $dir ]] || continue + + for pkg in "$dir"/*.pkg.tar?(.!(sig|*.*)); do + [[ -f $pkg ]] || continue + + # avoid adding duplicates of the same inode + for r in "${results[@]}"; do + [[ $r -ef $pkg ]] && continue 2 + done + + # split apart package filename into parts + pkgbasename=${pkg##*/} + pkgbasename=${pkgbasename%.pkg.tar*} + + arch=${pkgbasename##*-} + pkgbasename=${pkgbasename%-"$arch"} + + rel=${pkgbasename##*-} + pkgbasename=${pkgbasename%-"$rel"} + + ver=${pkgbasename##*-} + name=${pkgbasename%-"$ver"} + + if [[ $targetname = "$name" && $targetarch = "$arch" ]] && + pkgver_equal "$targetver" "$ver-$rel"; then + results+=("$pkg") + fi + done + done + + case ${#results[*]} in + 0) + return 1 + ;; + 1) + printf '%s\n' "${results[0]}" + return 0 + ;; + *) + error 'Multiple packages found:' + printf '\t%s\n' "${results[@]}" >&2 + return 1 + ;; + esac +} + +#}}} + +usage() { + cat <<- _EOF_ + Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] + + Searches for a locally built package corresponding to the PKGBUILD, and + downloads the last version of that package from the Pacman repositories. + It then compares the list of .so files provided by each version of the + package and outputs if there are soname differences for the new package. + A directory is also created using mktemp with files containing a file + list for both packages and a library list for both packages. + + OPTIONS + -r, --rmdir Remove the temporary directory + -w, --warn Print a warning in case of differences + -h, --help Show this help text +_EOF_ +} + +RMDIR=0 +WARN=0 + +OPT_SHORT='rwh' +OPT_LONG=('rmdir' 'warn' 'help') +if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then + exit 1 +fi +set -- "${OPTRET[@]}" + +while :; do + case $1 in + -r|--rmdir) + RMDIR=1 + ;; + -w|--warn) + WARN=1 + ;; + -h|--help) + usage + exit 0 + ;; + --) + shift; break + ;; + esac + shift +done + +if [[ ! -f PKGBUILD ]]; then + die 'This must be run in the directory of a built package.' +fi + +# shellcheck source=PKGBUILD.proto +. ./PKGBUILD +if [[ ${arch[0]} == 'any' ]]; then + CARCH='any' +fi + +STARTDIR=$(pwd) +(( RMDIR )) && trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT +TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX) + +for _pkgname in "${pkgname[@]}"; do + comparepkg=$_pkgname + pkgurl= + target_pkgver=$(get_full_version "$_pkgname") + if ! pkgfile=$(find_cached_package "$_pkgname" "$target_pkgver" "$CARCH"); then + die 'tarball not found for package: %s' "${_pkgname}-$target_pkgver" + fi + + ln -s "$pkgfile" "$TEMPDIR" + + if (( $# )); then + case $1 in + /*|*/*) + pkgurl=file://$(readlink -m "$1") ;; + *.pkg.tar*) + pkgurl=$1 ;; + '') + ;; + *) + comparepkg=$1 ;; + esac + shift + fi + [[ -n $pkgurl ]] || pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$comparepkg") || + die "Couldn't download previous package for %s." "$comparepkg" + + oldpkg=${pkgurl##*/} + + if [[ ${oldpkg} = "${pkgfile##*/}" ]]; then + die "The built package (%s) is the one in the repo right now!" "$_pkgname" + fi + + if [[ $pkgurl = file://* || ( $pkgurl = /* && -f $pkgurl ) ]]; then + ln -s "${pkgurl#file://}" "$TEMPDIR/$oldpkg" + elif [[ -f "$PKGDEST/$oldpkg" ]]; then + ln -s "$PKGDEST/$oldpkg" "$TEMPDIR/$oldpkg" + elif [[ -f "$STARTDIR/$oldpkg" ]]; then + ln -s "$STARTDIR/$oldpkg" "$TEMPDIR/$oldpkg" + else + curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl" + fi + + bsdtar tf "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old" + bsdtar tf "$pkgfile" | sort > "$TEMPDIR/filelist-$_pkgname" + + sdiff -s "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname" + + find-libprovides "$TEMPDIR/$oldpkg" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname-old" + find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname" + if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then + message="Sonames differ in $_pkgname!" + (( WARN )) && warning "$message" || msg "$message" + echo "$diff_output" + else + msg "No soname differences for %s." "$_pkgname" + fi +done + +(( RMDIR )) || msg "Files saved to %s" "$TEMPDIR" diff --git a/artools/0.26.1/artools/bin/pkg/checkrepo b/artools/0.26.1/artools/bin/pkg/checkrepo new file mode 100755 index 0000000..afed698 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/checkrepo @@ -0,0 +1,550 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +##{{{ repo + +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 +} + +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[@]}") +} + +find_repo(){ + local pkg="$1" pkgarch="${2:-${CARCH}}" repo + for r in "${ARCH_REPOS[@]}"; do + [[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo=repos/"$r-$pkgarch" + [[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=repos/"$r"-any + [[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$pkgarch/$r" + done + echo "$repo" +} + +find_pkg(){ + local searchdir="$1" pkg="$2" result + result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg") + echo "$result" +} + +tree_loop(){ + local func="$1" pkgs + for tree in "${ARTIX_TREE[@]}"; do + pkgs=$(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort) + for _package in ${pkgs}; do + "$func" "$_package" + done + done +} + +#}}} + +#!/hint/bash + +#{{{ table + +msg_table_header(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" +} + +msg_row_yellow(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row_green(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row_red(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" +} + +#}}} + + +#{{{ db libs + +extract_db() { + local u="$1" cdir="$2" + rm -rf "$cdir" + mkdir -p "$cdir" + msg2 "%s" "${cdir##*/}" + curl -L -s "$u" | bsdtar -xf - -C "$cdir" +} + +update_db_cache(){ + msg "Updating database cache ..." + local cachedir url + for repo in "${searchrepos[@]}"; do + cachedir=${db_cache_dir}/linksdb/$repo + url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext} + extract_db "$url" "$cachedir" + done + msg "Done" +} + +#}}} + +#{{{ sogrep + +query_db() { + for repo in "${searchrepos[@]}"; do + local db + db=${db_cache_dir}/linksdb/$repo/ + if [[ -d ${db} ]]; then + while read -rd '' pkg; do + read -r match + pkg=${pkg#${db}} + pkg="${pkg%/*}" + msg_row "${tableQ}" "$repo" "$pkg" "${match}" + done < <(grep -rZ "$library" "$db") | sort -u + fi + done +} + +#}}} + +#{{{ 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" != *eudev* ]] && [[ "$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* ]]; 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}" +db_ext="db.tar.${DBEXT}" + +load_makepkg_config + +sync=false +check=false +query=false +all_db=false +obsolete=false + +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=( + "${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]}]}" +) + +#}}} + +usage() { + echo "Usage: ${0##*/} [options] (with -q [libname])" + echo ' -r Repo name to query' + echo ' [default: all]' + echo " -s Sync repo databases" + echo ' -c Check repos' + echo ' -a Show repo db (-c)' + echo ' -o Check for obsolete packages' + echo " -q Query repo databases for so libs" + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='r:qcsaoh' + +while getopts "${opts}" arg; do + case "${arg}" in + r) searchrepos=("$OPTARG") ;; + s) sync=true ;; + c) check=true ;; + a) all_db=true ;; + q) query=true ;; + o) obsolete=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +library="$1"; shift + +${sync} && update_db_cache + +${check} && show_db_table + +${query} && show_lib_table + +${obsolete} && show_obsolete_table diff --git a/artools/0.26.1/artools/bin/pkg/checkrepo.in b/artools/0.26.1/artools/bin/pkg/checkrepo.in new file mode 100644 index 0000000..5bf3e53 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/checkrepo.in @@ -0,0 +1,251 @@ +#!/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) + +#{{{ db libs + +extract_db() { + local u="$1" cdir="$2" + rm -rf "$cdir" + mkdir -p "$cdir" + msg2 "%s" "${cdir##*/}" + curl -L -s "$u" | bsdtar -xf - -C "$cdir" +} + +update_db_cache(){ + msg "Updating database cache ..." + local cachedir url + for repo in "${searchrepos[@]}"; do + cachedir=${db_cache_dir}/linksdb/$repo + url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext} + extract_db "$url" "$cachedir" + done + msg "Done" +} + +#}}} + +#{{{ sogrep + +query_db() { + for repo in "${searchrepos[@]}"; do + local db + db=${db_cache_dir}/linksdb/$repo/ + if [[ -d ${db} ]]; then + while read -rd '' pkg; do + read -r match + pkg=${pkg#${db}} + pkg="${pkg%/*}" + msg_row "${tableQ}" "$repo" "$pkg" "${match}" + done < <(grep -rZ "$library" "$db") | sort -u + fi + done +} + +#}}} + +#{{{ 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" != *eudev* ]] && [[ "$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* ]]; 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}" +db_ext="db.tar.${DBEXT}" + +load_makepkg_config + +sync=false +check=false +query=false +all_db=false +obsolete=false + +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=( + "${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]}]}" +) + +#}}} + +usage() { + echo "Usage: ${0##*/} [options] (with -q [libname])" + echo ' -r Repo name to query' + echo ' [default: all]' + echo " -s Sync repo databases" + echo ' -c Check repos' + echo ' -a Show repo db (-c)' + echo ' -o Check for obsolete packages' + echo " -q Query repo databases for so libs" + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='r:qcsaoh' + +while getopts "${opts}" arg; do + case "${arg}" in + r) searchrepos=("$OPTARG") ;; + s) sync=true ;; + c) check=true ;; + a) all_db=true ;; + q) query=true ;; + o) obsolete=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +library="$1"; shift + +${sync} && update_db_cache + +${check} && show_db_table + +${query} && show_lib_table + +${obsolete} && show_obsolete_table diff --git a/artools/0.26.1/artools/bin/pkg/commitpkg b/artools/0.26.1/artools/bin/pkg/commitpkg new file mode 100755 index 0000000..72bbd41 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/commitpkg @@ -0,0 +1,596 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ common functions + +get_compliant_name(){ + local gitname="$1" + case "$gitname" in + *+) gitname=${gitname//+/plus} + esac + echo "$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 + echo "$org" +} + +api_put() { + curl -s -X PUT "$@" +} + +api_delete() { + curl -s -X DELETE "$@" +} + +api_post() { + curl -s -X POST "$@" +} + +#}}} + +#!/hint/bash + +#{{{ git + +get_local_head(){ + git log --pretty=%H ...refs/heads/master^ | head -n 1 +} + +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 + fi +} + +pull_tree(){ + local tree="$1" local_head="$2" os="${3:-Artix}" + local remote_head + remote_head=$(get_remote_head) + + msg "Checking (%s) (%s)" "${tree}" "$os" + if has_changeset "${local_head}" "${remote_head}";then + git pull origin master + fi +} + +#}}} + +#!/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" +} + +#}}} + +#!/hint/bash + +##{{{ repo + +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 +} + +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[@]}") +} + +find_repo(){ + local pkg="$1" pkgarch="${2:-${CARCH}}" repo + for r in "${ARCH_REPOS[@]}"; do + [[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo=repos/"$r-$pkgarch" + [[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=repos/"$r"-any + [[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$pkgarch/$r" + done + echo "$repo" +} + +find_pkg(){ + local searchdir="$1" pkg="$2" result + result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg") + echo "$result" +} + +tree_loop(){ + local func="$1" pkgs + for tree in "${ARTIX_TREE[@]}"; do + pkgs=$(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort) + for _package in ${pkgs}; do + "$func" "$_package" + done + done +} + +#}}} + + +#{{{ functions + +push_tree(){ + local tree="$1" + msg "Update (%s)" "${tree}" + git push origin master +} + +subrepo_push(){ + local pkg="$1" + msg2 "Subrepo push (%s)" "$pkg" + git subrepo push "$pkg" || die "%s push failed" "$pkg" +} + +subrepo_clean(){ + local pkg="$1" + msg2 "Subrepo clean (%s)" "$pkg" + git subrepo clean "$pkg" +} + +subrepo_pull(){ + local pkg="$1" + msg2 "Subrepo pull (%s)" "$pkg" + git subrepo pull "$pkg" +} + +check_rebuild(){ + if [[ -d "$CARCH"/"${valid_names[10]}" ]] \ + && [[ "${repo_dest}" == "${valid_names[7]}" ]]; then + git rm -r "$CARCH"/"${valid_names[10]}" + git commit -m "switch from ${valid_names[10]} to ${valid_names[7]}" + elif [[ -d "$CARCH"/"${valid_names[7]}" ]] \ + && [[ "${repo_dest}" == "${valid_names[10]}" ]]; then + git rm -r "$CARCH"/"${valid_names[7]}" + git commit -m "switch from ${valid_names[7]} to ${valid_names[10]}" + fi +} + +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 +} + +path_config() { + [[ "${repo_src}" != 'trunk' ]] && pkgbuild="$CARCH/${repo_src}"/PKGBUILD + + # shellcheck disable=1090 + . "$pkgbuild" +} + +get_repo_commit_msg() { + echo "[${repo_src}] -> [${repo_dest}] '${package}-$(get_full_version)' ${action}" +} + +get_commit_msg() { + echo "[${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 trunk + else + git rm -r "$CARCH/${repo_src}" + fi + else + action='modify' + commit_msg=$(get_commit_msg) + msg "Action: %s" "$commit_msg" + git add . + fi + git commit -m "$commit_msg" +} + +repo_commit_pkg() { + local commit_msg + + [[ -d "$CARCH/${repo_dest}" ]] && git rm -r "$CARCH/${repo_dest}" + [[ ! -d "$CARCH" ]] && mkdir "$CARCH" + [[ ! -d "$CARCH/${repo_dest}" ]] && mkdir "$CARCH/${repo_dest}" + + if [[ "${repo_src}" == 'trunk' ]]; then + action='add' + commit_msg=$(get_repo_commit_msg) + msg "Action: %s" "$commit_msg" + check_rebuild + cp trunk/* "$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 "$CARCH/${repo_src}"/* "$CARCH/${repo_dest}"/ + git rm -r "$CARCH/${repo_src}" + fi + git add . + git commit -m "$commit_msg" +} + +run(){ + local artixpath head group + artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}") + if [[ -n ${artixpath} ]];then + group=${artixpath%/*} + cd "${group}" || return + head=$(get_local_head) + + cd "${artixpath}" || return + + path_config + + if [[ "${cmd}" == 'commitpkg' ]];then + commit_pkg + else + repo_commit_pkg + fi + + cd "${group}" || return + + ${push} && pull_tree "${group##*/}" "$head" +# subrepo_pull "${package}" + subrepo_push "${package}" + subrepo_clean "${package}" + + ${push} && push_tree "${group##*/}" + + git prune + + [[ "${cmd}" != 'commitpkg' ]] && check_team + 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 +push=false + +pkgbuild=trunk/PKGBUILD + +cmd=${0##*/} +repo_dest=${cmd%pkg} + +usage() { + echo "Usage: ${0##*/} [options]" + echo " -s Source repository [default:${repo_src}]" + echo ' -p Package name' + echo ' -r Delete from repo (commitpkg only)' + echo ' -u Push' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='p:s:urh' + +while getopts "${opts}" arg; do + case "${arg}" in + s) repo_src="$OPTARG" ;; + p) package="$OPTARG" ;; + r) remove=true ;; + u) push=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +if is_valid_repo;then + run +else + die "source repository '%s' is not valid!" "${repo_src}" +fi diff --git a/artools/0.26.1/artools/bin/pkg/commitpkg.in b/artools/0.26.1/artools/bin/pkg/commitpkg.in new file mode 100644 index 0000000..f292d1b --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/commitpkg.in @@ -0,0 +1,230 @@ +#!/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 + +push_tree(){ + local tree="$1" + msg "Update (%s)" "${tree}" + git push origin master +} + +subrepo_push(){ + local pkg="$1" + msg2 "Subrepo push (%s)" "$pkg" + git subrepo push "$pkg" || die "%s push failed" "$pkg" +} + +subrepo_clean(){ + local pkg="$1" + msg2 "Subrepo clean (%s)" "$pkg" + git subrepo clean "$pkg" +} + +subrepo_pull(){ + local pkg="$1" + msg2 "Subrepo pull (%s)" "$pkg" + git subrepo pull "$pkg" +} + +check_rebuild(){ + if [[ -d "$CARCH"/"${valid_names[10]}" ]] \ + && [[ "${repo_dest}" == "${valid_names[7]}" ]]; then + git rm -r "$CARCH"/"${valid_names[10]}" + git commit -m "switch from ${valid_names[10]} to ${valid_names[7]}" + elif [[ -d "$CARCH"/"${valid_names[7]}" ]] \ + && [[ "${repo_dest}" == "${valid_names[10]}" ]]; then + git rm -r "$CARCH"/"${valid_names[7]}" + git commit -m "switch from ${valid_names[7]} to ${valid_names[10]}" + fi +} + +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 +} + +path_config() { + [[ "${repo_src}" != 'trunk' ]] && pkgbuild="$CARCH/${repo_src}"/PKGBUILD + + # shellcheck disable=1090 + . "$pkgbuild" +} + +get_repo_commit_msg() { + echo "[${repo_src}] -> [${repo_dest}] '${package}-$(get_full_version)' ${action}" +} + +get_commit_msg() { + echo "[${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 trunk + else + git rm -r "$CARCH/${repo_src}" + fi + else + action='modify' + commit_msg=$(get_commit_msg) + msg "Action: %s" "$commit_msg" + git add . + fi + git commit -m "$commit_msg" +} + +repo_commit_pkg() { + local commit_msg + + [[ -d "$CARCH/${repo_dest}" ]] && git rm -r "$CARCH/${repo_dest}" + [[ ! -d "$CARCH" ]] && mkdir "$CARCH" + [[ ! -d "$CARCH/${repo_dest}" ]] && mkdir "$CARCH/${repo_dest}" + + if [[ "${repo_src}" == 'trunk' ]]; then + action='add' + commit_msg=$(get_repo_commit_msg) + msg "Action: %s" "$commit_msg" + check_rebuild + cp trunk/* "$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 "$CARCH/${repo_src}"/* "$CARCH/${repo_dest}"/ + git rm -r "$CARCH/${repo_src}" + fi + git add . + git commit -m "$commit_msg" +} + +run(){ + local artixpath head group + artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}") + if [[ -n ${artixpath} ]];then + group=${artixpath%/*} + cd "${group}" || return + head=$(get_local_head) + + cd "${artixpath}" || return + + path_config + + if [[ "${cmd}" == 'commitpkg' ]];then + commit_pkg + else + repo_commit_pkg + fi + + cd "${group}" || return + + ${push} && pull_tree "${group##*/}" "$head" +# subrepo_pull "${package}" + subrepo_push "${package}" + subrepo_clean "${package}" + + ${push} && push_tree "${group##*/}" + + git prune + + [[ "${cmd}" != 'commitpkg' ]] && check_team + 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 +push=false + +pkgbuild=trunk/PKGBUILD + +cmd=${0##*/} +repo_dest=${cmd%pkg} + +usage() { + echo "Usage: ${0##*/} [options]" + echo " -s Source repository [default:${repo_src}]" + echo ' -p Package name' + echo ' -r Delete from repo (commitpkg only)' + echo ' -u Push' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='p:s:urh' + +while getopts "${opts}" arg; do + case "${arg}" in + s) repo_src="$OPTARG" ;; + p) package="$OPTARG" ;; + r) remove=true ;; + u) push=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +if is_valid_repo;then + run +else + die "source repository '%s' is not valid!" "${repo_src}" +fi diff --git a/artools/0.26.1/artools/bin/pkg/comparepkg b/artools/0.26.1/artools/bin/pkg/comparepkg new file mode 100755 index 0000000..6c4163a --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/comparepkg @@ -0,0 +1,506 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +##{{{ repo + +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 +} + +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[@]}") +} + +find_repo(){ + local pkg="$1" pkgarch="${2:-${CARCH}}" repo + for r in "${ARCH_REPOS[@]}"; do + [[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo=repos/"$r-$pkgarch" + [[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=repos/"$r"-any + [[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$pkgarch/$r" + done + echo "$repo" +} + +find_pkg(){ + local searchdir="$1" pkg="$2" result + result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg") + echo "$result" +} + +tree_loop(){ + local func="$1" pkgs + for tree in "${ARTIX_TREE[@]}"; do + pkgs=$(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort) + for _package in ${pkgs}; do + "$func" "$_package" + done + done +} + +#}}} + +#!/hint/bash + +#{{{ table + +msg_table_header(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" +} + +msg_row_yellow(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row_green(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row_red(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" +} + +#}}} + + + +#{{{ 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 +} + +compare_m(){ + case ${artixrepo} in + *testing*|*staging*|*rebuild) + if [[ "${a}" == "${b}" ]]; then + msg_row "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + elif [[ "${a}" == 'staging' && "${b}" == 'rebuild' ]]; then + msg_row_yellow "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + else + msg_row_green "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + if [[ -n "$archrepo" ]]; then + write_list "${a}:${b}:$pkg" pkg_moves + else + write_list "@repo@:${b}:$pkg" artix + fi + fi + ;; + esac +} + +compare_u(){ + if [ "$result" -eq -1 ];then +# local arel=${archver##*-} brel=${artixver##*-} +# local reldiff +# reldiff=$(( $arel-${brel%.*} )) + msg_row_red "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + write_list "${a}:$pkg" pkg_upgrades + fi +} + +compare_d(){ + if [ "$result" -eq 1 ];then + if [[ -n "$archver" ]] && [[ -n "$archrepo" ]];then + msg_row_yellow "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${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 + echo "$archpath" +} + +pre_compare(){ + local func="$1" pkgpath="$2" result group pkg + group="${pkgpath%/*}" + group=${group##*/} + pkg=${pkgpath##*/} + + local artixrepo archrepo pkgbuild artixver archver archpath node a b + artixrepo=$(find_repo "$pkgpath") + pkgbuild=$pkgpath/$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/$archrepo/PKGBUILD + node=${artixrepo%/*} + a=${archrepo#*/} b=${artixrepo#*/} + a="${a%-*}" + + [[ "$node" != "$CARCH" ]] && b=${b%-*} + + if [[ -f "$pkgbuild" ]]; then + # shellcheck disable=1090 + . "$pkgbuild" 2>/dev/null + archver=$(get_full_version) + fi + + result=$(vercmp "$artixver" "$archver") + + "$func" + + unset epoch + fi +} + +compare_upgrades(){ + local pkgpath="${1%/*}" + pre_compare compare_u "$pkgpath" +} + +compare_downgrades(){ + local pkgpath="${1%/*}" + pre_compare compare_d "$pkgpath" +} + +compare_move(){ + local pkgpath="${1%/*}" + pre_compare compare_m "$pkgpath" +} + +#}}} + +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 %-25s %-27s %-27s %-10s" + +usage() { + echo "Usage: ${0##*/} [options]" + echo ' -u Show upgrade packages' + echo ' -d Show downgrade packages' + echo ' -m Show packages to move' + echo " -x Don't inlcude testing packages" + echo " -y Don't inlcude staging packages" + echo ' -z Include unstable kde and gnome' + echo ' -h This help' + echo '' + echo '' + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +set_arch_repos "$testing" "$staging" "$unstable" + +${move} && show_move_table + +${upgrades} && show_upgrades_table + +${downgrades} && show_downgrades_table diff --git a/artools/0.26.1/artools/bin/pkg/comparepkg.in b/artools/0.26.1/artools/bin/pkg/comparepkg.in new file mode 100644 index 0000000..50119ee --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/comparepkg.in @@ -0,0 +1,207 @@ +#!/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 +} + +compare_m(){ + case ${artixrepo} in + *testing*|*staging*|*rebuild) + if [[ "${a}" == "${b}" ]]; then + msg_row "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + elif [[ "${a}" == 'staging' && "${b}" == 'rebuild' ]]; then + msg_row_yellow "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + else + msg_row_green "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + if [[ -n "$archrepo" ]]; then + write_list "${a}:${b}:$pkg" pkg_moves + else + write_list "@repo@:${b}:$pkg" artix + fi + fi + ;; + esac +} + +compare_u(){ + if [ "$result" -eq -1 ];then +# local arel=${archver##*-} brel=${artixver##*-} +# local reldiff + reldiff=$(( $arel-${brel%.*} )) + msg_row_red "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + write_list "${a}:$pkg" pkg_upgrades + fi +} + +compare_d(){ + if [ "$result" -eq 1 ];then + if [[ -n "$archver" ]] && [[ -n "$archrepo" ]];then + msg_row_yellow "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${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 + echo "$archpath" +} + +pre_compare(){ + local func="$1" pkgpath="$2" result group pkg + group="${pkgpath%/*}" + group=${group##*/} + pkg=${pkgpath##*/} + + local artixrepo archrepo pkgbuild artixver archver archpath node a b + artixrepo=$(find_repo "$pkgpath") + pkgbuild=$pkgpath/$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/$archrepo/PKGBUILD + node=${artixrepo%/*} + a=${archrepo#*/} b=${artixrepo#*/} + a="${a%-*}" + + [[ "$node" != "$CARCH" ]] && b=${b%-*} + + if [[ -f "$pkgbuild" ]]; then + # shellcheck disable=1090 + . "$pkgbuild" 2>/dev/null + archver=$(get_full_version) + fi + + result=$(vercmp "$artixver" "$archver") + + "$func" + + unset epoch + fi +} + +compare_upgrades(){ + local pkgpath="${1%/*}" + pre_compare compare_u "$pkgpath" +} + +compare_downgrades(){ + local pkgpath="${1%/*}" + pre_compare compare_d "$pkgpath" +} + +compare_move(){ + local pkgpath="${1%/*}" + pre_compare compare_m "$pkgpath" +} + +#}}} + +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 %-25s %-27s %-27s %-10s" + +usage() { + echo "Usage: ${0##*/} [options]" + echo ' -u Show upgrade packages' + echo ' -d Show downgrade packages' + echo ' -m Show packages to move' + echo " -x Don't inlcude testing packages" + echo " -y Don't inlcude staging packages" + echo ' -z Include unstable kde and gnome' + echo ' -h This help' + echo '' + echo '' + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +set_arch_repos "$testing" "$staging" "$unstable" + +${move} && show_move_table + +${upgrades} && show_upgrades_table + +${downgrades} && show_downgrades_table diff --git a/artools/0.26.1/artools/bin/pkg/deploypkg b/artools/0.26.1/artools/bin/pkg/deploypkg new file mode 100755 index 0000000..b6b596e --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/deploypkg @@ -0,0 +1,351 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ functions + +find_cached_pkgfile() { + local searchdirs=("$PKGDEST" "$PWD") results=() + local pkg="$1" + for dir in "${searchdirs[@]}"; do + [[ -d "$dir" ]] || continue + [[ -e "$dir/$pkg" ]] && results+=("$dir/$pkg") + done + case ${#results[*]} in + 0) + return 1 + ;; + 1) + printf '%s\n' "${results[0]}" + return 0 + ;; + *) + error 'Multiple packages found:' + printf '\t%s\n' "${results[@]}" >&2 + return 1 + ;; + esac +} + +get_pkgbasename() { + local name="$1" + local rm_pkg=${name%.pkg.tar*} + rm_pkg=${rm_pkg%-*} + rm_pkg=${rm_pkg%-*} + rm_pkg=${rm_pkg%-*} + echo "$rm_pkg" +} + +#}}} + + +#{{{ deploy + +add(){ + if pkgfile=$(find_cached_pkgfile "${pkgname}"); then + msg "Found: %s" "${pkgfile}" + packages+=("${pkgname}") + action='add' + ln -sfv "${pkgfile}"{,.sig} "$repo_path"/ + fi +} + +remove(){ + packages+=("$(get_pkgbasename "${pkgname}")") + action='remove' + rm -v "$repo_path"/"${pkgname}"{,.sig} +} + +repo_action(){ + local packages=() action func="$1" + for pkgname in "${passfiles[@]}"; do + "$func" + done + cd "$repo_path" || return + if [[ -n "${action}" ]]; then + repo-"${action}" -R "${dest_repo}"."${pkgdb_ext}" "${packages[@]}" + ${linksdb} && links-"${action}" "${dest_repo}"."${linksdb_ext}" "${packages[@]}" + fi +} + +#}}} + +load_makepkg_config + +pkgdb_ext="db.tar.${DBEXT}" +linksdb_ext="links.tar.${DBEXT}" + +add_pkg=false +rm_pkg=false +linksdb=false + +cmd=${0##*/} +dest_repo=${cmd#*-} + +usage() { + echo "Usage: ${cmd} [options]" + echo ' -d Destination repository' + echo ' -a Add package(s) to repository' + echo ' -r Remove package(s) from repository' + echo ' -l Use links db' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='arlhd:' + +while getopts "${opts}" arg; do + case "${arg}" in + d) dest_repo="$OPTARG" ;; + a) add_pkg=true; rm_pkg=false ;; + r) rm_pkg=true; add_pkg=false ;; + l) linksdb=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +passfiles=("$@") + +repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH} + +if [[ -n "${passfiles[*]}" ]]; then + if ${add_pkg}; then + repo_action add + fi + if ${rm_pkg}; then + repo_action remove + fi +fi diff --git a/artools/0.26.1/artools/bin/pkg/deploypkg.in b/artools/0.26.1/artools/bin/pkg/deploypkg.in new file mode 100644 index 0000000..d3fefb5 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/deploypkg.in @@ -0,0 +1,101 @@ +#!/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/deploy.sh) + +#{{{ deploy + +add(){ + if pkgfile=$(find_cached_pkgfile "${pkgname}"); then + msg "Found: %s" "${pkgfile}" + packages+=("${pkgname}") + action='add' + ln -sfv "${pkgfile}"{,.sig} "$repo_path"/ + fi +} + +remove(){ + packages+=("$(get_pkgbasename "${pkgname}")") + action='remove' + rm -v "$repo_path"/"${pkgname}"{,.sig} +} + +repo_action(){ + local packages=() action func="$1" + for pkgname in "${passfiles[@]}"; do + "$func" + done + cd "$repo_path" || return + if [[ -n "${action}" ]]; then + repo-"${action}" -R "${dest_repo}"."${pkgdb_ext}" "${packages[@]}" + ${linksdb} && links-"${action}" "${dest_repo}"."${linksdb_ext}" "${packages[@]}" + fi +} + +#}}} + +load_makepkg_config + +pkgdb_ext="db.tar.${DBEXT}" +linksdb_ext="links.tar.${DBEXT}" + +add_pkg=false +rm_pkg=false +linksdb=false + +cmd=${0##*/} +dest_repo=${cmd#*-} + +usage() { + echo "Usage: ${cmd} [options]" + echo ' -d Destination repository' + echo ' -a Add package(s) to repository' + echo ' -r Remove package(s) from repository' + echo ' -l Use links db' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='arlhd:' + +while getopts "${opts}" arg; do + case "${arg}" in + d) dest_repo="$OPTARG" ;; + a) add_pkg=true; rm_pkg=false ;; + r) rm_pkg=true; add_pkg=false ;; + l) linksdb=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +passfiles=("$@") + +repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH} + +if [[ -n "${passfiles[*]}" ]]; then + if ${add_pkg}; then + repo_action add + fi + if ${rm_pkg}; then + repo_action remove + fi +fi diff --git a/artools/0.26.1/artools/bin/pkg/find-libdeps b/artools/0.26.1/artools/bin/pkg/find-libdeps new file mode 100755 index 0000000..56294b8 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/find-libdeps @@ -0,0 +1,196 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +set -e +shopt -s extglob + +IGNORE_INTERNAL=0 + +if [[ $1 = "--ignore-internal" ]]; then + IGNORE_INTERNAL=1 + shift +fi + +script_mode=${BASH_SOURCE[0]##*/find-lib} + +case $script_mode in + deps|provides) true;; + *) die "Unknown mode %s" "$script_mode" ;; +esac + +if [[ -z $1 ]]; then + echo "${0##*/} [options] " + echo "Options:" + echo " --ignore-internal ignore internal libraries" + exit 1 +fi + +if [[ -d $1 ]]; then + pushd "$1" >/dev/null +else + setup_workdir + + case ${script_mode} in + deps) bsdtar -C "$WORKDIR" -xf "$1";; + provides) bsdtar -C "$WORKDIR" -xf "$1" --include="*.so*";; + esac + + pushd "$WORKDIR" >/dev/null +fi + +process_sofile() { + # extract the library name: libfoo.so + soname="${sofile%.so?(+(.+([0-9])))}".so + # extract the major version: 1 + soversion="${sofile##*\.so\.}" + if [[ "$soversion" = "$sofile" ]] && ((IGNORE_INTERNAL)); then + return + fi + if ! in_array "${soname}=${soversion}-${soarch}" "${soobjects[@]}"; then + # libfoo.so=1-64 + echo "${soname}=${soversion}-${soarch}" + soobjects+=("${soname}=${soversion}-${soarch}") + fi +} + +case $script_mode in + deps) find_args=(-perm -u+x);; + provides) find_args=(-name '*.so*');; +esac + +find . -type f "${find_args[@]}" | while read -r filename; do + if [[ $script_mode = "provides" ]]; then + # ignore if we don't have a shared object + if ! LC_ALL=C readelf -h "$filename" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then + continue + fi + fi + + # get architecture of the file; if soarch is empty it's not an ELF binary + soarch=$(LC_ALL=C readelf -h "$filename" 2>/dev/null | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p') + [[ -n $soarch ]] || continue + + if [[ $script_mode = "provides" ]]; then + # get the string binaries link to: libfoo.so.1.2 -> libfoo.so.1 + sofile=$(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p') + [[ -z $sofile ]] && sofile="${filename##*/}" + process_sofile + elif [[ $script_mode = "deps" ]]; then + # process all libraries needed by the binary + for sofile in $(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'); do + process_sofile + done + fi +done + +popd >/dev/null diff --git a/artools/0.26.1/artools/bin/pkg/find-libdeps.in b/artools/0.26.1/artools/bin/pkg/find-libdeps.in new file mode 100644 index 0000000..4bf4e55 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/find-libdeps.in @@ -0,0 +1,99 @@ +#!/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/base/message.sh) + +set -e +shopt -s extglob + +IGNORE_INTERNAL=0 + +if [[ $1 = "--ignore-internal" ]]; then + IGNORE_INTERNAL=1 + shift +fi + +script_mode=${BASH_SOURCE[0]##*/find-lib} + +case $script_mode in + deps|provides) true;; + *) die "Unknown mode %s" "$script_mode" ;; +esac + +if [[ -z $1 ]]; then + echo "${0##*/} [options] " + echo "Options:" + echo " --ignore-internal ignore internal libraries" + exit 1 +fi + +if [[ -d $1 ]]; then + pushd "$1" >/dev/null +else + setup_workdir + + case ${script_mode} in + deps) bsdtar -C "$WORKDIR" -xf "$1";; + provides) bsdtar -C "$WORKDIR" -xf "$1" --include="*.so*";; + esac + + pushd "$WORKDIR" >/dev/null +fi + +process_sofile() { + # extract the library name: libfoo.so + soname="${sofile%.so?(+(.+([0-9])))}".so + # extract the major version: 1 + soversion="${sofile##*\.so\.}" + if [[ "$soversion" = "$sofile" ]] && ((IGNORE_INTERNAL)); then + return + fi + if ! in_array "${soname}=${soversion}-${soarch}" "${soobjects[@]}"; then + # libfoo.so=1-64 + echo "${soname}=${soversion}-${soarch}" + soobjects+=("${soname}=${soversion}-${soarch}") + fi +} + +case $script_mode in + deps) find_args=(-perm -u+x);; + provides) find_args=(-name '*.so*');; +esac + +find . -type f "${find_args[@]}" | while read -r filename; do + if [[ $script_mode = "provides" ]]; then + # ignore if we don't have a shared object + if ! LC_ALL=C readelf -h "$filename" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then + continue + fi + fi + + # get architecture of the file; if soarch is empty it's not an ELF binary + soarch=$(LC_ALL=C readelf -h "$filename" 2>/dev/null | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p') + [[ -n $soarch ]] || continue + + if [[ $script_mode = "provides" ]]; then + # get the string binaries link to: libfoo.so.1.2 -> libfoo.so.1 + sofile=$(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p') + [[ -z $sofile ]] && sofile="${filename##*/}" + process_sofile + elif [[ $script_mode = "deps" ]]; then + # process all libraries needed by the binary + for sofile in $(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'); do + process_sofile + done + fi +done + +popd >/dev/null diff --git a/artools/0.26.1/artools/bin/pkg/finddeps b/artools/0.26.1/artools/bin/pkg/finddeps new file mode 100755 index 0000000..fdc96f7 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/finddeps @@ -0,0 +1,147 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +match=$1 + +if [[ -z $match ]]; then + echo 'Usage: finddeps ' + echo '' + echo 'Find packages that depend on a given depname.' + echo 'Run this script from the top-level directory of your ABS tree.' + echo '' + exit 1 +fi + +find . -type d -print0 2>/dev/null| while read -r -d '' d; do + if [[ -f "$d/PKGBUILD" ]]; then + pkgname=() depends=() makedepends=() optdepends=() + # shellcheck source=PKGBUILD.proto + . "$d/PKGBUILD" + for dep in "${depends[@]}"; do + # lose the version comparator, if any + depname=${dep%%[<>=]*} + [[ $depname = "$match" ]] && msg "$d (depends)" + done + for dep in "${makedepends[@]}"; do + # lose the version comparator, if any + depname=${dep%%[<>=]*} + [[ $depname = "$match" ]] && msg "$d (makedepends)" + done + for dep in "${optdepends[@]/:*}"; do + # lose the version comaparator, if any + depname=${dep%%[<>=]*} + [[ $depname = "$match" ]] && msg "$d (optdepends)" + done + fi +done + diff --git a/artools/0.26.1/artools/bin/pkg/finddeps.in b/artools/0.26.1/artools/bin/pkg/finddeps.in new file mode 100644 index 0000000..c73060c --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/finddeps.in @@ -0,0 +1,50 @@ +#!/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/base/message.sh) + +match=$1 + +if [[ -z $match ]]; then + echo 'Usage: finddeps ' + echo '' + echo 'Find packages that depend on a given depname.' + echo 'Run this script from the top-level directory of your ABS tree.' + echo '' + exit 1 +fi + +find . -type d -print0 2>/dev/null| while read -r -d '' d; do + if [[ -f "$d/PKGBUILD" ]]; then + pkgname=() depends=() makedepends=() optdepends=() + # shellcheck source=PKGBUILD.proto + . "$d/PKGBUILD" + for dep in "${depends[@]}"; do + # lose the version comparator, if any + depname=${dep%%[<>=]*} + [[ $depname = "$match" ]] && msg "$d (depends)" + done + for dep in "${makedepends[@]}"; do + # lose the version comparator, if any + depname=${dep%%[<>=]*} + [[ $depname = "$match" ]] && msg "$d (makedepends)" + done + for dep in "${optdepends[@]/:*}"; do + # lose the version comaparator, if any + depname=${dep%%[<>=]*} + [[ $depname = "$match" ]] && msg "$d (optdepends)" + done + fi +done + diff --git a/artools/0.26.1/artools/bin/pkg/gitearepo b/artools/0.26.1/artools/bin/pkg/gitearepo new file mode 100755 index 0000000..8eb3ebf --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/gitearepo @@ -0,0 +1,338 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ common functions + +get_compliant_name(){ + local gitname="$1" + case "$gitname" in + *+) gitname=${gitname//+/plus} + esac + echo "$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 + echo "$org" +} + +api_put() { + curl -s -X PUT "$@" +} + +api_delete() { + curl -s -X DELETE "$@" +} + +api_post() { + curl -s -X POST "$@" +} + +#}}} + + +#{{{ 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() { + echo "Usage: ${0##*/} [options]" + echo ' -r Repo name' + echo ' -c Create git repo' + echo ' -t Transfer git repo to landfill org' + echo ' -h This help' + echo '' + echo '' + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +org=$(get_pkg_org "${repo}") + +${create} && create_repo "${repo}" "${org}" + +${transfer} && transfer_repo "${repo}" "${org}" diff --git a/artools/0.26.1/artools/bin/pkg/gitearepo.in b/artools/0.26.1/artools/bin/pkg/gitearepo.in new file mode 100644 index 0000000..dba9806 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/gitearepo.in @@ -0,0 +1,89 @@ +#!/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() { + echo "Usage: ${0##*/} [options]" + echo ' -r Repo name' + echo ' -c Create git repo' + echo ' -t Transfer git repo to landfill org' + echo ' -h This help' + echo '' + echo '' + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +org=$(get_pkg_org "${repo}") + +${create} && create_repo "${repo}" "${org}" + +${transfer} && transfer_repo "${repo}" "${org}" diff --git a/artools/0.26.1/artools/bin/pkg/lddd b/artools/0.26.1/artools/bin/pkg/lddd new file mode 100755 index 0000000..8460493 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/lddd @@ -0,0 +1,154 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +ifs=$IFS +IFS="${IFS}:" + +libdirs="/lib /usr/lib /usr/local/lib $(cat /etc/ld.so.conf.d/*)" +extras= + +TEMPDIR=$(mktemp -d --tmpdir lddd-script.XXXX) + +msg 'Go out and drink some tea, this will take a while :) ...' +# Check ELF binaries in the PATH and specified dir trees. +for tree in $PATH $libdirs $extras; do + msg2 "DIR %s" "$tree" + + # Get list of files in tree. + files=$(find "$tree" -type f ! -name '*.a' ! -name '*.la' ! -name '*.py*' ! -name '*.txt' ! -name '*.h' ! -name '*.ttf' ! \ + -name '*.rb' ! -name '*.ko' ! -name '*.pc' ! -name '*.enc' ! -name '*.cf' ! -name '*.def' ! -name '*.rules' ! -name \ + '*.cmi' ! -name '*.mli' ! -name '*.ml' ! -name '*.cma' ! -name '*.cmx' ! -name '*.cmxa' ! -name '*.pod' ! -name '*.pm' \ + ! -name '*.pl' ! -name '*.al' ! -name '*.tcl' ! -name '*.bs' ! -name '*.o' ! -name '*.png' ! -name '*.gif' ! -name '*.cmo' \ + ! -name '*.cgi' ! -name '*.defs' ! -name '*.conf' ! -name '*_LOCALE' ! -name 'Compose' ! -name '*_OBJS' ! -name '*.msg' ! \ + -name '*.mcopclass' ! -name '*.mcoptype') + IFS=$ifs + for i in $files; do + if (( $(file "$i" | grep -c 'ELF') != 0 )); then + # Is an ELF binary. + if (( $(ldd "$i" 2>/dev/null | grep -c 'not found') != 0 )); then + # Missing lib. + echo "$i:" >> "$TEMPDIR/raw.txt" + ldd "$i" 2>/dev/null | grep 'not found' >> "$TEMPDIR/raw.txt" + fi + fi + done +done +grep '^/' "$TEMPDIR/raw.txt" | sed -e 's/://g' >> "$TEMPDIR/affected-files.txt" +# invoke pacman +while read -r i; do + pacman -Qo "$i" | awk '{print $4,$5}' >> "$TEMPDIR/pacman.txt" +done < "$TEMPDIR/affected-files.txt" +# clean list +sort -u "$TEMPDIR/pacman.txt" >> "$TEMPDIR/possible-rebuilds.txt" + +msg "Files saved to %s" "$TEMPDIR" diff --git a/artools/0.26.1/artools/bin/pkg/lddd.in b/artools/0.26.1/artools/bin/pkg/lddd.in new file mode 100644 index 0000000..482eb6b --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/lddd.in @@ -0,0 +1,57 @@ +#!/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/base/message.sh) + +ifs=$IFS +IFS="${IFS}:" + +libdirs="/lib /usr/lib /usr/local/lib $(cat /etc/ld.so.conf.d/*)" +extras= + +TEMPDIR=$(mktemp -d --tmpdir lddd-script.XXXX) + +msg 'Go out and drink some tea, this will take a while :) ...' +# Check ELF binaries in the PATH and specified dir trees. +for tree in $PATH $libdirs $extras; do + msg2 "DIR %s" "$tree" + + # Get list of files in tree. + files=$(find "$tree" -type f ! -name '*.a' ! -name '*.la' ! -name '*.py*' ! -name '*.txt' ! -name '*.h' ! -name '*.ttf' ! \ + -name '*.rb' ! -name '*.ko' ! -name '*.pc' ! -name '*.enc' ! -name '*.cf' ! -name '*.def' ! -name '*.rules' ! -name \ + '*.cmi' ! -name '*.mli' ! -name '*.ml' ! -name '*.cma' ! -name '*.cmx' ! -name '*.cmxa' ! -name '*.pod' ! -name '*.pm' \ + ! -name '*.pl' ! -name '*.al' ! -name '*.tcl' ! -name '*.bs' ! -name '*.o' ! -name '*.png' ! -name '*.gif' ! -name '*.cmo' \ + ! -name '*.cgi' ! -name '*.defs' ! -name '*.conf' ! -name '*_LOCALE' ! -name 'Compose' ! -name '*_OBJS' ! -name '*.msg' ! \ + -name '*.mcopclass' ! -name '*.mcoptype') + IFS=$ifs + for i in $files; do + if (( $(file "$i" | grep -c 'ELF') != 0 )); then + # Is an ELF binary. + if (( $(ldd "$i" 2>/dev/null | grep -c 'not found') != 0 )); then + # Missing lib. + echo "$i:" >> "$TEMPDIR/raw.txt" + ldd "$i" 2>/dev/null | grep 'not found' >> "$TEMPDIR/raw.txt" + fi + fi + done +done +grep '^/' "$TEMPDIR/raw.txt" | sed -e 's/://g' >> "$TEMPDIR/affected-files.txt" +# invoke pacman +while read -r i; do + pacman -Qo "$i" | awk '{print $4,$5}' >> "$TEMPDIR/pacman.txt" +done < "$TEMPDIR/affected-files.txt" +# clean list +sort -u "$TEMPDIR/pacman.txt" >> "$TEMPDIR/possible-rebuilds.txt" + +msg "Files saved to %s" "$TEMPDIR" diff --git a/artools/0.26.1/artools/bin/pkg/links-add b/artools/0.26.1/artools/bin/pkg/links-add new file mode 100755 index 0000000..565f10c --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/links-add @@ -0,0 +1,609 @@ +#!/bin/bash +# +# links-add - add a package to a given repo database file +# links-remove - remove a package entry from a given repo database file +# +# Copyright (c) 2006-2018 Pacman Development Team +# Copyright (c) 2019 artoo@artixlinux.org +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +shopt -s extglob + +declare -r REPO_DB_NAME="links" + +QUIET=0 +ONLYADDNEW=0 +SIGN=0 +KEY=0 +VERIFY=0 +REPO_DB_FILE= +REPO_DB_PREFIX= +REPO_DB_SUFFIX= +LOCKFILE= +CLEAN_LOCK=0 + +# ensure we have a sane umask set +umask 0022 + +# print usage instructions +usage() { + cmd=${0##*/} + printf -- "%s \n\n" "$cmd" + if [[ $cmd == "links-add" ]] ; then + printf -- "Usage: links-add [options] ...\n" + printf -- "\n" + printf -- "\ +links-add will update a package database by reading a package file.\n\ +Multiple packages to add can be specified on the command line.\n" + printf -- "\n" + printf -- "Options:\n" + printf -- " -n, --new only add packages that are not already in the database\n" + elif [[ $cmd == "links-remove" ]] ; then + printf -- "Usage: links-remove [options] ...\n" + printf -- "\n" + printf -- "\ +links-remove will update a package database by removing the package name\n\ +specified on the command line from the given repo database. Multiple\n\ +packages to remove can be specified on the command line.\n" + printf -- "\n" + printf -- "Options:\n" + else + printf -- "Please move along, there is nothing to see here.\n" + return + fi + printf -- " --nocolor turn off color in output\n" + printf -- " -q, --quiet minimize output\n" + printf -- " -s, --sign sign database with GnuPG after update\n" + printf -- " -k, --key use the specified key to sign the database\n" + printf -- " -v, --verify verify database's signature before update\n" + printf -- "\n\ +See %s(8) for more details and descriptions of the available options.\n" "$cmd" + printf "\n" + if [[ $cmd == "links-add" ]] ; then + printf -- "Example: links-add /path/to/repo.links.tar.xz pacman-5.1.3-1-x86_64.pkg.tar.xz\n" + elif [[ $cmd == "links-remove" ]] ; then + printf -- "Example: links-remove /path/to/repo.links.tar.xz kernel26\n" + fi +} + +find_pkgentry() { + local pkgname=$1 + local pkgentry + + for pkgentry in "$tmpdir/${REPO_DB_NAME}/$pkgname"*; do + name=${pkgentry##*/} + if [[ ${name%-*-*} = "$pkgname" ]]; then + echo "$pkgentry" + return 0 + fi + done + return 1 +} + +check_gpg() { + if ! type -p gpg >/dev/null; then + error "Cannot find the gpg binary! Is GnuPG installed?" + exit 1 # $E_MISSING_PROGRAM + fi + + if (( ! VERIFY )); then + if ! gpg --list-secret-key ${GPGKEY:+"$GPGKEY"} &>/dev/null; then + if [[ -n "$GPGKEY" ]]; then + error "The key ${GPGKEY} does not exist in your keyring." + elif (( ! KEY )); then + error "There is no key in your keyring." + fi + exit 1 + fi + fi +} + +# sign the package database once repackaged +create_signature() { + (( ! SIGN )) && return + local dbfile=$1 + local ret=0 + msg "Signing database '%s'..." "${dbfile##*/.tmp.}" + + local SIGNWITHKEY=() + if [[ -n $GPGKEY ]]; then + SIGNWITHKEY=(-u "${GPGKEY}") + fi + gpg --detach-sign --use-agent --no-armor "${SIGNWITHKEY[@]}" "$dbfile" &>/dev/null || ret=$? + + if (( ! ret )); then + msg2 "Created signature file '%s'" "${dbfile##*/.tmp.}.sig" + else + warning "Failed to sign package database file '%s'" "${dbfile##*/.tmp.}" + fi +} + +# verify the existing package database signature +verify_signature() { + (( ! VERIFY )) && return + local dbfile=$1 + local ret=0 + msg "Verifying database signature..." + + if [[ ! -f $dbfile.sig ]]; then + warning "No existing signature found, skipping verification." + return + fi + gpg --verify "$dbfile.sig" || ret=$? + if (( ! ret )); then + msg2 "Database signature file verified." + else + error "Database signature was NOT valid!" + exit 1 + fi +} + +verify_repo_extension() { + local junk=() + if [[ $1 = *.links.tar* ]] && get_compression_command "$1" junk; then + return 0 + fi + + error "'%s' does not have a valid database archive extension." "$1" + exit 1 +} + +# write an entry to the pacman database +# arg1 - path to package +db_write_entry() { + # blank out all variables + local pkgfile=$1 + + local pkgname pkgver + + # read info from the zipped package + local line var val + while read -r line; do + [[ ${line:0:1} = '#' ]] && continue + IFS=' =' read -r var val < <(printf '%s\n' "$line") + # normalize whitespace with an extglob + declare "$var=${val//+([[:space:]])/ }" + + done< <(bsdtar -xOqf "$pkgfile" .PKGINFO) + + # ensure $pkgname and $pkgver variables were found + if [[ -z $pkgname || -z $pkgver ]]; then + error "Invalid package file '%s'." "$pkgfile" + return 1 + fi + + if [[ -d $tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver ]]; then + warning "An entry for '%s' already existed" "$pkgname-$pkgver" + if (( ONLYADDNEW )); then + return 0 + fi + fi + + # remove an existing entry if it exists, ignore failures + db_remove_entry "$pkgname" + + local tmppkg=$tmpdir/pkg/$pkgname-$pkgver + + mkdir "$tmppkg" + + bsdtar -xof "$pkgfile" -C "$tmppkg" --include={opt,{,usr/}{lib{,32},{s,}bin}}'/*' 2>/dev/null + + pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null + mkdir "$pkgname-$pkgver" + pushd "$pkgname-$pkgver" >/dev/null + + # create links entry + msg2 "Creating '%s' db entry..." "${REPO_DB_NAME}" + + local linksentry=$tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver/${REPO_DB_NAME} + local files=$(find "$tmppkg" -type f ! -ipath "*/Documentation/*") + + for f in ${files}; do + readelf -d "$f" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p' + done | sort -u > "$linksentry" + + popd >/dev/null + popd >/dev/null + + return 0 +} + +# remove existing entries from the DB +# arg1 - package name +db_remove_entry() { + local pkgname=$1 + local notfound=1 + local pkgentry + pkgentry=$(find_pkgentry "$pkgname") + while [[ -n $pkgentry ]]; do + notfound=0 + + msg2 "Removing existing entry '%s'..." \ + "${pkgentry##*/}" + rm -rf "$pkgentry" + + # remove entries in "links" database + local linksentry + linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//') + rm -rf "$linksentry" + + pkgentry=$(find_pkgentry "$pkgname") + done + return $notfound +} + +prepare_repo_db() { + local repodir dbfile + + # ensure the path to the DB exists; $LOCKFILE is always an absolute path + repodir=${LOCKFILE%/*}/ + + if [[ ! -d $repodir ]]; then + error "%s does not exist or is not a directory." "$repodir" + exit 1 + fi + + # check lock file + if ( set -o noclobber; echo "$$" > "$LOCKFILE") 2> /dev/null; then + CLEAN_LOCK=1 + else + error "Failed to acquire lockfile: %s." "$LOCKFILE" + [[ -f $LOCKFILE ]] && error "Held by process %s" "$(cat "$LOCKFILE")" + exit 1 + fi + + dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX + + if [[ -f $dbfile ]]; then + # there are two situations we can have here: + # a DB with some entries, or a DB with no contents at all. + if ! bsdtar -tqf "$dbfile" '*/links' >/dev/null 2>&1; then + # check empty case + if [[ -n $(bsdtar -tqf "$dbfile" '*' 2>/dev/null) ]]; then + error "Repository file '%s' is not a proper links database." "$dbfile" + exit 1 + fi + fi + verify_signature "$dbfile" + msg "Extracting %s to a temporary location..." "${dbfile##*/}" + bsdtar -xf "$dbfile" -C "$tmpdir/${REPO_DB_NAME}" + else + case $cmd in + links-remove) + # only a missing "db" database is currently an error + # TODO: remove if statement + if [[ ${REPO_DB_NAME} == "links" ]]; then + error "Repository file '%s' was not found." "$dbfile" + exit 1 + fi + ;; + links-add) + # check if the file can be created (write permission, directory existence, etc) + if ! touch "$dbfile"; then + error "Repository file '%s' could not be created." "$dbfile" + exit 1 + fi + rm -f "$dbfile" + ;; + esac + fi +} + +add() { + if [[ ! -f $1 ]]; then + error "File '%s' not found." "$1" + return 1 + fi + + pkgfile=$1 + if ! bsdtar -tqf "$pkgfile" .PKGINFO >/dev/null 2>&1; then + error "'%s' is not a package file, skipping" "$pkgfile" + return 1 + fi + + msg "Adding package '%s'" "$pkgfile" + + db_write_entry "$pkgfile" +} + +remove() { + pkgname=$1 + msg "Searching for package '%s'..." "$pkgname" + + if ! db_remove_entry "$pkgname"; then + error "Package matching '%s' not found." "$pkgname" + return 1 + fi + + return 0 +} + +rotate_db() { + dirname=${LOCKFILE%/*} + + pushd "$dirname" >/dev/null + + filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX} + tempname=$dirname/.tmp.$filename + + # hardlink or move the previous version of the database and signature to .old + # extension as a backup measure + if [[ -f $filename ]]; then + ln -f "$filename" "$filename.old" 2>/dev/null || \ + mv -f "$filename" "$filename.old" + + if [[ -f $filename.sig ]]; then + ln -f "$filename.sig" "$filename.old.sig" 2>/dev/null || \ + mv -f "$filename.sig" "$filename.old.sig" + else + rm -f "$filename.old.sig" + fi + fi + + # rotate the newly-created database and signature into place + mv "$tempname" "$filename" + if [[ -f $tempname.sig ]]; then + mv "$tempname.sig" "$filename.sig" + fi + + dblink=${filename%.tar*} + rm -f "$dblink" "$dblink.sig" + ln -s "$filename" "$dblink" 2>/dev/null || \ + ln "$filename" "$dblink" 2>/dev/null || \ + cp "$filename" "$dblink" + if [[ -f "$filename.sig" ]]; then + ln -s "$filename.sig" "$dblink.sig" 2>/dev/null || \ + ln "$filename.sig" "$dblink.sig" 2>/dev/null || \ + cp "$filename.sig" "$dblink.sig" + fi + + popd >/dev/null +} + +create_db() { + # $LOCKFILE is already guaranteed to be absolute so this is safe + dirname=${LOCKFILE%/*} + + filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX} + # this ensures we create it on the same filesystem, making moves atomic + tempname=$dirname/.tmp.$filename + + pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null + local files=(*) + if [[ ${files[*]} = '*' ]]; then + # we have no packages remaining? zip up some emptyness + warning "No packages remain, creating empty database." + files=(-T /dev/null) + fi + bsdtar -cf - "${files[@]}" | compress_as "$filename" > "$tempname" + popd >/dev/null + + create_signature "$tempname" +} + +trap_exit() { + # unhook all traps to avoid race conditions + trap '' EXIT TERM HUP QUIT INT ERR + + echo + error "$@" + clean_up 1 +} + +clean_up() { + local exit_code=${1:-$?} + + # unhook all traps to avoid race conditions + trap '' EXIT TERM HUP QUIT INT ERR + + [[ -d $tmpdir ]] && rm -rf "$tmpdir" + (( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE" + + exit "$exit_code" +} + +# PROGRAM START +case $1 in + -h|--help) usage; exit 0;; +esac + +# figure out what program we are +cmd=${0##*/} + +if [[ $cmd != "links-add" && $cmd != "links-remove" ]]; then + error "Invalid command name '%s' specified." "$cmd" + exit 1 +fi + +tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/repo-tools.XXXXXXXXXX") || (\ + error "Cannot create temp directory for database building."; \ + exit 1) + +for repo in "pkg" "${REPO_DB_NAME}"; do + mkdir "$tmpdir/$repo" +done + +trap 'clean_up' EXIT +for signal in TERM HUP QUIT; do + trap "trap_exit \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal" +done +trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT +trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR + +declare -a args +# parse arguments +while (( $# )); do + case $1 in + -q|--quiet) QUIET=1 ;; + -n|--new) ONLYADDNEW=1 ;; + -s|--sign) SIGN=1 ;; + -k|--key) KEY=1 ; shift; GPGKEY=$1 ;; + -v|--verify) VERIFY=1 ;; + *) args+=("$1") ;; + esac + shift +done + +REPO_DB_FILE=${args[0]} +if [[ -z $REPO_DB_FILE ]]; then + usage + exit 1 +fi + +if [[ $REPO_DB_FILE == /* ]]; then + LOCKFILE=$REPO_DB_FILE.lck +else + LOCKFILE=$PWD/$REPO_DB_FILE.lck +fi + +verify_repo_extension "$REPO_DB_FILE" + +REPO_DB_PREFIX=${REPO_DB_FILE##*/} +REPO_DB_PREFIX=${REPO_DB_PREFIX%.links.*} +REPO_DB_SUFFIX=${REPO_DB_FILE##*.links.} + +if (( SIGN || VERIFY )); then + check_gpg +fi + +if (( VERIFY && ${#args[@]} == 1 )); then + dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX + + if [[ -f $dbfile ]]; then + verify_signature "$dbfile" + fi + exit 0 +fi + +prepare_repo_db + +fail=0 +for arg in "${args[@]:1}"; do + case $cmd in + links-add) add "$arg" ;; + links-remove) remove "$arg" ;; + esac || fail=1 +done + +# if the whole operation was a success, re-zip and rotate databases +if (( !fail )); then + msg "Creating updated database file '%s'" "$REPO_DB_FILE" + create_db + rotate_db +else + msg "No packages modified, nothing to do." + exit 1 +fi + +exit 0 diff --git a/artools/0.26.1/artools/bin/pkg/links-add.in b/artools/0.26.1/artools/bin/pkg/links-add.in new file mode 100644 index 0000000..d6502ab --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/links-add.in @@ -0,0 +1,512 @@ +#!/bin/bash +# +# links-add - add a package to a given repo database file +# links-remove - remove a package entry from a given repo database file +# +# Copyright (c) 2006-2018 Pacman Development Team +# Copyright (c) 2019 artoo@artixlinux.org +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +m4_include(lib/base/message.sh) + +shopt -s extglob + +declare -r REPO_DB_NAME="links" + +QUIET=0 +ONLYADDNEW=0 +SIGN=0 +KEY=0 +VERIFY=0 +REPO_DB_FILE= +REPO_DB_PREFIX= +REPO_DB_SUFFIX= +LOCKFILE= +CLEAN_LOCK=0 + +# ensure we have a sane umask set +umask 0022 + +# print usage instructions +usage() { + cmd=${0##*/} + printf -- "%s \n\n" "$cmd" + if [[ $cmd == "links-add" ]] ; then + printf -- "Usage: links-add [options] ...\n" + printf -- "\n" + printf -- "\ +links-add will update a package database by reading a package file.\n\ +Multiple packages to add can be specified on the command line.\n" + printf -- "\n" + printf -- "Options:\n" + printf -- " -n, --new only add packages that are not already in the database\n" + elif [[ $cmd == "links-remove" ]] ; then + printf -- "Usage: links-remove [options] ...\n" + printf -- "\n" + printf -- "\ +links-remove will update a package database by removing the package name\n\ +specified on the command line from the given repo database. Multiple\n\ +packages to remove can be specified on the command line.\n" + printf -- "\n" + printf -- "Options:\n" + else + printf -- "Please move along, there is nothing to see here.\n" + return + fi + printf -- " --nocolor turn off color in output\n" + printf -- " -q, --quiet minimize output\n" + printf -- " -s, --sign sign database with GnuPG after update\n" + printf -- " -k, --key use the specified key to sign the database\n" + printf -- " -v, --verify verify database's signature before update\n" + printf -- "\n\ +See %s(8) for more details and descriptions of the available options.\n" "$cmd" + printf "\n" + if [[ $cmd == "links-add" ]] ; then + printf -- "Example: links-add /path/to/repo.links.tar.xz pacman-5.1.3-1-x86_64.pkg.tar.xz\n" + elif [[ $cmd == "links-remove" ]] ; then + printf -- "Example: links-remove /path/to/repo.links.tar.xz kernel26\n" + fi +} + +find_pkgentry() { + local pkgname=$1 + local pkgentry + + for pkgentry in "$tmpdir/${REPO_DB_NAME}/$pkgname"*; do + name=${pkgentry##*/} + if [[ ${name%-*-*} = "$pkgname" ]]; then + echo "$pkgentry" + return 0 + fi + done + return 1 +} + +check_gpg() { + if ! type -p gpg >/dev/null; then + error "Cannot find the gpg binary! Is GnuPG installed?" + exit 1 # $E_MISSING_PROGRAM + fi + + if (( ! VERIFY )); then + if ! gpg --list-secret-key ${GPGKEY:+"$GPGKEY"} &>/dev/null; then + if [[ -n "$GPGKEY" ]]; then + error "The key ${GPGKEY} does not exist in your keyring." + elif (( ! KEY )); then + error "There is no key in your keyring." + fi + exit 1 + fi + fi +} + +# sign the package database once repackaged +create_signature() { + (( ! SIGN )) && return + local dbfile=$1 + local ret=0 + msg "Signing database '%s'..." "${dbfile##*/.tmp.}" + + local SIGNWITHKEY=() + if [[ -n $GPGKEY ]]; then + SIGNWITHKEY=(-u "${GPGKEY}") + fi + gpg --detach-sign --use-agent --no-armor "${SIGNWITHKEY[@]}" "$dbfile" &>/dev/null || ret=$? + + if (( ! ret )); then + msg2 "Created signature file '%s'" "${dbfile##*/.tmp.}.sig" + else + warning "Failed to sign package database file '%s'" "${dbfile##*/.tmp.}" + fi +} + +# verify the existing package database signature +verify_signature() { + (( ! VERIFY )) && return + local dbfile=$1 + local ret=0 + msg "Verifying database signature..." + + if [[ ! -f $dbfile.sig ]]; then + warning "No existing signature found, skipping verification." + return + fi + gpg --verify "$dbfile.sig" || ret=$? + if (( ! ret )); then + msg2 "Database signature file verified." + else + error "Database signature was NOT valid!" + exit 1 + fi +} + +verify_repo_extension() { + local junk=() + if [[ $1 = *.links.tar* ]] && get_compression_command "$1" junk; then + return 0 + fi + + error "'%s' does not have a valid database archive extension." "$1" + exit 1 +} + +# write an entry to the pacman database +# arg1 - path to package +db_write_entry() { + # blank out all variables + local pkgfile=$1 + + local pkgname pkgver + + # read info from the zipped package + local line var val + while read -r line; do + [[ ${line:0:1} = '#' ]] && continue + IFS=' =' read -r var val < <(printf '%s\n' "$line") + # normalize whitespace with an extglob + declare "$var=${val//+([[:space:]])/ }" + + done< <(bsdtar -xOqf "$pkgfile" .PKGINFO) + + # ensure $pkgname and $pkgver variables were found + if [[ -z $pkgname || -z $pkgver ]]; then + error "Invalid package file '%s'." "$pkgfile" + return 1 + fi + + if [[ -d $tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver ]]; then + warning "An entry for '%s' already existed" "$pkgname-$pkgver" + if (( ONLYADDNEW )); then + return 0 + fi + fi + + # remove an existing entry if it exists, ignore failures + db_remove_entry "$pkgname" + + local tmppkg=$tmpdir/pkg/$pkgname-$pkgver + + mkdir "$tmppkg" + + bsdtar -xof "$pkgfile" -C "$tmppkg" --include={opt,{,usr/}{lib{,32},{s,}bin}}'/*' 2>/dev/null + + pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null + mkdir "$pkgname-$pkgver" + pushd "$pkgname-$pkgver" >/dev/null + + # create links entry + msg2 "Creating '%s' db entry..." "${REPO_DB_NAME}" + + local linksentry=$tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver/${REPO_DB_NAME} + local files=$(find "$tmppkg" -type f ! -ipath "*/Documentation/*") + + for f in ${files}; do + readelf -d "$f" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p' + done | sort -u > "$linksentry" + + popd >/dev/null + popd >/dev/null + + return 0 +} + +# remove existing entries from the DB +# arg1 - package name +db_remove_entry() { + local pkgname=$1 + local notfound=1 + local pkgentry + pkgentry=$(find_pkgentry "$pkgname") + while [[ -n $pkgentry ]]; do + notfound=0 + + msg2 "Removing existing entry '%s'..." \ + "${pkgentry##*/}" + rm -rf "$pkgentry" + + # remove entries in "links" database + local linksentry + linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//') + rm -rf "$linksentry" + + pkgentry=$(find_pkgentry "$pkgname") + done + return $notfound +} + +prepare_repo_db() { + local repodir dbfile + + # ensure the path to the DB exists; $LOCKFILE is always an absolute path + repodir=${LOCKFILE%/*}/ + + if [[ ! -d $repodir ]]; then + error "%s does not exist or is not a directory." "$repodir" + exit 1 + fi + + # check lock file + if ( set -o noclobber; echo "$$" > "$LOCKFILE") 2> /dev/null; then + CLEAN_LOCK=1 + else + error "Failed to acquire lockfile: %s." "$LOCKFILE" + [[ -f $LOCKFILE ]] && error "Held by process %s" "$(cat "$LOCKFILE")" + exit 1 + fi + + dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX + + if [[ -f $dbfile ]]; then + # there are two situations we can have here: + # a DB with some entries, or a DB with no contents at all. + if ! bsdtar -tqf "$dbfile" '*/links' >/dev/null 2>&1; then + # check empty case + if [[ -n $(bsdtar -tqf "$dbfile" '*' 2>/dev/null) ]]; then + error "Repository file '%s' is not a proper links database." "$dbfile" + exit 1 + fi + fi + verify_signature "$dbfile" + msg "Extracting %s to a temporary location..." "${dbfile##*/}" + bsdtar -xf "$dbfile" -C "$tmpdir/${REPO_DB_NAME}" + else + case $cmd in + links-remove) + # only a missing "db" database is currently an error + # TODO: remove if statement + if [[ ${REPO_DB_NAME} == "links" ]]; then + error "Repository file '%s' was not found." "$dbfile" + exit 1 + fi + ;; + links-add) + # check if the file can be created (write permission, directory existence, etc) + if ! touch "$dbfile"; then + error "Repository file '%s' could not be created." "$dbfile" + exit 1 + fi + rm -f "$dbfile" + ;; + esac + fi +} + +add() { + if [[ ! -f $1 ]]; then + error "File '%s' not found." "$1" + return 1 + fi + + pkgfile=$1 + if ! bsdtar -tqf "$pkgfile" .PKGINFO >/dev/null 2>&1; then + error "'%s' is not a package file, skipping" "$pkgfile" + return 1 + fi + + msg "Adding package '%s'" "$pkgfile" + + db_write_entry "$pkgfile" +} + +remove() { + pkgname=$1 + msg "Searching for package '%s'..." "$pkgname" + + if ! db_remove_entry "$pkgname"; then + error "Package matching '%s' not found." "$pkgname" + return 1 + fi + + return 0 +} + +rotate_db() { + dirname=${LOCKFILE%/*} + + pushd "$dirname" >/dev/null + + filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX} + tempname=$dirname/.tmp.$filename + + # hardlink or move the previous version of the database and signature to .old + # extension as a backup measure + if [[ -f $filename ]]; then + ln -f "$filename" "$filename.old" 2>/dev/null || \ + mv -f "$filename" "$filename.old" + + if [[ -f $filename.sig ]]; then + ln -f "$filename.sig" "$filename.old.sig" 2>/dev/null || \ + mv -f "$filename.sig" "$filename.old.sig" + else + rm -f "$filename.old.sig" + fi + fi + + # rotate the newly-created database and signature into place + mv "$tempname" "$filename" + if [[ -f $tempname.sig ]]; then + mv "$tempname.sig" "$filename.sig" + fi + + dblink=${filename%.tar*} + rm -f "$dblink" "$dblink.sig" + ln -s "$filename" "$dblink" 2>/dev/null || \ + ln "$filename" "$dblink" 2>/dev/null || \ + cp "$filename" "$dblink" + if [[ -f "$filename.sig" ]]; then + ln -s "$filename.sig" "$dblink.sig" 2>/dev/null || \ + ln "$filename.sig" "$dblink.sig" 2>/dev/null || \ + cp "$filename.sig" "$dblink.sig" + fi + + popd >/dev/null +} + +create_db() { + # $LOCKFILE is already guaranteed to be absolute so this is safe + dirname=${LOCKFILE%/*} + + filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX} + # this ensures we create it on the same filesystem, making moves atomic + tempname=$dirname/.tmp.$filename + + pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null + local files=(*) + if [[ ${files[*]} = '*' ]]; then + # we have no packages remaining? zip up some emptyness + warning "No packages remain, creating empty database." + files=(-T /dev/null) + fi + bsdtar -cf - "${files[@]}" | compress_as "$filename" > "$tempname" + popd >/dev/null + + create_signature "$tempname" +} + +trap_exit() { + # unhook all traps to avoid race conditions + trap '' EXIT TERM HUP QUIT INT ERR + + echo + error "$@" + clean_up 1 +} + +clean_up() { + local exit_code=${1:-$?} + + # unhook all traps to avoid race conditions + trap '' EXIT TERM HUP QUIT INT ERR + + [[ -d $tmpdir ]] && rm -rf "$tmpdir" + (( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE" + + exit "$exit_code" +} + +# PROGRAM START +case $1 in + -h|--help) usage; exit 0;; +esac + +# figure out what program we are +cmd=${0##*/} + +if [[ $cmd != "links-add" && $cmd != "links-remove" ]]; then + error "Invalid command name '%s' specified." "$cmd" + exit 1 +fi + +tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/repo-tools.XXXXXXXXXX") || (\ + error "Cannot create temp directory for database building."; \ + exit 1) + +for repo in "pkg" "${REPO_DB_NAME}"; do + mkdir "$tmpdir/$repo" +done + +trap 'clean_up' EXIT +for signal in TERM HUP QUIT; do + trap "trap_exit \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal" +done +trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT +trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR + +declare -a args +# parse arguments +while (( $# )); do + case $1 in + -q|--quiet) QUIET=1 ;; + -n|--new) ONLYADDNEW=1 ;; + -s|--sign) SIGN=1 ;; + -k|--key) KEY=1 ; shift; GPGKEY=$1 ;; + -v|--verify) VERIFY=1 ;; + *) args+=("$1") ;; + esac + shift +done + +REPO_DB_FILE=${args[0]} +if [[ -z $REPO_DB_FILE ]]; then + usage + exit 1 +fi + +if [[ $REPO_DB_FILE == /* ]]; then + LOCKFILE=$REPO_DB_FILE.lck +else + LOCKFILE=$PWD/$REPO_DB_FILE.lck +fi + +verify_repo_extension "$REPO_DB_FILE" + +REPO_DB_PREFIX=${REPO_DB_FILE##*/} +REPO_DB_PREFIX=${REPO_DB_PREFIX%.links.*} +REPO_DB_SUFFIX=${REPO_DB_FILE##*.links.} + +if (( SIGN || VERIFY )); then + check_gpg +fi + +if (( VERIFY && ${#args[@]} == 1 )); then + dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX + + if [[ -f $dbfile ]]; then + verify_signature "$dbfile" + fi + exit 0 +fi + +prepare_repo_db + +fail=0 +for arg in "${args[@]:1}"; do + case $cmd in + links-add) add "$arg" ;; + links-remove) remove "$arg" ;; + esac || fail=1 +done + +# if the whole operation was a success, re-zip and rotate databases +if (( !fail )); then + msg "Creating updated database file '%s'" "$REPO_DB_FILE" + create_db + rotate_db +else + msg "No packages modified, nothing to do." + exit 1 +fi + +exit 0 diff --git a/artools/0.26.1/artools/bin/pkg/mkchrootpkg b/artools/0.26.1/artools/bin/pkg/mkchrootpkg new file mode 100755 index 0000000..9ca9d2f --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/mkchrootpkg @@ -0,0 +1,578 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + + +export BUILDTOOL=artools-pkg +export BUILDTOOLVER=0.26 + +shopt -s nullglob + +default_makepkg_args=(--syncdeps --noconfirm --log --holdver --skipinteg) +makepkg_args=("${default_makepkg_args[@]}") +verifysource_args=() +chrootdir= +passeddir= +makepkg_user= +declare -a install_pkgs +declare -i ret=0 + +keepbuilddir=0 +update_first=0 +clean_first=0 +run_namcap=0 +run_checkpkg=0 +temp_chroot=0 + +bindmounts=() + +copy=$USER +[[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER +[[ -z "$copy" || $copy = root ]] && copy=copy +src_owner=${SUDO_USER:-$USER} + +usage() { + echo "Usage: ${0##*/} [options] -r [--] [makepkg args]" + echo ' Run this script in a PKGBUILD dir to build a package inside a' + echo ' clean chroot. Arguments passed to this script after the' + echo ' end-of-options marker (--) will be passed to makepkg.' + echo '' + echo ' The chroot dir consists of the following directories:' + echo ' /{root, copy} but only "root" is required' + echo ' by default. The working copy will be created as needed' + echo '' + echo 'The chroot "root" directory must be created via the following' + echo 'command:' + echo ' mkchroot /root base-devel' + echo '' + echo 'This script reads {SRC,SRCPKG,PKG,LOG}DEST, MAKEFLAGS and PACKAGER' + echo 'from makepkg.conf(5), if those variables are not part of the' + echo 'environment.' + echo '' + echo "Default makepkg args: ${default_makepkg_args[*]}" + echo '' + echo 'Flags:' + echo '-h This help' + echo '-c Clean the chroot before building' + echo '-d Bind directory into build chroot as read-write' + echo '-D Bind directory into build chroot as read-only' + echo '-u Update the working copy of the chroot before building' + echo ' This is useful for rebuilds without dirtying the pristine' + echo ' chroot' + echo '-r The chroot dir to use' + echo '-I Install a package into the working copy of the chroot' + echo '-l The directory to use as the working copy of the chroot' + echo ' Useful for maintaining multiple copies' + echo " Default: $copy" + echo '-n Run namcap on the package' + echo '-C Run checkpkg on the package' + echo '-N Disable check() function' + echo '-T Build in a temporary directory' + echo '-U Run makepkg as a specified user' + exit 1 +} + +# {{{ functions + +# Usage: sync_chroot $chrootdir $copydir [$copy] +sync_chroot() { + local chrootdir=$1 + local copydir=$2 + local copy=${3:-$2} + + if [[ "$chrootdir/root" -ef "$copydir" ]]; then + error 'Cannot sync copy with itself: %s' "$copydir" + return 1 + fi + + # Get a read lock on the root chroot to make + # sure we don't clone a half-updated chroot + slock 8 "$chrootdir/root.lock" \ + "Locking clean chroot [%s]" "$chrootdir/root" + + stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$chrootdir/root" "$copy" + if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then + subvolume_delete_recursive "$copydir" || + die "Unable to delete subvolume %s" "$copydir" + btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null || + die "Unable to create subvolume %s" "$copydir" + else + mkdir -p "$copydir" + rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir" + fi + stat_done + + # Drop the read lock again + lock_close 8 + + # Update mtime + touch "$copydir" +} + +# Usage: delete_chroot $copydir [$copy] +delete_chroot() { + local copydir=$1 + local copy=${1:-$2} + + stat_busy "Removing chroot copy [%s]" "$copy" + if is_subvolume "$copydir" && ! mountpoint -q "$copydir"; then + subvolume_delete_recursive "$copydir" || + die "Unable to delete subvolume %s" "$copydir" + else + # avoid change of filesystem in case of an umount failure + rm --recursive --force --one-file-system "$copydir" || + die "Unable to delete %s" "$copydir" + fi + + # remove lock file + rm -f "$copydir.lock" + stat_done +} + +install_packages() { + local -a pkgnames + local ret + + pkgnames=("${install_pkgs[@]##*/}") + + cp -- "${install_pkgs[@]}" "$copydir/root/" + chroot-run \ + -b "${bindmounts[@]}" \ + "$copydir" \ + bash -c 'yes y | pacman -U -- "$@"' -bash "${pkgnames[@]/#//root/}" + ret=$? + rm -- "${pkgnames[@]/#/$copydir/root/}" + + return $ret +} + +prepare_chroot() { + (( keepbuilddir )) || rm -rf "$copydir/build" + + local builduser_uid builduser_gid + builduser_uid="$(id -u "$makepkg_user")" + builduser_gid="$(id -g "$makepkg_user")" + local install="install -o $builduser_uid -g $builduser_gid" + local x + + # We can't use useradd without chrooting, otherwise it invokes PAM modules + # which we might not be able to load (i.e. when building i686 packages on + # an x86_64 host). + sed -e '/^builduser:/d' -i "$copydir"/etc/{passwd,shadow,group} + printf >>"$copydir/etc/group" 'builduser:x:%d:\n' "$builduser_gid" + printf >>"$copydir/etc/passwd" 'builduser:x:%d:%d:builduser:/build:/bin/bash\n' "$builduser_uid" "$builduser_gid" + printf >>"$copydir/etc/shadow" 'builduser:!!:%d::::::\n' "$(( $(date -u +%s) / 86400 ))" + + $install -d "$copydir"/{build,startdir,{pkg,srcpkg,src,log}dest} + + sed -e '/^MAKEFLAGS=/d' -e '/^PACKAGER=/d' -i "$copydir/etc/makepkg.conf" + for x in BUILDDIR=/build PKGDEST=/pkgdest SRCPKGDEST=/srcpkgdest SRCDEST=/srcdest LOGDEST=/logdest \ + "MAKEFLAGS='${MAKEFLAGS:-}'" "PACKAGER='${PACKAGER:-}'" + do + grep -q "^$x" "$copydir/etc/makepkg.conf" && continue + echo "$x" >>"$copydir/etc/makepkg.conf" + done + + cat > "$copydir/etc/sudoers.d/builduser-pacman" </dev/null || true + declare -p BUILDTOOL 2>/dev/null + declare -p BUILDTOOLVER 2>/dev/null + printf '_chrootbuild "$@" || exit\n' + + if (( run_namcap )); then + declare -f _chrootnamcap + printf '_chrootnamcap || exit\n' + fi + } >"$copydir/chrootbuild" + chmod +x "$copydir/chrootbuild" +} + +# These functions aren't run in makechrootpkg, +# so no global variables +_chrootbuild() { + # No coredumps + ulimit -c 0 + + . /etc/locale.conf + + # shellcheck source=/dev/null + . /etc/profile + + # Beware, there are some stupid arbitrary rules on how you can + # use "$" in arguments to commands with "sudo -i". ${foo} or + # ${1} is OK, but $foo or $1 isn't. + # https://bugzilla.sudo.ws/show_bug.cgi?id=765 + sudo --preserve-env=SOURCE_DATE_EPOCH \ + -preserve-env=BUILDTOOL \ + --preserve-env=BUILDTOOLVER \ + -iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@" + ret=$? + case $ret in + 0|14) + return 0;; + *) + return $ret;; + esac +} + +_chrootnamcap() { + pacman -S --needed --noconfirm namcap + for pkgfile in /startdir/PKGBUILD /pkgdest/*; do + echo "Checking ${pkgfile##*/}" + sudo -u builduser namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log" + done +} + +download_sources() { + setup_workdir + chown "$makepkg_user:" "$WORKDIR" + + # Ensure sources are downloaded + sudo -u "$makepkg_user" --preserve-env=GNUPGHOME,SSH_AUTH_SOCK \ + env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \ + makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" || + die "Could not download sources." +} + +move_logfiles() { + local l + for l in "$copydir"/logdest/*; do + [[ $l == */logpipe.* ]] && continue + chown "$src_owner" "$l" + mv "$l" "$LOGDEST" + done +} + +move_products() { + local pkgfile + for pkgfile in "$copydir"/pkgdest/*; do + chown "$src_owner" "$pkgfile" + mv "$pkgfile" "$PKGDEST" + + # Fix broken symlink because of temporary chroot PKGDEST /pkgdest + if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then + ln -sf "$PKGDEST/${pkgfile##*/}" + fi + done + + move_logfiles + + for s in "$copydir"/srcpkgdest/*; do + chown "$src_owner" "$s" + mv "$s" "$SRCPKGDEST" + + # Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest + if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then + ln -sf "$SRCPKGDEST/${s##*/}" + fi + done +} +# }}} + +opts='hcur:I:l:nNCTb:U:' + +while getopts "${opts}" arg; do + case "$arg" in + c) clean_first=1 ;; + b) bindmounts+=("$OPTARG") ;; + u) update_first=1 ;; + r) passeddir="$OPTARG" ;; + I) install_pkgs+=("$OPTARG") ;; + l) copy="$OPTARG" ;; + n) run_namcap=1; makepkg_args+=(--install) ;; + N) makepkg_args+=(--nocheck) ;; + C) run_checkpkg=1 ;; + T) temp_chroot=1; copy+="-$$" ;; + U) makepkg_user="$OPTARG" ;; + h|*) usage ;; + esac +done + +[[ ! -f PKGBUILD && -z "${install_pkgs[*]}" ]] && die 'This must be run in a directory containing a PKGBUILD.' +[[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.' +makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}} + +check_root SOURCE_DATE_EPOCH,BUILDTOOL,BUILDTOOLVER,GNUPGHOME,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER + +# Canonicalize chrootdir, getting rid of trailing / +chrootdir=$(readlink -e "$passeddir") +[[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir" +[[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkchroot %s/root base-devel" "$chrootdir" + +if [[ ${copy:0:1} = / ]]; then + copydir=$copy +else + copydir="$chrootdir/$copy" +fi + +# Pass all arguments after -- right to makepkg +makepkg_args+=("${@:$OPTIND}") + +# See if -R or -e was passed to makepkg +for arg in "${@:$OPTIND}"; do + case ${arg%%=*} in + --skip*|--holdver) verifysource_args+=("$arg") ;; + --repackage|--noextract) keepbuilddir=1 ;; + --*) ;; + -*R*|-*e*) keepbuilddir=1 ;; + esac +done + +umask 0022 + +ORIG_HOME=$HOME +IFS=: read -r _ _ _ _ _ HOME _ < <(getent passwd "${SUDO_USER:-$USER}") +load_makepkg_config +HOME=$ORIG_HOME + +# Use PKGBUILD directory if these don't exist +[[ -d $PKGDEST ]] || PKGDEST=$PWD +[[ -d $SRCDEST ]] || SRCDEST=$PWD +[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD +[[ -d $LOGDEST ]] || LOGDEST=$PWD + +# Lock the chroot we want to use. We'll keep this lock until we exit. +lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy" + +if [[ ! -d $copydir ]] || (( clean_first )); then + sync_chroot "$chrootdir" "$copydir" "$copy" +fi + +bindmounts+=("-B:${PWD}:/startdir" "-B:${SRCDEST}:/srcdest") + +(( update_first )) && chroot-run \ + -b "${bindmounts[*]}" \ + "$copydir" \ + pacman -Syuu --noconfirm + +if [[ -n ${install_pkgs[*]:-} ]]; then + install_packages + ret=$? + # If there is no PKGBUILD we are done + [[ -f PKGBUILD ]] || exit $ret +fi + +if [[ "$(id -u "$makepkg_user")" == 0 ]]; then + error "Running makepkg as root is not allowed." + exit 1 +fi + +download_sources + +prepare_chroot + +if chroot-run \ + -b "${bindmounts[*]}" \ + "$copydir" \ + /chrootbuild "${makepkg_args[@]}" +then + mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') + move_products +else + (( ret += 1 )) + move_logfiles +fi + +(( temp_chroot )) && delete_chroot "$copydir" "$copy" + +if (( ret != 0 )); then + if (( temp_chroot )); then + die "Build failed" + else + die "Build failed, check %s/build" "$copydir" + fi +else + if (( run_checkpkg )); then + msg "Running checkpkg" + + mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ + --dbpath "$copydir"/var/lib/pacman \ + -Sddp "${pkgnames[@]}") + + if ! wait $!; then + warning "Skipped checkpkg due to missing repo packages" + exit 0 + fi + # download package files if any non-local location exists + for remotepkg in "${remotepkgs[@]}"; do + if [[ $remotepkg != file://* ]]; then + msg2 "Downloading current versions" + chroot-run "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}" + mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ + --dbpath "$copydir"/var/lib/pacman \ + -Sddp "${pkgnames[@]}") + break + fi + done + msg2 "Checking packages" + sudo -u "$makepkg_user" checkpkg --rmdir --warn "${remotepkgs[@]/#file:\/\//}" + fi + true +fi diff --git a/artools/0.26.1/artools/bin/pkg/mkchrootpkg.in b/artools/0.26.1/artools/bin/pkg/mkchrootpkg.in new file mode 100644 index 0000000..2523626 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/mkchrootpkg.in @@ -0,0 +1,432 @@ +#!/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/base/message.sh) +m4_include(lib/base/chroot.sh) + +export BUILDTOOL=artools-pkg +export BUILDTOOLVER=m4_artools_pkg_version + +shopt -s nullglob + +default_makepkg_args=(--syncdeps --noconfirm --log --holdver --skipinteg) +makepkg_args=("${default_makepkg_args[@]}") +verifysource_args=() +chrootdir= +passeddir= +makepkg_user= +declare -a install_pkgs +declare -i ret=0 + +keepbuilddir=0 +update_first=0 +clean_first=0 +run_namcap=0 +run_checkpkg=0 +temp_chroot=0 + +bindmounts=() + +copy=$USER +[[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER +[[ -z "$copy" || $copy = root ]] && copy=copy +src_owner=${SUDO_USER:-$USER} + +usage() { + echo "Usage: ${0##*/} [options] -r [--] [makepkg args]" + echo ' Run this script in a PKGBUILD dir to build a package inside a' + echo ' clean chroot. Arguments passed to this script after the' + echo ' end-of-options marker (--) will be passed to makepkg.' + echo '' + echo ' The chroot dir consists of the following directories:' + echo ' /{root, copy} but only "root" is required' + echo ' by default. The working copy will be created as needed' + echo '' + echo 'The chroot "root" directory must be created via the following' + echo 'command:' + echo ' mkchroot /root base-devel' + echo '' + echo 'This script reads {SRC,SRCPKG,PKG,LOG}DEST, MAKEFLAGS and PACKAGER' + echo 'from makepkg.conf(5), if those variables are not part of the' + echo 'environment.' + echo '' + echo "Default makepkg args: ${default_makepkg_args[*]}" + echo '' + echo 'Flags:' + echo '-h This help' + echo '-c Clean the chroot before building' + echo '-d Bind directory into build chroot as read-write' + echo '-D Bind directory into build chroot as read-only' + echo '-u Update the working copy of the chroot before building' + echo ' This is useful for rebuilds without dirtying the pristine' + echo ' chroot' + echo '-r The chroot dir to use' + echo '-I Install a package into the working copy of the chroot' + echo '-l The directory to use as the working copy of the chroot' + echo ' Useful for maintaining multiple copies' + echo " Default: $copy" + echo '-n Run namcap on the package' + echo '-C Run checkpkg on the package' + echo '-N Disable check() function' + echo '-T Build in a temporary directory' + echo '-U Run makepkg as a specified user' + exit 1 +} + +# {{{ functions + +# Usage: sync_chroot $chrootdir $copydir [$copy] +sync_chroot() { + local chrootdir=$1 + local copydir=$2 + local copy=${3:-$2} + + if [[ "$chrootdir/root" -ef "$copydir" ]]; then + error 'Cannot sync copy with itself: %s' "$copydir" + return 1 + fi + + # Get a read lock on the root chroot to make + # sure we don't clone a half-updated chroot + slock 8 "$chrootdir/root.lock" \ + "Locking clean chroot [%s]" "$chrootdir/root" + + stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$chrootdir/root" "$copy" + if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then + subvolume_delete_recursive "$copydir" || + die "Unable to delete subvolume %s" "$copydir" + btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null || + die "Unable to create subvolume %s" "$copydir" + else + mkdir -p "$copydir" + rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir" + fi + stat_done + + # Drop the read lock again + lock_close 8 + + # Update mtime + touch "$copydir" +} + +# Usage: delete_chroot $copydir [$copy] +delete_chroot() { + local copydir=$1 + local copy=${1:-$2} + + stat_busy "Removing chroot copy [%s]" "$copy" + if is_subvolume "$copydir" && ! mountpoint -q "$copydir"; then + subvolume_delete_recursive "$copydir" || + die "Unable to delete subvolume %s" "$copydir" + else + # avoid change of filesystem in case of an umount failure + rm --recursive --force --one-file-system "$copydir" || + die "Unable to delete %s" "$copydir" + fi + + # remove lock file + rm -f "$copydir.lock" + stat_done +} + +install_packages() { + local -a pkgnames + local ret + + pkgnames=("${install_pkgs[@]##*/}") + + cp -- "${install_pkgs[@]}" "$copydir/root/" + chroot-run \ + -b "${bindmounts[@]}" \ + "$copydir" \ + bash -c 'yes y | pacman -U -- "$@"' -bash "${pkgnames[@]/#//root/}" + ret=$? + rm -- "${pkgnames[@]/#/$copydir/root/}" + + return $ret +} + +prepare_chroot() { + (( keepbuilddir )) || rm -rf "$copydir/build" + + local builduser_uid builduser_gid + builduser_uid="$(id -u "$makepkg_user")" + builduser_gid="$(id -g "$makepkg_user")" + local install="install -o $builduser_uid -g $builduser_gid" + local x + + # We can't use useradd without chrooting, otherwise it invokes PAM modules + # which we might not be able to load (i.e. when building i686 packages on + # an x86_64 host). + sed -e '/^builduser:/d' -i "$copydir"/etc/{passwd,shadow,group} + printf >>"$copydir/etc/group" 'builduser:x:%d:\n' "$builduser_gid" + printf >>"$copydir/etc/passwd" 'builduser:x:%d:%d:builduser:/build:/bin/bash\n' "$builduser_uid" "$builduser_gid" + printf >>"$copydir/etc/shadow" 'builduser:!!:%d::::::\n' "$(( $(date -u +%s) / 86400 ))" + + $install -d "$copydir"/{build,startdir,{pkg,srcpkg,src,log}dest} + + sed -e '/^MAKEFLAGS=/d' -e '/^PACKAGER=/d' -i "$copydir/etc/makepkg.conf" + for x in BUILDDIR=/build PKGDEST=/pkgdest SRCPKGDEST=/srcpkgdest SRCDEST=/srcdest LOGDEST=/logdest \ + "MAKEFLAGS='${MAKEFLAGS:-}'" "PACKAGER='${PACKAGER:-}'" + do + grep -q "^$x" "$copydir/etc/makepkg.conf" && continue + echo "$x" >>"$copydir/etc/makepkg.conf" + done + + cat > "$copydir/etc/sudoers.d/builduser-pacman" </dev/null || true + declare -p BUILDTOOL 2>/dev/null + declare -p BUILDTOOLVER 2>/dev/null + printf '_chrootbuild "$@" || exit\n' + + if (( run_namcap )); then + declare -f _chrootnamcap + printf '_chrootnamcap || exit\n' + fi + } >"$copydir/chrootbuild" + chmod +x "$copydir/chrootbuild" +} + +# These functions aren't run in makechrootpkg, +# so no global variables +_chrootbuild() { + # No coredumps + ulimit -c 0 + + . /etc/locale.conf + + # shellcheck source=/dev/null + . /etc/profile + + # Beware, there are some stupid arbitrary rules on how you can + # use "$" in arguments to commands with "sudo -i". ${foo} or + # ${1} is OK, but $foo or $1 isn't. + # https://bugzilla.sudo.ws/show_bug.cgi?id=765 + sudo --preserve-env=SOURCE_DATE_EPOCH \ + -preserve-env=BUILDTOOL \ + --preserve-env=BUILDTOOLVER \ + -iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@" + ret=$? + case $ret in + 0|14) + return 0;; + *) + return $ret;; + esac +} + +_chrootnamcap() { + pacman -S --needed --noconfirm namcap + for pkgfile in /startdir/PKGBUILD /pkgdest/*; do + echo "Checking ${pkgfile##*/}" + sudo -u builduser namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log" + done +} + +download_sources() { + setup_workdir + chown "$makepkg_user:" "$WORKDIR" + + # Ensure sources are downloaded + sudo -u "$makepkg_user" --preserve-env=GNUPGHOME,SSH_AUTH_SOCK \ + env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \ + makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" || + die "Could not download sources." +} + +move_logfiles() { + local l + for l in "$copydir"/logdest/*; do + [[ $l == */logpipe.* ]] && continue + chown "$src_owner" "$l" + mv "$l" "$LOGDEST" + done +} + +move_products() { + local pkgfile + for pkgfile in "$copydir"/pkgdest/*; do + chown "$src_owner" "$pkgfile" + mv "$pkgfile" "$PKGDEST" + + # Fix broken symlink because of temporary chroot PKGDEST /pkgdest + if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then + ln -sf "$PKGDEST/${pkgfile##*/}" + fi + done + + move_logfiles + + for s in "$copydir"/srcpkgdest/*; do + chown "$src_owner" "$s" + mv "$s" "$SRCPKGDEST" + + # Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest + if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then + ln -sf "$SRCPKGDEST/${s##*/}" + fi + done +} +# }}} + +opts='hcur:I:l:nNCTb:U:' + +while getopts "${opts}" arg; do + case "$arg" in + c) clean_first=1 ;; + b) bindmounts+=("$OPTARG") ;; + u) update_first=1 ;; + r) passeddir="$OPTARG" ;; + I) install_pkgs+=("$OPTARG") ;; + l) copy="$OPTARG" ;; + n) run_namcap=1; makepkg_args+=(--install) ;; + N) makepkg_args+=(--nocheck) ;; + C) run_checkpkg=1 ;; + T) temp_chroot=1; copy+="-$$" ;; + U) makepkg_user="$OPTARG" ;; + h|*) usage ;; + esac +done + +[[ ! -f PKGBUILD && -z "${install_pkgs[*]}" ]] && die 'This must be run in a directory containing a PKGBUILD.' +[[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.' +makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}} + +check_root SOURCE_DATE_EPOCH,BUILDTOOL,BUILDTOOLVER,GNUPGHOME,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER + +# Canonicalize chrootdir, getting rid of trailing / +chrootdir=$(readlink -e "$passeddir") +[[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir" +[[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkchroot %s/root base-devel" "$chrootdir" + +if [[ ${copy:0:1} = / ]]; then + copydir=$copy +else + copydir="$chrootdir/$copy" +fi + +# Pass all arguments after -- right to makepkg +makepkg_args+=("${@:$OPTIND}") + +# See if -R or -e was passed to makepkg +for arg in "${@:$OPTIND}"; do + case ${arg%%=*} in + --skip*|--holdver) verifysource_args+=("$arg") ;; + --repackage|--noextract) keepbuilddir=1 ;; + --*) ;; + -*R*|-*e*) keepbuilddir=1 ;; + esac +done + +umask 0022 + +ORIG_HOME=$HOME +IFS=: read -r _ _ _ _ _ HOME _ < <(getent passwd "${SUDO_USER:-$USER}") +load_makepkg_config +HOME=$ORIG_HOME + +# Use PKGBUILD directory if these don't exist +[[ -d $PKGDEST ]] || PKGDEST=$PWD +[[ -d $SRCDEST ]] || SRCDEST=$PWD +[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD +[[ -d $LOGDEST ]] || LOGDEST=$PWD + +# Lock the chroot we want to use. We'll keep this lock until we exit. +lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy" + +if [[ ! -d $copydir ]] || (( clean_first )); then + sync_chroot "$chrootdir" "$copydir" "$copy" +fi + +bindmounts+=("-B:${PWD}:/startdir" "-B:${SRCDEST}:/srcdest") + +(( update_first )) && chroot-run \ + -b "${bindmounts[*]}" \ + "$copydir" \ + pacman -Syuu --noconfirm + +if [[ -n ${install_pkgs[*]:-} ]]; then + install_packages + ret=$? + # If there is no PKGBUILD we are done + [[ -f PKGBUILD ]] || exit $ret +fi + +if [[ "$(id -u "$makepkg_user")" == 0 ]]; then + error "Running makepkg as root is not allowed." + exit 1 +fi + +download_sources + +prepare_chroot + +if chroot-run \ + -b "${bindmounts[*]}" \ + "$copydir" \ + /chrootbuild "${makepkg_args[@]}" +then + mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') + move_products +else + (( ret += 1 )) + move_logfiles +fi + +(( temp_chroot )) && delete_chroot "$copydir" "$copy" + +if (( ret != 0 )); then + if (( temp_chroot )); then + die "Build failed" + else + die "Build failed, check %s/build" "$copydir" + fi +else + if (( run_checkpkg )); then + msg "Running checkpkg" + + mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ + --dbpath "$copydir"/var/lib/pacman \ + -Sddp "${pkgnames[@]}") + + if ! wait $!; then + warning "Skipped checkpkg due to missing repo packages" + exit 0 + fi + # download package files if any non-local location exists + for remotepkg in "${remotepkgs[@]}"; do + if [[ $remotepkg != file://* ]]; then + msg2 "Downloading current versions" + chroot-run "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}" + mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ + --dbpath "$copydir"/var/lib/pacman \ + -Sddp "${pkgnames[@]}") + break + fi + done + msg2 "Checking packages" + sudo -u "$makepkg_user" checkpkg --rmdir --warn "${remotepkgs[@]/#file:\/\//}" + fi + true +fi diff --git a/artools/0.26.1/artools/bin/pkg/pkg2yaml b/artools/0.26.1/artools/bin/pkg/pkg2yaml new file mode 100755 index 0000000..4ac2927 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/pkg2yaml @@ -0,0 +1,287 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ yaml + +write_yaml_header(){ + printf '%s' '---' +} + +write_empty_line(){ + printf '\n%s\n' ' ' +} + +write_yaml_map(){ + local ident="$1" key="$2" val="$3" + printf "\n%${ident}s%s: %s\n" '' "$key" "$val" +} + +write_yaml_seq(){ + local ident="$1" val="$2" + printf "\n%${ident}s- %s\n" '' "$val" +} + +write_yaml_seq_map(){ + local ident="$1" key="$2" val="$3" + printf "\n%${ident}s- %s: %s\n" '' "$key" "$val" +} + +#}}} + + +#{{{ functions + +srcyaml_write_attr(){ + local ident1="$1" ident2="$2" ident3="$3" + local attrname=$4 attrvalues=("${@:5}") + + # normalize whitespace, strip leading and trailing + attrvalues=("${attrvalues[@]//+([[:space:]])/ }") + attrvalues=("${attrvalues[@]#[[:space:]]}") + attrvalues=("${attrvalues[@]%[[:space:]]}") + + case $attrname in + pkgver|pkgrel|epoch|url|install|changelog) + for v in "${attrvalues[@]}"; do + Yaml+=$(write_yaml_map "$ident3" "$attrname" "$v") + done + ;; + *) + Yaml+=$(write_yaml_map "$ident1" "$attrname") + for v in "${attrvalues[@]}"; do + Yaml+=$(write_yaml_seq "$ident2" "$v") + done + ;; + esac +} + +pkgbuild_extract_to_yaml() { + local pkgname=$1 attrname=$2 isarray=$3 outvalue= + + if get_pkgbuild_attribute "$pkgname" "$attrname" "$isarray" 'outvalue'; then + [[ -z $pkgname ]] && srcyaml_write_attr 2 4 2 "$attrname" "${outvalue[@]}" + [[ -n $pkgname ]] && srcyaml_write_attr 4 6 2 "$attrname" "${outvalue[@]}" + fi +} + +srcyaml_write_section_details() { + local attr package_arch a + local multivalued_arch_attrs=(source provides conflicts depends replaces + optdepends makedepends checkdepends) +# "${known_hash_algos[@]/%/sums}") + + for attr in "${singlevalued[@]}"; do + pkgbuild_extract_to_yaml "$1" "$attr" 0 + done + + for attr in "${multivalued[@]}"; do + pkgbuild_extract_to_yaml "$1" "$attr" 1 + done + + get_pkgbuild_attribute "$1" 'arch' 1 'package_arch' + for a in "${package_arch[@]}"; do + # 'any' is special. there's no support for, e.g. depends_any. + [[ $a = any ]] && continue + + for attr in "${multivalued_arch_attrs[@]}"; do + pkgbuild_extract_to_yaml "$1" "${attr}_$a" 1 + done + done +} + +yaml_write_global() { + local singlevalued=(pkgver pkgrel epoch url install changelog) #pkgdesc + local multivalued=(arch groups license checkdepends makedepends + depends provides conflicts replaces) + #noextract options backup optdepends + #source validpgpkeys "${known_hash_algos[@]/%/sums}") + + Yaml+=$(write_empty_line) + Yaml+=$(write_yaml_map 0 "pkgbase") + Yaml+=$(write_yaml_map 2 "name" "${pkgbase:-$pkgname}") + ${details} && srcyaml_write_section_details '' + Yaml+=$(write_empty_line) +} + +yaml_write_package() { + local singlevalued=(url install changelog) #pkgdesc + local multivalued=(arch groups license checkdepends depends + provides conflicts replaces) #options backup optdepends) + + Yaml+=$(write_yaml_map 0 "packages") + for pkg in "${pkgname[@]}"; do + Yaml+=$(write_yaml_seq_map 2 "pkgname" "$pkg") + ${details} && srcyaml_write_section_details "$pkg" + done + Yaml+=$(write_empty_line) +} + +yaml_write_fileinfo(){ + local version + version=$(get_full_version) + pkgbase=${pkgbase:-$pkgname} + Yaml+=$(write_yaml_map 0 "version" "${version:-0}") + Yaml+=$(write_empty_line) + local pkgfile + pkgfile=$(print_all_package_names) + Yaml+=$(write_yaml_map 0 "files") + for f in ${pkgfile}; do + Yaml+=$(write_yaml_seq 2 "${f##*/}") + done + Yaml+=$(write_empty_line) +} + +write_srcyaml(){ + Yaml=$(write_yaml_header) + yaml_write_global + yaml_write_package + yaml_write_fileinfo + printf '%s' "${Yaml}" +} + +#}}} + +usage() { + echo "Usage: ${0##*/} [options]" + echo " -d Don't include details" + echo ' -h This help' + echo '' + exit "$1" +} + +details=true + +opts='dh' + +while getopts "${opts}" arg; do + case "${arg}" in + d) details=false ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +srcpath=$(readlink -f "$1") + +[[ -f "$srcpath"/PKGBUILD ]] || die "%s/PKGBUILD does not exist!" "$srcpath" +package="$srcpath"/PKGBUILD; shift + +# shellcheck disable=1090 +. "${package}" + +load_makepkg_config + +write_srcyaml diff --git a/artools/0.26.1/artools/bin/pkg/pkg2yaml.in b/artools/0.26.1/artools/bin/pkg/pkg2yaml.in new file mode 100644 index 0000000..4c2041d --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/pkg2yaml.in @@ -0,0 +1,162 @@ +#!/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/base/message.sh) +m4_include(lib/base/yaml.sh) + +#{{{ functions + +srcyaml_write_attr(){ + local ident1="$1" ident2="$2" ident3="$3" + local attrname=$4 attrvalues=("${@:5}") + + # normalize whitespace, strip leading and trailing + attrvalues=("${attrvalues[@]//+([[:space:]])/ }") + attrvalues=("${attrvalues[@]#[[:space:]]}") + attrvalues=("${attrvalues[@]%[[:space:]]}") + + case $attrname in + pkgver|pkgrel|epoch|url|install|changelog) + for v in "${attrvalues[@]}"; do + Yaml+=$(write_yaml_map "$ident3" "$attrname" "$v") + done + ;; + *) + Yaml+=$(write_yaml_map "$ident1" "$attrname") + for v in "${attrvalues[@]}"; do + Yaml+=$(write_yaml_seq "$ident2" "$v") + done + ;; + esac +} + +pkgbuild_extract_to_yaml() { + local pkgname=$1 attrname=$2 isarray=$3 outvalue= + + if get_pkgbuild_attribute "$pkgname" "$attrname" "$isarray" 'outvalue'; then + [[ -z $pkgname ]] && srcyaml_write_attr 2 4 2 "$attrname" "${outvalue[@]}" + [[ -n $pkgname ]] && srcyaml_write_attr 4 6 2 "$attrname" "${outvalue[@]}" + fi +} + +srcyaml_write_section_details() { + local attr package_arch a + local multivalued_arch_attrs=(source provides conflicts depends replaces + optdepends makedepends checkdepends) +# "${known_hash_algos[@]/%/sums}") + + for attr in "${singlevalued[@]}"; do + pkgbuild_extract_to_yaml "$1" "$attr" 0 + done + + for attr in "${multivalued[@]}"; do + pkgbuild_extract_to_yaml "$1" "$attr" 1 + done + + get_pkgbuild_attribute "$1" 'arch' 1 'package_arch' + for a in "${package_arch[@]}"; do + # 'any' is special. there's no support for, e.g. depends_any. + [[ $a = any ]] && continue + + for attr in "${multivalued_arch_attrs[@]}"; do + pkgbuild_extract_to_yaml "$1" "${attr}_$a" 1 + done + done +} + +yaml_write_global() { + local singlevalued=(pkgver pkgrel epoch url install changelog) #pkgdesc + local multivalued=(arch groups license checkdepends makedepends + depends provides conflicts replaces) + #noextract options backup optdepends + #source validpgpkeys "${known_hash_algos[@]/%/sums}") + + Yaml+=$(write_empty_line) + Yaml+=$(write_yaml_map 0 "pkgbase") + Yaml+=$(write_yaml_map 2 "name" "${pkgbase:-$pkgname}") + ${details} && srcyaml_write_section_details '' + Yaml+=$(write_empty_line) +} + +yaml_write_package() { + local singlevalued=(url install changelog) #pkgdesc + local multivalued=(arch groups license checkdepends depends + provides conflicts replaces) #options backup optdepends) + + Yaml+=$(write_yaml_map 0 "packages") + for pkg in "${pkgname[@]}"; do + Yaml+=$(write_yaml_seq_map 2 "pkgname" "$pkg") + ${details} && srcyaml_write_section_details "$pkg" + done + Yaml+=$(write_empty_line) +} + +yaml_write_fileinfo(){ + local version + version=$(get_full_version) + pkgbase=${pkgbase:-$pkgname} + Yaml+=$(write_yaml_map 0 "version" "${version:-0}") + Yaml+=$(write_empty_line) + local pkgfile + pkgfile=$(print_all_package_names) + Yaml+=$(write_yaml_map 0 "files") + for f in ${pkgfile}; do + Yaml+=$(write_yaml_seq 2 "${f##*/}") + done + Yaml+=$(write_empty_line) +} + +write_srcyaml(){ + Yaml=$(write_yaml_header) + yaml_write_global + yaml_write_package + yaml_write_fileinfo + printf '%s' "${Yaml}" +} + +#}}} + +usage() { + echo "Usage: ${0##*/} [options]" + echo " -d Don't include details" + echo ' -h This help' + echo '' + exit "$1" +} + +details=true + +opts='dh' + +while getopts "${opts}" arg; do + case "${arg}" in + d) details=false ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +srcpath=$(readlink -f "$1") + +[[ -f "$srcpath"/PKGBUILD ]] || die "%s/PKGBUILD does not exist!" "$srcpath" +package="$srcpath"/PKGBUILD; shift + +# shellcheck disable=1090 +. "${package}" + +load_makepkg_config + +write_srcyaml diff --git a/artools/0.26.1/artools/bin/pkg/signpkg b/artools/0.26.1/artools/bin/pkg/signpkg new file mode 100755 index 0000000..c05fb54 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/signpkg @@ -0,0 +1,180 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ functions + +find_cached_pkgfile() { + local searchdirs=("$PKGDEST" "$PWD") results=() + local pkg="$1" + for dir in "${searchdirs[@]}"; do + [[ -d "$dir" ]] || continue + [[ -e "$dir/$pkg" ]] && results+=("$dir/$pkg") + done + case ${#results[*]} in + 0) + return 1 + ;; + 1) + printf '%s\n' "${results[0]}" + return 0 + ;; + *) + error 'Multiple packages found:' + printf '\t%s\n' "${results[@]}" >&2 + return 1 + ;; + esac +} + +get_pkgbasename() { + local name="$1" + local rm_pkg=${name%.pkg.tar*} + rm_pkg=${rm_pkg%-*} + rm_pkg=${rm_pkg%-*} + rm_pkg=${rm_pkg%-*} + echo "$rm_pkg" +} + +#}}} + + +load_makepkg_config + +passfiles=("$@") + +sign_pkg(){ + local file_to_sign="$1" + + if [ ! -e "$file_to_sign" ]; then + error "%s does not exist!" "$file_to_sign" + exit 1 + fi + + if [[ -n "${BUILDBOT_GPGP}" ]]; then + msg "Signing [%s]" "${file_to_sign##*/}" + gpg --batch --passphrase "${BUILDBOT_GPGP}" --detach-sign "$file_to_sign" + else + msg "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..." + gpg --detach-sign --use-agent -u "${GPGKEY}" "$file_to_sign" + fi +} + +for pkg in "${passfiles[@]}"; do + msg "Searching %s ..." "$pkg" + if pkgfile=$(find_cached_pkgfile "$pkg");then + msg2 "Found: %s" "${pkgfile}" + [[ -e "${pkgfile}".sig ]] && rm "${pkgfile}".sig + sign_pkg "${pkgfile}" + fi +done diff --git a/artools/0.26.1/artools/bin/pkg/signpkg.in b/artools/0.26.1/artools/bin/pkg/signpkg.in new file mode 100644 index 0000000..ae6e700 --- /dev/null +++ b/artools/0.26.1/artools/bin/pkg/signpkg.in @@ -0,0 +1,46 @@ +#!/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/base/message.sh) +m4_include(lib/pkg/deploy.sh) + +load_makepkg_config + +passfiles=("$@") + +sign_pkg(){ + local file_to_sign="$1" + + if [ ! -e "$file_to_sign" ]; then + error "%s does not exist!" "$file_to_sign" + exit 1 + fi + + if [[ -n "${BUILDBOT_GPGP}" ]]; then + msg "Signing [%s]" "${file_to_sign##*/}" + gpg --batch --passphrase "${BUILDBOT_GPGP}" --detach-sign "$file_to_sign" + else + msg "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..." + gpg --detach-sign --use-agent -u "${GPGKEY}" "$file_to_sign" + fi +} + +for pkg in "${passfiles[@]}"; do + msg "Searching %s ..." "$pkg" + if pkgfile=$(find_cached_pkgfile "$pkg");then + msg2 "Found: %s" "${pkgfile}" + [[ -e "${pkgfile}".sig ]] && rm "${pkgfile}".sig + sign_pkg "${pkgfile}" + fi +done diff --git a/artools/0.26.1/artools/data/conf/artools-base.conf b/artools/0.26.1/artools/data/conf/artools-base.conf new file mode 100644 index 0000000..4954b0b --- /dev/null +++ b/artools/0.26.1/artools/data/conf/artools-base.conf @@ -0,0 +1,9 @@ +############################################# +################ artools-base ############### +############################################# + +# build dir where buildpkg or buildiso chroots are created +# CHROOTS_DIR=/var/lib/artools + +# the workspace directory +# WORKSPACE_DIR="${USER_HOME}/artools-workspace" diff --git a/artools/0.26.1/artools/data/conf/artools-iso.conf b/artools/0.26.1/artools/data/conf/artools-iso.conf new file mode 100644 index 0000000..446e692 --- /dev/null +++ b/artools/0.26.1/artools/data/conf/artools-iso.conf @@ -0,0 +1,21 @@ +############################################# +################ artools-iso ################ +############################################# + +# the iso storage directory +# ISO_POOL="${WORKSPACE_DIR}/iso" + +# the dist release; default: auto +# ISO_VERSION=$(date +%Y%m%d) + +# possible values: openrc, runit, s6, suite66, dinit +# INITSYS="openrc" + +# gpg key; leave empty or commented to skip img signing +# GPG_KEY="" + +# possible values: zstd (default), xz +# COMPRESSION="zstd" + +# zstd only: range 1..22 +# COMPRESSION_LEVEL=15 diff --git a/artools/0.26.1/artools/data/conf/artools-pkg.conf b/artools/0.26.1/artools/data/conf/artools-pkg.conf new file mode 100644 index 0000000..c4829f9 --- /dev/null +++ b/artools/0.26.1/artools/data/conf/artools-pkg.conf @@ -0,0 +1,59 @@ +############################################# +################ artools-pkg ################ +############################################# + +# gitea user access token for buildtree +# GIT_TOKEN='' + +# TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux + +# customize buildtree; uncomment to include +# TREE_NAMES_ARTIX=( +# packages-kernel +# packages-llvm +# packages-openrc +# packages-runit +# packages-s6 +# packages-suite66 +# packages-dinit +# packages-perl +# packages-java +# packages-ruby +# packages-gtk +# packages-qt5 +# packages-qt6 +# packages-xorg +# packages-plasma +# packages-kde +# packages-gnome +# packages-cinnamon +# packages-lxqt +# packages-lxde +# packages-mate +# packages-xfce +# packages-wm +# packages-devel +# packages-qt6 +# packages-office +# packages-misc +# python-world +# python-galaxy +# python-galaxy-groups +# python-misc +# packages-python +# packages-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' diff --git a/artools/0.26.1/artools/data/pacman/makepkg.conf b/artools/0.26.1/artools/data/pacman/makepkg.conf new file mode 100644 index 0000000..9d1b2f2 --- /dev/null +++ b/artools/0.26.1/artools/data/pacman/makepkg.conf @@ -0,0 +1,161 @@ +#!/hint/bash +# shellcheck disable=2034 + +# +# /etc/makepkg.conf +# + +######################################################################### +# SOURCE ACQUISITION +######################################################################### +# +#-- The download utilities that makepkg should use to acquire sources +# Format: 'protocol::agent' +DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u' + 'ftp::/usr/bin/curl -qgfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u' + 'http::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' + 'https::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' + 'rsync::/usr/bin/rsync --no-motd -z %u %o' + 'scp::/usr/bin/scp -C %u %o') + +# Other common tools: +# /usr/bin/snarf +# /usr/bin/lftpget -c +# /usr/bin/wget + +#-- The package required by makepkg to download VCS sources +# Format: 'protocol::package' +VCSCLIENTS=('bzr::bzr' + 'fossil::fossil' + 'git::git' + 'hg::mercurial' + 'svn::subversion') + +######################################################################### +# ARCHITECTURE, COMPILE FLAGS +######################################################################### +# +CARCH="x86_64" +CHOST="x86_64-pc-linux-gnu" + +#-- Compiler and Linker Flags +#CPPFLAGS="" +CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \ + -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ + -fstack-clash-protection -fcf-protection" +CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS" +LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" +#RUSTFLAGS="-C opt-level=2" +#-- Make Flags: change this for DistCC/SMP systems +#MAKEFLAGS="-j2" +#-- Debugging flags +DEBUG_CFLAGS="-g -fvar-tracking-assignments" +DEBUG_CXXFLAGS="-g -fvar-tracking-assignments" +#DEBUG_RUSTFLAGS="-C debuginfo=2" + +######################################################################### +# BUILD ENVIRONMENT +######################################################################### +# +# Makepkg defaults: BUILDENV=(!distcc !color !ccache check !sign) +# A negated environment option will do the opposite of the comments below. +# +#-- distcc: Use the Distributed C/C++/ObjC compiler +#-- color: Colorize output messages +#-- ccache: Use ccache to cache compilation +#-- check: Run the check() function if present in the PKGBUILD +#-- sign: Generate PGP signature file +# +BUILDENV=(!distcc color !ccache check !sign) +# +#-- If using DistCC, your MAKEFLAGS will also need modification. In addition, +#-- specify a space-delimited list of hosts running in the DistCC cluster. +#DISTCC_HOSTS="" +# +#-- Specify a directory for package building. +#BUILDDIR=/tmp/makepkg + +######################################################################### +# GLOBAL PACKAGE OPTIONS +# These are default values for the options=() settings +######################################################################### +# +# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto) +# A negated option will do the opposite of the comments below. +# +#-- strip: Strip symbols from binaries/libraries +#-- docs: Save doc directories specified by DOC_DIRS +#-- libtool: Leave libtool (.la) files in packages +#-- staticlibs: Leave static library (.a) files in packages +#-- emptydirs: Leave empty directories in packages +#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip +#-- purge: Remove files specified by PURGE_TARGETS +#-- debug: Add debugging flags as specified in DEBUG_* variables +#-- lto: Add compile flags for building with link time optimization +# +OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug lto) + +#-- File integrity checks to use. Valid: md5, sha1, sha224, sha256, sha384, sha512, b2 +INTEGRITY_CHECK=(sha256) +#-- Options to be used when stripping binaries. See `man strip' for details. +STRIP_BINARIES="--strip-all" +#-- Options to be used when stripping shared libraries. See `man strip' for details. +STRIP_SHARED="--strip-unneeded" +#-- Options to be used when stripping static libraries. See `man strip' for details. +STRIP_STATIC="--strip-debug" +#-- Manual (man and info) directories to compress (if zipman is specified) +MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info}) +#-- Doc directories to remove (if !docs is specified) +DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) +#-- Files to be removed from all packages (if purge is specified) +PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod) +#-- Directory to store source code in for debug packages +DBGSRCDIR="/usr/src/debug" + +######################################################################### +# PACKAGE OUTPUT +######################################################################### +# +# Default: put built package and cached source in build directory +# +#-- Destination: specify a fixed directory where all packages will be placed +#PKGDEST=/home/packages +#-- Source cache: specify a fixed directory where source files will be cached +#SRCDEST=/home/sources +#-- Source packages: specify a fixed directory where all src packages will be placed +#SRCPKGDEST=/home/srcpackages +#-- Log files: specify a fixed directory where all log files will be placed +#LOGDEST=/home/makepkglogs +#-- Packager: name/email of the person or organization building packages +#PACKAGER="John Doe " +#-- Specify a key to use for package signing +#GPGKEY="" + +######################################################################### +# COMPRESSION DEFAULTS +######################################################################### +# +COMPRESSGZ=(gzip -c -f -n) +COMPRESSBZ2=(bzip2 -c -f) +COMPRESSXZ=(xz -c -z -) +COMPRESSZST=(zstd -c -T0 --ultra -20 -) +COMPRESSLRZ=(lrzip -q) +COMPRESSLZO=(lzop -q) +COMPRESSZ=(compress -c -f) +COMPRESSLZ4=(lz4 -q) +COMPRESSLZ=(lzip -c -f) + +######################################################################### +# EXTENSION DEFAULTS +######################################################################### +# +PKGEXT='.pkg.tar.zst' +SRCEXT='.src.tar.gz' + +######################################################################### +# OTHER +######################################################################### +# +#-- Command used to run pacman as root, instead of trying sudo and su +#PACMAN_AUTH=() +# vim: set ft=sh ts=2 sw=2 et: diff --git a/artools/0.26.1/artools/data/pacman/pacman-default.conf b/artools/0.26.1/artools/data/pacman/pacman-default.conf new file mode 100644 index 0000000..64559bc --- /dev/null +++ b/artools/0.26.1/artools/data/pacman/pacman-default.conf @@ -0,0 +1,92 @@ +# +# /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 = + +# 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. + +#[gremlins] +#Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +#[galaxy-gremlins] +#Include = /etc/pacman.d/mirrorlist + +[galaxy] +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 diff --git a/artools/0.26.1/artools/data/pacman/pacman-docker.conf b/artools/0.26.1/artools/data/pacman/pacman-docker.conf new file mode 100644 index 0000000..01a1688 --- /dev/null +++ b/artools/0.26.1/artools/data/pacman/pacman-docker.conf @@ -0,0 +1,99 @@ +# +# /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 diff --git a/artools/0.26.1/artools/data/pacman/pacman-gnome-wobble.conf b/artools/0.26.1/artools/data/pacman/pacman-gnome-wobble.conf new file mode 100644 index 0000000..bcc3a2d --- /dev/null +++ b/artools/0.26.1/artools/data/pacman/pacman-gnome-wobble.conf @@ -0,0 +1,101 @@ +# +# /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 = + +# 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. + +[gnome-wobble] +Include = /etc/pacman.d/mirrorlist + +[goblins] +Include = /etc/pacman.d/mirrorlist + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-goblins] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +Include = /etc/pacman.d/mirrorlist + +[galaxy] +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 diff --git a/artools/0.26.1/artools/data/pacman/pacman-goblins.conf b/artools/0.26.1/artools/data/pacman/pacman-goblins.conf new file mode 100644 index 0000000..a085590 --- /dev/null +++ b/artools/0.26.1/artools/data/pacman/pacman-goblins.conf @@ -0,0 +1,98 @@ +# +# /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 = + +# 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. + +[goblins] +Include = /etc/pacman.d/mirrorlist + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-goblins] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +Include = /etc/pacman.d/mirrorlist + +[galaxy] +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 diff --git a/artools/0.26.1/artools/data/pacman/pacman-gremlins.conf b/artools/0.26.1/artools/data/pacman/pacman-gremlins.conf new file mode 100644 index 0000000..26ff03e --- /dev/null +++ b/artools/0.26.1/artools/data/pacman/pacman-gremlins.conf @@ -0,0 +1,92 @@ +# +# /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 = + +# 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. + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +Include = /etc/pacman.d/mirrorlist + +[galaxy] +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 diff --git a/artools/0.26.1/artools/data/pacman/pacman-kde-wobble.conf b/artools/0.26.1/artools/data/pacman/pacman-kde-wobble.conf new file mode 100644 index 0000000..640417d --- /dev/null +++ b/artools/0.26.1/artools/data/pacman/pacman-kde-wobble.conf @@ -0,0 +1,101 @@ +# +# /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 = + +# 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. + +[kde-wobble] +Include = /etc/pacman.d/mirrorlist + +[goblins] +Include = /etc/pacman.d/mirrorlist + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-goblins] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +Include = /etc/pacman.d/mirrorlist + +[galaxy] +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 diff --git a/artools/0.26.1/artools/data/pacman/pacman-lib32-goblins.conf b/artools/0.26.1/artools/data/pacman/pacman-lib32-goblins.conf new file mode 100644 index 0000000..971a4bc --- /dev/null +++ b/artools/0.26.1/artools/data/pacman/pacman-lib32-goblins.conf @@ -0,0 +1,110 @@ +# +# /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 = + +# 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. + +[goblins] +Include = /etc/pacman.d/mirrorlist + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-goblins] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +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-goblins] +Include = /etc/pacman.d/mirrorlist + +[lib32-gremlins] +Include = /etc/pacman.d/mirrorlist + +[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 diff --git a/artools/0.26.1/artools/data/pacman/pacman-lib32-gremlins.conf b/artools/0.26.1/artools/data/pacman/pacman-lib32-gremlins.conf new file mode 100644 index 0000000..379dfda --- /dev/null +++ b/artools/0.26.1/artools/data/pacman/pacman-lib32-gremlins.conf @@ -0,0 +1,101 @@ +# +# /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 = + +# 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. + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +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-gremlins] +Include = /etc/pacman.d/mirrorlist + +[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 diff --git a/artools/0.26.1/artools/data/pacman/pacman-lib32.conf b/artools/0.26.1/artools/data/pacman/pacman-lib32.conf new file mode 100644 index 0000000..a5e6621 --- /dev/null +++ b/artools/0.26.1/artools/data/pacman/pacman-lib32.conf @@ -0,0 +1,101 @@ +# +# /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 = + +# 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. + +#[gremlins] +#Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +#[galaxy-gremlins] +#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-gremlins] +#Include = /etc/pacman.d/mirrorlist + +[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 diff --git a/artools/0.26.1/artools/data/patches/artix-bash.patch b/artools/0.26.1/artools/data/patches/artix-bash.patch new file mode 100644 index 0000000..15daaba --- /dev/null +++ b/artools/0.26.1/artools/data/patches/artix-bash.patch @@ -0,0 +1,87 @@ +--- /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}$(/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 + # + diff --git a/artools/0.26.1/artools/data/valid-names.conf b/artools/0.26.1/artools/data/valid-names.conf new file mode 100644 index 0000000..57bdbdd --- /dev/null +++ b/artools/0.26.1/artools/data/valid-names.conf @@ -0,0 +1,42 @@ +#!/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]}" +) diff --git a/artools/0.26.1/artools/debian/.debhelper/generated/artools/installed-by-dh_installdocs b/artools/0.26.1/artools/debian/.debhelper/generated/artools/installed-by-dh_installdocs new file mode 100644 index 0000000..e69de29 diff --git a/artools/0.26.1/artools/debian/artools.substvars b/artools/0.26.1/artools/debian/artools.substvars new file mode 100644 index 0000000..978fc8b --- /dev/null +++ b/artools/0.26.1/artools/debian/artools.substvars @@ -0,0 +1,2 @@ +misc:Depends= +misc:Pre-Depends= diff --git a/artools/0.26.1/artools/debian/artools/DEBIAN/conffiles b/artools/0.26.1/artools/debian/artools/DEBIAN/conffiles new file mode 100644 index 0000000..ca80441 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/DEBIAN/conffiles @@ -0,0 +1,3 @@ +/etc/artools/artools-base.conf +/etc/artools/artools-iso.conf +/etc/artools/artools-pkg.conf diff --git a/artools/0.26.1/artools/debian/artools/DEBIAN/control b/artools/0.26.1/artools/debian/artools/DEBIAN/control new file mode 100644 index 0000000..b626f9a --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/DEBIAN/control @@ -0,0 +1,11 @@ +Package: artools +Version: 0.26.1-1 +Architecture: amd64 +Maintainer: Nathan Owens +Installed-Size: 331 +Depends: pacman +Section: misc +Priority: medium +Homepage: https://gitea.artixlinux.org/artix/artools +Description: Artix linux packaging + Tools used for Artix linux packaging diff --git a/artools/0.26.1/artools/debian/artools/DEBIAN/md5sums b/artools/0.26.1/artools/debian/artools/DEBIAN/md5sums new file mode 100644 index 0000000..b3a16b5 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/DEBIAN/md5sums @@ -0,0 +1,36 @@ +6baed6761084c9232f57924554480e06 usr/bin/artix-chroot +4639f727eaf4addb996f70b792feb8f4 usr/bin/basestrap +08651c365037779369148ffd6b53b707 usr/bin/batchpkg +ccda6a2d66085205c5990696b5ed9519 usr/bin/buildiso +8f751869346ea5bdf41eddd3ad972470 usr/bin/buildpkg +1cc04eb3aafe79a774985c788dd8a6d0 usr/bin/buildtree +afa49cd2fe1e045cbbc847d1d402ffa1 usr/bin/checkpkg +15959d076088753e40e643ba3ea25dab usr/bin/checkrepo +09d950e0e1522f961d2f4704a8dd1289 usr/bin/chroot-run +bf6b41ff330c34de6d66d9b4a1d0936c usr/bin/commitpkg +d3d205c3e6a28d5c587bfbb8191c4931 usr/bin/comparepkg +8cbef5d334401cb0d1d9dbd6aa1fa264 usr/bin/deploypkg +4263db4a86aed66dc99d6a97b16928e0 usr/bin/find-libdeps +0f5ebacf83572eba79bb51dc9575b9ae usr/bin/finddeps +ee1e248f1ec0d075ec7ff8aac54a5252 usr/bin/fstabgen +6690196c4576472db5c2288ba942f4ff usr/bin/gitearepo +3fc6f980fd83c03aa43e976a56abcac6 usr/bin/lddd +430719c5ec9dc5fba1d09347a619a5b7 usr/bin/links-add +d310cb0bd5c6ef8359d8e8e8807702ad usr/bin/mkchroot +522aaedb9c251e1db4482c88c6e969ee usr/bin/mkchrootpkg +276f3b2d8b6bc8685dd50b8a3bf14f83 usr/bin/pkg2yaml +cd81102f4036d498d4218d041632ec1d usr/bin/signpkg +f74cc2b6ba2675d629fa59f65adddfda usr/share/artools/makepkg.conf +732a1176492ebdd0b7f33a510759e60d usr/share/artools/pacman-default.conf +d7a315e5f3f38a11ec6088c0ef18e747 usr/share/artools/pacman-docker.conf +5c9fc484f08cf7c2013e81af03dafb97 usr/share/artools/pacman-gnome-wobble.conf +19ec8b44b710fc5502f1c824ef35d931 usr/share/artools/pacman-goblins.conf +3a3b7c0dddd2383e01dd864f4f7f44a7 usr/share/artools/pacman-gremlins.conf +feca0568fb28b43f942022e9f312633b usr/share/artools/pacman-kde-wobble.conf +f237026ce33a0849e3af85a8929ae051 usr/share/artools/pacman-lib32-goblins.conf +2bd50ec827d22f7251b67688ce09167c usr/share/artools/pacman-lib32-gremlins.conf +6f17f9619daf54e00039a296783e129a usr/share/artools/pacman-lib32.conf +38cb4015ec695dceee0669385a2b891b usr/share/artools/patches/artix-bash.patch +8f489af6be6ce56664e1f2f170702d04 usr/share/artools/valid-names.conf +54418370f8d9dd1ca1b9eff34afecb1e usr/share/doc/artools/changelog.Debian.gz +12441c75fc57cffbd52c9a9c2f92c91d usr/share/doc/artools/copyright diff --git a/artools/0.26.1/artools/debian/artools/etc/artools/artools-base.conf b/artools/0.26.1/artools/debian/artools/etc/artools/artools-base.conf new file mode 100644 index 0000000..4954b0b --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/etc/artools/artools-base.conf @@ -0,0 +1,9 @@ +############################################# +################ artools-base ############### +############################################# + +# build dir where buildpkg or buildiso chroots are created +# CHROOTS_DIR=/var/lib/artools + +# the workspace directory +# WORKSPACE_DIR="${USER_HOME}/artools-workspace" diff --git a/artools/0.26.1/artools/debian/artools/etc/artools/artools-iso.conf b/artools/0.26.1/artools/debian/artools/etc/artools/artools-iso.conf new file mode 100644 index 0000000..446e692 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/etc/artools/artools-iso.conf @@ -0,0 +1,21 @@ +############################################# +################ artools-iso ################ +############################################# + +# the iso storage directory +# ISO_POOL="${WORKSPACE_DIR}/iso" + +# the dist release; default: auto +# ISO_VERSION=$(date +%Y%m%d) + +# possible values: openrc, runit, s6, suite66, dinit +# INITSYS="openrc" + +# gpg key; leave empty or commented to skip img signing +# GPG_KEY="" + +# possible values: zstd (default), xz +# COMPRESSION="zstd" + +# zstd only: range 1..22 +# COMPRESSION_LEVEL=15 diff --git a/artools/0.26.1/artools/debian/artools/etc/artools/artools-pkg.conf b/artools/0.26.1/artools/debian/artools/etc/artools/artools-pkg.conf new file mode 100644 index 0000000..c4829f9 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/etc/artools/artools-pkg.conf @@ -0,0 +1,59 @@ +############################################# +################ artools-pkg ################ +############################################# + +# gitea user access token for buildtree +# GIT_TOKEN='' + +# TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux + +# customize buildtree; uncomment to include +# TREE_NAMES_ARTIX=( +# packages-kernel +# packages-llvm +# packages-openrc +# packages-runit +# packages-s6 +# packages-suite66 +# packages-dinit +# packages-perl +# packages-java +# packages-ruby +# packages-gtk +# packages-qt5 +# packages-qt6 +# packages-xorg +# packages-plasma +# packages-kde +# packages-gnome +# packages-cinnamon +# packages-lxqt +# packages-lxde +# packages-mate +# packages-xfce +# packages-wm +# packages-devel +# packages-qt6 +# packages-office +# packages-misc +# python-world +# python-galaxy +# python-galaxy-groups +# python-misc +# packages-python +# packages-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' diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/artix-chroot b/artools/0.26.1/artools/debian/artools/usr/bin/artix-chroot new file mode 100755 index 0000000..54dd3a2 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/artix-chroot @@ -0,0 +1,381 @@ +#!/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. + +shopt -s extglob + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + +#!/hint/bash + +#{{{ mount + +ignore_error() { + "$@" 2>/dev/null + return 0 +} + +trap_setup(){ + [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' + trap "$1" EXIT +} + +chroot_mount() { +# msg2 "mount: [%s]" "$2" + mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") +} + +chroot_add_resolv_conf() { + local chrootdir=$1 resolv_conf=$1/etc/resolv.conf + + [[ -e /etc/resolv.conf ]] || return 0 + + # Handle resolv.conf as a symlink to somewhere else. + if [[ -L $chrootdir/etc/resolv.conf ]]; then + # readlink(1) should always give us *something* since we know at this point + # it's a symlink. For simplicity, ignore the case of nested symlinks. + resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") + if [[ $resolv_conf = /* ]]; then + resolv_conf=$chrootdir$resolv_conf + else + resolv_conf=$chrootdir/etc/$resolv_conf + fi + + # ensure file exists to bind mount over + if [[ ! -f $resolv_conf ]]; then + install -Dm644 /dev/null "$resolv_conf" || return 1 + fi + elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then + # The chroot might not have a resolv.conf. + return 0 + fi + + chroot_mount /etc/resolv.conf "$resolv_conf" --bind +} + +chroot_mount_conditional() { + local cond=$1; shift + if eval "$cond"; then + chroot_mount "$@" + fi +} + +chroot_setup(){ + local mnt="$1" os="$2" args='-t tmpfs -o nosuid,nodev,mode=0755' + $os && args='--bind' + chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && + chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && + chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && + ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \ + efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && + chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && + chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && + chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && + chroot_mount /run "$mnt/run" ${args} && + chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid +} + +chroot_api_mount() { + CHROOT_ACTIVE_MOUNTS=() + trap_setup chroot_api_umount + chroot_setup "$1" false +} + +chroot_api_umount() { + if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then +# msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" + umount "${CHROOT_ACTIVE_MOUNTS[@]}" + fi + unset CHROOT_ACTIVE_MOUNTS +} + +#}}} + + +#{{{ functions + +chroot_part_mount() { + msg2 "mount: [%s]" "$2" + mount "$@" && CHROOT_ACTIVE_PART_MOUNTS=("$2" "${CHROOT_ACTIVE_PART_MOUNTS[@]}") +} + +chroot_part_umount() { + chroot_api_umount + msg2 "umount: [%s]" "${CHROOT_ACTIVE_PART_MOUNTS[@]}" + umount "${CHROOT_ACTIVE_PART_MOUNTS[@]}" + unset CHROOT_ACTIVE_PART_MOUNTS +} + +detect(){ + local detected + detected="$(os-prober | tr ' ' '_' | paste -s -d ' ')" + echo "${detected}" +} + +# $1: os-prober array +get_os_name(){ + local str=$1 + str="${str#*:}" + str="${str#*:}" + str="${str%:*}" + echo "$str" +} + +mount_os(){ + CHROOT_ACTIVE_PART_MOUNTS=() + CHROOT_ACTIVE_MOUNTS=() + + trap_setup chroot_part_umount + + chroot_part_mount "$2" "$1" + + local mounts + mounts=$(perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^UUID=#;' "$1"/etc/fstab) + + for entry in ${mounts}; do + entry=${entry//UUID=} + local dev=${entry%:*} mp=${entry#*:} + case "${entry#*:}" in + '/'|'swap'|'none') continue ;; + *) chroot_part_mount "/dev/disk/by-uuid/${dev}" "$1${mp}" ;; + esac + done + + chroot_setup "$1" true + chroot_add_resolv_conf "$1" +} + +select_os(){ + local os_list=( "$(detect)" ) count=${#os_list[@]} + if [[ ${count} -gt 1 ]];then + msg "Detected systems:" + local i=0 + for os in "${os_list[@]}"; do + local last=${os##*:} + case $last in + 'efi') count=$((count-1)) ;; + *) msg2 "$i) $(get_os_name "$os")"; i=$((i+1)) ;; + esac + done + i=0 + msg "Select system to mount [0-%s] : " "$((count-1))" + read -r select + else + select=0 + fi + local os_str=${os_list[$select]} type + type=$os_str + root=${os_str%%:*} + type=${type##*:} + if [[ "${type##*:}" == 'linux' ]];then + msg "Mounting (%s) [%s]" "$(get_os_name "$os_str")" "$root" + mount_os "$1" "$root" + else + die "You can't mount %s!" "$select" + fi +} + +#}}} + +automount=false + +usage() { + echo "usage: ${0##*/} -a [or] ${0##*/} chroot-dir [command]" + echo ' -a Automount detected linux system' + echo ' -h Print this help message' + echo '' + echo " If 'command' is unspecified, ${0##*/} will launch /bin/sh." + echo '' + echo " If 'automount' is true, ${0##*/} will launch /bin/bash" + echo " and ${chrootdir}." + echo '' + echo '' + exit "$1" +} + +opts=':ha' + +while getopts ${opts} arg; do + case "${arg}" in + a) automount=true ;; + h|?) usage 0 ;; + *) echo "invalid argument ${arg}"; usage 1 ;; + esac +done +shift $(( OPTIND - 1 )) + +check_root + +if ${automount};then + chrootdir=/mnt + run_args=(/bin/bash) + + select_os "${chrootdir}" +else + chrootdir=$1 + shift + run_args=("$@") + + [[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}" + + chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}" + chroot_add_resolv_conf "${chrootdir}" +fi + +SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "${run_args[@]}" diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/artools-chroot b/artools/0.26.1/artools/debian/artools/usr/bin/artools-chroot new file mode 120000 index 0000000..faa7faa --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/artools-chroot @@ -0,0 +1 @@ +artix-chroot \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/basestrap b/artools/0.26.1/artools/debian/artools/usr/bin/basestrap new file mode 100755 index 0000000..611bd60 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/basestrap @@ -0,0 +1,356 @@ +#!/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. + +# +# Assumptions: +# 1) User has partitioned, formatted, and mounted partitions on /mnt +# 2) Network is functional +# 3) Arguments passed to the script are valid pacman targets +# 4) A valid mirror appears in /etc/pacman.d/mirrorlist +# + +shopt -s extglob + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ mount + +ignore_error() { + "$@" 2>/dev/null + return 0 +} + +trap_setup(){ + [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' + trap "$1" EXIT +} + +chroot_mount() { +# msg2 "mount: [%s]" "$2" + mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") +} + +chroot_add_resolv_conf() { + local chrootdir=$1 resolv_conf=$1/etc/resolv.conf + + [[ -e /etc/resolv.conf ]] || return 0 + + # Handle resolv.conf as a symlink to somewhere else. + if [[ -L $chrootdir/etc/resolv.conf ]]; then + # readlink(1) should always give us *something* since we know at this point + # it's a symlink. For simplicity, ignore the case of nested symlinks. + resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") + if [[ $resolv_conf = /* ]]; then + resolv_conf=$chrootdir$resolv_conf + else + resolv_conf=$chrootdir/etc/$resolv_conf + fi + + # ensure file exists to bind mount over + if [[ ! -f $resolv_conf ]]; then + install -Dm644 /dev/null "$resolv_conf" || return 1 + fi + elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then + # The chroot might not have a resolv.conf. + return 0 + fi + + chroot_mount /etc/resolv.conf "$resolv_conf" --bind +} + +chroot_mount_conditional() { + local cond=$1; shift + if eval "$cond"; then + chroot_mount "$@" + fi +} + +chroot_setup(){ + local mnt="$1" os="$2" args='-t tmpfs -o nosuid,nodev,mode=0755' + $os && args='--bind' + chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && + chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && + chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && + ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \ + efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && + chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && + chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && + chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && + chroot_mount /run "$mnt/run" ${args} && + chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid +} + +chroot_api_mount() { + CHROOT_ACTIVE_MOUNTS=() + trap_setup chroot_api_umount + chroot_setup "$1" false +} + +chroot_api_umount() { + if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then +# msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" + umount "${CHROOT_ACTIVE_MOUNTS[@]}" + fi + unset CHROOT_ACTIVE_MOUNTS +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + + +#{{{ functions + +copy_mirrorlist(){ + cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/" +} + +copy_keyring(){ + if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then + cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/" + fi +} + +create_min_fs(){ + msg "Creating install root at %s" "$1" + mkdir -m 0755 -p "$1"/var/{cache/pacman/pkg,lib/pacman,log} "$1"/{dev,run,etc/pacman.d} + mkdir -m 1777 -p "$1"/tmp + mkdir -m 0555 -p "$1"/{sys,proc} +} + +#}}} + +newroot=/mnt + +hostcache=0 +copykeyring=1 +copymirrorlist=1 +pacmode=-Sy + +usage() { + echo "usage: ${0##*/} [options] root [packages...]" + echo " -C Use an alternate config file for pacman" + echo " -c Use the package cache on the host, rather than the target" + echo " -G Avoid copying the host's pacman keyring to the target" + echo " -i Avoid auto-confirmation of package selections" + echo " -M Avoid copying the host's mirrorlist to the target" + echo ' -U Use pacman -U to install packages' + echo " -h Print this help message" + echo '' + echo ' basestrap installs packages to the specified new root directory.' + echo ' If no packages are given, basestrap defaults to the "base" group.' + echo '' + echo '' + exit "$1" +} + +opts=':C:cGiMU' + +while getopts ${opts} arg; do + case "${arg}" in + C) pacman_conf=$OPTARG ;; + c) hostcache=1 ;; + i) interactive=1 ;; + G) copykeyring=0 ;; + M) copymirrorlist=0 ;; + U) pacmode=-U ;; + :) echo "invalid argument ${arg}:$OPTARG"; usage 1;; + ?) usage 0 ;; + esac +done +shift $(( OPTIND - 1 )) + +check_root + +(( $# )) || die "No root directory specified" +newroot=$1; shift +pacman_args=("${@:-base}") + +if (( ! hostcache ));then + pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg") +fi + +if (( ! interactive )); then + pacman_args+=(--noconfirm) +fi + +[[ -n $pacman_conf ]] && pacman_args+=(--config="$pacman_conf") + +[[ -d $newroot ]] || die "%s is not a directory" "$newroot" + +# create obligatory directories +create_min_fs "$newroot" + +# mount API filesystems +chroot_api_mount "$newroot" || die "failed to setup API filesystems in new root" + +if (( copykeyring ));then + copy_keyring "$newroot" +fi + +msg2 'Installing packages to %s' "$newroot" +if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then + die 'Failed to install packages to new root' +fi + + +if (( copymirrorlist ));then + copy_mirrorlist "$newroot" +fi diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/batchpkg b/artools/0.26.1/artools/debian/artools/usr/bin/batchpkg new file mode 100755 index 0000000..fa0dafa --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/batchpkg @@ -0,0 +1,328 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +#{{{ 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}" -u -p "${pkg}" + else + msg "%s" "${dest}pkg -s ${src} -u -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 -u -p "${pkg}" + else + msg "buildtree -i -p ${pkg}" + msg2 "${dest}pkg -u -p ${pkg}" + fi + done < "$pkglist" +} + +#}}} + +usage() { + echo "Usage: ${0##*/} [optional listname]" + echo ' -r Run generated commands' + echo ' -c Create subrepos from list' + echo ' -u Update subrepos from list' + echo ' -h This help' + echo '' + echo '' + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + 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 diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildiso b/artools/0.26.1/artools/debian/artools/usr/bin/buildiso new file mode 100755 index 0000000..d6f34b7 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildiso @@ -0,0 +1,1327 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ iso conf + +load_iso_config(){ + + local conf="$1/artools-iso.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-iso.conf + [[ -r "$conf" ]] && . "$conf" + + ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"} + + ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"} + + INITSYS=${INITSYS:-'openrc'} + + GPG_KEY=${GPG_KEY:-''} + + COMPRESSION="${COMPRESSION:-zstd}" + + COMPRESSION_LEVEL="${COMPRESSION_LEVEL:-15}" + + if [[ -z "${COMPRESSION_ARGS[*]}" ]]; then + COMPRESSION_ARGS=(-Xcompression-level "${COMPRESSION_LEVEL}") + fi + + if [[ "${COMPRESSION}" == 'xz' ]]; then + COMPRESSION_ARGS=(-Xbcj x86) + fi + + return 0 +} + +#}}} + +load_iso_config "${USER_CONF_DIR}" || load_iso_config "${SYSCONFDIR}" + +prepare_dir "${ISO_POOL}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/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" +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + +#!/hint/bash + +#{{{ mount + +track_img() { + msg2 "mount: [%s]" "$2" + mount "$@" && IMG_ACTIVE_MOUNTS=("$2" "${IMG_ACTIVE_MOUNTS[@]}") +} + +mount_img() { + IMG_ACTIVE_MOUNTS=() + mkdir -p "$2" + track_img "$1" "$2" +} + +umount_img() { + if [[ -n "${IMG_ACTIVE_MOUNTS[*]}" ]];then + msg2 "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}" + umount "${IMG_ACTIVE_MOUNTS[@]}" + unset IMG_ACTIVE_MOUNTS + rm -r "$1" + fi +} + +track_fs() { + msg2 "overlayfs mount: [%s]" "$5" + mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}") +} + +mount_overlayfs(){ + FS_ACTIVE_MOUNTS=() + local lower upper="$1" work="$2" + mkdir -p "${mnt_dir}/work" + mkdir -p "$upper" + case $upper in + */livefs) lower="$work/rootfs" ;; + */bootfs) + lower="$work/rootfs" + [[ -d "$work/livefs" ]] && lower="$work/livefs:$work/rootfs" + ;; + esac + # shellcheck disable=2140 + track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper" +} + +umount_overlayfs(){ + if [[ -n "${FS_ACTIVE_MOUNTS[*]}" ]];then + msg2 "overlayfs umount: [%s]" "${FS_ACTIVE_MOUNTS[@]}" + umount "${FS_ACTIVE_MOUNTS[@]}" + unset FS_ACTIVE_MOUNTS + rm -rf "${mnt_dir}/work" + fi +} + +#}}} + +#!/hint/bash + +#{{{ services + +add_svc_openrc(){ + local mnt="$1" names="$2" rlvl="${3:-default}" + for svc in $names; do + if [[ -f $mnt/etc/init.d/$svc ]];then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" rc-update add "$svc" "$rlvl" &>/dev/null + fi + done +} + +add_svc_runit(){ + local mnt="$1" names="$2" rlvl="${3:-default}" + for svc in $names; do + if [[ -d $mnt/etc/runit/sv/$svc ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" ln -s /etc/runit/sv/"$svc" /etc/runit/runsvdir/"$rlvl" &>/dev/null + fi + done +} + +add_svc_s6(){ + local mnt="$1" names="$2" rlvl="${3:-default}" error ret + local db=/etc/s6/rc/compiled + for svc in $names; do + error=false + chroot "$mnt" s6-rc-db -c "$db" type "$svc" &> /dev/null || error=true + ret="$?" + if [ $ret -eq 0 ] && [[ "$error" == false ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" s6-rc-bundle-update -c "$db" add "$rlvl" "$svc" + fi + done + + local rlvl=/etc/s6/current + # rebuild s6-linux-init binaries + chroot "$mnt" rm -r "$rlvl" + chroot "$mnt" s6-linux-init-maker -1 -N -f /etc/s6/skel -G "/usr/bin/agetty -L -8 tty7 115200" -c "$rlvl" "$rlvl" + chroot "$mnt" mv "$rlvl"/bin/init "$rlvl"/bin/s6-init + chroot "$mnt" cp -a "$rlvl"/bin /usr +} + +add_svc_suite66(){ + local mnt="$1" names="$2" + for svc in $names; do + if [[ -f "$mnt"/etc/66/service/"$svc" ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" 66-enable -t default "$svc" &>/dev/null + fi + done +} + +add_svc_dinit(){ + local mnt="$1" names="$2" + for svc in $names; do + if [[ -d $mnt/etc/dinit.d/boot.d ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" ln -s ../"$svc" /etc/dinit.d/boot.d/"$svc" &>/dev/null + fi + done +} + +#}}} + +#!/hint/bash + +#{{{ yaml + +write_yaml_header(){ + printf '%s' '---' +} + +write_empty_line(){ + printf '\n%s\n' ' ' +} + +write_yaml_map(){ + local ident="$1" key="$2" val="$3" + printf "\n%${ident}s%s: %s\n" '' "$key" "$val" +} + +write_yaml_seq(){ + local ident="$1" val="$2" + printf "\n%${ident}s- %s\n" '' "$val" +} + +write_yaml_seq_map(){ + local ident="$1" key="$2" val="$3" + printf "\n%${ident}s- %s: %s\n" '' "$key" "$val" +} + +#}}} + +#!/hint/bash + +#{{{ calamares + +write_services_conf(){ + local key1="$1" val1="$2" key2="$3" val2="$4" + local yaml + yaml=$(write_yaml_header) + yaml+=$(write_yaml_map 0 "$key1" "$val1") + yaml+=$(write_yaml_map 0 "$key2" "$val2") + yaml+=$(write_yaml_map 0 'services') + for svc in "${SERVICES[@]}"; do + yaml+=$(write_yaml_seq 2 "$svc") + done + yaml+=$(write_empty_line) + printf '%s' "${yaml}" +} + +write_services_openrc_conf(){ + local conf="$1"/services-openrc.conf + write_services_conf 'initdDir' '/etc/init.d' 'runlevelsDir' '/etc/runlevels' > "$conf" +} + +write_services_runit_conf(){ + local conf="$1"/services-runit.conf + write_services_conf 'svDir' '/etc/runit/sv' 'runsvDir' '/etc/runit/runsvdir' > "$conf" +} + +write_services_s6_conf(){ + local conf="$1"/services-s6.conf + write_services_conf 'svDir' '/etc/s6/sv' 'dbDir' '/etc/s6/rc/compiled' > "$conf" +} + +write_services_suite66_conf(){ + local conf="$1"/services-suite66.conf + write_services_conf 'svDir' '/etc/66/service' 'runsvDir' '/var/lib/66/system' > "$conf" +} + +write_services_dinit_conf(){ + local conf="$1"/services-dinit.conf + write_services_conf 'initdDir' '/etc/dinit.d' 'runsvDir' '/etc/dinit.d/boot.d' > "$conf" +} + +configure_calamares(){ + local mods="$1/etc/calamares/modules" + if [[ -d "$mods" ]];then + msg2 "Configuring: Calamares" + write_services_"${INITSYS}"_conf "$mods" + sed -e "s|services-openrc|services-${INITSYS}|" \ + -i "$1"/etc/calamares/settings.conf + fi +} + +#}}} + +#!/hint/bash + +#{{{ session + +configure_services(){ + local mnt="$1" + add_svc_"${INITSYS}" "$mnt" "${SERVICES[*]}" +} + + +write_live_session_conf(){ + local conf='' + conf+=$(printf '%s\n' '# live session configuration') + conf+=$(printf "\nAUTOLOGIN=%s\n" "${AUTOLOGIN}") + conf+=$(printf "\nPASSWORD=%s\n" "${PASSWORD}") + printf '%s' "$conf" +} + +configure_chroot(){ + local fs="$1" + msg "Configuring [%s]" "${fs##*/}" + configure_services "$fs" + configure_calamares "$fs" + [[ ! -d "$fs/etc/artools" ]] && mkdir -p "$fs/etc/artools" + msg2 "Writing: live.conf" + write_live_session_conf > "$fs/etc/artools/live.conf" + msg "Done configuring [%s]" "${fs##*/}" +} + +#}}} + +#!/hint/bash + +#{{{ firmware + +prepare_boot_extras(){ + local src="$1" dest + dest=${iso_root}/boot + + for fw in intel amd; do + cp "$src"/boot/"$fw"-ucode.img "$dest/$fw"-ucode.img + done + + cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest + cp "$src"/usr/share/licenses/common/GPL2/license.txt "$dest"/memtest.COPYING +} + +#}}} + +#!/hint/bash + +#{{{ dracut + +prepare_initramfs_dracut(){ + local mnt="$1" + local kver + kver=$(<"$mnt"/usr/src/linux/version) + + printf "%s\n" 'add_dracutmodules+=" dmsquash-live"' > "$mnt"/etc/dracut.conf.d/50-live.conf + + msg "Starting build: %s" "${kver}" + artix-chroot "$mnt" dracut -fqM /boot/initramfs.img "$kver" + msg "Image generation successful" + + cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img + + prepare_boot_extras "$mnt" +} + +configure_grub_dracut(){ + msg "Configuring grub kernel options ..." + local kopts=() + kopts=( + "root=live:LABEL=${iso_label}" + 'rd.live.squashimg=rootfs.img' + 'rd.live.image' + 'rootflags=auto' + ) + [[ "${profile}" != 'base' ]] && kopts+=("rd.live.join=livefs.img") + + local ro_opts=() + local rw_opts=() +# 'rd.writable.fsimg=1' + + sed -e "s|@kopts@|${kopts[*]}|" \ + -e "s|@ro_opts@|${ro_opts[*]}|" \ + -e "s|@rw_opts@|${rw_opts[*]}|" \ + -i "${iso_root}"/boot/grub/kernels.cfg +} + +#}}} + +#!/hint/bash + +#{{{ initcpio + +make_checksum(){ + local file="$1" + msg2 "Creating md5sum ..." + cd "${iso_root}${live_dir}" + md5sum "$file" > "$file".md5 + cd "${OLDPWD}" +} + +make_sig () { + local file="$1" + msg2 "Creating signature file..." + chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}" + su "${owner}" -c "gpg --detach-sign --output $file.sig --default-key ${GPG_KEY} $file" + chown "root:root" "${iso_root}${live_dir}" +} + +export_gpg_publickey() { + key_export=${WORKSPACE_DIR}/pubkey.gpg + if [[ ! -e "${key_export}" ]]; then + gpg --batch --output "${key_export}" --export "${GPG_KEY}" + fi +} + +prepare_initramfs_mkinitcpio() { + local mnt="$1" packages=() mkinitcpio_conf k + + mkinitcpio_conf=mkinitcpio-default.conf + [[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf + k=$(<"$mnt"/usr/src/linux/version) + + read_from_list "${common_dir}/Packages-boot" + basestrap "${basestrap_args[@]}" "$mnt" "${packages[@]}" + + if [[ -n "${GPG_KEY}" ]]; then + exec {ARTIX_GNUPG_FD}<>"${key_export}" + export ARTIX_GNUPG_FD + fi + + artix-chroot "$mnt" mkinitcpio -k "$k" \ + -c /etc/"$mkinitcpio_conf" \ + -g /boot/initramfs.img + + if [[ -n "${GPG_KEY}" ]]; then + exec {ARTIX_GNUPG_FD}<&- + unset ARTIX_GNUPG_FD + fi + if [[ -f "${key_export}" ]]; then + rm "${key_export}" + fi + cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img + prepare_boot_extras "$mnt" +} + +configure_grub_mkinitcpio() { + msg "Configuring grub kernel options ..." + local ro_opts=() + local rw_opts=() + local kopts=("label=${iso_label}") + + [[ "${profile}" != 'base' ]] && kopts+=('overlay=livefs') + + sed -e "s|@kopts@|${kopts[*]}|" \ + -e "s|@ro_opts@|${ro_opts[*]}|" \ + -e "s|@rw_opts@|${rw_opts[*]}|" \ + -i "${iso_root}"/boot/grub/kernels.cfg +} + +#}}} + +#!/hint/bash + +#{{{ grub + +prepare_grub(){ + local platform=i386-pc img='core.img' prefix=/boot/grub + local lib="$1"/usr/lib/grub + local theme="$1"/usr/share/grub + local livecfg="$2"/usr/share/grub + local grub=${iso_root}/boot/grub efi=${iso_root}/efi/boot + + prepare_dir "${grub}/${platform}" + + cp "${livecfg}"/cfg/*.cfg "${grub}" + + cp "${lib}/${platform}"/* "${grub}/${platform}" + + msg2 "Building %s ..." "${img}" + + grub-mkimage -d "${grub}/${platform}" -o "${grub}/${platform}/${img}" -O "${platform}" -p "${prefix}" biosdisk iso9660 + + cat "${grub}/${platform}"/cdboot.img "${grub}/${platform}/${img}" > "${grub}/${platform}"/eltorito.img + + platform=x86_64-efi + img=bootx64.efi + + prepare_dir "${efi}" + prepare_dir "${grub}/${platform}" + + cp "${lib}/${platform}"/* "${grub}/${platform}" + + msg2 "Building %s ..." "${img}" + + grub-mkimage -d "${grub}/${platform}" -o "${efi}/${img}" -O "${platform}" -p "${prefix}" iso9660 + + prepare_dir "${grub}"/themes + + cp -r "${theme}"/themes/artix "${grub}"/themes + cp -r "${livecfg}"/{locales,tz} "${grub}" + + if [[ -f /usr/share/grub/unicode.pf2 ]];then + msg2 "Copying %s ..." "unicode.pf2" + cp /usr/share/grub/unicode.pf2 "${grub}"/unicode.pf2 + else + msg2 "Creating %s ..." "unicode.pf2" + grub-mkfont -o "${grub}"/unicode.pf2 /usr/share/fonts/misc/unifont.bdf + fi + + local size=4M mnt="${mnt_dir}/efiboot" efi_img="${iso_root}/boot/efi.img" + msg2 "Creating fat image of %s ..." "${size}" + truncate -s "${size}" "${efi_img}" + mkfs.fat -n ARTIX_EFI "${efi_img}" &>/dev/null + prepare_dir "${mnt}" + mount_img "${efi_img}" "${mnt}" + prepare_dir "${mnt}"/efi/boot + msg2 "Building %s ..." "${img}" + grub-mkimage -d "${grub}/${platform}" -o "${mnt}"/efi/boot/"${img}" -O "${platform}" -p "${prefix}" iso9660 + umount_img "${mnt}" +} + +#}}} + +#!/hint/bash + +#{{{ squash + +make_ext_img(){ + local src="$1" + local size=32G + local mnt="${mnt_dir}/${src##*/}" + mkdir -p "${work_dir}"/embed"${live_dir}" + local extimg="${work_dir}/embed${live_dir}/${src##*/}".img + + msg2 "Creating ext4 image of %s ..." "${size}" + truncate -s ${size} "${extimg}" + local ext4_args=() + ext4_args+=("-O ^has_journal,^resize_inode" -E lazy_itable_init=0 -m 0) + mkfs.ext4 "${ext4_args[@]}" -F "${extimg}" &>/dev/null + tune2fs -c 0 -i 0 "${extimg}" &> /dev/null + mount_img "${extimg}" "${mnt}" + msg2 "Copying %s ..." "${src}/" + cp -aT "${src}/" "${mnt}/" + umount_img "${mnt}" +} + +has_changed(){ + local src="$1" dest="$2" + if [[ -f "${dest}" ]]; then + local has_changes + has_changes=$(find "${src}" -newer "${dest}") + if [[ -n "${has_changes}" ]]; then + msg2 "Possible changes for %s ..." "${src}" + msg2 "%s" "${has_changes}" + msg2 "SquashFS image %s is not up to date, rebuilding..." "${dest}" + rm "${dest}" + else + msg2 "SquashFS image %s is up to date, skipping." "${dest}" + return 1 + fi + fi +} + +# $1: image path +make_sfs() { + local sfs_in="$1" + if [[ ! -e "${sfs_in}" ]]; then + error "The path %s does not exist" "${sfs_in}" + retrun 1 + fi + + mkdir -p "${iso_root}${live_dir}" + + local img_name=${sfs_in##*/}.img + + local sfs_out="${iso_root}${live_dir}/${img_name}" + + if has_changed "${sfs_in}" "${sfs_out}"; then + + msg "Generating SquashFS image for %s" "${sfs_in}" + + local mksfs_args=() + + if ${persist};then + make_ext_img "${sfs_in}" + mksfs_args+=("${work_dir}/embed") + else + mksfs_args+=("${sfs_in}") + fi + + mksfs_args+=("${sfs_out}") + + mksfs_args+=(-comp "${COMPRESSION}" "${COMPRESSION_ARGS[@]}" -noappend) + + mksquashfs "${mksfs_args[@]}" + + if ! ${use_dracut}; then + make_checksum "${img_name}" + if [[ -n ${GPG_KEY} ]];then + make_sig "${iso_root}${live_dir}/${img_name}" + fi + fi + if ${persist}; then + rm -r "${work_dir}/embed" + fi + fi +} + +#}}} + +#!/hint/bash + +#{{{ iso + +get_disturl(){ + # shellcheck disable=1091 + . /usr/lib/os-release + echo "${HOME_URL}" +} + +get_osname(){ + # shellcheck disable=1091 + . /usr/lib/os-release + echo "${NAME}" +} + +assemble_iso(){ + msg "Creating ISO image..." + local mod_date + mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g) + local appid + appid="$(get_osname) Live/Rescue CD" + local publisher + publisher="$(get_osname) <$(get_disturl)>" + + xorriso -as mkisofs \ + --modification-date="${mod_date}" \ + --protective-msdos-label \ + -volid "${iso_label}" \ + -appid "${appid}" \ + -publisher "${publisher}" \ + -preparer "Prepared by artools/${0##*/}" \ + -r -graft-points -no-pad \ + --sort-weight 0 / \ + --sort-weight 1 /boot \ + --grub2-mbr "${iso_root}"/boot/grub/i386-pc/boot_hybrid.img \ + -partition_offset 16 \ + -b boot/grub/i386-pc/eltorito.img \ + -c boot.catalog \ + -no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \ + -eltorito-alt-boot \ + -append_partition 2 0xef "${iso_root}"/boot/efi.img \ + -e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \ + -no-emul-boot \ + -iso-level 3 \ + -o "${iso_dir}/${iso_file}" \ + "${iso_root}"/ +} + +#}}} + +#!/hint/bash + +#{{{ profile + +show_profile(){ + msg2 "iso_file: %s" "${iso_file}" + msg2 "AUTOLOGIN: %s" "${AUTOLOGIN}" + msg2 "PASSWORD: %s" "${PASSWORD}" + msg2 "SERVICES: %s" "${SERVICES[*]}" +} + +load_profile(){ + local profile_dir="${DATADIR}/iso-profiles" + [[ -d "${WORKSPACE_DIR}"/iso-profiles ]] && profile_dir="${WORKSPACE_DIR}"/iso-profiles + + root_list="$profile_dir/${profile}/Packages-Root" + root_overlay="$profile_dir/${profile}/root-overlay" + + [[ -f "$profile_dir/${profile}/Packages-Live" ]] && live_list="$profile_dir/${profile}/Packages-Live" + [[ -d "$profile_dir/${profile}/live-overlay" ]] && live_overlay="$profile_dir/${profile}/live-overlay" + + common_dir="${DATADIR}/iso-profiles/common" + [[ -d "$profile_dir"/common ]] && common_dir="${profile_dir}"/common + + [[ -f $profile_dir/${profile}/profile.conf ]] || return 1 + + # shellcheck disable=1090 + [[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf + + AUTOLOGIN=${AUTOLOGIN:-true} + + PASSWORD=${PASSWORD:-'artix'} + + if [[ -z "${SERVICES[*]}" ]];then + SERVICES=('acpid' 'bluetoothd' 'cronie' 'cupsd' 'syslog-ng' 'connmand') + fi + + return 0 +} + +read_from_list() { + local list="$1" + local _space="s| ||g" + local _clean=':a;N;$!ba;s/\n/ /g' + local _com_rm="s|#.*||g" + + local _init="s|@initsys@|${INITSYS}|g" + + msg2 "Loading Packages: [%s] ..." "${list##*/}" + packages+=($(sed "$_com_rm" "$list" \ + | sed "$_space" \ + | sed "$_init" \ + | sed "$_clean")) +} + +read_from_services() { + for svc in "${SERVICES[@]}"; do + case "$svc" in + sddm|gdm|lightdm|mdm|greetd|lxdm|xdm) packages+=("$svc-${INITSYS}") ;; + NetworkManager) packages+=("networkmanager-${INITSYS}") ;; + connmand) packages+=("connman-${INITSYS}") ;; + cupsd) packages+=("cups-${INITSYS}") ;; + bluetoothd) packages+=("bluez-${INITSYS}") ;; + syslog-ng|metalog) packages+=("$svc-${INITSYS}") ;; + esac + done +} + +load_pkgs(){ + local pkglist="$1" + packages=() + + if [[ "${pkglist##*/}" == "Packages-Root" ]]; then + read_from_list "${common_dir}/Packages-base" + read_from_list "${common_dir}/Packages-apps" + read_from_list "${common_dir}/Packages-${INITSYS}" + [[ -n "${live_list}" ]] && read_from_list "${common_dir}/Packages-xorg" + read_from_list "$pkglist" + read_from_services + else + read_from_list "$pkglist" + fi +} + +#}}} + +#!/hint/bash + +#{{{ trap + +error_function() { + local func="$1" + # first exit all subshells, then print the error + if (( ! BASH_SUBSHELL )); then + error "A failure occurred in %s()." "$func" + plain "Aborting..." + fi + umount_overlayfs + umount_img + exit 2 +} + +run_safe() { + local restoretrap func="$1" + set -e + set -E + restoretrap=$(trap -p ERR) + trap 'error_function $func' ERR + + "$func" + + eval "$restoretrap" + set +E + set +e +} + +trap_exit() { + local sig=$1; shift + error "$@" + umount_overlayfs + trap -- "$sig" + kill "-$sig" "$$" +} + +prepare_traps(){ + for sig in TERM HUP QUIT; do + # shellcheck disable=2064 + trap "trap_exit $sig \"$(gettext "%s signal caught. Exiting...")\" \"$sig\"" "$sig" + done + trap 'trap_exit INT "$(gettext "Aborted by user! Exiting...")"' INT +# trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR +} + +#}}} + + +clean_up_chroot(){ + local path mnt="$1" + msg2 "Cleaning [%s]" "${mnt##*/}" + + path=$mnt/boot + if [[ -d "$path" ]]; then + find "$path" -name 'initramfs*.img' -delete &> /dev/null + fi + path=$mnt/var/lib/pacman/sync + if [[ -d $path ]];then + find "$path" -type f -delete &> /dev/null + fi + path=$mnt/var/cache/pacman/pkg + if [[ -d $path ]]; then + find "$path" -type f -delete &> /dev/null + fi + path=$mnt/var/log + if [[ -d $path ]]; then + find "$path" -type f -delete &> /dev/null + fi + path=$mnt/var/tmp + if [[ -d $path ]];then + find "$path" -mindepth 1 -delete &> /dev/null + fi + path=$mnt/tmp + if [[ -d $path ]];then + find "$path" -mindepth 1 -delete &> /dev/null + fi + # shellcheck disable=2035 + find "$mnt" -name *.pacnew -name *.pacsave -name *.pacorig -delete + if [[ -f "$mnt/boot/grub/grub.cfg" ]]; then + rm "$mnt"/boot/grub/grub.cfg + fi + if [[ -f "$mnt/etc/machine-id" ]]; then + rm "$mnt"/etc/machine-id + fi +} + +copy_overlay(){ + local src="$1" dest="$2" + if [[ -e "$src" ]];then + msg2 "Copying [%s] ..." "${src##*/}" + cp -LR "$src"/* "$dest" + fi +} + +make_rootfs() { + if [[ ! -e "${work_dir}"/rootfs.lock ]]; then + msg "Prepare [Base installation] (rootfs)" + local rootfs="${work_dir}/rootfs" + + prepare_dir "${rootfs}" + + basestrap "${basestrap_args[@]}" "${rootfs}" "${packages[@]}" + + copy_overlay "${root_overlay}" "${rootfs}" + + [[ -z ${live_list} ]] && configure_chroot "${rootfs}" + + clean_up_chroot "${rootfs}" + + : > "${work_dir}"/rootfs.lock + + msg "Done [Base installation] (rootfs)" + fi +} + +make_livefs() { + if [[ ! -e ${work_dir}/livefs.lock ]]; then + msg "Prepare [Live installation] (livefs)" + local livefs="${work_dir}/livefs" + + prepare_dir "${livefs}" + + mount_overlayfs "${livefs}" "${work_dir}" + + basestrap "${basestrap_args[@]}" "${livefs}" "${packages[@]}" + + copy_overlay "${live_overlay}" "${livefs}" + + configure_chroot "${livefs}" + + umount_overlayfs + + clean_up_chroot "${livefs}" + + : > "${work_dir}"/livefs.lock + + msg "Done [Live installation] (livefs)" + fi +} + +make_bootfs() { + if [[ ! -e ${work_dir}/bootfs.lock ]]; then + msg "Prepare [/iso/boot]" + + prepare_dir "${iso_root}/boot" + + cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}" + + local bootfs="${work_dir}/bootfs" + + mount_overlayfs "${bootfs}" "${work_dir}" + + if "${use_dracut}"; then + prepare_initramfs_dracut "${bootfs}" + else + prepare_initramfs_mkinitcpio "${bootfs}" + fi + + umount_overlayfs + + rm -R "${bootfs}" + : > "${work_dir}"/bootfs.lock + msg "Done [/iso/boot]" + fi +} + +make_grub(){ + if [[ ! -e ${work_dir}/grub.lock ]]; then + msg "Prepare [/iso/boot/grub]" + + local layer=${work_dir}/rootfs + [[ -n ${live_list} ]] && layer=${work_dir}/livefs + + prepare_grub "${work_dir}/rootfs" "$layer" + + if ${use_dracut}; then + configure_grub_dracut + else + configure_grub_mkinitcpio + fi + + : > "${work_dir}"/grub.lock + msg "Done [/iso/boot/grub]" + fi +} + +gen_iso_fn(){ + local vars=("artix") name + vars+=("${profile}") + vars+=("${INITSYS}") + case "${repo}" in + 'gremlins'|'goblins') vars+=("${repo}") ;; + esac + vars+=("${ISO_VERSION}") + vars+=("${arch}") + for n in "${vars[@]}"; do + name=${name:-}${name:+-}${n} + done + echo "$name" +} + +prepare_build(){ + load_profile + + case "${repo}" in + 'gremlins'|'goblins') repo="${repo}" ;; + *) repo=default ;; + esac + + get_pacman_conf "${repo}" + + iso_file=$(gen_iso_fn).iso + + iso_label="ARTIX_$(date +%Y%m)" + + basestrap_args+=(-C "${pacman_conf}") + work_dir=${chroots_iso}/${profile}/artix + + iso_dir="${ISO_POOL}/${profile}" + + iso_root=${chroots_iso}/${profile}/iso + live_dir=/LiveOS + + mnt_dir=${chroots_iso}/${profile}/mnt + + if [[ -n "${GPG_KEY}" ]]; then + ${use_dracut} || export_gpg_publickey + fi +} + +display_settings(){ + msg "OPTIONS:" + msg2 "profile: %s" "${profile}" + msg2 "INITSYS: %s" "${INITSYS}" + [[ -n ${GPG_KEY} ]] && msg2 "GPG_KEY: %s" "${GPG_KEY}" + + msg "ISO SETTINGS:" + msg2 "ISO_VERSION: %s" "${ISO_VERSION}" + msg2 "COMPRESSION: %s" "${COMPRESSION}" + [[ "${COMPRESSION}" == 'zstd' ]] && msg2 "COMPRESSION_LEVEL: %s" "${COMPRESSION_LEVEL}" + + msg "BUILD:" + show_profile +} + +mk_squash(){ + make_sfs "${work_dir}/rootfs" + if [[ -d "${work_dir}/livefs" ]]; then + make_sfs "${work_dir}/livefs" + fi +} + +mk_iso(){ + touch "${iso_root}/.artix" + msg "Making bootable image" + # Sanity checks + [[ ! -d "${iso_root}" ]] && return 1 + if [[ -f "${iso_dir}/${iso_file}" ]]; then + msg2 "Removing existing bootable image..." + rm -rf "${iso_dir}/${iso_file}" + fi + assemble_iso + chown -R "${owner}:$(id --group "${owner}")" "${iso_dir}" +} + +mk_boot(){ + run_safe "make_bootfs" + run_safe "make_grub" +} + +mk_chroots(){ + load_pkgs "${root_list}" + run_safe "make_rootfs" + if [[ -n ${live_list} ]]; then + load_pkgs "${live_list}" + run_safe "make_livefs" + fi +} + +build(){ + msg "Start building [%s]" "${profile}" + if ${clean_first};then + for copy in "${work_dir}"/*; do + [[ -d $copy ]] || continue + msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")" + + lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy" + + subvolume_delete_recursive "${copy}" + rm -rf --one-file-system "${copy}" + done + lock_close 9 + + rm -rf --one-file-system "${work_dir}" + + msg "Deleting isoroot [%s] ..." "${iso_root##*/}" + rm -rf --one-file-system "${iso_root}" + fi + + if ${chroot_only}; then + mk_chroots + warning "Continue squash: %s -p %s -sc ..." "${cmd}" "${profile}" + exit 1 + elif ${boot_only}; then + mk_boot + warning "Continue iso: %s -p %s -zc ..." "${cmd}" "${profile}" + exit 1 + elif ${squash_only}; then + mk_squash + warning "Continue boot: %s -p %s -bc ..." "${cmd}" "${profile}" + exit 1 + elif ${iso_only}; then + [[ ! -d ${work_dir} ]] && die "Create chroot: %s -p %s -x" "${cmd}" "${profile}" + mk_iso + else + mk_chroots + mk_boot + mk_squash + mk_iso + fi + msg "Finished building [%s]" "${profile}" +} + +clean_first=true +pretend=false +chroot_only=false +iso_only=false +persist=false +use_dracut=false +squash_only=false +boot_only=false + +basestrap_args=(-GMc) +cmd=${0##*/} + +repo=${cmd##*-} +owner=${SUDO_USER:-$USER} +profile='base' +chroots_iso="${CHROOTS_DIR}/buildiso" +arch=$(uname -m) + +usage() { + echo "Usage: ${cmd} [options]" + echo " -p Profile [default: ${profile}]" + echo ' -r Chroots directory' + echo " [default: ${chroots_iso}]" + echo ' -t Target directory' + echo " [default: ${ISO_POOL}]" + echo ' -i Init system to use' + echo " [default: ${INITSYS}]" + echo ' -g The gpg key for img signing' + echo " [default: none]" + echo ' -m Set SquashFS image mode to persistence' + echo ' -c Disable clean work dir' + echo ' -x Build chroot only' + echo ' -s Squash chroot only' + echo ' -b Generate iso boot only' + echo ' -z Generate iso only' + echo ' Requires pre built images (-x)' + echo ' -d Use dracut instead of mkinitcpio for iso initramfs' + echo ' -q Query settings and pretend build' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='p:r:t:i:g:czsbxmdqh' + +while getopts "${opts}" arg; do + case "${arg}" in + p) profile="$OPTARG" ;; + r) chroots_iso="$OPTARG" ;; + t) ISO_POOL="$OPTARG" ;; + i) INITSYS="$OPTARG" ;; + g) GPG_KEY="$OPTARG" ;; + c) clean_first=false ;; + x) chroot_only=true ;; + z) iso_only=true ;; + s) squash_only=true ;; + b) boot_only=true ;; + m) persist=true ;; + d) use_dracut=true ;; + q) pretend=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +prepare_build + +${pretend} && display_settings && exit 1 + +check_root + +prepare_dir "${mnt_dir}" +prepare_dir "${iso_dir}" +prepare_dir "${iso_root}" + +prepare_traps + +build diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildiso-goblins b/artools/0.26.1/artools/debian/artools/usr/bin/buildiso-goblins new file mode 120000 index 0000000..609e2dd --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildiso-goblins @@ -0,0 +1 @@ +buildiso \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildiso-gremlins b/artools/0.26.1/artools/debian/artools/usr/bin/buildiso-gremlins new file mode 120000 index 0000000..609e2dd --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildiso-gremlins @@ -0,0 +1 @@ +buildiso \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg new file mode 100755 index 0000000..091fb8e --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg @@ -0,0 +1,324 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/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" +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + + +create_first=false +rebuild=false + +mkchrootpkg_args=(-c -n) + +cmd=${0##*/} +repo=${cmd#*-} +base_devel=('base-devel') +chroots_pkg="${CHROOTS_DIR}/buildpkg" +arch=$(uname -m) + +usage() { + echo "Usage: ${0##*/} [options] -- [mkchrootpkg_args]" + echo " -r Create chroots in this directory" + echo " -d Destination repo chroot" + echo ' -c Recreate the chroot before building' + echo ' -m Major rebuild' + echo ' -N Disable check() function' + echo ' -C Run checkpkg after built' + echo ' -h This help' + echo '' + echo "Default mkchrootpkg_args args: ${mkchrootpkg_args[*]}" + echo '' + exit "$1" +} + +opts='hcCNmr:d:' + +while getopts "${opts}" arg; do + case "${arg}" in + r) chroots_pkg="$OPTARG" ;; + d) repo="$OPTARG" ;; + c) create_first=true ;; + m) rebuild=true ;; + C) mkchrootpkg_args+=(-C) ;; + N) mkchrootpkg_args+=(-N) ;; + h|?) usage 0 ;; + *) echo "invalid argument '%s'" "${arg}"; usage 1 ;; + esac +done + +if ${rebuild};then + repo='default' +else + case ${repo} in + system|world|galaxy) repo='default' ;; + lib32*) base_devel+=('multilib-devel') ;; + galaxy-gremlins|galaxy-goblins) repo=${repo#*-} ;; + esac +fi + +get_pacman_conf "${repo}" + +get_makepkg_conf + +if [[ -f "${DATADIR}/setarch-aliases.d/${arch}" ]]; then + read -r set_arch < "${DATADIR}/setarch-aliases.d/${arch}" +else + set_arch="${arch}" +fi + +check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME + +mkchrootpkg_args+=("${@:$OPTIND}") + +if ${create_first} || [[ ! -d "${chroots_pkg}/${repo}-${arch}" ]];then + msg "Creating chroot for [%s] (%s)..." "${repo}" "${arch}" + + for copy in "${chroots_pkg}/${repo}-${arch}"/*; do + [[ -d $copy ]] || continue + msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")" + + lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy" + + subvolume_delete_recursive "${copy}" + rm -rf --one-file-system "${copy}" + done + lock_close 9 + + rm -rf --one-file-system "${chroots_pkg}/${repo}-${arch}" + (umask 0022; mkdir -p "${chroots_pkg}/${repo}-${arch}") + setarch "${set_arch}" mkchroot \ + -C "${pacman_conf}" \ + -M "${makepkg_conf}" \ + "${chroots_pkg}/${repo}-${arch}/root" \ + "${base_devel[@]}" || abort +else + lock 9 "${chroots_pkg}/${repo}-${arch}/root.lock" "Locking clean chroot" + chroot-run \ + -C "${pacman_conf}" \ + -M "${makepkg_conf}" \ + "${chroots_pkg}/${repo}-${arch}/root" \ + pacman -Syuu --noconfirm || abort +fi + +# Always build official packages reproducibly +if [[ ! -v SOURCE_DATE_EPOCH ]]; then + export SOURCE_DATE_EPOCH=$(date +%s) +fi + +msg "Building in chroot for [%s] (%s)..." "${repo}" "${arch}" +exec mkchrootpkg -r "${chroots_pkg}/${repo}-${arch}" "${mkchrootpkg_args[@]}" diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy-goblins b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy-goblins new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy-goblins @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy-gremlins b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy-gremlins new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy-gremlins @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-gnome-wobble b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-gnome-wobble new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-gnome-wobble @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-goblins b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-goblins new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-goblins @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-gremlins b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-gremlins new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-gremlins @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-kde-wobble b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-kde-wobble new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-kde-wobble @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32 b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32 new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32 @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32-goblins b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32-goblins new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32-goblins @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32-gremlins b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32-gremlins new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32-gremlins @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-system b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-system new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-system @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-world b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-world new file mode 120000 index 0000000..9572764 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-world @@ -0,0 +1 @@ +buildpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/buildtree b/artools/0.26.1/artools/debian/artools/usr/bin/buildtree new file mode 100755 index 0000000..1005a72 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/buildtree @@ -0,0 +1,741 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ common functions + +get_compliant_name(){ + local gitname="$1" + case "$gitname" in + *+) gitname=${gitname//+/plus} + esac + echo "$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 + echo "$org" +} + +api_put() { + curl -s -X PUT "$@" +} + +api_delete() { + curl -s -X DELETE "$@" +} + +api_post() { + curl -s -X POST "$@" +} + +#}}} + +#!/hint/bash + +#{{{ git + +get_local_head(){ + git log --pretty=%H ...refs/heads/master^ | head -n 1 +} + +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 + fi +} + +pull_tree(){ + local tree="$1" local_head="$2" os="${3:-Artix}" + local remote_head + remote_head=$(get_remote_head) + + msg "Checking (%s) (%s)" "${tree}" "$os" + if has_changeset "${local_head}" "${remote_head}";then + git pull origin master + fi +} + +#}}} + +#!/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" +} + +#}}} + +#!/hint/bash + +##{{{ repo + +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 +} + +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[@]}") +} + +find_repo(){ + local pkg="$1" pkgarch="${2:-${CARCH}}" repo + for r in "${ARCH_REPOS[@]}"; do + [[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo=repos/"$r-$pkgarch" + [[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=repos/"$r"-any + [[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$pkgarch/$r" + done + echo "$repo" +} + +find_pkg(){ + local searchdir="$1" pkg="$2" result + result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg") + echo "$result" +} + +tree_loop(){ + local func="$1" pkgs + for tree in "${ARTIX_TREE[@]}"; do + pkgs=$(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort) + for _package in ${pkgs}; do + "$func" "$_package" + done + done +} + +#}}} + +#!/hint/bash + +#{{{ jenkins + +write_jenkinsfile(){ + local pkg="$1" + local jenkins=$pkg/Jenkinsfile + + echo "@Library('artix-ci') import org.artixlinux.RepoPackage" > "$jenkins" + { + echo '' + echo 'PackagePipeline(new RepoPackage(this))' + echo '' + } >> "$jenkins" + + git add "$jenkins" +} + +write_agentyaml(){ + local pkg="$1" + local agent="$pkg"/.artixlinux/agent.yaml label='master' + [[ -d $pkg/.artixlinux ]] || mkdir "$pkg"/.artixlinux + + echo '---' > "$agent" + { + echo '' + echo "label: $label" + echo '' + } >> "$agent" + + git add "$agent" +} + +commit_jenkins_files(){ + local pkg="$1" + + write_jenkinsfile "$pkg" + write_agentyaml "$pkg" + + git commit -m "initial commit" +} + +#}}} + + +#{{{ new git repo + +subrepo_clone(){ + local pkg="$1" + local org="$2" + local name="$3" + + msg2 "Subrepo clone [%s] from (%s)" "$pkg" "$org/$name" + git subrepo clone "${GIT_SSH}":"$org"/"$name".git "$pkg" +} + +subrepo_new(){ + cd "${TREE_DIR_ARTIX}/${group}" || return + + local org gitname + org=$(get_pkg_org "${package}") + gitname=$(get_compliant_name "${package}") + + gitearepo -cr "$gitname" + + add_team_to_repo "$gitname" "$org" "${team}" + + subrepo_clone "${package}" "$org" "$gitname" + + mkdir -p "${TREE_DIR_ARTIX}/${group}/${package}/trunk" + + commit_jenkins_files "${package}" +} + +#}}} + +#{{{ pull + +clone_tree(){ + local url="$1" tree="$2" os="${3:-Artix}" + + msg "Cloning %s (%s) ..." "$tree" "$os" + + git clone "$url/$tree".git +} + +pull_tree_arch(){ + cd "${TREE_DIR_ARCH}" || return + for tree in "${ARCH_TREE[@]}";do + if [[ -d "${tree}" ]];then + ( cd "${tree}" || return + pull_tree "${tree}" "$(get_local_head)" "Arch" + ) + else + clone_tree "${HOST_TREE_ARCH}" "${tree}" "Arch" + fi + done +} + +config_tree(){ + local tree="$1" + cd "$tree" || return + 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 + cd .. +} + +pull_tree_artix(){ + local repos=() + if ${sync_group}; then + repos=("${group}") + else + repos=("${ARTIX_TREE[@]}") + fi + cd "${TREE_DIR_ARTIX}" || return + for tree in "${repos[@]}"; do + if [[ -d "${tree}" ]];then + config_tree "${tree}" + ( cd "${tree}" || return + pull_tree "${tree}" "$(get_local_head)" + ) + else + clone_tree "${host_tree_artix}" "${tree}" + config_tree "${tree}" + fi + done +} + +#}}} + +#{{{ patch + +patch_pkg(){ + local pkgpath="$1" + local pkg=${pkgpath%/*} + pkg=${pkg##*/} + sed -e 's|arch-meson|artix-meson|' -i "$pkgpath"/PKGBUILD + 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/$repo + artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}") + + show_deps "$archpath" + + if [[ -f "$artixpath"/.gitrepo ]]; 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/$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} && pull_tree_arch + ${sync_artix} && pull_tree_artix +} + +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 +sync_group=false +check=false + +package='' + +team='community' +group="${ARTIX_TREE[0]}" + +host_tree_artix="${GIT_SSH}:artixlinux" + +usage() { + echo "Usage: ${0##*/} [options]" + echo ' -p Package name' + echo ' -t Team name (only with -n)' + echo ' Possible values: core,extra,community,multilib' + echo " [default: ${team}]" + echo ' -g Group name, the superrepo (only with -n or -s)' + echo " [default: ${group}]" + echo " -s Clone or pull repos" + echo " -a Don't clone or pull arch repos" + echo " -b Don't clone or pull artix repos" + echo ' -i Import a package from arch repos' + echo ' -n New remote subrepo and clone it' + echo ' -v Check if a package is in the artix tree(s)' + echo ' -c View package depends' + echo ' -x Exclude testing (only with -i)' + echo ' -y Exclude staging (only with -i)' + echo ' -z Include kde & gnome unstable (only with -i)' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='p:t:g:sinabcvxyzh' + +while getopts "${opts}" arg; do + case "${arg}" in + p) package="$OPTARG" ;; + t) team="$OPTARG" ;; + g) group="$OPTARG"; sync_group=true ;; + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +set_arch_repos "$testing" "$staging" "$unstable" + +${sync} && sync_repos + +${view} && view_build + +${check} && check_tree + +${import} && from_arch + +${createnew} && subrepo_new diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/checkpkg b/artools/0.26.1/artools/debian/artools/usr/bin/checkpkg new file mode 100755 index 0000000..0c94b49 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/checkpkg @@ -0,0 +1,303 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +shopt -s extglob + +load_makepkg_config + +#{{{ functions + +pkgver_equal() { + if [[ $1 = *-* && $2 = *-* ]]; then + # if both versions have a pkgrel, then they must be an exact match + [[ $1 = "$2" ]] + else + # otherwise, trim any pkgrel and compare the bare version. + [[ ${1%%-*} = "${2%%-*}" ]] + fi +} + +find_cached_package() { + local searchdirs=("$PKGDEST" "$PWD") results=() + local targetname=$1 targetver=$2 targetarch=$3 + local dir pkg pkgbasename name ver rel arch r results + + for dir in "${searchdirs[@]}"; do + [[ -d $dir ]] || continue + + for pkg in "$dir"/*.pkg.tar?(.!(sig|*.*)); do + [[ -f $pkg ]] || continue + + # avoid adding duplicates of the same inode + for r in "${results[@]}"; do + [[ $r -ef $pkg ]] && continue 2 + done + + # split apart package filename into parts + pkgbasename=${pkg##*/} + pkgbasename=${pkgbasename%.pkg.tar*} + + arch=${pkgbasename##*-} + pkgbasename=${pkgbasename%-"$arch"} + + rel=${pkgbasename##*-} + pkgbasename=${pkgbasename%-"$rel"} + + ver=${pkgbasename##*-} + name=${pkgbasename%-"$ver"} + + if [[ $targetname = "$name" && $targetarch = "$arch" ]] && + pkgver_equal "$targetver" "$ver-$rel"; then + results+=("$pkg") + fi + done + done + + case ${#results[*]} in + 0) + return 1 + ;; + 1) + printf '%s\n' "${results[0]}" + return 0 + ;; + *) + error 'Multiple packages found:' + printf '\t%s\n' "${results[@]}" >&2 + return 1 + ;; + esac +} + +#}}} + +usage() { + cat <<- _EOF_ + Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] + + Searches for a locally built package corresponding to the PKGBUILD, and + downloads the last version of that package from the Pacman repositories. + It then compares the list of .so files provided by each version of the + package and outputs if there are soname differences for the new package. + A directory is also created using mktemp with files containing a file + list for both packages and a library list for both packages. + + OPTIONS + -r, --rmdir Remove the temporary directory + -w, --warn Print a warning in case of differences + -h, --help Show this help text +_EOF_ +} + +RMDIR=0 +WARN=0 + +OPT_SHORT='rwh' +OPT_LONG=('rmdir' 'warn' 'help') +if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then + exit 1 +fi +set -- "${OPTRET[@]}" + +while :; do + case $1 in + -r|--rmdir) + RMDIR=1 + ;; + -w|--warn) + WARN=1 + ;; + -h|--help) + usage + exit 0 + ;; + --) + shift; break + ;; + esac + shift +done + +if [[ ! -f PKGBUILD ]]; then + die 'This must be run in the directory of a built package.' +fi + +# shellcheck source=PKGBUILD.proto +. ./PKGBUILD +if [[ ${arch[0]} == 'any' ]]; then + CARCH='any' +fi + +STARTDIR=$(pwd) +(( RMDIR )) && trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT +TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX) + +for _pkgname in "${pkgname[@]}"; do + comparepkg=$_pkgname + pkgurl= + target_pkgver=$(get_full_version "$_pkgname") + if ! pkgfile=$(find_cached_package "$_pkgname" "$target_pkgver" "$CARCH"); then + die 'tarball not found for package: %s' "${_pkgname}-$target_pkgver" + fi + + ln -s "$pkgfile" "$TEMPDIR" + + if (( $# )); then + case $1 in + /*|*/*) + pkgurl=file://$(readlink -m "$1") ;; + *.pkg.tar*) + pkgurl=$1 ;; + '') + ;; + *) + comparepkg=$1 ;; + esac + shift + fi + [[ -n $pkgurl ]] || pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$comparepkg") || + die "Couldn't download previous package for %s." "$comparepkg" + + oldpkg=${pkgurl##*/} + + if [[ ${oldpkg} = "${pkgfile##*/}" ]]; then + die "The built package (%s) is the one in the repo right now!" "$_pkgname" + fi + + if [[ $pkgurl = file://* || ( $pkgurl = /* && -f $pkgurl ) ]]; then + ln -s "${pkgurl#file://}" "$TEMPDIR/$oldpkg" + elif [[ -f "$PKGDEST/$oldpkg" ]]; then + ln -s "$PKGDEST/$oldpkg" "$TEMPDIR/$oldpkg" + elif [[ -f "$STARTDIR/$oldpkg" ]]; then + ln -s "$STARTDIR/$oldpkg" "$TEMPDIR/$oldpkg" + else + curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl" + fi + + bsdtar tf "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old" + bsdtar tf "$pkgfile" | sort > "$TEMPDIR/filelist-$_pkgname" + + sdiff -s "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname" + + find-libprovides "$TEMPDIR/$oldpkg" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname-old" + find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname" + if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then + message="Sonames differ in $_pkgname!" + (( WARN )) && warning "$message" || msg "$message" + echo "$diff_output" + else + msg "No soname differences for %s." "$_pkgname" + fi +done + +(( RMDIR )) || msg "Files saved to %s" "$TEMPDIR" diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/checkrepo b/artools/0.26.1/artools/debian/artools/usr/bin/checkrepo new file mode 100755 index 0000000..afed698 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/checkrepo @@ -0,0 +1,550 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +##{{{ repo + +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 +} + +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[@]}") +} + +find_repo(){ + local pkg="$1" pkgarch="${2:-${CARCH}}" repo + for r in "${ARCH_REPOS[@]}"; do + [[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo=repos/"$r-$pkgarch" + [[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=repos/"$r"-any + [[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$pkgarch/$r" + done + echo "$repo" +} + +find_pkg(){ + local searchdir="$1" pkg="$2" result + result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg") + echo "$result" +} + +tree_loop(){ + local func="$1" pkgs + for tree in "${ARTIX_TREE[@]}"; do + pkgs=$(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort) + for _package in ${pkgs}; do + "$func" "$_package" + done + done +} + +#}}} + +#!/hint/bash + +#{{{ table + +msg_table_header(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" +} + +msg_row_yellow(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row_green(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row_red(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" +} + +#}}} + + +#{{{ db libs + +extract_db() { + local u="$1" cdir="$2" + rm -rf "$cdir" + mkdir -p "$cdir" + msg2 "%s" "${cdir##*/}" + curl -L -s "$u" | bsdtar -xf - -C "$cdir" +} + +update_db_cache(){ + msg "Updating database cache ..." + local cachedir url + for repo in "${searchrepos[@]}"; do + cachedir=${db_cache_dir}/linksdb/$repo + url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext} + extract_db "$url" "$cachedir" + done + msg "Done" +} + +#}}} + +#{{{ sogrep + +query_db() { + for repo in "${searchrepos[@]}"; do + local db + db=${db_cache_dir}/linksdb/$repo/ + if [[ -d ${db} ]]; then + while read -rd '' pkg; do + read -r match + pkg=${pkg#${db}} + pkg="${pkg%/*}" + msg_row "${tableQ}" "$repo" "$pkg" "${match}" + done < <(grep -rZ "$library" "$db") | sort -u + fi + done +} + +#}}} + +#{{{ 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" != *eudev* ]] && [[ "$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* ]]; 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}" +db_ext="db.tar.${DBEXT}" + +load_makepkg_config + +sync=false +check=false +query=false +all_db=false +obsolete=false + +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=( + "${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]}]}" +) + +#}}} + +usage() { + echo "Usage: ${0##*/} [options] (with -q [libname])" + echo ' -r Repo name to query' + echo ' [default: all]' + echo " -s Sync repo databases" + echo ' -c Check repos' + echo ' -a Show repo db (-c)' + echo ' -o Check for obsolete packages' + echo " -q Query repo databases for so libs" + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='r:qcsaoh' + +while getopts "${opts}" arg; do + case "${arg}" in + r) searchrepos=("$OPTARG") ;; + s) sync=true ;; + c) check=true ;; + a) all_db=true ;; + q) query=true ;; + o) obsolete=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +library="$1"; shift + +${sync} && update_db_cache + +${check} && show_db_table + +${query} && show_lib_table + +${obsolete} && show_obsolete_table diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/chroot-run b/artools/0.26.1/artools/debian/artools/usr/bin/chroot-run new file mode 100755 index 0000000..3438224 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/chroot-run @@ -0,0 +1,414 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ mount + +ignore_error() { + "$@" 2>/dev/null + return 0 +} + +trap_setup(){ + [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' + trap "$1" EXIT +} + +chroot_mount() { +# msg2 "mount: [%s]" "$2" + mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") +} + +chroot_add_resolv_conf() { + local chrootdir=$1 resolv_conf=$1/etc/resolv.conf + + [[ -e /etc/resolv.conf ]] || return 0 + + # Handle resolv.conf as a symlink to somewhere else. + if [[ -L $chrootdir/etc/resolv.conf ]]; then + # readlink(1) should always give us *something* since we know at this point + # it's a symlink. For simplicity, ignore the case of nested symlinks. + resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") + if [[ $resolv_conf = /* ]]; then + resolv_conf=$chrootdir$resolv_conf + else + resolv_conf=$chrootdir/etc/$resolv_conf + fi + + # ensure file exists to bind mount over + if [[ ! -f $resolv_conf ]]; then + install -Dm644 /dev/null "$resolv_conf" || return 1 + fi + elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then + # The chroot might not have a resolv.conf. + return 0 + fi + + chroot_mount /etc/resolv.conf "$resolv_conf" --bind +} + +chroot_mount_conditional() { + local cond=$1; shift + if eval "$cond"; then + chroot_mount "$@" + fi +} + +chroot_setup(){ + local mnt="$1" os="$2" args='-t tmpfs -o nosuid,nodev,mode=0755' + $os && args='--bind' + chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && + chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && + chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && + ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \ + efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && + chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && + chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && + chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && + chroot_mount /run "$mnt/run" ${args} && + chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid +} + +chroot_api_mount() { + CHROOT_ACTIVE_MOUNTS=() + trap_setup chroot_api_umount + chroot_setup "$1" false +} + +chroot_api_umount() { + if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then +# msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" + umount "${CHROOT_ACTIVE_MOUNTS[@]}" + fi + unset CHROOT_ACTIVE_MOUNTS +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + +#!/hint/bash + +CHROOTVERSION=0.10 + + +# $1: chroot +kill_chroot_process(){ + local prefix="$1" flink pid name + for root_dir in /proc/*/root; do + flink=$(readlink "$root_dir") + if [ "x$flink" != "x" ]; then + if [ "x${flink:0:${#prefix}}" = "x$prefix" ]; then + # this process is in the chroot... + pid=$(basename "$(dirname "$root_dir")") + name=$(ps -p "$pid" -o comm=) + msg2 "Killing chroot process: %s (%s)" "$name" "$pid" + kill -9 "$pid" + fi + fi + done + sleep 1 +} + +# umask might have been changed in /etc/profile +# ensure that sane default is set again +umask 0022 + +working_dir='' +files=() + +mount_args=("-B:/etc/hosts:/etc/hosts") + +usage() { + echo "Usage: ${0##*/} [options] working-dir [run arguments]" + echo "A wrapper around chroot. Provides support for pacman." + echo + echo ' options:' + echo ' -C Location of a pacman config file' + echo ' -M Location of a makepkg config file' + echo ' -c Set pacman cache' + echo ' -f Copy file from the host to the chroot' + echo ' -s Do not run setarch' + echo ' -b Bind mountargs' + echo ' List format [mntarg1:src1:dest1 ... mntargN:srcN:destN]' + echo ' -h This message' + exit 1 +} + +opts='hC:M:c:b:f:s' + +while getopts ${opts} arg; do + case "${arg}" in + C) pacman_conf="$OPTARG" ;; + M) makepkg_conf="$OPTARG" ;; + c) cache_dirs+=("$OPTARG") ;; + f) files+=("$OPTARG") ;; + s) nosetarch=1 ;; + b) bindmounts+=("$OPTARG"); mount_args+=(${bindmounts[@]}) ;; + h|?) usage ;; + *) error "invalid argument '$arg'"; usage ;; + esac +done +shift $(( OPTIND - 1 )) + +(( $# < 1 )) && die 'You must specify a directory.' + +check_root + +working_dir=$(readlink -f "$1") +shift 1 + +[[ -z $working_dir ]] && die 'Please specify a working directory.' + +if (( ${#cache_dirs[@]} == 0 )); then + mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir) +fi + +# shellcheck disable=2016 +host_mirrors=($(pacman-conf --repo world Server 2> /dev/null | sed -r 's#(.*/)world/os/.*#\1$repo/os/$arch#')) + +for host_mirror in "${host_mirrors[@]}"; do + if [[ $host_mirror == *file://* ]]; then + # shellcheck disable=2016 + host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g') + in_array "$host_mirror" "${cache_dirs[@]}" || cache_dirs+=("$host_mirror") + fi +done + +while read -r line; do + # shellcheck disable=2016 + mapfile -t lines < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" \ + --repo "$line" Server | sed -r 's#(.*/)[^/]+/os/.+#\1#') + for line in "${lines[@]}"; do + if [[ $line = file://* ]]; then + line=${line#file://} + in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line") + fi + done +done < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list) + +copy_hostconf () { + unshare --fork --pid gpg --homedir "$working_dir"/etc/pacman.d/gnupg/ --no-permission-warning --quiet --batch --import --import-options import-local-sigs "$(pacman-conf GpgDir)"/pubring.gpg >/dev/null 2>&1 + pacman-key --gpgdir "$working_dir"/etc/pacman.d/gnupg/ --import-trustdb "$(pacman-conf GpgDir)" >/dev/null 2>&1 + + printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist" + + [[ -n $pacman_conf ]] && cp "$pacman_conf" "${working_dir}/etc/pacman.conf" + + [[ -n $makepkg_conf ]] && cp "$makepkg_conf" "${working_dir}/etc/makepkg.conf" + + local file + for file in "${files[@]}"; do + mkdir -p "$(dirname "$working_dir$file")" + cp -T "$file" "$working_dir$file" + done + + sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "${working_dir}/etc/pacman.conf" +} + +mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}") + +for cache_dir in "${cache_dirs[@]:1}"; do + mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}") +done + +chroot_extra_mount() { + chroot_add_resolv_conf "${working_dir}" + + for arg in "${mount_args[@]}"; do + local flag=${arg%%:*} dest=${arg##*:} src=${arg%:*} + src=${src#*:} + chroot_mount "${src}" "${working_dir}${dest}" "${flag}" + done +} + +umask 0022 + +# Sanity check +if [[ ! -f "$working_dir/.artools" ]]; then + die "'%s' does not appear to be an artix chroot." "$working_dir" +elif [[ $(cat "$working_dir/.artools") != "${CHROOTVERSION}" ]]; then + die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}" +fi + +chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}" + +chroot_extra_mount + +copy_hostconf + +eval "$(grep '^CARCH=' "$working_dir/etc/makepkg.conf")" + +[[ -z $nosetarch ]] || unset CARCH + +if [[ -f "/usr/share/artools/setarch-aliases.d/${CARCH}" ]]; then + read -r set_arch < "/usr/share/artools/setarch-aliases.d/${CARCH}" +else + set_arch="${CARCH}" +fi + +${CARCH:+setarch "${set_arch}"} chroot "${working_dir}" "$@" + +ret=$? + +kill_chroot_process "${working_dir}" + +exit $ret diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/commitpkg b/artools/0.26.1/artools/debian/artools/usr/bin/commitpkg new file mode 100755 index 0000000..72bbd41 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/commitpkg @@ -0,0 +1,596 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ common functions + +get_compliant_name(){ + local gitname="$1" + case "$gitname" in + *+) gitname=${gitname//+/plus} + esac + echo "$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 + echo "$org" +} + +api_put() { + curl -s -X PUT "$@" +} + +api_delete() { + curl -s -X DELETE "$@" +} + +api_post() { + curl -s -X POST "$@" +} + +#}}} + +#!/hint/bash + +#{{{ git + +get_local_head(){ + git log --pretty=%H ...refs/heads/master^ | head -n 1 +} + +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 + fi +} + +pull_tree(){ + local tree="$1" local_head="$2" os="${3:-Artix}" + local remote_head + remote_head=$(get_remote_head) + + msg "Checking (%s) (%s)" "${tree}" "$os" + if has_changeset "${local_head}" "${remote_head}";then + git pull origin master + fi +} + +#}}} + +#!/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" +} + +#}}} + +#!/hint/bash + +##{{{ repo + +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 +} + +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[@]}") +} + +find_repo(){ + local pkg="$1" pkgarch="${2:-${CARCH}}" repo + for r in "${ARCH_REPOS[@]}"; do + [[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo=repos/"$r-$pkgarch" + [[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=repos/"$r"-any + [[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$pkgarch/$r" + done + echo "$repo" +} + +find_pkg(){ + local searchdir="$1" pkg="$2" result + result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg") + echo "$result" +} + +tree_loop(){ + local func="$1" pkgs + for tree in "${ARTIX_TREE[@]}"; do + pkgs=$(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort) + for _package in ${pkgs}; do + "$func" "$_package" + done + done +} + +#}}} + + +#{{{ functions + +push_tree(){ + local tree="$1" + msg "Update (%s)" "${tree}" + git push origin master +} + +subrepo_push(){ + local pkg="$1" + msg2 "Subrepo push (%s)" "$pkg" + git subrepo push "$pkg" || die "%s push failed" "$pkg" +} + +subrepo_clean(){ + local pkg="$1" + msg2 "Subrepo clean (%s)" "$pkg" + git subrepo clean "$pkg" +} + +subrepo_pull(){ + local pkg="$1" + msg2 "Subrepo pull (%s)" "$pkg" + git subrepo pull "$pkg" +} + +check_rebuild(){ + if [[ -d "$CARCH"/"${valid_names[10]}" ]] \ + && [[ "${repo_dest}" == "${valid_names[7]}" ]]; then + git rm -r "$CARCH"/"${valid_names[10]}" + git commit -m "switch from ${valid_names[10]} to ${valid_names[7]}" + elif [[ -d "$CARCH"/"${valid_names[7]}" ]] \ + && [[ "${repo_dest}" == "${valid_names[10]}" ]]; then + git rm -r "$CARCH"/"${valid_names[7]}" + git commit -m "switch from ${valid_names[7]} to ${valid_names[10]}" + fi +} + +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 +} + +path_config() { + [[ "${repo_src}" != 'trunk' ]] && pkgbuild="$CARCH/${repo_src}"/PKGBUILD + + # shellcheck disable=1090 + . "$pkgbuild" +} + +get_repo_commit_msg() { + echo "[${repo_src}] -> [${repo_dest}] '${package}-$(get_full_version)' ${action}" +} + +get_commit_msg() { + echo "[${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 trunk + else + git rm -r "$CARCH/${repo_src}" + fi + else + action='modify' + commit_msg=$(get_commit_msg) + msg "Action: %s" "$commit_msg" + git add . + fi + git commit -m "$commit_msg" +} + +repo_commit_pkg() { + local commit_msg + + [[ -d "$CARCH/${repo_dest}" ]] && git rm -r "$CARCH/${repo_dest}" + [[ ! -d "$CARCH" ]] && mkdir "$CARCH" + [[ ! -d "$CARCH/${repo_dest}" ]] && mkdir "$CARCH/${repo_dest}" + + if [[ "${repo_src}" == 'trunk' ]]; then + action='add' + commit_msg=$(get_repo_commit_msg) + msg "Action: %s" "$commit_msg" + check_rebuild + cp trunk/* "$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 "$CARCH/${repo_src}"/* "$CARCH/${repo_dest}"/ + git rm -r "$CARCH/${repo_src}" + fi + git add . + git commit -m "$commit_msg" +} + +run(){ + local artixpath head group + artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}") + if [[ -n ${artixpath} ]];then + group=${artixpath%/*} + cd "${group}" || return + head=$(get_local_head) + + cd "${artixpath}" || return + + path_config + + if [[ "${cmd}" == 'commitpkg' ]];then + commit_pkg + else + repo_commit_pkg + fi + + cd "${group}" || return + + ${push} && pull_tree "${group##*/}" "$head" +# subrepo_pull "${package}" + subrepo_push "${package}" + subrepo_clean "${package}" + + ${push} && push_tree "${group##*/}" + + git prune + + [[ "${cmd}" != 'commitpkg' ]] && check_team + 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 +push=false + +pkgbuild=trunk/PKGBUILD + +cmd=${0##*/} +repo_dest=${cmd%pkg} + +usage() { + echo "Usage: ${0##*/} [options]" + echo " -s Source repository [default:${repo_src}]" + echo ' -p Package name' + echo ' -r Delete from repo (commitpkg only)' + echo ' -u Push' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='p:s:urh' + +while getopts "${opts}" arg; do + case "${arg}" in + s) repo_src="$OPTARG" ;; + p) package="$OPTARG" ;; + r) remove=true ;; + u) push=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +if is_valid_repo;then + run +else + die "source repository '%s' is not valid!" "${repo_src}" +fi diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/community-stagingpkg b/artools/0.26.1/artools/debian/artools/usr/bin/community-stagingpkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/community-stagingpkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/community-testingpkg b/artools/0.26.1/artools/debian/artools/usr/bin/community-testingpkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/community-testingpkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/communitypkg b/artools/0.26.1/artools/debian/artools/usr/bin/communitypkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/communitypkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/comparepkg b/artools/0.26.1/artools/debian/artools/usr/bin/comparepkg new file mode 100755 index 0000000..6c4163a --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/comparepkg @@ -0,0 +1,506 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +##{{{ repo + +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 +} + +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[@]}") +} + +find_repo(){ + local pkg="$1" pkgarch="${2:-${CARCH}}" repo + for r in "${ARCH_REPOS[@]}"; do + [[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo=repos/"$r-$pkgarch" + [[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=repos/"$r"-any + [[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$pkgarch/$r" + done + echo "$repo" +} + +find_pkg(){ + local searchdir="$1" pkg="$2" result + result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg") + echo "$result" +} + +tree_loop(){ + local func="$1" pkgs + for tree in "${ARTIX_TREE[@]}"; do + pkgs=$(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort) + for _package in ${pkgs}; do + "$func" "$_package" + done + done +} + +#}}} + +#!/hint/bash + +#{{{ table + +msg_table_header(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" +} + +msg_row_yellow(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row_green(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row_red(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" +} + +#}}} + + + +#{{{ 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 +} + +compare_m(){ + case ${artixrepo} in + *testing*|*staging*|*rebuild) + if [[ "${a}" == "${b}" ]]; then + msg_row "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + elif [[ "${a}" == 'staging' && "${b}" == 'rebuild' ]]; then + msg_row_yellow "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + else + msg_row_green "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + if [[ -n "$archrepo" ]]; then + write_list "${a}:${b}:$pkg" pkg_moves + else + write_list "@repo@:${b}:$pkg" artix + fi + fi + ;; + esac +} + +compare_u(){ + if [ "$result" -eq -1 ];then +# local arel=${archver##*-} brel=${artixver##*-} +# local reldiff +# reldiff=$(( $arel-${brel%.*} )) + msg_row_red "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + write_list "${a}:$pkg" pkg_upgrades + fi +} + +compare_d(){ + if [ "$result" -eq 1 ];then + if [[ -n "$archver" ]] && [[ -n "$archrepo" ]];then + msg_row_yellow "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${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 + echo "$archpath" +} + +pre_compare(){ + local func="$1" pkgpath="$2" result group pkg + group="${pkgpath%/*}" + group=${group##*/} + pkg=${pkgpath##*/} + + local artixrepo archrepo pkgbuild artixver archver archpath node a b + artixrepo=$(find_repo "$pkgpath") + pkgbuild=$pkgpath/$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/$archrepo/PKGBUILD + node=${artixrepo%/*} + a=${archrepo#*/} b=${artixrepo#*/} + a="${a%-*}" + + [[ "$node" != "$CARCH" ]] && b=${b%-*} + + if [[ -f "$pkgbuild" ]]; then + # shellcheck disable=1090 + . "$pkgbuild" 2>/dev/null + archver=$(get_full_version) + fi + + result=$(vercmp "$artixver" "$archver") + + "$func" + + unset epoch + fi +} + +compare_upgrades(){ + local pkgpath="${1%/*}" + pre_compare compare_u "$pkgpath" +} + +compare_downgrades(){ + local pkgpath="${1%/*}" + pre_compare compare_d "$pkgpath" +} + +compare_move(){ + local pkgpath="${1%/*}" + pre_compare compare_m "$pkgpath" +} + +#}}} + +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 %-25s %-27s %-27s %-10s" + +usage() { + echo "Usage: ${0##*/} [options]" + echo ' -u Show upgrade packages' + echo ' -d Show downgrade packages' + echo ' -m Show packages to move' + echo " -x Don't inlcude testing packages" + echo " -y Don't inlcude staging packages" + echo ' -z Include unstable kde and gnome' + echo ' -h This help' + echo '' + echo '' + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +set_arch_repos "$testing" "$staging" "$unstable" + +${move} && show_move_table + +${upgrades} && show_upgrades_table + +${downgrades} && show_downgrades_table diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/corepkg b/artools/0.26.1/artools/debian/artools/usr/bin/corepkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/corepkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg new file mode 100755 index 0000000..b6b596e --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg @@ -0,0 +1,351 @@ +#!/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. + +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'/usr/share/artools'} +SYSCONFDIR=${SYSCONFDIR:-'/etc/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" + +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ functions + +find_cached_pkgfile() { + local searchdirs=("$PKGDEST" "$PWD") results=() + local pkg="$1" + for dir in "${searchdirs[@]}"; do + [[ -d "$dir" ]] || continue + [[ -e "$dir/$pkg" ]] && results+=("$dir/$pkg") + done + case ${#results[*]} in + 0) + return 1 + ;; + 1) + printf '%s\n' "${results[0]}" + return 0 + ;; + *) + error 'Multiple packages found:' + printf '\t%s\n' "${results[@]}" >&2 + return 1 + ;; + esac +} + +get_pkgbasename() { + local name="$1" + local rm_pkg=${name%.pkg.tar*} + rm_pkg=${rm_pkg%-*} + rm_pkg=${rm_pkg%-*} + rm_pkg=${rm_pkg%-*} + echo "$rm_pkg" +} + +#}}} + + +#{{{ deploy + +add(){ + if pkgfile=$(find_cached_pkgfile "${pkgname}"); then + msg "Found: %s" "${pkgfile}" + packages+=("${pkgname}") + action='add' + ln -sfv "${pkgfile}"{,.sig} "$repo_path"/ + fi +} + +remove(){ + packages+=("$(get_pkgbasename "${pkgname}")") + action='remove' + rm -v "$repo_path"/"${pkgname}"{,.sig} +} + +repo_action(){ + local packages=() action func="$1" + for pkgname in "${passfiles[@]}"; do + "$func" + done + cd "$repo_path" || return + if [[ -n "${action}" ]]; then + repo-"${action}" -R "${dest_repo}"."${pkgdb_ext}" "${packages[@]}" + ${linksdb} && links-"${action}" "${dest_repo}"."${linksdb_ext}" "${packages[@]}" + fi +} + +#}}} + +load_makepkg_config + +pkgdb_ext="db.tar.${DBEXT}" +linksdb_ext="links.tar.${DBEXT}" + +add_pkg=false +rm_pkg=false +linksdb=false + +cmd=${0##*/} +dest_repo=${cmd#*-} + +usage() { + echo "Usage: ${cmd} [options]" + echo ' -d Destination repository' + echo ' -a Add package(s) to repository' + echo ' -r Remove package(s) from repository' + echo ' -l Use links db' + echo ' -h This help' + echo '' + echo '' + exit "$1" +} + +opts='arlhd:' + +while getopts "${opts}" arg; do + case "${arg}" in + d) dest_repo="$OPTARG" ;; + a) add_pkg=true; rm_pkg=false ;; + r) rm_pkg=true; add_pkg=false ;; + l) linksdb=true ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +passfiles=("$@") + +repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH} + +if [[ -n "${passfiles[*]}" ]]; then + if ${add_pkg}; then + repo_action add + fi + if ${rm_pkg}; then + repo_action remove + fi +fi diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy-goblins b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy-goblins new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy-goblins @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy-gremlins b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy-gremlins new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy-gremlins @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-gnome-wobble b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-gnome-wobble new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-gnome-wobble @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-goblins b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-goblins new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-goblins @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-gremlins b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-gremlins new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-gremlins @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-kde-wobble b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-kde-wobble new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-kde-wobble @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32 b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32 new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32 @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32-goblins b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32-goblins new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32-goblins @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32-gremlins b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32-gremlins new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32-gremlins @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-system b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-system new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-system @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-world b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-world new file mode 120000 index 0000000..47b3194 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-world @@ -0,0 +1 @@ +deploypkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/extrapkg b/artools/0.26.1/artools/debian/artools/usr/bin/extrapkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/extrapkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/find-libdeps b/artools/0.26.1/artools/debian/artools/usr/bin/find-libdeps new file mode 100755 index 0000000..56294b8 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/find-libdeps @@ -0,0 +1,196 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +set -e +shopt -s extglob + +IGNORE_INTERNAL=0 + +if [[ $1 = "--ignore-internal" ]]; then + IGNORE_INTERNAL=1 + shift +fi + +script_mode=${BASH_SOURCE[0]##*/find-lib} + +case $script_mode in + deps|provides) true;; + *) die "Unknown mode %s" "$script_mode" ;; +esac + +if [[ -z $1 ]]; then + echo "${0##*/} [options] " + echo "Options:" + echo " --ignore-internal ignore internal libraries" + exit 1 +fi + +if [[ -d $1 ]]; then + pushd "$1" >/dev/null +else + setup_workdir + + case ${script_mode} in + deps) bsdtar -C "$WORKDIR" -xf "$1";; + provides) bsdtar -C "$WORKDIR" -xf "$1" --include="*.so*";; + esac + + pushd "$WORKDIR" >/dev/null +fi + +process_sofile() { + # extract the library name: libfoo.so + soname="${sofile%.so?(+(.+([0-9])))}".so + # extract the major version: 1 + soversion="${sofile##*\.so\.}" + if [[ "$soversion" = "$sofile" ]] && ((IGNORE_INTERNAL)); then + return + fi + if ! in_array "${soname}=${soversion}-${soarch}" "${soobjects[@]}"; then + # libfoo.so=1-64 + echo "${soname}=${soversion}-${soarch}" + soobjects+=("${soname}=${soversion}-${soarch}") + fi +} + +case $script_mode in + deps) find_args=(-perm -u+x);; + provides) find_args=(-name '*.so*');; +esac + +find . -type f "${find_args[@]}" | while read -r filename; do + if [[ $script_mode = "provides" ]]; then + # ignore if we don't have a shared object + if ! LC_ALL=C readelf -h "$filename" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then + continue + fi + fi + + # get architecture of the file; if soarch is empty it's not an ELF binary + soarch=$(LC_ALL=C readelf -h "$filename" 2>/dev/null | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p') + [[ -n $soarch ]] || continue + + if [[ $script_mode = "provides" ]]; then + # get the string binaries link to: libfoo.so.1.2 -> libfoo.so.1 + sofile=$(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p') + [[ -z $sofile ]] && sofile="${filename##*/}" + process_sofile + elif [[ $script_mode = "deps" ]]; then + # process all libraries needed by the binary + for sofile in $(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'); do + process_sofile + done + fi +done + +popd >/dev/null diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/find-libprovides b/artools/0.26.1/artools/debian/artools/usr/bin/find-libprovides new file mode 120000 index 0000000..69b4ce5 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/find-libprovides @@ -0,0 +1 @@ +find-libdeps \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/finddeps b/artools/0.26.1/artools/debian/artools/usr/bin/finddeps new file mode 100755 index 0000000..fdc96f7 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/finddeps @@ -0,0 +1,147 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +match=$1 + +if [[ -z $match ]]; then + echo 'Usage: finddeps ' + echo '' + echo 'Find packages that depend on a given depname.' + echo 'Run this script from the top-level directory of your ABS tree.' + echo '' + exit 1 +fi + +find . -type d -print0 2>/dev/null| while read -r -d '' d; do + if [[ -f "$d/PKGBUILD" ]]; then + pkgname=() depends=() makedepends=() optdepends=() + # shellcheck source=PKGBUILD.proto + . "$d/PKGBUILD" + for dep in "${depends[@]}"; do + # lose the version comparator, if any + depname=${dep%%[<>=]*} + [[ $depname = "$match" ]] && msg "$d (depends)" + done + for dep in "${makedepends[@]}"; do + # lose the version comparator, if any + depname=${dep%%[<>=]*} + [[ $depname = "$match" ]] && msg "$d (makedepends)" + done + for dep in "${optdepends[@]/:*}"; do + # lose the version comaparator, if any + depname=${dep%%[<>=]*} + [[ $depname = "$match" ]] && msg "$d (optdepends)" + done + fi +done + diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/fstabgen b/artools/0.26.1/artools/debian/artools/usr/bin/fstabgen new file mode 100755 index 0000000..0bff558 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/fstabgen @@ -0,0 +1,529 @@ +#!/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. + +shopt -s extglob + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +#{{{ filesystems + +declare -A pseudofs_types=([anon_inodefs]=1 + [autofs]=1 + [bdev]=1 + [bpf]=1 + [binfmt_misc]=1 + [cgroup]=1 + [cgroup2]=1 + [configfs]=1 + [cpuset]=1 + [debugfs]=1 + [devfs]=1 + [devpts]=1 + [devtmpfs]=1 + [dlmfs]=1 + [efivarfs]=1 + [fuse.gvfs-fuse-daemon]=1 + [fusectl]=1 + [hugetlbfs]=1 + [mqueue]=1 + [nfsd]=1 + [none]=1 + [pipefs]=1 + [proc]=1 + [pstore]=1 + [ramfs]=1 + [rootfs]=1 + [rpc_pipefs]=1 + [securityfs]=1 + [sockfs]=1 + [spufs]=1 + [sysfs]=1 + [tmpfs]=1) + +declare -A fsck_types=([cramfs]=1 + [exfat]=1 + [ext2]=1 + [ext3]=1 + [ext4]=1 + [ext4dev]=1 + [jfs]=1 + [minix]=1 + [msdos]=1 + [reiserfs]=1 + [vfat]=1 + [xfs]=1) + +#}}} + +#{{{ functions + +fstype_is_pseudofs() { + (( pseudofs_types["$1"] )) +} + +fstype_has_fsck() { + (( fsck_types["$1"] )) +} + +valid_number_of_base() { + local base=$1 len=${#2} i + + for (( i = 0; i < len; i++ )); do + { _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null + done + + return 0 +} + +mangle() { + local i chr out + + local {a..f}= {A..F}= + + for (( i = 0; i < ${#1}; i++ )); do + chr=${1:i:1} + case $chr in + [[:space:]\\]) + printf -v chr '%03o' "'$chr" + out+=\\ + ;; + esac + out+=$chr + done + + printf '%s' "$out" +} + +unmangle() { + local i chr out len=$(( ${#1} - 4 )) + + local {a..f}= {A..F}= + + for (( i = 0; i < len; i++ )); do + chr=${1:i:1} + case $chr in + \\) + if valid_number_of_base 8 "${1:i+1:3}" || + valid_number_of_base 16 "${1:i+1:3}"; then + printf -v chr '%b' "${1:i:4}" + (( i += 3 )) + fi + ;; + esac + out+=$chr + done + + printf '%s' "$out${1:i}" +} + +dm_name_for_devnode() { + read -r dm_name <"/sys/class/block/${1#/dev/}/dm/name" + if [[ $dm_name ]]; then + printf '/dev/mapper/%s' "$dm_name" + else + # don't leave the caller hanging, just print the original name + # along with the failure. + print '%s' "$1" + error 'Failed to resolve device mapper name for: %s' "$1" + fi +} + +optstring_match_option() { + local candidate pat patterns + + IFS=, read -ra patterns <<<"$1" + for pat in "${patterns[@]}"; do + if [[ $pat = *=* ]]; then + # "key=val" will only ever match "key=val" + candidate=$2 + else + # "key" will match "key", but also "key=anyval" + candidate=${2%%=*} + fi + + [[ $pat = "$candidate" ]] && return 0 + done + + return 1 +} + +optstring_remove_option() { + local o options_ remove=$2 IFS=, + + read -ra options_ <<<"${!1}" + + for o in "${!options_[@]}"; do + optstring_match_option "$remove" "${options_[o]}" && unset 'options_[o]' + done + + declare -g "$1=${options_[*]}" +} + +optstring_normalize() { + local o options_ norm IFS=, + + read -ra options_ <<<"${!1}" + + # remove empty fields + for o in "${options_[@]}"; do + [[ $o ]] && norm+=("$o") + done + + # avoid empty strings, reset to "defaults" + declare -g "$1=${norm[*]:-defaults}" +} + +optstring_append_option() { + if ! optstring_has_option "$1" "$2"; then + declare -g "$1=${!1},$2" + fi + + optstring_normalize "$1" +} + +optstring_prepend_option() { + if ! optstring_has_option "$1" "$2"; then + declare -g "$1=$2,${!1}" + fi + + optstring_normalize "$1" +} + +optstring_get_option() { + local opts o + + IFS=, read -ra opts <<<"${!1}" + for o in "${opts[@]}"; do + if optstring_match_option "$2" "$o"; then + declare -g "$o" + return 0 + fi + done + + return 1 +} + +optstring_has_option() { + local "${2%%=*}" + + optstring_get_option "$1" "$2" +} + +write_source() { + local src=$1 spec label uuid comment=() + + label=$(lsblk -rno LABEL "$1" 2>/dev/null) + uuid=$(lsblk -rno UUID "$1" 2>/dev/null) + + # bind mounts do not have a UUID! + + case $bytag in + '') + [[ $uuid ]] && comment=("UUID=$uuid") + [[ $label ]] && comment+=("LABEL=$(mangle "$label")") + ;; + LABEL) + spec=$label + [[ $uuid ]] && comment=("$src" "UUID=$uuid") + ;; + UUID) + spec=$uuid + comment=("$src") + [[ $label ]] && comment+=("LABEL=$(mangle "$label")") + ;; + *) + [[ $uuid ]] && comment=("$1" "UUID=$uuid") + [[ $label ]] && comment+=("LABEL=$(mangle "$label")") + [[ $bytag ]] && spec=$(lsblk -rno "$bytag" "$1" 2>/dev/null) + ;; + esac + + [[ -n "${comment[*]}" ]] && printf '# %s\n' "${comment[*]}" + + if [[ $spec ]]; then + printf '%-20s' "$bytag=$(mangle "$spec")" + else + printf '%-20s' "$(mangle "$src")" + fi +} + +optstring_apply_quirks() { + local varname="$1" fstype="$2" + + # SELinux displays a 'seclabel' option in /proc/self/mountinfo. We can't know + # if the system we're generating the fstab for has any support for SELinux (as + # one might install Arch from a Fedora environment), so let's remove it. + optstring_remove_option "$varname" seclabel + + # Prune 'relatime' option for any pseudofs. This seems to be a rampant + # default which the kernel often exports even if the underlying filesystem + # doesn't support it. Example: https://bugs.archlinux.org/task/54554. + if awk -v fstype="$fstype" '$1 == fstype { exit 1 }' /proc/filesystems; then + optstring_remove_option "$varname" relatime + fi + + case $fstype in + f2fs) + # These are Kconfig options for f2fs. Kernels supporting the options will + # only provide the negative versions of these (e.g. noacl), and vice versa + # for kernels without support. + optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr + ;; + vfat) + # Before Linux v3.8, "cp" is prepended to the value of the codepage. + if optstring_get_option "$varname" codepage && [[ "$codepage" = cp* ]]; then + optstring_remove_option "$varname" codepage + optstring_append_option "$varname" "codepage=${codepage#cp}" + fi + ;; + esac +} + +#}}} + +usage() { + cat </dev/null; then + # this is root. we can't possibly have more than one... + pass=1 foundroot=1 + fi + + # if there's no fsck tool available, then only pass=0 makes sense. + if ! fstype_has_fsck "$fstype"; then + pass=0 + fi + + if [[ $fsroot != / && $fstype != btrfs ]]; then + # it's a bind mount + src=$(findmnt -funcevo TARGET "$src")$fsroot + if [[ $src -ef $target ]]; then + # hrmm, this is weird. we're probably looking at a file or directory + # that was bound into a chroot from the host machine. Ignore it, + # because this won't actually be a valid mount. Worst case, the user + # just re-adds it. + continue + fi + fstype=none + opts+=,bind + pass=0 + fi + + # filesystem quirks + case $fstype in + fuseblk) + # well-behaved FUSE filesystems will report themselves as fuse.$fstype. + # this is probably NTFS-3g, but let's just make sure. + if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then + # avoid blanking out fstype, leading to an invalid fstab + error 'Failed to derive real filesystem type for FUSE device on %s' "$target" + else + fstype=$newtype + fi + ;; + esac + + optstring_apply_quirks "opts" "$fstype" + + # write one line + write_source "$src" + printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts" + printf '\t%s %s' "$dump" "$pass" + printf '\n\n' +done + +# handle swaps devices +{ + # ignore header + read -r + + while read -r device type _ _ prio; do + options=defaults + if (( prio >= 0 )); then + options+=,pri=$prio + fi + + # skip files marked deleted by the kernel + [[ $device = *'\040(deleted)' ]] && continue + + if [[ $type = file ]]; then + printf '%-20s' "${device#${root%/}}" + elif [[ $device = /dev/dm-+([0-9]) ]]; then + # device mapper doesn't allow characters we need to worry + # about being mangled, and it does the escaping of dashes + # for us in sysfs. + write_source "$(dm_name_for_devnode "$device")" + else + write_source "$(unmangle "$device")" + fi + + printf '\t%-10s\t%-10s\t%-10s\t0 0\n\n' 'none' 'swap' "$options" + done +} ${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ common functions + +get_compliant_name(){ + local gitname="$1" + case "$gitname" in + *+) gitname=${gitname//+/plus} + esac + echo "$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 + echo "$org" +} + +api_put() { + curl -s -X PUT "$@" +} + +api_delete() { + curl -s -X DELETE "$@" +} + +api_post() { + curl -s -X POST "$@" +} + +#}}} + + +#{{{ 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() { + echo "Usage: ${0##*/} [options]" + echo ' -r Repo name' + echo ' -c Create git repo' + echo ' -t Transfer git repo to landfill org' + echo ' -h This help' + echo '' + echo '' + 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 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +org=$(get_pkg_org "${repo}") + +${create} && create_repo "${repo}" "${org}" + +${transfer} && transfer_repo "${repo}" "${org}" diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/gnome-unstablepkg b/artools/0.26.1/artools/debian/artools/usr/bin/gnome-unstablepkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/gnome-unstablepkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/kde-unstablepkg b/artools/0.26.1/artools/debian/artools/usr/bin/kde-unstablepkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/kde-unstablepkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/lddd b/artools/0.26.1/artools/debian/artools/usr/bin/lddd new file mode 100755 index 0000000..8460493 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/lddd @@ -0,0 +1,154 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +ifs=$IFS +IFS="${IFS}:" + +libdirs="/lib /usr/lib /usr/local/lib $(cat /etc/ld.so.conf.d/*)" +extras= + +TEMPDIR=$(mktemp -d --tmpdir lddd-script.XXXX) + +msg 'Go out and drink some tea, this will take a while :) ...' +# Check ELF binaries in the PATH and specified dir trees. +for tree in $PATH $libdirs $extras; do + msg2 "DIR %s" "$tree" + + # Get list of files in tree. + files=$(find "$tree" -type f ! -name '*.a' ! -name '*.la' ! -name '*.py*' ! -name '*.txt' ! -name '*.h' ! -name '*.ttf' ! \ + -name '*.rb' ! -name '*.ko' ! -name '*.pc' ! -name '*.enc' ! -name '*.cf' ! -name '*.def' ! -name '*.rules' ! -name \ + '*.cmi' ! -name '*.mli' ! -name '*.ml' ! -name '*.cma' ! -name '*.cmx' ! -name '*.cmxa' ! -name '*.pod' ! -name '*.pm' \ + ! -name '*.pl' ! -name '*.al' ! -name '*.tcl' ! -name '*.bs' ! -name '*.o' ! -name '*.png' ! -name '*.gif' ! -name '*.cmo' \ + ! -name '*.cgi' ! -name '*.defs' ! -name '*.conf' ! -name '*_LOCALE' ! -name 'Compose' ! -name '*_OBJS' ! -name '*.msg' ! \ + -name '*.mcopclass' ! -name '*.mcoptype') + IFS=$ifs + for i in $files; do + if (( $(file "$i" | grep -c 'ELF') != 0 )); then + # Is an ELF binary. + if (( $(ldd "$i" 2>/dev/null | grep -c 'not found') != 0 )); then + # Missing lib. + echo "$i:" >> "$TEMPDIR/raw.txt" + ldd "$i" 2>/dev/null | grep 'not found' >> "$TEMPDIR/raw.txt" + fi + fi + done +done +grep '^/' "$TEMPDIR/raw.txt" | sed -e 's/://g' >> "$TEMPDIR/affected-files.txt" +# invoke pacman +while read -r i; do + pacman -Qo "$i" | awk '{print $4,$5}' >> "$TEMPDIR/pacman.txt" +done < "$TEMPDIR/affected-files.txt" +# clean list +sort -u "$TEMPDIR/pacman.txt" >> "$TEMPDIR/possible-rebuilds.txt" + +msg "Files saved to %s" "$TEMPDIR" diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/links-add b/artools/0.26.1/artools/debian/artools/usr/bin/links-add new file mode 100755 index 0000000..565f10c --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/links-add @@ -0,0 +1,609 @@ +#!/bin/bash +# +# links-add - add a package to a given repo database file +# links-remove - remove a package entry from a given repo database file +# +# Copyright (c) 2006-2018 Pacman Development Team +# Copyright (c) 2019 artoo@artixlinux.org +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + + +shopt -s extglob + +declare -r REPO_DB_NAME="links" + +QUIET=0 +ONLYADDNEW=0 +SIGN=0 +KEY=0 +VERIFY=0 +REPO_DB_FILE= +REPO_DB_PREFIX= +REPO_DB_SUFFIX= +LOCKFILE= +CLEAN_LOCK=0 + +# ensure we have a sane umask set +umask 0022 + +# print usage instructions +usage() { + cmd=${0##*/} + printf -- "%s \n\n" "$cmd" + if [[ $cmd == "links-add" ]] ; then + printf -- "Usage: links-add [options] ...\n" + printf -- "\n" + printf -- "\ +links-add will update a package database by reading a package file.\n\ +Multiple packages to add can be specified on the command line.\n" + printf -- "\n" + printf -- "Options:\n" + printf -- " -n, --new only add packages that are not already in the database\n" + elif [[ $cmd == "links-remove" ]] ; then + printf -- "Usage: links-remove [options] ...\n" + printf -- "\n" + printf -- "\ +links-remove will update a package database by removing the package name\n\ +specified on the command line from the given repo database. Multiple\n\ +packages to remove can be specified on the command line.\n" + printf -- "\n" + printf -- "Options:\n" + else + printf -- "Please move along, there is nothing to see here.\n" + return + fi + printf -- " --nocolor turn off color in output\n" + printf -- " -q, --quiet minimize output\n" + printf -- " -s, --sign sign database with GnuPG after update\n" + printf -- " -k, --key use the specified key to sign the database\n" + printf -- " -v, --verify verify database's signature before update\n" + printf -- "\n\ +See %s(8) for more details and descriptions of the available options.\n" "$cmd" + printf "\n" + if [[ $cmd == "links-add" ]] ; then + printf -- "Example: links-add /path/to/repo.links.tar.xz pacman-5.1.3-1-x86_64.pkg.tar.xz\n" + elif [[ $cmd == "links-remove" ]] ; then + printf -- "Example: links-remove /path/to/repo.links.tar.xz kernel26\n" + fi +} + +find_pkgentry() { + local pkgname=$1 + local pkgentry + + for pkgentry in "$tmpdir/${REPO_DB_NAME}/$pkgname"*; do + name=${pkgentry##*/} + if [[ ${name%-*-*} = "$pkgname" ]]; then + echo "$pkgentry" + return 0 + fi + done + return 1 +} + +check_gpg() { + if ! type -p gpg >/dev/null; then + error "Cannot find the gpg binary! Is GnuPG installed?" + exit 1 # $E_MISSING_PROGRAM + fi + + if (( ! VERIFY )); then + if ! gpg --list-secret-key ${GPGKEY:+"$GPGKEY"} &>/dev/null; then + if [[ -n "$GPGKEY" ]]; then + error "The key ${GPGKEY} does not exist in your keyring." + elif (( ! KEY )); then + error "There is no key in your keyring." + fi + exit 1 + fi + fi +} + +# sign the package database once repackaged +create_signature() { + (( ! SIGN )) && return + local dbfile=$1 + local ret=0 + msg "Signing database '%s'..." "${dbfile##*/.tmp.}" + + local SIGNWITHKEY=() + if [[ -n $GPGKEY ]]; then + SIGNWITHKEY=(-u "${GPGKEY}") + fi + gpg --detach-sign --use-agent --no-armor "${SIGNWITHKEY[@]}" "$dbfile" &>/dev/null || ret=$? + + if (( ! ret )); then + msg2 "Created signature file '%s'" "${dbfile##*/.tmp.}.sig" + else + warning "Failed to sign package database file '%s'" "${dbfile##*/.tmp.}" + fi +} + +# verify the existing package database signature +verify_signature() { + (( ! VERIFY )) && return + local dbfile=$1 + local ret=0 + msg "Verifying database signature..." + + if [[ ! -f $dbfile.sig ]]; then + warning "No existing signature found, skipping verification." + return + fi + gpg --verify "$dbfile.sig" || ret=$? + if (( ! ret )); then + msg2 "Database signature file verified." + else + error "Database signature was NOT valid!" + exit 1 + fi +} + +verify_repo_extension() { + local junk=() + if [[ $1 = *.links.tar* ]] && get_compression_command "$1" junk; then + return 0 + fi + + error "'%s' does not have a valid database archive extension." "$1" + exit 1 +} + +# write an entry to the pacman database +# arg1 - path to package +db_write_entry() { + # blank out all variables + local pkgfile=$1 + + local pkgname pkgver + + # read info from the zipped package + local line var val + while read -r line; do + [[ ${line:0:1} = '#' ]] && continue + IFS=' =' read -r var val < <(printf '%s\n' "$line") + # normalize whitespace with an extglob + declare "$var=${val//+([[:space:]])/ }" + + done< <(bsdtar -xOqf "$pkgfile" .PKGINFO) + + # ensure $pkgname and $pkgver variables were found + if [[ -z $pkgname || -z $pkgver ]]; then + error "Invalid package file '%s'." "$pkgfile" + return 1 + fi + + if [[ -d $tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver ]]; then + warning "An entry for '%s' already existed" "$pkgname-$pkgver" + if (( ONLYADDNEW )); then + return 0 + fi + fi + + # remove an existing entry if it exists, ignore failures + db_remove_entry "$pkgname" + + local tmppkg=$tmpdir/pkg/$pkgname-$pkgver + + mkdir "$tmppkg" + + bsdtar -xof "$pkgfile" -C "$tmppkg" --include={opt,{,usr/}{lib{,32},{s,}bin}}'/*' 2>/dev/null + + pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null + mkdir "$pkgname-$pkgver" + pushd "$pkgname-$pkgver" >/dev/null + + # create links entry + msg2 "Creating '%s' db entry..." "${REPO_DB_NAME}" + + local linksentry=$tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver/${REPO_DB_NAME} + local files=$(find "$tmppkg" -type f ! -ipath "*/Documentation/*") + + for f in ${files}; do + readelf -d "$f" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p' + done | sort -u > "$linksentry" + + popd >/dev/null + popd >/dev/null + + return 0 +} + +# remove existing entries from the DB +# arg1 - package name +db_remove_entry() { + local pkgname=$1 + local notfound=1 + local pkgentry + pkgentry=$(find_pkgentry "$pkgname") + while [[ -n $pkgentry ]]; do + notfound=0 + + msg2 "Removing existing entry '%s'..." \ + "${pkgentry##*/}" + rm -rf "$pkgentry" + + # remove entries in "links" database + local linksentry + linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//') + rm -rf "$linksentry" + + pkgentry=$(find_pkgentry "$pkgname") + done + return $notfound +} + +prepare_repo_db() { + local repodir dbfile + + # ensure the path to the DB exists; $LOCKFILE is always an absolute path + repodir=${LOCKFILE%/*}/ + + if [[ ! -d $repodir ]]; then + error "%s does not exist or is not a directory." "$repodir" + exit 1 + fi + + # check lock file + if ( set -o noclobber; echo "$$" > "$LOCKFILE") 2> /dev/null; then + CLEAN_LOCK=1 + else + error "Failed to acquire lockfile: %s." "$LOCKFILE" + [[ -f $LOCKFILE ]] && error "Held by process %s" "$(cat "$LOCKFILE")" + exit 1 + fi + + dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX + + if [[ -f $dbfile ]]; then + # there are two situations we can have here: + # a DB with some entries, or a DB with no contents at all. + if ! bsdtar -tqf "$dbfile" '*/links' >/dev/null 2>&1; then + # check empty case + if [[ -n $(bsdtar -tqf "$dbfile" '*' 2>/dev/null) ]]; then + error "Repository file '%s' is not a proper links database." "$dbfile" + exit 1 + fi + fi + verify_signature "$dbfile" + msg "Extracting %s to a temporary location..." "${dbfile##*/}" + bsdtar -xf "$dbfile" -C "$tmpdir/${REPO_DB_NAME}" + else + case $cmd in + links-remove) + # only a missing "db" database is currently an error + # TODO: remove if statement + if [[ ${REPO_DB_NAME} == "links" ]]; then + error "Repository file '%s' was not found." "$dbfile" + exit 1 + fi + ;; + links-add) + # check if the file can be created (write permission, directory existence, etc) + if ! touch "$dbfile"; then + error "Repository file '%s' could not be created." "$dbfile" + exit 1 + fi + rm -f "$dbfile" + ;; + esac + fi +} + +add() { + if [[ ! -f $1 ]]; then + error "File '%s' not found." "$1" + return 1 + fi + + pkgfile=$1 + if ! bsdtar -tqf "$pkgfile" .PKGINFO >/dev/null 2>&1; then + error "'%s' is not a package file, skipping" "$pkgfile" + return 1 + fi + + msg "Adding package '%s'" "$pkgfile" + + db_write_entry "$pkgfile" +} + +remove() { + pkgname=$1 + msg "Searching for package '%s'..." "$pkgname" + + if ! db_remove_entry "$pkgname"; then + error "Package matching '%s' not found." "$pkgname" + return 1 + fi + + return 0 +} + +rotate_db() { + dirname=${LOCKFILE%/*} + + pushd "$dirname" >/dev/null + + filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX} + tempname=$dirname/.tmp.$filename + + # hardlink or move the previous version of the database and signature to .old + # extension as a backup measure + if [[ -f $filename ]]; then + ln -f "$filename" "$filename.old" 2>/dev/null || \ + mv -f "$filename" "$filename.old" + + if [[ -f $filename.sig ]]; then + ln -f "$filename.sig" "$filename.old.sig" 2>/dev/null || \ + mv -f "$filename.sig" "$filename.old.sig" + else + rm -f "$filename.old.sig" + fi + fi + + # rotate the newly-created database and signature into place + mv "$tempname" "$filename" + if [[ -f $tempname.sig ]]; then + mv "$tempname.sig" "$filename.sig" + fi + + dblink=${filename%.tar*} + rm -f "$dblink" "$dblink.sig" + ln -s "$filename" "$dblink" 2>/dev/null || \ + ln "$filename" "$dblink" 2>/dev/null || \ + cp "$filename" "$dblink" + if [[ -f "$filename.sig" ]]; then + ln -s "$filename.sig" "$dblink.sig" 2>/dev/null || \ + ln "$filename.sig" "$dblink.sig" 2>/dev/null || \ + cp "$filename.sig" "$dblink.sig" + fi + + popd >/dev/null +} + +create_db() { + # $LOCKFILE is already guaranteed to be absolute so this is safe + dirname=${LOCKFILE%/*} + + filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX} + # this ensures we create it on the same filesystem, making moves atomic + tempname=$dirname/.tmp.$filename + + pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null + local files=(*) + if [[ ${files[*]} = '*' ]]; then + # we have no packages remaining? zip up some emptyness + warning "No packages remain, creating empty database." + files=(-T /dev/null) + fi + bsdtar -cf - "${files[@]}" | compress_as "$filename" > "$tempname" + popd >/dev/null + + create_signature "$tempname" +} + +trap_exit() { + # unhook all traps to avoid race conditions + trap '' EXIT TERM HUP QUIT INT ERR + + echo + error "$@" + clean_up 1 +} + +clean_up() { + local exit_code=${1:-$?} + + # unhook all traps to avoid race conditions + trap '' EXIT TERM HUP QUIT INT ERR + + [[ -d $tmpdir ]] && rm -rf "$tmpdir" + (( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE" + + exit "$exit_code" +} + +# PROGRAM START +case $1 in + -h|--help) usage; exit 0;; +esac + +# figure out what program we are +cmd=${0##*/} + +if [[ $cmd != "links-add" && $cmd != "links-remove" ]]; then + error "Invalid command name '%s' specified." "$cmd" + exit 1 +fi + +tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/repo-tools.XXXXXXXXXX") || (\ + error "Cannot create temp directory for database building."; \ + exit 1) + +for repo in "pkg" "${REPO_DB_NAME}"; do + mkdir "$tmpdir/$repo" +done + +trap 'clean_up' EXIT +for signal in TERM HUP QUIT; do + trap "trap_exit \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal" +done +trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT +trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR + +declare -a args +# parse arguments +while (( $# )); do + case $1 in + -q|--quiet) QUIET=1 ;; + -n|--new) ONLYADDNEW=1 ;; + -s|--sign) SIGN=1 ;; + -k|--key) KEY=1 ; shift; GPGKEY=$1 ;; + -v|--verify) VERIFY=1 ;; + *) args+=("$1") ;; + esac + shift +done + +REPO_DB_FILE=${args[0]} +if [[ -z $REPO_DB_FILE ]]; then + usage + exit 1 +fi + +if [[ $REPO_DB_FILE == /* ]]; then + LOCKFILE=$REPO_DB_FILE.lck +else + LOCKFILE=$PWD/$REPO_DB_FILE.lck +fi + +verify_repo_extension "$REPO_DB_FILE" + +REPO_DB_PREFIX=${REPO_DB_FILE##*/} +REPO_DB_PREFIX=${REPO_DB_PREFIX%.links.*} +REPO_DB_SUFFIX=${REPO_DB_FILE##*.links.} + +if (( SIGN || VERIFY )); then + check_gpg +fi + +if (( VERIFY && ${#args[@]} == 1 )); then + dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX + + if [[ -f $dbfile ]]; then + verify_signature "$dbfile" + fi + exit 0 +fi + +prepare_repo_db + +fail=0 +for arg in "${args[@]:1}"; do + case $cmd in + links-add) add "$arg" ;; + links-remove) remove "$arg" ;; + esac || fail=1 +done + +# if the whole operation was a success, re-zip and rotate databases +if (( !fail )); then + msg "Creating updated database file '%s'" "$REPO_DB_FILE" + create_db + rotate_db +else + msg "No packages modified, nothing to do." + exit 1 +fi + +exit 0 diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/links-remove b/artools/0.26.1/artools/debian/artools/usr/bin/links-remove new file mode 120000 index 0000000..c3c8f21 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/links-remove @@ -0,0 +1 @@ +links-add \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/mkchroot b/artools/0.26.1/artools/debian/artools/usr/bin/mkchroot new file mode 100755 index 0000000..2a2a0b1 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/mkchroot @@ -0,0 +1,255 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + +#!/hint/bash + +CHROOTVERSION=0.10 + + +working_dir='' +umode='' + +files=() +chroot_args=() + +usage() { + echo "Usage: ${0##*/} [options] working-dir package-list..." + echo ' options:' + echo ' -U Use pacman -U to install packages' + echo ' -C Location of a pacman config file' + echo ' -M Location of a makepkg config file' + echo ' -c Set pacman cache' + echo ' -f Copy file from the host to the chroot' + echo ' -s Do not run setarch' + echo ' -h This message' + exit 1 +} + +opts='hUC:M:c:f:s' + +while getopts ${opts} arg; do + case "${arg}" in + U) umode=U ;; + C) pacman_conf="$OPTARG" ;; + M) makepkg_conf="$OPTARG" ;; + c) cache_dir="$OPTARG" ;; + f) files+=("$OPTARG") ;; + s) nosetarch=1 ;; + h|?) usage ;; + *) error "invalid argument '%s'" "$arg"; usage ;; + esac + if [[ $arg != U ]]; then + chroot_args+=("-$arg") + [[ -v OPTARG ]] && chroot_args+=("$OPTARG") + fi +done +shift $(( OPTIND - 1 )) + +(( $# < 2 )) && die 'You must specify a directory and one or more packages.' + +check_root + +working_dir="$(readlink -f "$1")" +shift 1 + +[[ -z $working_dir ]] && die 'Please specify a working directory.' + +if (( ${#cache_dirs[@]} == 0 )); then + mapfile -t cache_dirs < <(pacman-conf CacheDir) +fi + +umask 0022 + +[[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir" + +mkdir -p "$working_dir" + +[[ ! -d $working_dir ]] && mkdir -p "$working_dir" + +lock 9 "${working_dir}.lock" "Locking chroot" + +if is_btrfs "$working_dir"; then + rmdir "$working_dir" + if ! btrfs subvolume create "$working_dir"; then + die "Couldn't create subvolume for '%s'" "$working_dir" + fi + chmod 0755 "$working_dir" +fi + +for f in "${files[@]}"; do + mkdir -p "$(dirname "$working_dir$f")" + cp "$f" "$working_dir$f" +done + +basestrap -${umode}Mc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" \ + "${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages' + +printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$working_dir/etc/locale.gen" +echo 'LANG=en_US.UTF-8' > "$working_dir/etc/locale.conf" +# echo 'KEYMAP=en' > "$working_dir/etc/vconsole.conf" +echo "${CHROOTVERSION}" > "$working_dir/.artools" + +dbus-uuidgen --ensure="$working_dir"/etc/machine-id + +exec chroot-run \ + "${chroot_args[@]}" \ + "$working_dir" locale-gen diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/mkchrootpkg b/artools/0.26.1/artools/debian/artools/usr/bin/mkchrootpkg new file mode 100755 index 0000000..9ca9d2f --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/mkchrootpkg @@ -0,0 +1,578 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} + + +export BUILDTOOL=artools-pkg +export BUILDTOOLVER=0.26 + +shopt -s nullglob + +default_makepkg_args=(--syncdeps --noconfirm --log --holdver --skipinteg) +makepkg_args=("${default_makepkg_args[@]}") +verifysource_args=() +chrootdir= +passeddir= +makepkg_user= +declare -a install_pkgs +declare -i ret=0 + +keepbuilddir=0 +update_first=0 +clean_first=0 +run_namcap=0 +run_checkpkg=0 +temp_chroot=0 + +bindmounts=() + +copy=$USER +[[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER +[[ -z "$copy" || $copy = root ]] && copy=copy +src_owner=${SUDO_USER:-$USER} + +usage() { + echo "Usage: ${0##*/} [options] -r [--] [makepkg args]" + echo ' Run this script in a PKGBUILD dir to build a package inside a' + echo ' clean chroot. Arguments passed to this script after the' + echo ' end-of-options marker (--) will be passed to makepkg.' + echo '' + echo ' The chroot dir consists of the following directories:' + echo ' /{root, copy} but only "root" is required' + echo ' by default. The working copy will be created as needed' + echo '' + echo 'The chroot "root" directory must be created via the following' + echo 'command:' + echo ' mkchroot /root base-devel' + echo '' + echo 'This script reads {SRC,SRCPKG,PKG,LOG}DEST, MAKEFLAGS and PACKAGER' + echo 'from makepkg.conf(5), if those variables are not part of the' + echo 'environment.' + echo '' + echo "Default makepkg args: ${default_makepkg_args[*]}" + echo '' + echo 'Flags:' + echo '-h This help' + echo '-c Clean the chroot before building' + echo '-d Bind directory into build chroot as read-write' + echo '-D Bind directory into build chroot as read-only' + echo '-u Update the working copy of the chroot before building' + echo ' This is useful for rebuilds without dirtying the pristine' + echo ' chroot' + echo '-r The chroot dir to use' + echo '-I Install a package into the working copy of the chroot' + echo '-l The directory to use as the working copy of the chroot' + echo ' Useful for maintaining multiple copies' + echo " Default: $copy" + echo '-n Run namcap on the package' + echo '-C Run checkpkg on the package' + echo '-N Disable check() function' + echo '-T Build in a temporary directory' + echo '-U Run makepkg as a specified user' + exit 1 +} + +# {{{ functions + +# Usage: sync_chroot $chrootdir $copydir [$copy] +sync_chroot() { + local chrootdir=$1 + local copydir=$2 + local copy=${3:-$2} + + if [[ "$chrootdir/root" -ef "$copydir" ]]; then + error 'Cannot sync copy with itself: %s' "$copydir" + return 1 + fi + + # Get a read lock on the root chroot to make + # sure we don't clone a half-updated chroot + slock 8 "$chrootdir/root.lock" \ + "Locking clean chroot [%s]" "$chrootdir/root" + + stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$chrootdir/root" "$copy" + if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then + subvolume_delete_recursive "$copydir" || + die "Unable to delete subvolume %s" "$copydir" + btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null || + die "Unable to create subvolume %s" "$copydir" + else + mkdir -p "$copydir" + rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir" + fi + stat_done + + # Drop the read lock again + lock_close 8 + + # Update mtime + touch "$copydir" +} + +# Usage: delete_chroot $copydir [$copy] +delete_chroot() { + local copydir=$1 + local copy=${1:-$2} + + stat_busy "Removing chroot copy [%s]" "$copy" + if is_subvolume "$copydir" && ! mountpoint -q "$copydir"; then + subvolume_delete_recursive "$copydir" || + die "Unable to delete subvolume %s" "$copydir" + else + # avoid change of filesystem in case of an umount failure + rm --recursive --force --one-file-system "$copydir" || + die "Unable to delete %s" "$copydir" + fi + + # remove lock file + rm -f "$copydir.lock" + stat_done +} + +install_packages() { + local -a pkgnames + local ret + + pkgnames=("${install_pkgs[@]##*/}") + + cp -- "${install_pkgs[@]}" "$copydir/root/" + chroot-run \ + -b "${bindmounts[@]}" \ + "$copydir" \ + bash -c 'yes y | pacman -U -- "$@"' -bash "${pkgnames[@]/#//root/}" + ret=$? + rm -- "${pkgnames[@]/#/$copydir/root/}" + + return $ret +} + +prepare_chroot() { + (( keepbuilddir )) || rm -rf "$copydir/build" + + local builduser_uid builduser_gid + builduser_uid="$(id -u "$makepkg_user")" + builduser_gid="$(id -g "$makepkg_user")" + local install="install -o $builduser_uid -g $builduser_gid" + local x + + # We can't use useradd without chrooting, otherwise it invokes PAM modules + # which we might not be able to load (i.e. when building i686 packages on + # an x86_64 host). + sed -e '/^builduser:/d' -i "$copydir"/etc/{passwd,shadow,group} + printf >>"$copydir/etc/group" 'builduser:x:%d:\n' "$builduser_gid" + printf >>"$copydir/etc/passwd" 'builduser:x:%d:%d:builduser:/build:/bin/bash\n' "$builduser_uid" "$builduser_gid" + printf >>"$copydir/etc/shadow" 'builduser:!!:%d::::::\n' "$(( $(date -u +%s) / 86400 ))" + + $install -d "$copydir"/{build,startdir,{pkg,srcpkg,src,log}dest} + + sed -e '/^MAKEFLAGS=/d' -e '/^PACKAGER=/d' -i "$copydir/etc/makepkg.conf" + for x in BUILDDIR=/build PKGDEST=/pkgdest SRCPKGDEST=/srcpkgdest SRCDEST=/srcdest LOGDEST=/logdest \ + "MAKEFLAGS='${MAKEFLAGS:-}'" "PACKAGER='${PACKAGER:-}'" + do + grep -q "^$x" "$copydir/etc/makepkg.conf" && continue + echo "$x" >>"$copydir/etc/makepkg.conf" + done + + cat > "$copydir/etc/sudoers.d/builduser-pacman" </dev/null || true + declare -p BUILDTOOL 2>/dev/null + declare -p BUILDTOOLVER 2>/dev/null + printf '_chrootbuild "$@" || exit\n' + + if (( run_namcap )); then + declare -f _chrootnamcap + printf '_chrootnamcap || exit\n' + fi + } >"$copydir/chrootbuild" + chmod +x "$copydir/chrootbuild" +} + +# These functions aren't run in makechrootpkg, +# so no global variables +_chrootbuild() { + # No coredumps + ulimit -c 0 + + . /etc/locale.conf + + # shellcheck source=/dev/null + . /etc/profile + + # Beware, there are some stupid arbitrary rules on how you can + # use "$" in arguments to commands with "sudo -i". ${foo} or + # ${1} is OK, but $foo or $1 isn't. + # https://bugzilla.sudo.ws/show_bug.cgi?id=765 + sudo --preserve-env=SOURCE_DATE_EPOCH \ + -preserve-env=BUILDTOOL \ + --preserve-env=BUILDTOOLVER \ + -iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@" + ret=$? + case $ret in + 0|14) + return 0;; + *) + return $ret;; + esac +} + +_chrootnamcap() { + pacman -S --needed --noconfirm namcap + for pkgfile in /startdir/PKGBUILD /pkgdest/*; do + echo "Checking ${pkgfile##*/}" + sudo -u builduser namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log" + done +} + +download_sources() { + setup_workdir + chown "$makepkg_user:" "$WORKDIR" + + # Ensure sources are downloaded + sudo -u "$makepkg_user" --preserve-env=GNUPGHOME,SSH_AUTH_SOCK \ + env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \ + makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" || + die "Could not download sources." +} + +move_logfiles() { + local l + for l in "$copydir"/logdest/*; do + [[ $l == */logpipe.* ]] && continue + chown "$src_owner" "$l" + mv "$l" "$LOGDEST" + done +} + +move_products() { + local pkgfile + for pkgfile in "$copydir"/pkgdest/*; do + chown "$src_owner" "$pkgfile" + mv "$pkgfile" "$PKGDEST" + + # Fix broken symlink because of temporary chroot PKGDEST /pkgdest + if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then + ln -sf "$PKGDEST/${pkgfile##*/}" + fi + done + + move_logfiles + + for s in "$copydir"/srcpkgdest/*; do + chown "$src_owner" "$s" + mv "$s" "$SRCPKGDEST" + + # Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest + if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then + ln -sf "$SRCPKGDEST/${s##*/}" + fi + done +} +# }}} + +opts='hcur:I:l:nNCTb:U:' + +while getopts "${opts}" arg; do + case "$arg" in + c) clean_first=1 ;; + b) bindmounts+=("$OPTARG") ;; + u) update_first=1 ;; + r) passeddir="$OPTARG" ;; + I) install_pkgs+=("$OPTARG") ;; + l) copy="$OPTARG" ;; + n) run_namcap=1; makepkg_args+=(--install) ;; + N) makepkg_args+=(--nocheck) ;; + C) run_checkpkg=1 ;; + T) temp_chroot=1; copy+="-$$" ;; + U) makepkg_user="$OPTARG" ;; + h|*) usage ;; + esac +done + +[[ ! -f PKGBUILD && -z "${install_pkgs[*]}" ]] && die 'This must be run in a directory containing a PKGBUILD.' +[[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.' +makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}} + +check_root SOURCE_DATE_EPOCH,BUILDTOOL,BUILDTOOLVER,GNUPGHOME,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER + +# Canonicalize chrootdir, getting rid of trailing / +chrootdir=$(readlink -e "$passeddir") +[[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir" +[[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkchroot %s/root base-devel" "$chrootdir" + +if [[ ${copy:0:1} = / ]]; then + copydir=$copy +else + copydir="$chrootdir/$copy" +fi + +# Pass all arguments after -- right to makepkg +makepkg_args+=("${@:$OPTIND}") + +# See if -R or -e was passed to makepkg +for arg in "${@:$OPTIND}"; do + case ${arg%%=*} in + --skip*|--holdver) verifysource_args+=("$arg") ;; + --repackage|--noextract) keepbuilddir=1 ;; + --*) ;; + -*R*|-*e*) keepbuilddir=1 ;; + esac +done + +umask 0022 + +ORIG_HOME=$HOME +IFS=: read -r _ _ _ _ _ HOME _ < <(getent passwd "${SUDO_USER:-$USER}") +load_makepkg_config +HOME=$ORIG_HOME + +# Use PKGBUILD directory if these don't exist +[[ -d $PKGDEST ]] || PKGDEST=$PWD +[[ -d $SRCDEST ]] || SRCDEST=$PWD +[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD +[[ -d $LOGDEST ]] || LOGDEST=$PWD + +# Lock the chroot we want to use. We'll keep this lock until we exit. +lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy" + +if [[ ! -d $copydir ]] || (( clean_first )); then + sync_chroot "$chrootdir" "$copydir" "$copy" +fi + +bindmounts+=("-B:${PWD}:/startdir" "-B:${SRCDEST}:/srcdest") + +(( update_first )) && chroot-run \ + -b "${bindmounts[*]}" \ + "$copydir" \ + pacman -Syuu --noconfirm + +if [[ -n ${install_pkgs[*]:-} ]]; then + install_packages + ret=$? + # If there is no PKGBUILD we are done + [[ -f PKGBUILD ]] || exit $ret +fi + +if [[ "$(id -u "$makepkg_user")" == 0 ]]; then + error "Running makepkg as root is not allowed." + exit 1 +fi + +download_sources + +prepare_chroot + +if chroot-run \ + -b "${bindmounts[*]}" \ + "$copydir" \ + /chrootbuild "${makepkg_args[@]}" +then + mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') + move_products +else + (( ret += 1 )) + move_logfiles +fi + +(( temp_chroot )) && delete_chroot "$copydir" "$copy" + +if (( ret != 0 )); then + if (( temp_chroot )); then + die "Build failed" + else + die "Build failed, check %s/build" "$copydir" + fi +else + if (( run_checkpkg )); then + msg "Running checkpkg" + + mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ + --dbpath "$copydir"/var/lib/pacman \ + -Sddp "${pkgnames[@]}") + + if ! wait $!; then + warning "Skipped checkpkg due to missing repo packages" + exit 0 + fi + # download package files if any non-local location exists + for remotepkg in "${remotepkgs[@]}"; do + if [[ $remotepkg != file://* ]]; then + msg2 "Downloading current versions" + chroot-run "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}" + mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ + --dbpath "$copydir"/var/lib/pacman \ + -Sddp "${pkgnames[@]}") + break + fi + done + msg2 "Checking packages" + sudo -u "$makepkg_user" checkpkg --rmdir --warn "${remotepkgs[@]/#file:\/\//}" + fi + true +fi diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/multilib-stagingpkg b/artools/0.26.1/artools/debian/artools/usr/bin/multilib-stagingpkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/multilib-stagingpkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/multilib-testingpkg b/artools/0.26.1/artools/debian/artools/usr/bin/multilib-testingpkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/multilib-testingpkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/multilibpkg b/artools/0.26.1/artools/debian/artools/usr/bin/multilibpkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/multilibpkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/pkg2yaml b/artools/0.26.1/artools/debian/artools/usr/bin/pkg2yaml new file mode 100755 index 0000000..4ac2927 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/pkg2yaml @@ -0,0 +1,287 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ yaml + +write_yaml_header(){ + printf '%s' '---' +} + +write_empty_line(){ + printf '\n%s\n' ' ' +} + +write_yaml_map(){ + local ident="$1" key="$2" val="$3" + printf "\n%${ident}s%s: %s\n" '' "$key" "$val" +} + +write_yaml_seq(){ + local ident="$1" val="$2" + printf "\n%${ident}s- %s\n" '' "$val" +} + +write_yaml_seq_map(){ + local ident="$1" key="$2" val="$3" + printf "\n%${ident}s- %s: %s\n" '' "$key" "$val" +} + +#}}} + + +#{{{ functions + +srcyaml_write_attr(){ + local ident1="$1" ident2="$2" ident3="$3" + local attrname=$4 attrvalues=("${@:5}") + + # normalize whitespace, strip leading and trailing + attrvalues=("${attrvalues[@]//+([[:space:]])/ }") + attrvalues=("${attrvalues[@]#[[:space:]]}") + attrvalues=("${attrvalues[@]%[[:space:]]}") + + case $attrname in + pkgver|pkgrel|epoch|url|install|changelog) + for v in "${attrvalues[@]}"; do + Yaml+=$(write_yaml_map "$ident3" "$attrname" "$v") + done + ;; + *) + Yaml+=$(write_yaml_map "$ident1" "$attrname") + for v in "${attrvalues[@]}"; do + Yaml+=$(write_yaml_seq "$ident2" "$v") + done + ;; + esac +} + +pkgbuild_extract_to_yaml() { + local pkgname=$1 attrname=$2 isarray=$3 outvalue= + + if get_pkgbuild_attribute "$pkgname" "$attrname" "$isarray" 'outvalue'; then + [[ -z $pkgname ]] && srcyaml_write_attr 2 4 2 "$attrname" "${outvalue[@]}" + [[ -n $pkgname ]] && srcyaml_write_attr 4 6 2 "$attrname" "${outvalue[@]}" + fi +} + +srcyaml_write_section_details() { + local attr package_arch a + local multivalued_arch_attrs=(source provides conflicts depends replaces + optdepends makedepends checkdepends) +# "${known_hash_algos[@]/%/sums}") + + for attr in "${singlevalued[@]}"; do + pkgbuild_extract_to_yaml "$1" "$attr" 0 + done + + for attr in "${multivalued[@]}"; do + pkgbuild_extract_to_yaml "$1" "$attr" 1 + done + + get_pkgbuild_attribute "$1" 'arch' 1 'package_arch' + for a in "${package_arch[@]}"; do + # 'any' is special. there's no support for, e.g. depends_any. + [[ $a = any ]] && continue + + for attr in "${multivalued_arch_attrs[@]}"; do + pkgbuild_extract_to_yaml "$1" "${attr}_$a" 1 + done + done +} + +yaml_write_global() { + local singlevalued=(pkgver pkgrel epoch url install changelog) #pkgdesc + local multivalued=(arch groups license checkdepends makedepends + depends provides conflicts replaces) + #noextract options backup optdepends + #source validpgpkeys "${known_hash_algos[@]/%/sums}") + + Yaml+=$(write_empty_line) + Yaml+=$(write_yaml_map 0 "pkgbase") + Yaml+=$(write_yaml_map 2 "name" "${pkgbase:-$pkgname}") + ${details} && srcyaml_write_section_details '' + Yaml+=$(write_empty_line) +} + +yaml_write_package() { + local singlevalued=(url install changelog) #pkgdesc + local multivalued=(arch groups license checkdepends depends + provides conflicts replaces) #options backup optdepends) + + Yaml+=$(write_yaml_map 0 "packages") + for pkg in "${pkgname[@]}"; do + Yaml+=$(write_yaml_seq_map 2 "pkgname" "$pkg") + ${details} && srcyaml_write_section_details "$pkg" + done + Yaml+=$(write_empty_line) +} + +yaml_write_fileinfo(){ + local version + version=$(get_full_version) + pkgbase=${pkgbase:-$pkgname} + Yaml+=$(write_yaml_map 0 "version" "${version:-0}") + Yaml+=$(write_empty_line) + local pkgfile + pkgfile=$(print_all_package_names) + Yaml+=$(write_yaml_map 0 "files") + for f in ${pkgfile}; do + Yaml+=$(write_yaml_seq 2 "${f##*/}") + done + Yaml+=$(write_empty_line) +} + +write_srcyaml(){ + Yaml=$(write_yaml_header) + yaml_write_global + yaml_write_package + yaml_write_fileinfo + printf '%s' "${Yaml}" +} + +#}}} + +usage() { + echo "Usage: ${0##*/} [options]" + echo " -d Don't include details" + echo ' -h This help' + echo '' + exit "$1" +} + +details=true + +opts='dh' + +while getopts "${opts}" arg; do + case "${arg}" in + d) details=false ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +shift $(( OPTIND - 1 )) + +srcpath=$(readlink -f "$1") + +[[ -f "$srcpath"/PKGBUILD ]] || die "%s/PKGBUILD does not exist!" "$srcpath" +package="$srcpath"/PKGBUILD; shift + +# shellcheck disable=1090 +. "${package}" + +load_makepkg_config + +write_srcyaml diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/rebuildpkg b/artools/0.26.1/artools/debian/artools/usr/bin/rebuildpkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/rebuildpkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/signpkg b/artools/0.26.1/artools/debian/artools/usr/bin/signpkg new file mode 100755 index 0000000..c05fb54 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/signpkg @@ -0,0 +1,180 @@ +#!/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. + +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} + +#!/hint/bash + +#{{{ functions + +find_cached_pkgfile() { + local searchdirs=("$PKGDEST" "$PWD") results=() + local pkg="$1" + for dir in "${searchdirs[@]}"; do + [[ -d "$dir" ]] || continue + [[ -e "$dir/$pkg" ]] && results+=("$dir/$pkg") + done + case ${#results[*]} in + 0) + return 1 + ;; + 1) + printf '%s\n' "${results[0]}" + return 0 + ;; + *) + error 'Multiple packages found:' + printf '\t%s\n' "${results[@]}" >&2 + return 1 + ;; + esac +} + +get_pkgbasename() { + local name="$1" + local rm_pkg=${name%.pkg.tar*} + rm_pkg=${rm_pkg%-*} + rm_pkg=${rm_pkg%-*} + rm_pkg=${rm_pkg%-*} + echo "$rm_pkg" +} + +#}}} + + +load_makepkg_config + +passfiles=("$@") + +sign_pkg(){ + local file_to_sign="$1" + + if [ ! -e "$file_to_sign" ]; then + error "%s does not exist!" "$file_to_sign" + exit 1 + fi + + if [[ -n "${BUILDBOT_GPGP}" ]]; then + msg "Signing [%s]" "${file_to_sign##*/}" + gpg --batch --passphrase "${BUILDBOT_GPGP}" --detach-sign "$file_to_sign" + else + msg "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..." + gpg --detach-sign --use-agent -u "${GPGKEY}" "$file_to_sign" + fi +} + +for pkg in "${passfiles[@]}"; do + msg "Searching %s ..." "$pkg" + if pkgfile=$(find_cached_pkgfile "$pkg");then + msg2 "Found: %s" "${pkgfile}" + [[ -e "${pkgfile}".sig ]] && rm "${pkgfile}".sig + sign_pkg "${pkgfile}" + fi +done diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/stagingpkg b/artools/0.26.1/artools/debian/artools/usr/bin/stagingpkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/stagingpkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/bin/testingpkg b/artools/0.26.1/artools/debian/artools/usr/bin/testingpkg new file mode 120000 index 0000000..604ab02 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/bin/testingpkg @@ -0,0 +1 @@ +commitpkg \ No newline at end of file diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/makepkg.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/makepkg.conf new file mode 100644 index 0000000..9d1b2f2 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/makepkg.conf @@ -0,0 +1,161 @@ +#!/hint/bash +# shellcheck disable=2034 + +# +# /etc/makepkg.conf +# + +######################################################################### +# SOURCE ACQUISITION +######################################################################### +# +#-- The download utilities that makepkg should use to acquire sources +# Format: 'protocol::agent' +DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u' + 'ftp::/usr/bin/curl -qgfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u' + 'http::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' + 'https::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' + 'rsync::/usr/bin/rsync --no-motd -z %u %o' + 'scp::/usr/bin/scp -C %u %o') + +# Other common tools: +# /usr/bin/snarf +# /usr/bin/lftpget -c +# /usr/bin/wget + +#-- The package required by makepkg to download VCS sources +# Format: 'protocol::package' +VCSCLIENTS=('bzr::bzr' + 'fossil::fossil' + 'git::git' + 'hg::mercurial' + 'svn::subversion') + +######################################################################### +# ARCHITECTURE, COMPILE FLAGS +######################################################################### +# +CARCH="x86_64" +CHOST="x86_64-pc-linux-gnu" + +#-- Compiler and Linker Flags +#CPPFLAGS="" +CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \ + -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ + -fstack-clash-protection -fcf-protection" +CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS" +LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" +#RUSTFLAGS="-C opt-level=2" +#-- Make Flags: change this for DistCC/SMP systems +#MAKEFLAGS="-j2" +#-- Debugging flags +DEBUG_CFLAGS="-g -fvar-tracking-assignments" +DEBUG_CXXFLAGS="-g -fvar-tracking-assignments" +#DEBUG_RUSTFLAGS="-C debuginfo=2" + +######################################################################### +# BUILD ENVIRONMENT +######################################################################### +# +# Makepkg defaults: BUILDENV=(!distcc !color !ccache check !sign) +# A negated environment option will do the opposite of the comments below. +# +#-- distcc: Use the Distributed C/C++/ObjC compiler +#-- color: Colorize output messages +#-- ccache: Use ccache to cache compilation +#-- check: Run the check() function if present in the PKGBUILD +#-- sign: Generate PGP signature file +# +BUILDENV=(!distcc color !ccache check !sign) +# +#-- If using DistCC, your MAKEFLAGS will also need modification. In addition, +#-- specify a space-delimited list of hosts running in the DistCC cluster. +#DISTCC_HOSTS="" +# +#-- Specify a directory for package building. +#BUILDDIR=/tmp/makepkg + +######################################################################### +# GLOBAL PACKAGE OPTIONS +# These are default values for the options=() settings +######################################################################### +# +# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto) +# A negated option will do the opposite of the comments below. +# +#-- strip: Strip symbols from binaries/libraries +#-- docs: Save doc directories specified by DOC_DIRS +#-- libtool: Leave libtool (.la) files in packages +#-- staticlibs: Leave static library (.a) files in packages +#-- emptydirs: Leave empty directories in packages +#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip +#-- purge: Remove files specified by PURGE_TARGETS +#-- debug: Add debugging flags as specified in DEBUG_* variables +#-- lto: Add compile flags for building with link time optimization +# +OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug lto) + +#-- File integrity checks to use. Valid: md5, sha1, sha224, sha256, sha384, sha512, b2 +INTEGRITY_CHECK=(sha256) +#-- Options to be used when stripping binaries. See `man strip' for details. +STRIP_BINARIES="--strip-all" +#-- Options to be used when stripping shared libraries. See `man strip' for details. +STRIP_SHARED="--strip-unneeded" +#-- Options to be used when stripping static libraries. See `man strip' for details. +STRIP_STATIC="--strip-debug" +#-- Manual (man and info) directories to compress (if zipman is specified) +MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info}) +#-- Doc directories to remove (if !docs is specified) +DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) +#-- Files to be removed from all packages (if purge is specified) +PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod) +#-- Directory to store source code in for debug packages +DBGSRCDIR="/usr/src/debug" + +######################################################################### +# PACKAGE OUTPUT +######################################################################### +# +# Default: put built package and cached source in build directory +# +#-- Destination: specify a fixed directory where all packages will be placed +#PKGDEST=/home/packages +#-- Source cache: specify a fixed directory where source files will be cached +#SRCDEST=/home/sources +#-- Source packages: specify a fixed directory where all src packages will be placed +#SRCPKGDEST=/home/srcpackages +#-- Log files: specify a fixed directory where all log files will be placed +#LOGDEST=/home/makepkglogs +#-- Packager: name/email of the person or organization building packages +#PACKAGER="John Doe " +#-- Specify a key to use for package signing +#GPGKEY="" + +######################################################################### +# COMPRESSION DEFAULTS +######################################################################### +# +COMPRESSGZ=(gzip -c -f -n) +COMPRESSBZ2=(bzip2 -c -f) +COMPRESSXZ=(xz -c -z -) +COMPRESSZST=(zstd -c -T0 --ultra -20 -) +COMPRESSLRZ=(lrzip -q) +COMPRESSLZO=(lzop -q) +COMPRESSZ=(compress -c -f) +COMPRESSLZ4=(lz4 -q) +COMPRESSLZ=(lzip -c -f) + +######################################################################### +# EXTENSION DEFAULTS +######################################################################### +# +PKGEXT='.pkg.tar.zst' +SRCEXT='.src.tar.gz' + +######################################################################### +# OTHER +######################################################################### +# +#-- Command used to run pacman as root, instead of trying sudo and su +#PACMAN_AUTH=() +# vim: set ft=sh ts=2 sw=2 et: diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-default.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-default.conf new file mode 100644 index 0000000..64559bc --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-default.conf @@ -0,0 +1,92 @@ +# +# /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 = + +# 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. + +#[gremlins] +#Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +#[galaxy-gremlins] +#Include = /etc/pacman.d/mirrorlist + +[galaxy] +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 diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-docker.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-docker.conf new file mode 100644 index 0000000..01a1688 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-docker.conf @@ -0,0 +1,99 @@ +# +# /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 diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-gnome-wobble.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-gnome-wobble.conf new file mode 100644 index 0000000..bcc3a2d --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-gnome-wobble.conf @@ -0,0 +1,101 @@ +# +# /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 = + +# 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. + +[gnome-wobble] +Include = /etc/pacman.d/mirrorlist + +[goblins] +Include = /etc/pacman.d/mirrorlist + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-goblins] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +Include = /etc/pacman.d/mirrorlist + +[galaxy] +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 diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-goblins.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-goblins.conf new file mode 100644 index 0000000..a085590 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-goblins.conf @@ -0,0 +1,98 @@ +# +# /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 = + +# 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. + +[goblins] +Include = /etc/pacman.d/mirrorlist + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-goblins] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +Include = /etc/pacman.d/mirrorlist + +[galaxy] +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 diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-gremlins.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-gremlins.conf new file mode 100644 index 0000000..26ff03e --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-gremlins.conf @@ -0,0 +1,92 @@ +# +# /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 = + +# 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. + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +Include = /etc/pacman.d/mirrorlist + +[galaxy] +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 diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-kde-wobble.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-kde-wobble.conf new file mode 100644 index 0000000..640417d --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-kde-wobble.conf @@ -0,0 +1,101 @@ +# +# /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 = + +# 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. + +[kde-wobble] +Include = /etc/pacman.d/mirrorlist + +[goblins] +Include = /etc/pacman.d/mirrorlist + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-goblins] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +Include = /etc/pacman.d/mirrorlist + +[galaxy] +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 diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32-goblins.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32-goblins.conf new file mode 100644 index 0000000..971a4bc --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32-goblins.conf @@ -0,0 +1,110 @@ +# +# /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 = + +# 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. + +[goblins] +Include = /etc/pacman.d/mirrorlist + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-goblins] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +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-goblins] +Include = /etc/pacman.d/mirrorlist + +[lib32-gremlins] +Include = /etc/pacman.d/mirrorlist + +[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 diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32-gremlins.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32-gremlins.conf new file mode 100644 index 0000000..379dfda --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32-gremlins.conf @@ -0,0 +1,101 @@ +# +# /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 = + +# 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. + +[gremlins] +Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +[galaxy-gremlins] +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-gremlins] +Include = /etc/pacman.d/mirrorlist + +[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 diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32.conf new file mode 100644 index 0000000..a5e6621 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32.conf @@ -0,0 +1,101 @@ +# +# /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 = + +# 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. + +#[gremlins] +#Include = /etc/pacman.d/mirrorlist + +[system] +Include = /etc/pacman.d/mirrorlist + +[world] +Include = /etc/pacman.d/mirrorlist + +#[galaxy-gremlins] +#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-gremlins] +#Include = /etc/pacman.d/mirrorlist + +[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 diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/patches/artix-bash.patch b/artools/0.26.1/artools/debian/artools/usr/share/artools/patches/artix-bash.patch new file mode 100644 index 0000000..15daaba --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/patches/artix-bash.patch @@ -0,0 +1,87 @@ +--- /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}$(/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 + # + diff --git a/artools/0.26.1/artools/debian/artools/usr/share/artools/valid-names.conf b/artools/0.26.1/artools/debian/artools/usr/share/artools/valid-names.conf new file mode 100644 index 0000000..57bdbdd --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/artools/valid-names.conf @@ -0,0 +1,42 @@ +#!/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]}" +) diff --git a/artools/0.26.1/artools/debian/artools/usr/share/doc/artools/changelog.Debian.gz b/artools/0.26.1/artools/debian/artools/usr/share/doc/artools/changelog.Debian.gz new file mode 100644 index 0000000..fcecf0b Binary files /dev/null and b/artools/0.26.1/artools/debian/artools/usr/share/doc/artools/changelog.Debian.gz differ diff --git a/artools/0.26.1/artools/debian/artools/usr/share/doc/artools/copyright b/artools/0.26.1/artools/debian/artools/usr/share/doc/artools/copyright new file mode 100644 index 0000000..9713bc9 --- /dev/null +++ b/artools/0.26.1/artools/debian/artools/usr/share/doc/artools/copyright @@ -0,0 +1,35 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: artools +Source: https://gitea.artixlinux.org/artix/artools + +Files: * +Copyright: 2022 Artixlinux +License: GPL-2+ + +Files: debian/* +Copyright: 2022 Nathan Owens +License: GPL-2+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + +# Please also look if there are files or directories which have a +# different copyright/license attached and list them here. +# Please avoid picking licenses with terms that are more restrictive than the +# packaged work, as it may make Debian's contributions unacceptable upstream. +# +# If you need, there are some extra license texts available in two places: +# /usr/share/debhelper/dh_make/licenses/ +# /usr/share/common-licenses/ diff --git a/artools/0.26.1/artools/debian/changelog b/artools/0.26.1/artools/debian/changelog new file mode 100644 index 0000000..cdf28b8 --- /dev/null +++ b/artools/0.26.1/artools/debian/changelog @@ -0,0 +1,5 @@ +artools (0.26.1-1) unstable; urgency=medium + + * Initial release + + -- Nathan Owens Sun, 09 Jan 2022 13:20:08 -0600 diff --git a/artools/0.26.1/artools/debian/control b/artools/0.26.1/artools/debian/control new file mode 100644 index 0000000..7ad91d9 --- /dev/null +++ b/artools/0.26.1/artools/debian/control @@ -0,0 +1,16 @@ +Source: artools +Section: misc +Priority:medium +Maintainer: Nathan Owens +Build-Depends: debhelper-compat (= 13) +Standards-Version: 4.5.1 +Homepage: https://gitea.artixlinux.org/artix/artools +#Vcs-Browser: https://salsa.debian.org/debian/artools +#Vcs-Git: https://salsa.debian.org/debian/artools.git +Rules-Requires-Root: no + +Package: artools +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, pacman +Description: Artix linux packaging + Tools used for Artix linux packaging diff --git a/artools/0.26.1/artools/debian/copyright b/artools/0.26.1/artools/debian/copyright new file mode 100644 index 0000000..9713bc9 --- /dev/null +++ b/artools/0.26.1/artools/debian/copyright @@ -0,0 +1,35 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: artools +Source: https://gitea.artixlinux.org/artix/artools + +Files: * +Copyright: 2022 Artixlinux +License: GPL-2+ + +Files: debian/* +Copyright: 2022 Nathan Owens +License: GPL-2+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + +# Please also look if there are files or directories which have a +# different copyright/license attached and list them here. +# Please avoid picking licenses with terms that are more restrictive than the +# packaged work, as it may make Debian's contributions unacceptable upstream. +# +# If you need, there are some extra license texts available in two places: +# /usr/share/debhelper/dh_make/licenses/ +# /usr/share/common-licenses/ diff --git a/artools/0.26.1/artools/debian/debhelper-build-stamp b/artools/0.26.1/artools/debian/debhelper-build-stamp new file mode 100644 index 0000000..f0bde23 --- /dev/null +++ b/artools/0.26.1/artools/debian/debhelper-build-stamp @@ -0,0 +1 @@ +artools diff --git a/artools/0.26.1/artools/debian/files b/artools/0.26.1/artools/debian/files new file mode 100644 index 0000000..9fcc4d0 --- /dev/null +++ b/artools/0.26.1/artools/debian/files @@ -0,0 +1,2 @@ +artools_0.26.1-1_amd64.buildinfo misc medium +artools_0.26.1-1_amd64.deb misc medium diff --git a/artools/0.26.1/artools/debian/patches/1 b/artools/0.26.1/artools/debian/patches/1 new file mode 100644 index 0000000..57f6b88 --- /dev/null +++ b/artools/0.26.1/artools/debian/patches/1 @@ -0,0 +1,37 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + artools (0.26.1-1) unstable; urgency=medium + . + * Initial release +Author: Nathan Owens + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2022-01-09 + +--- /dev/null ++++ artools-0.26.1/etc/artools/artools-base.conf +@@ -0,0 +1,9 @@ ++############################################# ++################ artools-base ############### ++############################################# ++ ++# build dir where buildpkg or buildiso chroots are created ++# CHROOTS_DIR=/var/lib/artools ++ ++# the workspace directory ++# WORKSPACE_DIR="${USER_HOME}/artools-workspace" diff --git a/artools/0.26.1/artools/debian/patches/add-flto-to-LDFLAGS-for-clang.patch b/artools/0.26.1/artools/debian/patches/add-flto-to-LDFLAGS-for-clang.patch new file mode 100644 index 0000000..b3c139d --- /dev/null +++ b/artools/0.26.1/artools/debian/patches/add-flto-to-LDFLAGS-for-clang.patch @@ -0,0 +1,24 @@ +From 26ee6ff6adbcd8560ec3a65cf219d2ab98edb804 Mon Sep 17 00:00:00 2001 +From: Allan McRae +Date: Fri, 24 Dec 2021 17:59:32 +1000 +Subject: [PATCH] LTO: Add -flto to LDFLAGS for clang + +GCC automatically detects when it is linking LTO objects, but clang does +not. Add -flto to LDFLAGS to make this work for clang too. + +Signed-off-by: Allan McRae +--- + scripts/libmakepkg/buildenv/lto.sh.in | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/scripts/libmakepkg/buildenv/lto.sh.in b/scripts/libmakepkg/buildenv/lto.sh.in +index 1f1ca53f..c3bd0fa4 100644 +--- a/scripts/libmakepkg/buildenv/lto.sh.in ++++ b/scripts/libmakepkg/buildenv/lto.sh.in +@@ -33,5 +33,6 @@ buildenv_lto() { + if check_option "lto" "y"; then + CFLAGS+=" -flto" + CXXFLAGS+=" -flto" ++ LDFLAGS+=" -flto" + fi + } diff --git a/artools/0.26.1/artools/debian/patches/comparepkg-fix.patch b/artools/0.26.1/artools/debian/patches/comparepkg-fix.patch new file mode 100644 index 0000000..90a0988 --- /dev/null +++ b/artools/0.26.1/artools/debian/patches/comparepkg-fix.patch @@ -0,0 +1,16 @@ + bin/pkg/comparepkg.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/bin/pkg/comparepkg.in b/bin/pkg/comparepkg.in +index 50119ee..f68a919 100644 +--- artools/bin/pkg/comparepkg.in ++++ artools/bin/pkg/comparepkg.in +@@ -54,7 +54,7 @@ compare_u(){ + if [ "$result" -eq -1 ];then + # local arel=${archver##*-} brel=${artixver##*-} + # local reldiff +- reldiff=$(( $arel-${brel%.*} )) ++# reldiff=$(( $arel-${brel%.*} )) + msg_row_red "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}" + write_list "${a}:$pkg" pkg_upgrades + fi diff --git a/artools/0.26.1/artools/debian/patches/series b/artools/0.26.1/artools/debian/patches/series new file mode 100644 index 0000000..6a1dab6 --- /dev/null +++ b/artools/0.26.1/artools/debian/patches/series @@ -0,0 +1,2 @@ +1 +comparepkg-fix.patch diff --git a/artools/0.26.1/artools/debian/rules b/artools/0.26.1/artools/debian/rules new file mode 100755 index 0000000..b46f278 --- /dev/null +++ b/artools/0.26.1/artools/debian/rules @@ -0,0 +1,26 @@ +#!/usr/bin/make -f +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#export DH_VERBOSE = 1 + + +# see FEATURE AREAS in dpkg-buildflags(1) +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + +%: + dh $@ + +override_dh_auto_build: + make PREFIX=/usr + +# dh_make generated override targets +# This is example for Cmake (See https://bugs.debian.org/641051 ) +#override_dh_auto_configure: +# dh_auto_configure -- \ +# -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) diff --git a/artools/0.26.1/artools/debian/source/format b/artools/0.26.1/artools/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/artools/0.26.1/artools/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/artools/0.26.1/artools/lib/base/chroot-version.sh b/artools/0.26.1/artools/lib/base/chroot-version.sh new file mode 100644 index 0000000..b5aaab7 --- /dev/null +++ b/artools/0.26.1/artools/lib/base/chroot-version.sh @@ -0,0 +1,3 @@ +#!/hint/bash + +CHROOTVERSION=0.10 diff --git a/artools/0.26.1/artools/lib/base/chroot.sh b/artools/0.26.1/artools/lib/base/chroot.sh new file mode 100644 index 0000000..22486ec --- /dev/null +++ b/artools/0.26.1/artools/lib/base/chroot.sh @@ -0,0 +1,49 @@ +#!/hint/bash + +#{{{ chroot + +orig_argv=("$0" "$@") +check_root() { + local keepenv="$1" + + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + # shellcheck disable=2154 + exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}" + else + # shellcheck disable=2154 + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +is_subvolume() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] +} + +# is_same_fs() { +# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] +# } + +subvolume_delete_recursive() { + local subvol + + is_subvolume "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! subvolume_delete_recursive "$subvol"; then + return 1 + fi + done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0) + if ! btrfs subvolume delete "$1" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + + return 0 +} + +# }}} diff --git a/artools/0.26.1/artools/lib/base/common.sh b/artools/0.26.1/artools/lib/base/common.sh new file mode 100644 index 0000000..4629a9a --- /dev/null +++ b/artools/0.26.1/artools/lib/base/common.sh @@ -0,0 +1,16 @@ +#!/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" +} + +#}}} diff --git a/artools/0.26.1/artools/lib/base/message.sh b/artools/0.26.1/artools/lib/base/message.sh new file mode 100644 index 0000000..ae1f833 --- /dev/null +++ b/artools/0.26.1/artools/lib/base/message.sh @@ -0,0 +1,97 @@ +#!/hint/bash + +#{{{ message + +#set +u +o posix + +# shellcheck disable=1091 +. /usr/share/makepkg/util.sh + +export LANG=C + +shopt -s extglob + +if [[ -t 2 && "$TERM" != dumb ]]; then + colorize +else + # shellcheck disable=2034 + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' +fi + +stat_busy() { + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 +} + +stat_done() { + # shellcheck disable=2059 + printf "${BOLD}done${ALL_OFF}\n" >&2 +} + +lock_close() { + local fd=$1 + exec {fd}>&- +} + +lock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -n "$1"; then + stat_busy "$3" + flock "$1" + stat_done + fi +} + +slock() { + if ! [[ "/dev/fd/$1" -ef "$2" ]]; then + mkdir -p -- "$(dirname -- "$2")" + eval "exec $1>"'"$2"' + fi + if ! flock -sn "$1"; then + stat_busy "$3" + flock -s "$1" + stat_done + fi +} + +_setup_workdir=false +setup_workdir() { + [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") + _setup_workdir=true + trap 'trap_abort' INT QUIT TERM HUP + trap 'trap_exit' EXIT +} + +trap_abort() { + trap - EXIT INT QUIT TERM HUP + abort +} + +trap_exit() { + local r=$? + trap - EXIT INT QUIT TERM HUP + cleanup $r +} + +cleanup() { + if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then + rm -rf "$WORKDIR" + fi + exit "${1:-0}" +} + +abort() { + error 'Aborting...' + cleanup 255 +} + +die() { + (( $# )) && error "$@" + cleanup 255 +} + +#}}} diff --git a/artools/0.26.1/artools/lib/base/mount.sh b/artools/0.26.1/artools/lib/base/mount.sh new file mode 100644 index 0000000..2705717 --- /dev/null +++ b/artools/0.26.1/artools/lib/base/mount.sh @@ -0,0 +1,84 @@ +#!/hint/bash + +#{{{ mount + +ignore_error() { + "$@" 2>/dev/null + return 0 +} + +trap_setup(){ + [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' + trap "$1" EXIT +} + +chroot_mount() { +# msg2 "mount: [%s]" "$2" + mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") +} + +chroot_add_resolv_conf() { + local chrootdir=$1 resolv_conf=$1/etc/resolv.conf + + [[ -e /etc/resolv.conf ]] || return 0 + + # Handle resolv.conf as a symlink to somewhere else. + if [[ -L $chrootdir/etc/resolv.conf ]]; then + # readlink(1) should always give us *something* since we know at this point + # it's a symlink. For simplicity, ignore the case of nested symlinks. + resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") + if [[ $resolv_conf = /* ]]; then + resolv_conf=$chrootdir$resolv_conf + else + resolv_conf=$chrootdir/etc/$resolv_conf + fi + + # ensure file exists to bind mount over + if [[ ! -f $resolv_conf ]]; then + install -Dm644 /dev/null "$resolv_conf" || return 1 + fi + elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then + # The chroot might not have a resolv.conf. + return 0 + fi + + chroot_mount /etc/resolv.conf "$resolv_conf" --bind +} + +chroot_mount_conditional() { + local cond=$1; shift + if eval "$cond"; then + chroot_mount "$@" + fi +} + +chroot_setup(){ + local mnt="$1" os="$2" args='-t tmpfs -o nosuid,nodev,mode=0755' + $os && args='--bind' + chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && + chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && + chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && + ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \ + efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && + chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && + chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && + chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && + chroot_mount /run "$mnt/run" ${args} && + chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid +} + +chroot_api_mount() { + CHROOT_ACTIVE_MOUNTS=() + trap_setup chroot_api_umount + chroot_setup "$1" false +} + +chroot_api_umount() { + if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then +# msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" + umount "${CHROOT_ACTIVE_MOUNTS[@]}" + fi + unset CHROOT_ACTIVE_MOUNTS +} + +#}}} diff --git a/artools/0.26.1/artools/lib/base/yaml.sh b/artools/0.26.1/artools/lib/base/yaml.sh new file mode 100644 index 0000000..ba8c83c --- /dev/null +++ b/artools/0.26.1/artools/lib/base/yaml.sh @@ -0,0 +1,28 @@ +#!/hint/bash + +#{{{ yaml + +write_yaml_header(){ + printf '%s' '---' +} + +write_empty_line(){ + printf '\n%s\n' ' ' +} + +write_yaml_map(){ + local ident="$1" key="$2" val="$3" + printf "\n%${ident}s%s: %s\n" '' "$key" "$val" +} + +write_yaml_seq(){ + local ident="$1" val="$2" + printf "\n%${ident}s- %s\n" '' "$val" +} + +write_yaml_seq_map(){ + local ident="$1" key="$2" val="$3" + printf "\n%${ident}s- %s: %s\n" '' "$key" "$val" +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/calamares.sh b/artools/0.26.1/artools/lib/iso/calamares.sh new file mode 100644 index 0000000..2e599d9 --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/calamares.sh @@ -0,0 +1,54 @@ +#!/hint/bash + +#{{{ calamares + +write_services_conf(){ + local key1="$1" val1="$2" key2="$3" val2="$4" + local yaml + yaml=$(write_yaml_header) + yaml+=$(write_yaml_map 0 "$key1" "$val1") + yaml+=$(write_yaml_map 0 "$key2" "$val2") + yaml+=$(write_yaml_map 0 'services') + for svc in "${SERVICES[@]}"; do + yaml+=$(write_yaml_seq 2 "$svc") + done + yaml+=$(write_empty_line) + printf '%s' "${yaml}" +} + +write_services_openrc_conf(){ + local conf="$1"/services-openrc.conf + write_services_conf 'initdDir' '/etc/init.d' 'runlevelsDir' '/etc/runlevels' > "$conf" +} + +write_services_runit_conf(){ + local conf="$1"/services-runit.conf + write_services_conf 'svDir' '/etc/runit/sv' 'runsvDir' '/etc/runit/runsvdir' > "$conf" +} + +write_services_s6_conf(){ + local conf="$1"/services-s6.conf + write_services_conf 'svDir' '/etc/s6/sv' 'dbDir' '/etc/s6/rc/compiled' > "$conf" +} + +write_services_suite66_conf(){ + local conf="$1"/services-suite66.conf + write_services_conf 'svDir' '/etc/66/service' 'runsvDir' '/var/lib/66/system' > "$conf" +} + +write_services_dinit_conf(){ + local conf="$1"/services-dinit.conf + write_services_conf 'initdDir' '/etc/dinit.d' 'runsvDir' '/etc/dinit.d/boot.d' > "$conf" +} + +configure_calamares(){ + local mods="$1/etc/calamares/modules" + if [[ -d "$mods" ]];then + msg2 "Configuring: Calamares" + write_services_"${INITSYS}"_conf "$mods" + sed -e "s|services-openrc|services-${INITSYS}|" \ + -i "$1"/etc/calamares/settings.conf + fi +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/config.sh b/artools/0.26.1/artools/lib/iso/config.sh new file mode 100644 index 0000000..4def9ce --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/config.sh @@ -0,0 +1,30 @@ +#!/hint/bash + +#{{{ session + +configure_services(){ + local mnt="$1" + add_svc_"${INITSYS}" "$mnt" "${SERVICES[*]}" +} + + +write_live_session_conf(){ + local conf='' + conf+=$(printf '%s\n' '# live session configuration') + conf+=$(printf "\nAUTOLOGIN=%s\n" "${AUTOLOGIN}") + conf+=$(printf "\nPASSWORD=%s\n" "${PASSWORD}") + printf '%s' "$conf" +} + +configure_chroot(){ + local fs="$1" + msg "Configuring [%s]" "${fs##*/}" + configure_services "$fs" + configure_calamares "$fs" + [[ ! -d "$fs/etc/artools" ]] && mkdir -p "$fs/etc/artools" + msg2 "Writing: live.conf" + write_live_session_conf > "$fs/etc/artools/live.conf" + msg "Done configuring [%s]" "${fs##*/}" +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/dracut.sh b/artools/0.26.1/artools/lib/iso/dracut.sh new file mode 100644 index 0000000..0504f3e --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/dracut.sh @@ -0,0 +1,42 @@ +#!/hint/bash + +#{{{ dracut + +prepare_initramfs_dracut(){ + local mnt="$1" + local kver + kver=$(<"$mnt"/usr/src/linux/version) + + printf "%s\n" 'add_dracutmodules+=" dmsquash-live"' > "$mnt"/etc/dracut.conf.d/50-live.conf + + msg "Starting build: %s" "${kver}" + artix-chroot "$mnt" dracut -fqM /boot/initramfs.img "$kver" + msg "Image generation successful" + + cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img + + prepare_boot_extras "$mnt" +} + +configure_grub_dracut(){ + msg "Configuring grub kernel options ..." + local kopts=() + kopts=( + "root=live:LABEL=${iso_label}" + 'rd.live.squashimg=rootfs.img' + 'rd.live.image' + 'rootflags=auto' + ) + [[ "${profile}" != 'base' ]] && kopts+=("rd.live.join=livefs.img") + + local ro_opts=() + local rw_opts=() +# 'rd.writable.fsimg=1' + + sed -e "s|@kopts@|${kopts[*]}|" \ + -e "s|@ro_opts@|${ro_opts[*]}|" \ + -e "s|@rw_opts@|${rw_opts[*]}|" \ + -i "${iso_root}"/boot/grub/kernels.cfg +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/firmware.sh b/artools/0.26.1/artools/lib/iso/firmware.sh new file mode 100644 index 0000000..fdba940 --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/firmware.sh @@ -0,0 +1,17 @@ +#!/hint/bash + +#{{{ firmware + +prepare_boot_extras(){ + local src="$1" dest + dest=${iso_root}/boot + + for fw in intel amd; do + cp "$src"/boot/"$fw"-ucode.img "$dest/$fw"-ucode.img + done + + cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest + cp "$src"/usr/share/licenses/common/GPL2/license.txt "$dest"/memtest.COPYING +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/grub.sh b/artools/0.26.1/artools/lib/iso/grub.sh new file mode 100644 index 0000000..7200ed9 --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/grub.sh @@ -0,0 +1,61 @@ +#!/hint/bash + +#{{{ grub + +prepare_grub(){ + local platform=i386-pc img='core.img' prefix=/boot/grub + local lib="$1"/usr/lib/grub + local theme="$1"/usr/share/grub + local livecfg="$2"/usr/share/grub + local grub=${iso_root}/boot/grub efi=${iso_root}/efi/boot + + prepare_dir "${grub}/${platform}" + + cp "${livecfg}"/cfg/*.cfg "${grub}" + + cp "${lib}/${platform}"/* "${grub}/${platform}" + + msg2 "Building %s ..." "${img}" + + grub-mkimage -d "${grub}/${platform}" -o "${grub}/${platform}/${img}" -O "${platform}" -p "${prefix}" biosdisk iso9660 + + cat "${grub}/${platform}"/cdboot.img "${grub}/${platform}/${img}" > "${grub}/${platform}"/eltorito.img + + platform=x86_64-efi + img=bootx64.efi + + prepare_dir "${efi}" + prepare_dir "${grub}/${platform}" + + cp "${lib}/${platform}"/* "${grub}/${platform}" + + msg2 "Building %s ..." "${img}" + + grub-mkimage -d "${grub}/${platform}" -o "${efi}/${img}" -O "${platform}" -p "${prefix}" iso9660 + + prepare_dir "${grub}"/themes + + cp -r "${theme}"/themes/artix "${grub}"/themes + cp -r "${livecfg}"/{locales,tz} "${grub}" + + if [[ -f /usr/share/grub/unicode.pf2 ]];then + msg2 "Copying %s ..." "unicode.pf2" + cp /usr/share/grub/unicode.pf2 "${grub}"/unicode.pf2 + else + msg2 "Creating %s ..." "unicode.pf2" + grub-mkfont -o "${grub}"/unicode.pf2 /usr/share/fonts/misc/unifont.bdf + fi + + local size=4M mnt="${mnt_dir}/efiboot" efi_img="${iso_root}/boot/efi.img" + msg2 "Creating fat image of %s ..." "${size}" + truncate -s "${size}" "${efi_img}" + mkfs.fat -n ARTIX_EFI "${efi_img}" &>/dev/null + prepare_dir "${mnt}" + mount_img "${efi_img}" "${mnt}" + prepare_dir "${mnt}"/efi/boot + msg2 "Building %s ..." "${img}" + grub-mkimage -d "${grub}/${platform}" -o "${mnt}"/efi/boot/"${img}" -O "${platform}" -p "${prefix}" iso9660 + umount_img "${mnt}" +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/initcpio.sh b/artools/0.26.1/artools/lib/iso/initcpio.sh new file mode 100644 index 0000000..8116bfe --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/initcpio.sh @@ -0,0 +1,72 @@ +#!/hint/bash + +#{{{ initcpio + +make_checksum(){ + local file="$1" + msg2 "Creating md5sum ..." + cd "${iso_root}${live_dir}" + md5sum "$file" > "$file".md5 + cd "${OLDPWD}" +} + +make_sig () { + local file="$1" + msg2 "Creating signature file..." + chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}" + su "${owner}" -c "gpg --detach-sign --output $file.sig --default-key ${GPG_KEY} $file" + chown "root:root" "${iso_root}${live_dir}" +} + +export_gpg_publickey() { + key_export=${WORKSPACE_DIR}/pubkey.gpg + if [[ ! -e "${key_export}" ]]; then + gpg --batch --output "${key_export}" --export "${GPG_KEY}" + fi +} + +prepare_initramfs_mkinitcpio() { + local mnt="$1" packages=() mkinitcpio_conf k + + mkinitcpio_conf=mkinitcpio-default.conf + [[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf + k=$(<"$mnt"/usr/src/linux/version) + + read_from_list "${common_dir}/Packages-boot" + basestrap "${basestrap_args[@]}" "$mnt" "${packages[@]}" + + if [[ -n "${GPG_KEY}" ]]; then + exec {ARTIX_GNUPG_FD}<>"${key_export}" + export ARTIX_GNUPG_FD + fi + + artix-chroot "$mnt" mkinitcpio -k "$k" \ + -c /etc/"$mkinitcpio_conf" \ + -g /boot/initramfs.img + + if [[ -n "${GPG_KEY}" ]]; then + exec {ARTIX_GNUPG_FD}<&- + unset ARTIX_GNUPG_FD + fi + if [[ -f "${key_export}" ]]; then + rm "${key_export}" + fi + cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img + prepare_boot_extras "$mnt" +} + +configure_grub_mkinitcpio() { + msg "Configuring grub kernel options ..." + local ro_opts=() + local rw_opts=() + local kopts=("label=${iso_label}") + + [[ "${profile}" != 'base' ]] && kopts+=('overlay=livefs') + + sed -e "s|@kopts@|${kopts[*]}|" \ + -e "s|@ro_opts@|${ro_opts[*]}|" \ + -e "s|@rw_opts@|${rw_opts[*]}|" \ + -i "${iso_root}"/boot/grub/kernels.cfg +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/iso.sh b/artools/0.26.1/artools/lib/iso/iso.sh new file mode 100644 index 0000000..26a33c6 --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/iso.sh @@ -0,0 +1,50 @@ +#!/hint/bash + +#{{{ iso + +get_disturl(){ + # shellcheck disable=1091 + . /usr/lib/os-release + echo "${HOME_URL}" +} + +get_osname(){ + # shellcheck disable=1091 + . /usr/lib/os-release + echo "${NAME}" +} + +assemble_iso(){ + msg "Creating ISO image..." + local mod_date + mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g) + local appid + appid="$(get_osname) Live/Rescue CD" + local publisher + publisher="$(get_osname) <$(get_disturl)>" + + xorriso -as mkisofs \ + --modification-date="${mod_date}" \ + --protective-msdos-label \ + -volid "${iso_label}" \ + -appid "${appid}" \ + -publisher "${publisher}" \ + -preparer "Prepared by artools/${0##*/}" \ + -r -graft-points -no-pad \ + --sort-weight 0 / \ + --sort-weight 1 /boot \ + --grub2-mbr "${iso_root}"/boot/grub/i386-pc/boot_hybrid.img \ + -partition_offset 16 \ + -b boot/grub/i386-pc/eltorito.img \ + -c boot.catalog \ + -no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \ + -eltorito-alt-boot \ + -append_partition 2 0xef "${iso_root}"/boot/efi.img \ + -e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \ + -no-emul-boot \ + -iso-level 3 \ + -o "${iso_dir}/${iso_file}" \ + "${iso_root}"/ +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/mount.sh b/artools/0.26.1/artools/lib/iso/mount.sh new file mode 100644 index 0000000..88e5262 --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/mount.sh @@ -0,0 +1,55 @@ +#!/hint/bash + +#{{{ mount + +track_img() { + msg2 "mount: [%s]" "$2" + mount "$@" && IMG_ACTIVE_MOUNTS=("$2" "${IMG_ACTIVE_MOUNTS[@]}") +} + +mount_img() { + IMG_ACTIVE_MOUNTS=() + mkdir -p "$2" + track_img "$1" "$2" +} + +umount_img() { + if [[ -n "${IMG_ACTIVE_MOUNTS[*]}" ]];then + msg2 "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}" + umount "${IMG_ACTIVE_MOUNTS[@]}" + unset IMG_ACTIVE_MOUNTS + rm -r "$1" + fi +} + +track_fs() { + msg2 "overlayfs mount: [%s]" "$5" + mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}") +} + +mount_overlayfs(){ + FS_ACTIVE_MOUNTS=() + local lower upper="$1" work="$2" + mkdir -p "${mnt_dir}/work" + mkdir -p "$upper" + case $upper in + */livefs) lower="$work/rootfs" ;; + */bootfs) + lower="$work/rootfs" + [[ -d "$work/livefs" ]] && lower="$work/livefs:$work/rootfs" + ;; + esac + # shellcheck disable=2140 + track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper" +} + +umount_overlayfs(){ + if [[ -n "${FS_ACTIVE_MOUNTS[*]}" ]];then + msg2 "overlayfs umount: [%s]" "${FS_ACTIVE_MOUNTS[@]}" + umount "${FS_ACTIVE_MOUNTS[@]}" + unset FS_ACTIVE_MOUNTS + rm -rf "${mnt_dir}/work" + fi +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/profile.sh b/artools/0.26.1/artools/lib/iso/profile.sh new file mode 100644 index 0000000..ebf653c --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/profile.sh @@ -0,0 +1,85 @@ +#!/hint/bash + +#{{{ profile + +show_profile(){ + msg2 "iso_file: %s" "${iso_file}" + msg2 "AUTOLOGIN: %s" "${AUTOLOGIN}" + msg2 "PASSWORD: %s" "${PASSWORD}" + msg2 "SERVICES: %s" "${SERVICES[*]}" +} + +load_profile(){ + local profile_dir="${DATADIR}/iso-profiles" + [[ -d "${WORKSPACE_DIR}"/iso-profiles ]] && profile_dir="${WORKSPACE_DIR}"/iso-profiles + + root_list="$profile_dir/${profile}/Packages-Root" + root_overlay="$profile_dir/${profile}/root-overlay" + + [[ -f "$profile_dir/${profile}/Packages-Live" ]] && live_list="$profile_dir/${profile}/Packages-Live" + [[ -d "$profile_dir/${profile}/live-overlay" ]] && live_overlay="$profile_dir/${profile}/live-overlay" + + common_dir="${DATADIR}/iso-profiles/common" + [[ -d "$profile_dir"/common ]] && common_dir="${profile_dir}"/common + + [[ -f $profile_dir/${profile}/profile.conf ]] || return 1 + + # shellcheck disable=1090 + [[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf + + AUTOLOGIN=${AUTOLOGIN:-true} + + PASSWORD=${PASSWORD:-'artix'} + + if [[ -z "${SERVICES[*]}" ]];then + SERVICES=('acpid' 'bluetoothd' 'cronie' 'cupsd' 'syslog-ng' 'connmand') + fi + + return 0 +} + +read_from_list() { + local list="$1" + local _space="s| ||g" + local _clean=':a;N;$!ba;s/\n/ /g' + local _com_rm="s|#.*||g" + + local _init="s|@initsys@|${INITSYS}|g" + + msg2 "Loading Packages: [%s] ..." "${list##*/}" + packages+=($(sed "$_com_rm" "$list" \ + | sed "$_space" \ + | sed "$_init" \ + | sed "$_clean")) +} + +read_from_services() { + for svc in "${SERVICES[@]}"; do + case "$svc" in + sddm|gdm|lightdm|mdm|greetd|lxdm|xdm) packages+=("$svc-${INITSYS}") ;; + NetworkManager) packages+=("networkmanager-${INITSYS}") ;; + connmand) packages+=("connman-${INITSYS}") ;; + cupsd) packages+=("cups-${INITSYS}") ;; + bluetoothd) packages+=("bluez-${INITSYS}") ;; + syslog-ng|metalog) packages+=("$svc-${INITSYS}") ;; + esac + done +} + +load_pkgs(){ + local pkglist="$1" + packages=() + + if [[ "${pkglist##*/}" == "Packages-Root" ]]; then + read_from_list "${common_dir}/Packages-base" + read_from_list "${common_dir}/Packages-apps" + read_from_list "${common_dir}/Packages-${INITSYS}" + [[ -n "${live_list}" ]] && read_from_list "${common_dir}/Packages-xorg" + read_from_list "$pkglist" + read_from_services + else + read_from_list "$pkglist" + fi +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/services.sh b/artools/0.26.1/artools/lib/iso/services.sh new file mode 100644 index 0000000..ebc59ed --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/services.sh @@ -0,0 +1,66 @@ +#!/hint/bash + +#{{{ services + +add_svc_openrc(){ + local mnt="$1" names="$2" rlvl="${3:-default}" + for svc in $names; do + if [[ -f $mnt/etc/init.d/$svc ]];then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" rc-update add "$svc" "$rlvl" &>/dev/null + fi + done +} + +add_svc_runit(){ + local mnt="$1" names="$2" rlvl="${3:-default}" + for svc in $names; do + if [[ -d $mnt/etc/runit/sv/$svc ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" ln -s /etc/runit/sv/"$svc" /etc/runit/runsvdir/"$rlvl" &>/dev/null + fi + done +} + +add_svc_s6(){ + local mnt="$1" names="$2" rlvl="${3:-default}" error ret + local db=/etc/s6/rc/compiled + for svc in $names; do + error=false + chroot "$mnt" s6-rc-db -c "$db" type "$svc" &> /dev/null || error=true + ret="$?" + if [ $ret -eq 0 ] && [[ "$error" == false ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" s6-rc-bundle-update -c "$db" add "$rlvl" "$svc" + fi + done + + local rlvl=/etc/s6/current + # rebuild s6-linux-init binaries + chroot "$mnt" rm -r "$rlvl" + chroot "$mnt" s6-linux-init-maker -1 -N -f /etc/s6/skel -G "/usr/bin/agetty -L -8 tty7 115200" -c "$rlvl" "$rlvl" + chroot "$mnt" mv "$rlvl"/bin/init "$rlvl"/bin/s6-init + chroot "$mnt" cp -a "$rlvl"/bin /usr +} + +add_svc_suite66(){ + local mnt="$1" names="$2" + for svc in $names; do + if [[ -f "$mnt"/etc/66/service/"$svc" ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" 66-enable -t default "$svc" &>/dev/null + fi + done +} + +add_svc_dinit(){ + local mnt="$1" names="$2" + for svc in $names; do + if [[ -d $mnt/etc/dinit.d/boot.d ]]; then + msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" + chroot "$mnt" ln -s ../"$svc" /etc/dinit.d/boot.d/"$svc" &>/dev/null + fi + done +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/squash.sh b/artools/0.26.1/artools/lib/iso/squash.sh new file mode 100644 index 0000000..b860342 --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/squash.sh @@ -0,0 +1,86 @@ +#!/hint/bash + +#{{{ squash + +make_ext_img(){ + local src="$1" + local size=32G + local mnt="${mnt_dir}/${src##*/}" + mkdir -p "${work_dir}"/embed"${live_dir}" + local extimg="${work_dir}/embed${live_dir}/${src##*/}".img + + msg2 "Creating ext4 image of %s ..." "${size}" + truncate -s ${size} "${extimg}" + local ext4_args=() + ext4_args+=("-O ^has_journal,^resize_inode" -E lazy_itable_init=0 -m 0) + mkfs.ext4 "${ext4_args[@]}" -F "${extimg}" &>/dev/null + tune2fs -c 0 -i 0 "${extimg}" &> /dev/null + mount_img "${extimg}" "${mnt}" + msg2 "Copying %s ..." "${src}/" + cp -aT "${src}/" "${mnt}/" + umount_img "${mnt}" +} + +has_changed(){ + local src="$1" dest="$2" + if [[ -f "${dest}" ]]; then + local has_changes + has_changes=$(find "${src}" -newer "${dest}") + if [[ -n "${has_changes}" ]]; then + msg2 "Possible changes for %s ..." "${src}" + msg2 "%s" "${has_changes}" + msg2 "SquashFS image %s is not up to date, rebuilding..." "${dest}" + rm "${dest}" + else + msg2 "SquashFS image %s is up to date, skipping." "${dest}" + return 1 + fi + fi +} + +# $1: image path +make_sfs() { + local sfs_in="$1" + if [[ ! -e "${sfs_in}" ]]; then + error "The path %s does not exist" "${sfs_in}" + retrun 1 + fi + + mkdir -p "${iso_root}${live_dir}" + + local img_name=${sfs_in##*/}.img + + local sfs_out="${iso_root}${live_dir}/${img_name}" + + if has_changed "${sfs_in}" "${sfs_out}"; then + + msg "Generating SquashFS image for %s" "${sfs_in}" + + local mksfs_args=() + + if ${persist};then + make_ext_img "${sfs_in}" + mksfs_args+=("${work_dir}/embed") + else + mksfs_args+=("${sfs_in}") + fi + + mksfs_args+=("${sfs_out}") + + mksfs_args+=(-comp "${COMPRESSION}" "${COMPRESSION_ARGS[@]}" -noappend) + + mksquashfs "${mksfs_args[@]}" + + if ! ${use_dracut}; then + make_checksum "${img_name}" + if [[ -n ${GPG_KEY} ]];then + make_sig "${iso_root}${live_dir}/${img_name}" + fi + fi + if ${persist}; then + rm -r "${work_dir}/embed" + fi + fi +} + +#}}} diff --git a/artools/0.26.1/artools/lib/iso/trap.sh b/artools/0.26.1/artools/lib/iso/trap.sh new file mode 100644 index 0000000..7c740d8 --- /dev/null +++ b/artools/0.26.1/artools/lib/iso/trap.sh @@ -0,0 +1,48 @@ +#!/hint/bash + +#{{{ trap + +error_function() { + local func="$1" + # first exit all subshells, then print the error + if (( ! BASH_SUBSHELL )); then + error "A failure occurred in %s()." "$func" + plain "Aborting..." + fi + umount_overlayfs + umount_img + exit 2 +} + +run_safe() { + local restoretrap func="$1" + set -e + set -E + restoretrap=$(trap -p ERR) + trap 'error_function $func' ERR + + "$func" + + eval "$restoretrap" + set +E + set +e +} + +trap_exit() { + local sig=$1; shift + error "$@" + umount_overlayfs + trap -- "$sig" + kill "-$sig" "$$" +} + +prepare_traps(){ + for sig in TERM HUP QUIT; do + # shellcheck disable=2064 + trap "trap_exit $sig \"$(gettext "%s signal caught. Exiting...")\" \"$sig\"" "$sig" + done + trap 'trap_exit INT "$(gettext "Aborted by user! Exiting...")"' INT +# trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR +} + +#}}} diff --git a/artools/0.26.1/artools/lib/pkg/common.sh b/artools/0.26.1/artools/lib/pkg/common.sh new file mode 100644 index 0000000..1ae0c43 --- /dev/null +++ b/artools/0.26.1/artools/lib/pkg/common.sh @@ -0,0 +1,36 @@ +#!/hint/bash + +#{{{ common functions + +get_compliant_name(){ + local gitname="$1" + case "$gitname" in + *+) gitname=${gitname//+/plus} + esac + echo "$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 + echo "$org" +} + +api_put() { + curl -s -X PUT "$@" +} + +api_delete() { + curl -s -X DELETE "$@" +} + +api_post() { + curl -s -X POST "$@" +} + +#}}} diff --git a/artools/0.26.1/artools/lib/pkg/deploy.sh b/artools/0.26.1/artools/lib/pkg/deploy.sh new file mode 100644 index 0000000..0cce3ff --- /dev/null +++ b/artools/0.26.1/artools/lib/pkg/deploy.sh @@ -0,0 +1,37 @@ +#!/hint/bash + +#{{{ functions + +find_cached_pkgfile() { + local searchdirs=("$PKGDEST" "$PWD") results=() + local pkg="$1" + for dir in "${searchdirs[@]}"; do + [[ -d "$dir" ]] || continue + [[ -e "$dir/$pkg" ]] && results+=("$dir/$pkg") + done + case ${#results[*]} in + 0) + return 1 + ;; + 1) + printf '%s\n' "${results[0]}" + return 0 + ;; + *) + error 'Multiple packages found:' + printf '\t%s\n' "${results[@]}" >&2 + return 1 + ;; + esac +} + +get_pkgbasename() { + local name="$1" + local rm_pkg=${name%.pkg.tar*} + rm_pkg=${rm_pkg%-*} + rm_pkg=${rm_pkg%-*} + rm_pkg=${rm_pkg%-*} + echo "$rm_pkg" +} + +#}}} diff --git a/artools/0.26.1/artools/lib/pkg/git.sh b/artools/0.26.1/artools/lib/pkg/git.sh new file mode 100644 index 0000000..bc1f1bf --- /dev/null +++ b/artools/0.26.1/artools/lib/pkg/git.sh @@ -0,0 +1,35 @@ +#!/hint/bash + +#{{{ git + +get_local_head(){ + git log --pretty=%H ...refs/heads/master^ | head -n 1 +} + +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 + fi +} + +pull_tree(){ + local tree="$1" local_head="$2" os="${3:-Artix}" + local remote_head + remote_head=$(get_remote_head) + + msg "Checking (%s) (%s)" "${tree}" "$os" + if has_changeset "${local_head}" "${remote_head}";then + git pull origin master + fi +} + +#}}} diff --git a/artools/0.26.1/artools/lib/pkg/gitea.sh b/artools/0.26.1/artools/lib/pkg/gitea.sh new file mode 100644 index 0000000..fecfb72 --- /dev/null +++ b/artools/0.26.1/artools/lib/pkg/gitea.sh @@ -0,0 +1,31 @@ +#!/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" +} + +#}}} diff --git a/artools/0.26.1/artools/lib/pkg/jenkins.sh b/artools/0.26.1/artools/lib/pkg/jenkins.sh new file mode 100644 index 0000000..29c7e0f --- /dev/null +++ b/artools/0.26.1/artools/lib/pkg/jenkins.sh @@ -0,0 +1,43 @@ +#!/hint/bash + +#{{{ jenkins + +write_jenkinsfile(){ + local pkg="$1" + local jenkins=$pkg/Jenkinsfile + + echo "@Library('artix-ci') import org.artixlinux.RepoPackage" > "$jenkins" + { + echo '' + echo 'PackagePipeline(new RepoPackage(this))' + echo '' + } >> "$jenkins" + + git add "$jenkins" +} + +write_agentyaml(){ + local pkg="$1" + local agent="$pkg"/.artixlinux/agent.yaml label='master' + [[ -d $pkg/.artixlinux ]] || mkdir "$pkg"/.artixlinux + + echo '---' > "$agent" + { + echo '' + echo "label: $label" + echo '' + } >> "$agent" + + git add "$agent" +} + +commit_jenkins_files(){ + local pkg="$1" + + write_jenkinsfile "$pkg" + write_agentyaml "$pkg" + + git commit -m "initial commit" +} + +#}}} diff --git a/artools/0.26.1/artools/lib/pkg/repo.sh b/artools/0.26.1/artools/lib/pkg/repo.sh new file mode 100644 index 0000000..b439527 --- /dev/null +++ b/artools/0.26.1/artools/lib/pkg/repo.sh @@ -0,0 +1,51 @@ +#!/hint/bash + +##{{{ repo + +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 +} + +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[@]}") +} + +find_repo(){ + local pkg="$1" pkgarch="${2:-${CARCH}}" repo + for r in "${ARCH_REPOS[@]}"; do + [[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo=repos/"$r-$pkgarch" + [[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=repos/"$r"-any + [[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$pkgarch/$r" + done + echo "$repo" +} + +find_pkg(){ + local searchdir="$1" pkg="$2" result + result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg") + echo "$result" +} + +tree_loop(){ + local func="$1" pkgs + for tree in "${ARTIX_TREE[@]}"; do + pkgs=$(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort) + for _package in ${pkgs}; do + "$func" "$_package" + done + done +} + +#}}} diff --git a/artools/0.26.1/artools/lib/pkg/table.sh b/artools/0.26.1/artools/lib/pkg/table.sh new file mode 100644 index 0000000..fa75320 --- /dev/null +++ b/artools/0.26.1/artools/lib/pkg/table.sh @@ -0,0 +1,35 @@ +#!/hint/bash + +#{{{ table + +msg_table_header(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" +} + +msg_row_yellow(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row_green(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" +} + +msg_row_red(){ + local mesg=$1; shift + # shellcheck disable=2059 + printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" +} + +#}}} diff --git a/artools/0.26.1/artools/lib/util-base.sh b/artools/0.26.1/artools/lib/util-base.sh new file mode 100644 index 0000000..d6904ef --- /dev/null +++ b/artools/0.26.1/artools/lib/util-base.sh @@ -0,0 +1,41 @@ +#!/hint/bash + +#{{{ base conf + +DATADIR=${DATADIR:-'@datadir@/artools'} +SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} + +if [[ -n $SUDO_USER ]]; then + eval "USER_HOME=~$SUDO_USER" +else + USER_HOME=$HOME +fi + +USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" + +prepare_dir(){ + [[ ! -d $1 ]] && mkdir -p "$1" +} + +load_base_config(){ + + local conf="$1/artools-base.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-base.conf + [[ -r "$conf" ]] && . "$conf" + + CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} + + WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} + + return 0 +} + +#}}} + +load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" + +prepare_dir "${WORKSPACE_DIR}" +prepare_dir "${USER_CONF_DIR}" diff --git a/artools/0.26.1/artools/lib/util-iso.sh b/artools/0.26.1/artools/lib/util-iso.sh new file mode 100644 index 0000000..f2ae4e9 --- /dev/null +++ b/artools/0.26.1/artools/lib/util-iso.sh @@ -0,0 +1,41 @@ +#!/hint/bash + +#{{{ iso conf + +load_iso_config(){ + + local conf="$1/artools-iso.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-iso.conf + [[ -r "$conf" ]] && . "$conf" + + ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"} + + ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"} + + INITSYS=${INITSYS:-'openrc'} + + GPG_KEY=${GPG_KEY:-''} + + COMPRESSION="${COMPRESSION:-zstd}" + + COMPRESSION_LEVEL="${COMPRESSION_LEVEL:-15}" + + if [[ -z "${COMPRESSION_ARGS[*]}" ]]; then + COMPRESSION_ARGS=(-Xcompression-level "${COMPRESSION_LEVEL}") + fi + + if [[ "${COMPRESSION}" == 'xz' ]]; then + COMPRESSION_ARGS=(-Xbcj x86) + fi + + return 0 +} + +#}}} + +load_iso_config "${USER_CONF_DIR}" || load_iso_config "${SYSCONFDIR}" + +prepare_dir "${ISO_POOL}" diff --git a/artools/0.26.1/artools/lib/util-pkg.sh b/artools/0.26.1/artools/lib/util-pkg.sh new file mode 100644 index 0000000..30acc3b --- /dev/null +++ b/artools/0.26.1/artools/lib/util-pkg.sh @@ -0,0 +1,75 @@ +#!/hint/bash + +#{{{ pkg conf + +load_pkg_config(){ + + local conf="$1/artools-pkg.conf" + + [[ -f "$conf" ]] || return 1 + + # shellcheck source=/etc/artools/artools-pkg.conf + [[ -r "$conf" ]] && . "$conf" + + local git_domain="gitea.artixlinux.org" + + GIT_URL=${GIT_URL:-"https://${git_domain}"} + + GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} + + GIT_TOKEN=${GIT_TOKEN:-''} + + TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} + + ARTIX_TREE=( + packages community + packages-{gfx,media,net} + ) + + local dev_tree=( + packages-{llvm,python,perl,java,ruby,misc} + python-{world,galaxy,galaxy-groups,misc} + ) + + local init_tree=(packages-{openrc,runit,s6,suite66,dinit}) + + local desktop_tree=( + packages-{kf5,plasma,kde,qt5,qt6,xorg,gtk} + packages-{lxqt,gnome,cinnamon,mate,xfce,wm,lxde} + ) + + [[ -z ${TREE_NAMES_ARTIX[*]} ]] && \ + TREE_NAMES_ARTIX=( + packages-kernel + "${init_tree[@]}" + "${dev_tree[@]}" + "${desktop_tree[@]}" + packages-devel + packages-lib32 + ) + + ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}") + + 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'} + + DBEXT=${DBEXT:-'gz'} + + return 0 +} + +#}}} + +load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}" + +prepare_dir "${REPOS_ROOT}" +prepare_dir "${TREE_DIR_ARTIX}" +prepare_dir "${TREE_DIR_ARCH}" diff --git a/artools/0.26.1/artools_0.26.1-1.debian.tar.xz b/artools/0.26.1/artools_0.26.1-1.debian.tar.xz index 8888ff8..93cfaab 100644 Binary files a/artools/0.26.1/artools_0.26.1-1.debian.tar.xz and b/artools/0.26.1/artools_0.26.1-1.debian.tar.xz differ diff --git a/artools/0.26.1/artools_0.26.1-1.dsc b/artools/0.26.1/artools_0.26.1-1.dsc index 6d7b3b1..6075d6d 100644 --- a/artools/0.26.1/artools_0.26.1-1.dsc +++ b/artools/0.26.1/artools_0.26.1-1.dsc @@ -14,28 +14,28 @@ Package-List: artools deb misc medium arch=any Checksums-Sha1: 3488d9b1c0df03c5188d3a674ee7b80c15334a38 50212 artools_0.26.1.orig.tar.gz - 8caebd7d6d69067921ef60d7f4e1d5dbfb59663d 2852 artools_0.26.1-1.debian.tar.xz + 0a235203dc49a0432ad84457e70d0b10f9a9114f 3112 artools_0.26.1-1.debian.tar.xz Checksums-Sha256: 11fdef1e63cd0c7a3a9ecdeec718a3353352ff9e76a331b4063eebc72a922c49 50212 artools_0.26.1.orig.tar.gz - c8ccd573158fa553e85946ec73704eaab74676dfb28342bf1144f7ff5487c27f 2852 artools_0.26.1-1.debian.tar.xz + 5a0b79934ad26a7a8af500700650112ed22b886b21893613ceb646c860b3efcf 3112 artools_0.26.1-1.debian.tar.xz Files: 9a46f2694252377d63db7b559a69acaf 50212 artools_0.26.1.orig.tar.gz - dd5c153d6e00f11865300c067e425e4e 2852 artools_0.26.1-1.debian.tar.xz + 78abdb6baf78d3112fb7f61ed0f8c272 3112 artools_0.26.1-1.debian.tar.xz -----BEGIN PGP SIGNATURE----- -iQJLBAEBCgA1FiEEaGFl8HhSoLfV0hzL3FpvgJJkHi0FAmHbOnMXHG5kb3dlbnNA -YXJ0aXhsaW51eC5vcmcACgkQ3FpvgJJkHi3fMhAAk/KtRrg2Uy7EeIX4uxqK2xph -eG4OnkVpm2h0Ak2cv0pacoYydk9/tLeDj7ak7M7WNLPfHxilDA8mI0auKPMMspJV -8LMq12AqOgkqfQhCaTpgMO5PjCp3iawyM9XjEChv/0SosdNpCalAeSm8LSTFIBbx -727p9TXCNdGmTeDIraO+2mdXhKVF0qj/HxNbynhQV9nys5fYaMTLTvv4VYg+IXQr -rM8a7+Nhrcfx4zaPvAGIbjs8Om/Nk4W03oZay/ntMZZOKOVqD7614+nmAycrVjpc -wr2YxQmvatl2KvSoi86VDI9SPNR9eQHt22KCunrIhQN2oRtGSbkPDICpGq1mwjyw -Kz5up6Bv87BxLtFMNL9cazCsn4EKLDAZMtzDqXPMyVubkjaRhIdW+7xVP1kFSFHV -FDP6Sv9rhfqNHpNWYP/ruvK7fOQRPRtktyS8KAxJIIV7P5/7AsbY1j8luaSyzFy2 -V33HJu8W0A8Ku/mDgeB6TTVWUWN16vodQmCrcPkz8zn9TzQDcMhG9CQdq2TdWwV/ -9VrcF6t7wrGCzRM1LLB7Q++5ey5gkZ3B4qDT9HoYbODZfm4Let44EKlTj0Nbtnvb -4wY4ObMfEhVtfQcVMgYOMYsE88fAczYx1coXPmIo5fFu+PUPD53AxGYjrsGD627k -tLkShyLRWVEFilUcdJY= -=jhut +iQJLBAEBCgA1FiEEaGFl8HhSoLfV0hzL3FpvgJJkHi0FAmHbR1QXHG5kb3dlbnNA +YXJ0aXhsaW51eC5vcmcACgkQ3FpvgJJkHi24qg//bdEVCpdydCpZ4z07GRqLIMSw +xZICwFKsIxZWvIcD3XgkkQ3Mm+nOnmWpRycmWulNyWH5M6O2+CNSa24N/Ouucj9r +dwQhY3a/uNyqx8IZaj0S9WpvM2eKBuzg7zVEPCUQ6bUYzDGIkBz29XiMpO8WndBo +U2omhiTJ57XcovOj0Q0FT1hNCyJTsxbvUWZM8Nte3GkBFgksKXUzqQzRxNlAlKL9 +2v4De0mYGrKg/qMyxBaWg5OGFHZq/ugG4f/tL1c8Zkz5tI2+rEbXOCkYaNf6g5FO +Luf2DGzmc6G0lM4Ln8+XueCYQ+YAEiNUcvC7WnVccUei404bO/43kBEhpJ4AsAT5 +cZLjlPolEGsXTvJ5Wk5SGTwyDY3I2dAflfJSu+l1IOaYUxtpCH1OK7tA5wCscpzq +NHGfyv+uviWqQGPjOjJDUZTnyHRZOAOSUbb4sV/q37pkztSjjXBpgWXYiHsUcA6h +3ryFaLU/DFJE0SAHH4pdp63N3oTe2Vcxn2xxzq0EYM5c2g3QS0w0hrV1Ww4X6IPg +qtSBfHO+5URRNb6oWEUsfkz4t62HfnzVNYpU5/XC8ps2AZFoTR8MJibZVLdajlf6 +Y26p+jE6nzBD7dMlvYvNeW6A0X5d5kasKXZjrF6YuGOXMnkKDRhzE8JpfFJuAuXw +P1b+BRcXMo7M/rP6KGo= +=PRDO -----END PGP SIGNATURE----- diff --git a/artools/0.26.1/artools_0.26.1-1_amd64.buildinfo b/artools/0.26.1/artools_0.26.1-1_amd64.buildinfo new file mode 100644 index 0000000..b4aa245 --- /dev/null +++ b/artools/0.26.1/artools_0.26.1-1_amd64.buildinfo @@ -0,0 +1,199 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +Format: 1.0 +Source: artools +Binary: artools +Architecture: amd64 source +Version: 0.26.1-1 +Checksums-Md5: + 0d39cb3aaab0fda4d2b290700dacad7f 1751 artools_0.26.1-1.dsc + 4eacff5378b93e0ba8f727687fa8803f 44370 artools_0.26.1-1_amd64.deb +Checksums-Sha1: + 45a14fe5a49b5b225a70db3dfa0a9c85964ab7a2 1751 artools_0.26.1-1.dsc + 56a18f3c6da4efe0eec7e5bccbaa8946c634435d 44370 artools_0.26.1-1_amd64.deb +Checksums-Sha256: + 758b57574f6c6abc9e3afcaec08029bd955b76a70ba9013915639bc3701d7b95 1751 artools_0.26.1-1.dsc + aa686ef61135df67182987291f10cb68d751de49e1fca1713e742a33a4207635 44370 artools_0.26.1-1_amd64.deb +Build-Origin: Ubuntu +Build-Architecture: amd64 +Build-Date: Sun, 09 Jan 2022 14:36:36 -0600 +Build-Tainted-By: + merged-usr-via-aliased-dirs +Installed-Build-Depends: + autoconf (= 2.69-14), + automake (= 1:1.16.4-2), + autopoint (= 0.21-4ubuntu3), + autotools-dev (= 20180224.1+nmu1), + base-files (= 11.1ubuntu5), + base-passwd (= 3.5.51), + bash (= 5.1-3ubuntu2), + binutils (= 2.37-7ubuntu1), + binutils-common (= 2.37-7ubuntu1), + binutils-x86-64-linux-gnu (= 2.37-7ubuntu1), + bsdextrautils (= 2.36.1-8ubuntu2), + bsdutils (= 1:2.36.1-8ubuntu2), + build-essential (= 12.9ubuntu2), + bzip2 (= 1.0.8-4ubuntu3), + coreutils (= 8.32-4ubuntu2), + cpp (= 4:11.2.0-1ubuntu1), + cpp-11 (= 11.2.0-7ubuntu2), + dash (= 0.5.11+git20210120+802ebd4-1build1), + debconf (= 1.5.77), + debhelper (= 13.3.4ubuntu2), + debianutils (= 4.11.2), + debugedit (= 1:5.0-0ubuntu2), + dh-autoreconf (= 20), + dh-strip-nondeterminism (= 1.12.0-1), + diffutils (= 1:3.8-0ubuntu1), + dpkg (= 1.20.9ubuntu2), + dpkg-dev (= 1.20.9ubuntu2), + dwz (= 0.14-1build1), + file (= 1:5.39-3), + findutils (= 4.8.0-1ubuntu2), + g++ (= 4:11.2.0-1ubuntu1), + g++-11 (= 11.2.0-7ubuntu2), + gcc (= 4:11.2.0-1ubuntu1), + gcc-11 (= 11.2.0-7ubuntu2), + gcc-11-base (= 11.2.0-7ubuntu2), + gettext (= 0.21-4ubuntu3), + gettext-base (= 0.21-4ubuntu3), + grep (= 3.7-0ubuntu1), + groff-base (= 1.22.4-7), + gzip (= 1.10-4ubuntu1), + hostname (= 3.23ubuntu1), + init-system-helpers (= 1.60build1), + install-info (= 6.7.0.dfsg.2-6), + intltool-debian (= 0.35.0+20060710.5), + libacl1 (= 2.2.53-10ubuntu2), + libarchive-zip-perl (= 1.68-1), + libasan6 (= 11.2.0-7ubuntu2), + libatomic1 (= 11.2.0-7ubuntu2), + libattr1 (= 1:2.4.48-6build2), + libaudit-common (= 1:3.0-2ubuntu2), + libaudit1 (= 1:3.0-2ubuntu2), + libbinutils (= 2.37-7ubuntu1), + libblkid1 (= 2.36.1-8ubuntu2), + libbz2-1.0 (= 1.0.8-4ubuntu3), + libc-bin (= 2.34-0ubuntu3), + libc-dev-bin (= 2.34-0ubuntu3), + libc6 (= 2.34-0ubuntu3), + libc6-dev (= 2.34-0ubuntu3), + libcap-ng0 (= 0.7.9-2.2build1), + libcap2 (= 1:2.44-1build1), + libcc1-0 (= 11.2.0-7ubuntu2), + libcom-err2 (= 1.46.3-1ubuntu3), + libcrypt-dev (= 1:4.4.18-4ubuntu1), + libcrypt1 (= 1:4.4.18-4ubuntu1), + libctf-nobfd0 (= 2.37-7ubuntu1), + libctf0 (= 2.37-7ubuntu1), + libdb5.3 (= 5.3.28+dfsg1-0.8ubuntu1), + libdebconfclient0 (= 0.256ubuntu3), + libdebhelper-perl (= 13.3.4ubuntu2), + libdpkg-perl (= 1.20.9ubuntu2), + libdw1 (= 0.185-1build1), + libelf1 (= 0.185-1build1), + libfile-stripnondeterminism-perl (= 1.12.0-1), + libgcc-11-dev (= 11.2.0-7ubuntu2), + libgcc-s1 (= 11.2.0-7ubuntu2), + libgcrypt20 (= 1.8.7-5ubuntu2), + libgdbm-compat4 (= 1.19-2), + libgdbm6 (= 1.19-2), + libgmp10 (= 2:6.2.1+dfsg-1ubuntu2), + libgomp1 (= 11.2.0-7ubuntu2), + libgpg-error0 (= 1.38-2build1), + libgssapi-krb5-2 (= 1.18.3-6), + libicu67 (= 67.1-7ubuntu1), + libisl23 (= 0.24-1), + libitm1 (= 11.2.0-7ubuntu2), + libk5crypto3 (= 1.18.3-6), + libkeyutils1 (= 1.6.1-2ubuntu1), + libkrb5-3 (= 1.18.3-6), + libkrb5support0 (= 1.18.3-6), + liblsan0 (= 11.2.0-7ubuntu2), + liblz4-1 (= 1.9.3-2), + liblzma5 (= 5.2.5-2), + libmagic-mgc (= 1:5.39-3), + libmagic1 (= 1:5.39-3), + libmount1 (= 2.36.1-8ubuntu2), + libmpc3 (= 1.2.0-1build1), + libmpfr6 (= 4.1.0-3build1), + libnsl-dev (= 1.3.0-2build1), + libnsl2 (= 1.3.0-2build1), + libpam-modules (= 1.3.1-5ubuntu11), + libpam-modules-bin (= 1.3.1-5ubuntu11), + libpam-runtime (= 1.3.1-5ubuntu11), + libpam0g (= 1.3.1-5ubuntu11), + libpcre2-8-0 (= 10.37-0ubuntu2), + libpcre3 (= 2:8.39-13build3), + libperl5.32 (= 5.32.1-3ubuntu3), + libpipeline1 (= 1.5.3-1build1), + libquadmath0 (= 11.2.0-7ubuntu2), + libseccomp2 (= 2.5.1-1ubuntu1), + libselinux1 (= 3.1-3build2), + libsigsegv2 (= 2.13-1ubuntu2), + libsmartcols1 (= 2.36.1-8ubuntu2), + libssl1.1 (= 1.1.1l-1ubuntu1.1), + libstdc++-11-dev (= 11.2.0-7ubuntu2), + libstdc++6 (= 11.2.0-7ubuntu2), + libsub-override-perl (= 0.09-2), + libsystemd0 (= 248.3-1ubuntu8.1), + libtinfo6 (= 6.2+20201114-2build1), + libtirpc-common (= 1.3.2-2), + libtirpc-dev (= 1.3.2-2), + libtirpc3 (= 1.3.2-2), + libtool (= 2.4.6-15), + libtsan0 (= 11.2.0-7ubuntu2), + libubsan1 (= 11.2.0-7ubuntu2), + libuchardet0 (= 0.0.7-1build1), + libudev1 (= 248.3-1ubuntu8.1), + libunistring2 (= 0.9.10-6), + libuuid1 (= 2.36.1-8ubuntu2), + libxml2 (= 2.9.12+dfsg-4), + libzstd1 (= 1.4.8+dfsg-2.1), + linux-libc-dev (= 5.13.0-23.23), + login (= 1:4.8.1-1ubuntu9), + lsb-base (= 11.1.0ubuntu3), + lto-disabled-list (= 16), + m4 (= 1.4.18-5ubuntu1), + make (= 4.3-4ubuntu1), + man-db (= 2.9.4-2), + mawk (= 1.3.4.20200120-2), + ncurses-base (= 6.2+20201114-2build1), + ncurses-bin (= 6.2+20201114-2build1), + patch (= 2.7.6-7), + perl (= 5.32.1-3ubuntu3), + perl-base (= 5.32.1-3ubuntu3), + perl-modules-5.32 (= 5.32.1-3ubuntu3), + po-debconf (= 1.0.21+nmu1), + rpcsvc-proto (= 1.4.2-0ubuntu5), + sed (= 4.7-1ubuntu1), + sensible-utils (= 0.0.14), + sysvinit-utils (= 2.96-7ubuntu1), + tar (= 1.34+dfsg-1build1), + util-linux (= 2.36.1-8ubuntu2), + xz-utils (= 5.2.5-2), + zlib1g (= 1:1.2.11.dfsg-2ubuntu7) +Environment: + DEB_BUILD_OPTIONS="parallel=4" + DEB_BUILD_PROFILES="noudeb" + LANG="en_US.UTF-8" + SOURCE_DATE_EPOCH="1641756008" + +-----BEGIN PGP SIGNATURE----- + +iQJLBAEBCgA1FiEEaGFl8HhSoLfV0hzL3FpvgJJkHi0FAmHbR1QXHG5kb3dlbnNA +YXJ0aXhsaW51eC5vcmcACgkQ3FpvgJJkHi0IZhAApaYkdKtvoyYjjOLsdziq0vrZ +wVJwRd3UpHkR7+uycoU9VIwcWmC9xQLqkEItZbWihoOuAMzwUfrgavGPLgz0i96s +Jhrq1IoJepCHgWpM8Q6un8hdtO20UzIQ8kFi0pHnBZI8DEXFPjYZJlHccVk/G5pX +SDXMdFS4URBu5VdHIue/BABtYDh8yAOQ02hFEbLlLNkdVTKFvXj1sh2mu5fMSsqC +4sSrC9uE0DMgQZA2lM9iQkmj1djBOczrcMzWwGiy8/DINlsz6ELxrhXv677GV0pj +h5PnSdr562u94Fbjrc4yujq5vVxi2zzAd8f7SmYHB85TN5RZ/EJ3QTq7xstnoIbA +GUmLg/NZdGa0wnp6JZP7SSbeXrJ7ZSJ5EtpGlHB+e9mzATf7z/pHw6j8tOBjPmvH +ZsDRJzHVdtxJycR6CSqCSOnZofyDE/zJcfNJy8kc48PE1B8U6scyrpklNgmjY0ws +btwsuaf7QH0OLsXv5EhcvTcpuyF4ZX7cMMEHPnUz+Qp2fi8J46qhIM8h+spzEjKr +AaWxf9ls7zTKbwOZDivFuinSZi+a4QpkxyApcQfIEvdyNL7X/gG+aptc7oPlOlgM +wE1pVVKHN3PeMaE309nPVpiP4nGiyqDg0cD+fVIemfWagffdM8OIVQUb1mDLPV48 +Kdn55cIls/XHq49I3g0= +=zhrT +-----END PGP SIGNATURE----- diff --git a/artools/0.26.1/artools_0.26.1-1_amd64.changes b/artools/0.26.1/artools_0.26.1-1_amd64.changes new file mode 100644 index 0000000..4df9304 --- /dev/null +++ b/artools/0.26.1/artools_0.26.1-1_amd64.changes @@ -0,0 +1,56 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +Format: 1.8 +Date: Sun, 09 Jan 2022 13:20:08 -0600 +Source: artools +Binary: artools +Built-For-Profiles: noudeb +Architecture: source amd64 +Version: 0.26.1-1 +Distribution: unstable +Urgency: medium +Maintainer: Nathan Owens +Changed-By: Nathan Owens +Description: + artools - Artix linux packaging +Changes: + artools (0.26.1-1) unstable; urgency=medium + . + * Initial release +Checksums-Sha1: + 45a14fe5a49b5b225a70db3dfa0a9c85964ab7a2 1751 artools_0.26.1-1.dsc + 3488d9b1c0df03c5188d3a674ee7b80c15334a38 50212 artools_0.26.1.orig.tar.gz + 0a235203dc49a0432ad84457e70d0b10f9a9114f 3112 artools_0.26.1-1.debian.tar.xz + 29e7d0958463b3250208270653ad97197f608a9e 6524 artools_0.26.1-1_amd64.buildinfo + 56a18f3c6da4efe0eec7e5bccbaa8946c634435d 44370 artools_0.26.1-1_amd64.deb +Checksums-Sha256: + 758b57574f6c6abc9e3afcaec08029bd955b76a70ba9013915639bc3701d7b95 1751 artools_0.26.1-1.dsc + 11fdef1e63cd0c7a3a9ecdeec718a3353352ff9e76a331b4063eebc72a922c49 50212 artools_0.26.1.orig.tar.gz + 5a0b79934ad26a7a8af500700650112ed22b886b21893613ceb646c860b3efcf 3112 artools_0.26.1-1.debian.tar.xz + 064e5ba76b1b81d58ee7645dd12050b56c9158d5f6700209e807523fa48ee0bf 6524 artools_0.26.1-1_amd64.buildinfo + aa686ef61135df67182987291f10cb68d751de49e1fca1713e742a33a4207635 44370 artools_0.26.1-1_amd64.deb +Files: + 0d39cb3aaab0fda4d2b290700dacad7f 1751 misc medium artools_0.26.1-1.dsc + 9a46f2694252377d63db7b559a69acaf 50212 misc medium artools_0.26.1.orig.tar.gz + 78abdb6baf78d3112fb7f61ed0f8c272 3112 misc medium artools_0.26.1-1.debian.tar.xz + 89afd53a2c3161fdb7f16ea417611e69 6524 misc medium artools_0.26.1-1_amd64.buildinfo + 4eacff5378b93e0ba8f727687fa8803f 44370 misc medium artools_0.26.1-1_amd64.deb + +-----BEGIN PGP SIGNATURE----- + +iQJLBAEBCgA1FiEEaGFl8HhSoLfV0hzL3FpvgJJkHi0FAmHbR1QXHG5kb3dlbnNA +YXJ0aXhsaW51eC5vcmcACgkQ3FpvgJJkHi1iHA//d8n+uN3AKykL0OTVYCK4Ypkk +3pvdpUw5vJH/0/JskXt1MFFxMo2qywQszYKCHaEwksItUb/1rp7NC6k9O0JoqzHT +ve7MQ6LfHb+A241wFwoBX6GvRASmXtIJFt2tdHa3Bjinq1am6muOLnEagj1k8qqC +pB/vNDbpsAAcZbEEa+bXyFpsXcb3Vzu0IFjqPxOcixUBMnb8NKbiNWUrA4Qhf5aW +DDlWH+x9415Ysm0/Du5OhPTKHylbaPF6xc0Ulkn246Ek3bpi9txFN7exq+awWN3h +bksG37xPi5cXNtcCHQiMwl865r8rKDBmx5TarctpwtuWMG+YU25aQa8dicIGv4Bp +hGUH7/jUAe/7wzWITdHMQ8/8S9Lz5jcgqIiolYCK5e+EDMYsflYcZrYKdhJKiNwE +gGNhiJe/ALlZzaQ4BmIdX2r4N4cXxmiwPp9aBidpqwuGRjMOi7Fe/HbTxvYF1Acv +GAjdDtSzSKM875x17Z8LNY5r3WqUc+GV3UQgE9rIWL3BfbYZKzw1GFOF4/VRlrrF +3CrcpXADSJtG2f3A4J/GcbxnWGVz2Ive8EAzje4QsIStq6QqoOl2jkMUEi7HFJ8H +djDwcKLMmmMFE7tpF6Bvqn3SA23SkKE3v/oQWpAAjL2UXhCz+V/z1nnK3eLvUc8R +wFGfPZv5YmiOG0oA92U= +=cvnx +-----END PGP SIGNATURE----- diff --git a/artools/0.26.1/artools_0.26.1-1_amd64.deb b/artools/0.26.1/artools_0.26.1-1_amd64.deb index 42a2849..fcd983e 100644 Binary files a/artools/0.26.1/artools_0.26.1-1_amd64.deb and b/artools/0.26.1/artools_0.26.1-1_amd64.deb differ diff --git a/elogind/246.10/elogind-246.10/build_release/meson-logs/meson-log.txt b/elogind/246.10/elogind-246.10/build_release/meson-logs/meson-log.txt new file mode 100644 index 0000000..ac0d267 --- /dev/null +++ b/elogind/246.10/elogind-246.10/build_release/meson-logs/meson-log.txt @@ -0,0 +1,16 @@ +Build started at 2022-01-09T14:25:49.614575 +Main binary: /usr/bin/python3 +Build Options: -Drootprefix=/tmp/elogind_test -Dsysconfdir=/tmp/elogind_test/etc -Dacl=true -Dcgroup-controller=elogind -Ddefault-hierarchy= -Defi=true -Dhtml=auto -Dman=auto -Dpam=true -Dselinux=false -Dsmack=true -Dprefix=/tmp/elogind_test -Dbuildtype=release -Dwrap_mode=nodownload +Python system: Linux +The Meson build system +Version: 0.56.2 +Source dir: /home/ndowens/git/debian-packages/elogind/246.10/elogind-246.10 +Build dir: /home/ndowens/git/debian-packages/elogind/246.10/elogind-246.10/build_release +Build type: native build + +meson.build:3:0: ERROR: Value "" (of type "string") for combo option "Wanted cgroup hierarchy if elogind has to be a cgroup controller: + "legacy" assumes tmpfs mounted on /sys/fs/cgroup and cgroup on its + subfolders. + "hybrid" assumes cgroups version 2 mounted on /sys/fs/cgroup/unified. + /sys/fs/cgroup is legacy, then. + "unified" assumes cgroups version 2 on /sys/fs/cgroup" is not one of the choices. Possible choices are (as string): "legacy", "hybrid", "unified". diff --git a/elogind/246.10/elogind-246.10/build_release/meson-private/meson.lock b/elogind/246.10/elogind-246.10/build_release/meson-private/meson.lock new file mode 100644 index 0000000..e69de29