Compare commits

...

45 Commits

Author SHA1 Message Date
2edcd2fd54 commitpkg: cp -r on move 2022-07-31 18:23:22 +02:00
80887fba39 commitpkg: cp -r to support keys sub dirs 2022-07-26 18:25:52 +02:00
bd07105192 patches (#64)
Reviewed-on: artix/artools#64
2022-07-21 18:35:47 +02:00
02edf46d6a buildtree: set maintainer 2022-06-10 00:41:08 +02:00
860d2272ba buildtree: don't braid push ci 2022-06-09 01:26:01 +02:00
0d9e54c4e3 buildtree: braid push the ci fiiles 2022-06-09 00:09:37 +02:00
26bd425d55 buildtree: add func to set maintainer 2022-06-08 10:04:23 +02:00
c08f82044c commitpkg: only run braid update if push is success 2022-06-06 18:05:10 +02:00
74af21ca25 batchpkg: drop -u arg on move 2022-06-06 12:44:21 +02:00
e3b8439b04 commitpkg: fix update msg 2022-06-06 01:35:24 +02:00
e00096d503 braid (#63)
* use braid instead of git-subrepo

Reviewed-on: artix/artools#63
2022-06-06 01:28:53 +02:00
f7ebc6bd11 mkdepgraph: include mode to graph artix-rebuild-order output 2022-05-28 09:30:37 +02:00
b5fa7084b2 mkdepgraph: remove printf vars 2022-05-27 19:58:03 +02:00
7eabdb0e46 add mkdepgraph 2022-05-27 19:54:00 +02:00
10c013bf33 data: update makepkg.conf 2022-05-27 19:54:00 +02:00
74618d77a5 comparepkg: don't check for result when moving 2022-05-12 13:06:56 +02:00
196761740b repo: rename var 2022-05-09 15:24:05 +02:00
a814655956 repo: simplify find_repo() return 2022-05-08 23:37:02 +02:00
7b03050ab9 comparepkg: rename var 2022-05-08 20:59:38 +02:00
0b1ff8d060 comparepkg: fix var 2022-05-08 19:12:09 +02:00
f66761aa57 comparepkg: use get_group() 2022-05-08 19:10:30 +02:00
f33d9bdac1 artix-chroot: remove obsolete help 2022-05-03 22:54:52 +02:00
f50c66cdd7 artix-chroot: remove -a arg 2022-05-03 22:45:58 +02:00
fd1bc87ef0 makefile: remove compat symlink, remove deploypkg symlinks 2022-05-03 22:45:27 +02:00
9da1ae8e31 jenkins: fix printf arg 2022-05-03 17:20:10 +02:00
52ecf8d463 update default trees used 2022-05-01 12:01:23 +02:00
38fa79e10b update conf 2022-04-28 13:18:53 +02:00
a53fb9e839 artools/0.27 (#62)
* refactoring
* drop echo

Reviewed-on: artix/artools#62
2022-04-25 17:35:02 +02:00
1d85f8000c buildiso: write defaultBundle map for s6 cal 2022-04-12 16:54:05 +02:00
21c44dba79 checkrepo: update pkg filter 2022-04-11 16:10:57 +02:00
f4e3abae46 buildiso: clean up s6 sv handling 2022-04-11 02:06:20 +02:00
a7cef500ad s6 (#61)
Reviewed-on: artix/artools#61
Co-authored-by: artoo <artoo@artixlinux.org>
Co-committed-by: artoo <artoo@artixlinux.org>
2022-04-10 20:44:11 +02:00
f7c29d1c98 makepkg.conf: drop -fvar-tracking-assignments flag 2022-02-14 17:42:36 +01:00
f1b2af947b s6: remove s6-rc-bundle-update usage
This is deprecated, so we should remove it from the buildiso script.
Instead, files are touched in the defaults/contents.d directory and the
database is reloaded.
2022-02-08 14:58:31 +01:00
5637ba0f8f pkg1yaml: yaml sequence debug pkgs 2022-02-01 20:02:29 +01:00
a383531e5d pkg2yaml: don't include debug packages for pkgnames 2022-01-30 18:58:31 +01:00
6b4acbdd94 comparepkg: fix upg cmp 2021-12-25 15:23:20 +01:00
b7fd0a4e41 enable lto, upd conf 2021-12-23 19:07:38 +01:00
b734357ea9 checkrepo: refactoring 2021-11-29 22:58:49 +01:00
74d44873e7 checkrepo: add obsolete pkg check 2021-11-29 16:41:49 +01:00
91e038c3f5 don't find arch vcs repos 2021-11-28 13:59:20 +01:00
8548a584f3 restore arch vcs repo detect 2021-11-28 13:57:07 +01:00
38fb213e13 pkg tools: remove old layout support 2021-11-26 19:04:17 +01:00
fade611ae7 checkrepo: fix check_db() and speed it up 2021-11-26 10:55:11 +01:00
8cdb68ce6a fix call to artools-chroot when artools-pkg is not installed 2021-11-08 16:21:23 -03:00
43 changed files with 1491 additions and 772 deletions

View File

@@ -1,4 +1,4 @@
V=0.26
V=0.28
TOOLS = artools
PREFIX ?= /usr
@@ -40,7 +40,12 @@ PKG_BIN = \
bin/pkg/batchpkg \
bin/pkg/signpkg \
bin/pkg/checkrepo \
bin/pkg/gitearepo
bin/pkg/gitearepo \
bin/pkg/tidyarch \
bin/pkg/mkdepgraph \
bin/pkg/diffpkg \
bin/pkg/makerepropkg \
bin/pkg/export-pkgbuild-keys
LN_COMMITPKG = \
extrapkg \
@@ -71,20 +76,6 @@ LN_BUILDPKG = \
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
@@ -155,9 +146,6 @@ install_pkg:
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)

View File

@@ -23,7 +23,7 @@ artools
- pkg:
* namcap
* git-subrepo
* ruby-braid
* rsync
- iso:

View File

@@ -18,134 +18,34 @@ 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 ''
printf 'usage: %s chroot-dir [command]\n' "${0##*/}"
printf ' -h Print this help message\n'
printf '\n'
printf " If 'command' is unspecified, %s will launch /bin/sh.\n" "${0##*/}"
printf '\n'
printf '\n'
exit "$1"
}
opts=':ha'
opts=':h'
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)
chrootdir=$1
shift
select_os "${chrootdir}"
else
chrootdir=$1
shift
run_args=("$@")
[[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}"
[[ -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}"
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[@]}"
SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "$@"

View File

@@ -55,19 +55,19 @@ copymirrorlist=1
pacmode=-Sy
usage() {
echo "usage: ${0##*/} [options] root [packages...]"
echo " -C <config> 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 ''
printf "usage: %s [options] root [packages...]\n" "${0##*/}"
printf " -C <config> Use an alternate config file for pacman\n"
printf " -c Use the package cache on the host, rather than the target\n"
printf " -G Avoid copying the host's pacman keyring to the target\n"
printf " -i Avoid auto-confirmation of package selections\n"
printf " -M Avoid copying the host's mirrorlist to the target\n"
printf ' -U Use pacman -U to install packages\n'
printf " -h Print this help message\n"
printf '\n'
printf ' basestrap installs packages to the specified new root directory.\n'
printf ' If no packages are given, basestrap defaults to the "base" group.\n'
printf '\n'
printf '\n'
exit "$1"
}
@@ -81,8 +81,7 @@ while getopts ${opts} arg; do
G) copykeyring=0 ;;
M) copymirrorlist=0 ;;
U) pacmode=-U ;;
:) echo "invalid argument ${arg}:$OPTARG"; usage 1;;
?) usage 0 ;;
h|?) usage 0 ;;
esac
done
shift $(( OPTIND - 1 ))

View File

@@ -45,18 +45,18 @@ 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 <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -c <dir> Set pacman cache'
echo ' -f <file> Copy file from the host to the chroot'
echo ' -s Do not run setarch'
echo ' -b <list> Bind mountargs'
echo ' List format [mntarg1:src1:dest1 ... mntargN:srcN:destN]'
echo ' -h This message'
printf "Usage: %s [options] working-dir [run arguments]\n" "${0##*/}"
printf "A wrapper around chroot. Provides support for pacman.\n"
printf '\n'
printf ' options:\n'
printf ' -C <file> Location of a pacman config file\n'
printf ' -M <file> Location of a makepkg config file\n'
printf ' -c <dir> Set pacman cache\n'
printf ' -f <file> Copy file from the host to the chroot\n'
printf ' -s Do not run setarch\n'
printf ' -b <list> Bind mountargs\n'
printf ' List format [mntarg1:src1:dest1 ... mntargN:srcN:destN]\n'
printf ' -h This message\n'
exit 1
}
@@ -71,7 +71,6 @@ while getopts ${opts} arg; do
s) nosetarch=1 ;;
b) bindmounts+=("$OPTARG"); mount_args+=(${bindmounts[@]}) ;;
h|?) usage ;;
*) error "invalid argument '$arg'"; usage ;;
esac
done
shift $(( OPTIND - 1 ))
@@ -85,26 +84,24 @@ shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.'
pacconf_cmd=$(command -v pacman-conf || command -v pacconf)
if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir)
mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir)
fi
# shellcheck disable=2016
host_mirrors=($("$pacconf_cmd" --repo world Server 2> /dev/null | sed -r 's#(.*/)world/os/.*#\1$repo/os/$arch#'))
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')
host_mirror=$(printf "%s\n" "$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 < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" \
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
@@ -112,7 +109,7 @@ while read -r line; do
in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line")
fi
done
done < <("$pacconf_cmd" --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list)
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

View File

@@ -23,15 +23,15 @@ files=()
chroot_args=()
usage() {
echo "Usage: ${0##*/} [options] working-dir package-list..."
echo ' options:'
echo ' -U Use pacman -U to install packages'
echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -c <dir> Set pacman cache'
echo ' -f <file> Copy file from the host to the chroot'
echo ' -s Do not run setarch'
echo ' -h This message'
printf "Usage: %s [options] working-dir package-list...\n" "${0##*/}"
printf ' options:\n'
printf ' -U Use pacman -U to install packages\n'
printf ' -C <file> Location of a pacman config file\n'
printf ' -M <file> Location of a makepkg config file\n'
printf ' -c <dir> Set pacman cache\n'
printf ' -f <file> Copy file from the host to the chroot\n'
printf ' -s Do not run setarch\n'
printf ' -h This message\n'
exit 1
}
@@ -46,7 +46,6 @@ while getopts ${opts} arg; do
f) files+=("$OPTARG") ;;
s) nosetarch=1 ;;
h|?) usage ;;
*) error "invalid argument '%s'" "$arg"; usage ;;
esac
if [[ $arg != U ]]; then
chroot_args+=("-$arg")
@@ -64,10 +63,8 @@ shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.'
pacconf_cmd=$(command -v pacman-conf || command -v pacconf)
if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <($pacconf_cmd CacheDir)
mapfile -t cache_dirs < <(pacman-conf CacheDir)
fi
umask 0022
@@ -93,13 +90,13 @@ for f in "${files[@]}"; do
cp "$f" "$working_dir$f"
done
basestrap -${umode}Mc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" \
unshare --mount 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"
printf '%s.UTF-8 UTF-8\n' C en_US de_DE > "$working_dir/etc/locale.gen"
printf 'LANG=C.UTF-8\n' > "$working_dir/etc/locale.conf"
# printf 'KEYMAP=en\n' > "$working_dir/etc/vconsole.conf"
printf "%s\n" "${CHROOTVERSION}" > "$working_dir/.artools"
dbus-uuidgen --ensure="$working_dir"/etc/machine-id

View File

@@ -181,7 +181,7 @@ gen_iso_fn(){
for n in "${vars[@]}"; do
name=${name:-}${name:+-}${n}
done
echo "$name"
printf "%s\n" "$name"
}
prepare_build(){
@@ -325,28 +325,28 @@ chroots_iso="${CHROOTS_DIR}/buildiso"
arch=$(uname -m)
usage() {
echo "Usage: ${cmd} [options]"
echo " -p <profile> Profile [default: ${profile}]"
echo ' -r <dir> Chroots directory'
echo " [default: ${chroots_iso}]"
echo ' -t <dir> Target directory'
echo " [default: ${ISO_POOL}]"
echo ' -i <name> Init system to use'
echo " [default: ${INITSYS}]"
echo ' -g <key> 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 ''
printf 'Usage: %s [options]\n' "${cmd}"
printf ' -p <profile> Profile [default: %s]\n' "${profile}"
printf ' -r <dir> Chroots directory\n'
printf ' [default: %s]\n' "${chroots_iso}"
printf ' -t <dir> Target directory\n'
printf ' [default: %s]\n' "${ISO_POOL}"
printf ' -i <name> Init system to use\n'
printf ' [default: %s]\n' "${INITSYS}"
printf ' -g <key> The gpg key for img signing\n'
printf ' [default: none]\n'
printf ' -m Set SquashFS image mode to persistence\n'
printf ' -c Disable clean work dir\n'
printf ' -x Build chroot only\n'
printf ' -s Squash chroot only\n'
printf ' -b Generate iso boot only\n'
printf ' -z Generate iso only\n'
printf ' Requires pre built images (-x)\n'
printf ' -d Use dracut instead of mkinitcpio for iso initramfs\n'
printf ' -q Query settings and pretend build\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
@@ -368,7 +368,6 @@ while getopts "${opts}" arg; do
d) use_dracut=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done

View File

@@ -28,9 +28,9 @@ batch_move() {
src=${src#*:}
local dest=${entry%%:*}
if ${runlist}; then
"${dest}"pkg -s "${src}" -u -p "${pkg}"
"${dest}"pkg -s "${src}" -p "${pkg}"
else
msg "%s" "${dest}pkg -s ${src} -u -p ${pkg}"
msg "%s" "${dest}pkg -s ${src} -p ${pkg}"
fi
done < "$pkglist"
}
@@ -65,10 +65,10 @@ batch_update() {
local dest=${entry%:*}
if ${runlist}; then
buildtree -i -p "${pkg}"
"${dest}"pkg -u -p "${pkg}"
"${dest}"pkg -p "${pkg}"
else
msg "buildtree -i -p ${pkg}"
msg2 "${dest}pkg -u -p ${pkg}"
msg2 "${dest}pkg -p ${pkg}"
fi
done < "$pkglist"
}
@@ -76,13 +76,13 @@ batch_update() {
#}}}
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 ''
printf 'Usage: %s [optional listname]\n' "${0##*/}"
printf ' -r Run generated commands\n'
printf ' -c Create pkgrepos from list\n'
printf ' -u Update pkgrepos from list\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
@@ -98,7 +98,6 @@ while getopts "${opts}" arg; do
c) create=true ;;
u) update=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done

View File

@@ -29,17 +29,17 @@ chroots_pkg="${CHROOTS_DIR}/buildpkg"
arch=$(uname -m)
usage() {
echo "Usage: ${0##*/} [options] -- [mkchrootpkg_args]"
echo " -r <dir> Create chroots in this directory"
echo " -d <dir> 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 ''
printf 'Usage: %s [options] -- [mkchrootpkg_args]\n' "${0##*/}"
printf ' -r <dir> Create chroots in this directory\n'
printf ' -d <dir> Destination repo chroot\n'
printf ' -c Recreate the chroot before building\n'
printf ' -m Major rebuild\n'
printf ' -N Disable check() function\n'
printf ' -C Run checkpkg after built\n'
printf ' -h This help\n'
printf '\n'
printf 'Default mkchrootpkg_args args: %s\n' "${mkchrootpkg_args[*]}"
printf '\n'
exit "$1"
}
@@ -54,7 +54,6 @@ while getopts "${opts}" arg; do
C) mkchrootpkg_args+=(-C) ;;
N) mkchrootpkg_args+=(-N) ;;
h|?) usage 0 ;;
*) echo "invalid argument '%s'" "${arg}"; usage 1 ;;
esac
done

View File

@@ -23,88 +23,85 @@ 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(){
pkgrepo_new(){
cd "${TREE_DIR_ARTIX}/${group}" || return
local org gitname
org=$(get_pkg_org "${package}")
gitname=$(get_compliant_name "${package}")
gitearepo -cr "$gitname"
if [[ ! -d "${package}" ]]; then
gitearepo -cr "$gitname"
add_team_to_repo "$gitname" "$org" "${team}"
add_team_to_repo "$gitname" "$org" "${team}"
subrepo_clone "${package}" "$org" "$gitname"
msg2 "Adding [%s] from (%s)" "${package}" "$org/$gitname"
braid add "${GIT_SSH}":"$org/$gitname".git "${package}"
mkdir -p "${TREE_DIR_ARTIX}/${group}/${package}/trunk"
prepare_dir "${TREE_DIR_ARTIX}/${group}/${package}/trunk"
commit_jenkins_files "${package}"
commit_ci "${package}"
# if braid push "${package}"; then
# braid update "${package}"
# fi
else
die "Package %s already exists!" "${package}"
fi
}
#}}}
#{{{ pull
clone_tree(){
local url="$1" tree="$2" os="${3:-Artix}"
msg "Cloning %s (%s) ..." "$tree" "$os"
git clone "$url/$tree".git
config_tree() {
local dist="$1" vars="${2:-false}"
case "$dist" in
Artix)
if "$vars"; then
dist_tree=("${ARTIX_TREE[@]}")
dist_url="${GIT_SSH}:pkgbuild"
dist_dir=${TREE_DIR_ARTIX}
else
git config --bool pull.rebase true
git config commit.gpgsign true
if [[ -n "${GPGKEY}" ]];then
git config user.signingkey "${GPGKEY}"
else
warning "No GPGKEY configured in makepkg.conf!"
fi
fi
;;
Arch)
if "$vars"; then
dist_tree=("${ARCH_TREE[@]}")
dist_url="${HOST_TREE_ARCH}"
dist_dir=${TREE_DIR_ARCH}
else
git config --bool pull.rebase false
git config branch.master.mergeoptions --no-edit
fi
;;
esac
}
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"
update_tree() {
local dist="${1:-Artix}"
config_tree "$dist" true
cd "$dist_dir" || return
for tree in "${dist_tree[@]}"; do
if [[ -d "$tree" ]]; then
( cd "$tree" || return
config_tree "$dist"
msg "Checking (%s) (%s)" "$tree" "$dist"
pull_tree "$tree" "$(get_local_head)"
)
else
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)"
msg "Cloning (%s) (%s) ..." "$tree" "$dist"
git clone "$dist_url/$tree".git
( cd "$tree" || return
config_tree "$dist"
)
else
clone_tree "${host_tree_artix}" "${tree}"
config_tree "${tree}"
fi
done
}
@@ -113,11 +110,20 @@ pull_tree_artix(){
#{{{ patch
set_maintainer() {
local name email path="$1"
name=$(git config --get user.name)
email=$(git config --get user.email)
sed -e "1s|Maintainer:.*|Maintainer: $name <$email>|" \
-i "$path"/PKGBUILD
}
patch_pkg(){
local pkgpath="$1"
local pkg=${pkgpath%/*}
pkg=${pkg##*/}
sed -e 's|arch-meson|artix-meson|' -i "$pkgpath"/PKGBUILD
set_maintainer "$pkgpath"
case $pkg in
glibc)
msg2 "Patching %s" "$pkg"
@@ -199,14 +205,14 @@ from_arch(){
[[ -z $srcpath ]] && die "Package '%s' does not exist!" "${package}"
repo=$(find_repo "$srcpath")
msg "repo: %s" "${repo#*/}"
msg "repo: %s" "$repo"
archpath=$srcpath/$repo
archpath=$srcpath/repos/$repo
artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}")
show_deps "$archpath"
if [[ -f "$artixpath"/.gitrepo ]]; then
if [[ -f "$artixpath"/Jenkinsfile ]]; then
artixpath="$artixpath"/trunk
if [[ -d "$artixpath" ]];then
@@ -225,7 +231,7 @@ view_build(){
archpath=$(find_pkg "${TREE_DIR_ARCH}" "${package}")
[[ -z $archpath ]] && die "Package '%s' does not exist!" "${package}"
repo=$(find_repo "${archpath}")
archpath=$archpath/$repo
archpath=$archpath/repos/$repo
msg "repo: %s" "${repo#*/}"
show_deps "$archpath"
}
@@ -243,8 +249,8 @@ check_tree(){
}
sync_repos(){
${sync_arch} && pull_tree_arch
${sync_artix} && pull_tree_artix
${sync_arch} && update_tree "Arch"
${sync_artix} && update_tree
}
load_makepkg_config
@@ -261,7 +267,6 @@ sync_artix=true
import=false
view=false
createnew=false
sync_group=false
check=false
package=''
@@ -269,29 +274,27 @@ package=''
team='community'
group="${ARTIX_TREE[0]}"
host_tree_artix="${GIT_SSH}:artixlinux"
usage() {
echo "Usage: ${0##*/} [options]"
echo ' -p <pkg> Package name'
echo ' -t <team> Team name (only with -n)'
echo ' Possible values: core,extra,community,multilib'
echo " [default: ${team}]"
echo ' -g <group> 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 ''
printf "Usage: %s [options]\n" "${0##*/}"
printf ' -p <pkg> Package name\n'
printf ' -t <team> Team name (only with -n)\n'
printf ' Possible values: core,extra,community,multilib\n'
printf " [default: %s]\n" "${team}"
printf ' -g <group> Group name, the superrepo (only with -n)\n'
printf " [default: %s]\n" "${group}"
printf " -s Clone or pull repos\n"
printf " -a Don't clone or pull arch repos\n"
printf " -b Don't clone or pull artix repos\n"
printf ' -i Import a package from arch repos\n'
printf ' -n New remote pkgrepo and add it\n'
printf ' -v Check if a package is in the artix tree(s)\n'
printf ' -c View package depends\n'
printf ' -x Exclude testing (only with -i)\n'
printf ' -y Exclude staging (only with -i)\n'
printf ' -z Include kde & gnome unstable (only with -i)\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
@@ -301,7 +304,7 @@ while getopts "${opts}" arg; do
case "${arg}" in
p) package="$OPTARG" ;;
t) team="$OPTARG" ;;
g) group="$OPTARG"; sync_group=true ;;
g) group="$OPTARG" ;;
s) sync=true ;;
a) sync_arch=false ;;
b) sync_artix=false ;;
@@ -313,7 +316,6 @@ while getopts "${opts}" arg; do
y) staging=false ;;
z) unstable=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
@@ -329,4 +331,4 @@ ${check} && check_tree
${import} && from_arch
${createnew} && subrepo_new
${createnew} && pkgrepo_new

View File

@@ -13,77 +13,12 @@
# GNU General Public License for more details.
m4_include(lib/base/message.sh)
m4_include(lib/pkg/diff.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]
@@ -197,7 +132,7 @@ for _pkgname in "${pkgname[@]}"; do
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"
printf "%s\n" "$diff_output"
else
msg "No soname differences for %s." "$_pkgname"
fi

View File

@@ -18,19 +18,42 @@ 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_ext}/${CARCH}/${repo}/
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
msg_row "${tableQ}" "$repo" "$pkg" "${match}"
done < <(grep -rZ "$library" "$db") | sort -u
fi
done
}
@@ -41,7 +64,7 @@ query_db() {
is_db_entry() {
local pkgname="$1" repo="${REPOS[$2]}" entry
entry=${db_cache_dir}/${linksdb_ext}/${CARCH}/$repo/$pkgname
entry=${db_cache_dir}/linksdb/$repo/$pkgname
if [[ -d "$entry" ]];then
return 0
@@ -50,26 +73,74 @@ is_db_entry() {
}
check_db(){
local pkgpath="${1%/*}"
local pkgpath="${1}"
for repo in "${!REPOS[@]}"; do
local pkgbuild artixver
[[ -f $pkgpath/$CARCH/$repo/PKGBUILD ]] && pkgbuild=$pkgpath/$CARCH/$repo/PKGBUILD
[[ -f $pkgpath/repos/$repo-$CARCH/PKGBUILD ]] && pkgbuild=$pkgpath/repos/$repo-$CARCH/PKGBUILD
[[ -f $pkgpath/repos/$repo-any/PKGBUILD ]] && pkgbuild=$pkgpath/repos/$repo-any/PKGBUILD
if [[ -f $pkgpath/$repo/PKGBUILD ]]; then
pkgbuild=$pkgpath/$repo/PKGBUILD
# shellcheck disable=1090
. "$pkgbuild" 2>/dev/null
artixver=$(get_full_version)
# 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
}
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"
#}}}
# {{{ check obsolete
show_obsolete_table() {
local arch_mirror='https://mirror.f4st.host/archlinux'
local arch_repo artix_repo artix_db arch_db url
arch_repo="${searchrepos[@]}"
artix_repo="${REPOS[$arch_repo]}"
artix_db="${db_cache_dir}/artixdb/${artix_repo}"
arch_db="${db_cache_dir}/archdb/${arch_repo}"
msg "Updating database cache ..."
url=${REPOS_MIRROR}/${artix_repo}/os/$CARCH/${artix_repo}.${db_ext}
extract_db "$url" "${artix_db}"
url=${arch_mirror}/${arch_repo}/os/$CARCH/${arch_repo}.${db_ext}
extract_db "$url" "${arch_db}"
msg "Done"
msg_table_header "${tableQ}" "Repo" "Package" "Obsolete"
for p in "${artix_db}"/*; do
local pkg rel
pkg=${p##*/}
rel=${pkg##*-}
rel=${rel%.*}
pkg=${pkg%-*}
local p="$pkg-$rel"
if [[ "$p" != *openrc* ]] && [[ "$p" != *runit* ]] \
&& [[ "$p" != *s6* ]] && [[ "$p" != *suite66* ]] \
&& [[ "$p" != *udev* ]] && [[ "$p" != *elogind* ]] \
&& [[ "$p" != *sysusers* ]] && [[ "$p" != *tmpfiles* ]] \
&& [[ "$p" != *execline* ]] && [[ "$p" != *skalibs* ]] \
&& [[ "$p" != *netifrc* ]] && [[ "$p" != *bootlogd* ]] \
&& [[ "$p" != *pam_rundir* ]] && [[ "$p" != *artools* ]] \
&& [[ "$p" != *archlinux* ]] && [[ "$p" != *iso-profiles* ]] \
&& [[ "$p" != *calamares* ]] && [[ "$p" != *iso-initcpio* ]] \
&& [[ "$p" != *dinit* ]] && [[ "$p" != *artix* ]] && [[ "$p" != *blocaled* ]]; then
if [[ ! -d "${arch_db}/$p" ]]; then
msg_row "${tableQ}" "${artix_repo}" "$p" "true"
fi
done
unset artixver pkgbuild pkgver epoch pkgname pkgbase
fi
done
}
@@ -85,23 +156,10 @@ show_db_table(){
tree_loop check_db
}
update_db_cache(){
msg "Updating database cache ..."
local cachedir url
for repo in "${searchrepos[@]}"; do
cachedir=${db_cache_dir}/${linksdb_ext}/${CARCH}/${repo}
rm -rf "$cachedir"
mkdir -p "$cachedir"
msg2 "%s" "$repo"
url=${REPOS_MIRROR}/${repo}/os/${CARCH}/${repo}.${linksdb_ext}
curl -L -s "$url" | bsdtar -xf - -C "$cachedir"
done
msg "Done"
}
db_cache_dir="${XDG_CACHE_HOME:-$USER_HOME/.cache}/artools"
linksdb_ext="links.tar.${DBEXT}"
db_ext="db.tar.${DBEXT}"
load_makepkg_config
@@ -109,9 +167,10 @@ sync=false
check=false
query=false
all_db=false
obsolete=false
readonly tableU="%-20s %-35s %-30s %-10s"
readonly tableQ="%-20s %-45s %s"
readonly tableQ="%-20s %-55s %s"
load_valid_names
@@ -150,20 +209,21 @@ searchrepos=(
#}}}
usage() {
echo "Usage: ${0##*/} [options] (with -q [libname])"
echo ' -r <repo> Repo name to query'
echo ' [default: all]'
echo " -s Sync repo databases"
echo ' -c Check repos'
echo ' -a Show repo db (-c)'
echo " -q Query repo databases for so libs"
echo ' -h This help'
echo ''
echo ''
printf "Usage: %s [options] (with -q [libname])\n" "${0##*/}"
printf ' -r <repo> Repo name to query\n'
printf ' [default: all]\n'
printf " -s Sync repo databases\n"
printf ' -c Check repos\n'
printf ' -a Show repo db (-c)\n'
printf ' -o Check for obsolete packages\n'
printf " -q Query repo databases for so libs\n"
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
opts='r:qcsah'
opts='r:qcsaoh'
while getopts "${opts}" arg; do
case "${arg}" in
@@ -172,8 +232,8 @@ while getopts "${opts}" arg; do
c) check=true ;;
a) all_db=true ;;
q) query=true ;;
o) obsolete=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
@@ -186,3 +246,5 @@ ${sync} && update_db_cache
${check} && show_db_table
${query} && show_lib_table
${obsolete} && show_obsolete_table

View File

@@ -22,57 +22,6 @@ 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"
}
prepare_commit(){
# create new layout, copy & remove repos
if [[ -d repos ]]; then
msg2 "Switching to new layout ..."
[[ ! -d "$CARCH" ]] && mkdir "$CARCH"
for r in repos/*; do
local name noarch
name=${r#*/}
noarch=${name%-*}
mkdir "$CARCH/${noarch}"
cp repos/"${name}"/* "$CARCH/${noarch}/"
git add "$CARCH/${noarch}"
done
git rm -r repos
git commit -m "switch to new repo layout"
msg2 "Done switch"
fi
if [[ $action == 'add' ]] || [[ $action == 'move' ]] ;then
[[ -d "$CARCH/${repo_dest}" ]] && git rm -r "$CARCH/${repo_dest}"
[[ ! -d "$CARCH" ]] && mkdir "$CARCH"
[[ ! -d "$CARCH/${repo_dest}" ]] && mkdir "$CARCH/${repo_dest}"
fi
}
check_rebuild(){
if [[ -d "$CARCH"/"${valid_names[10]}" ]] \
&& [[ "${repo_dest}" == "${valid_names[7]}" ]]; then
@@ -104,21 +53,16 @@ check_team(){
path_config() {
[[ "${repo_src}" != 'trunk' ]] && pkgbuild="$CARCH/${repo_src}"/PKGBUILD
if [[ ! -f "$pkgbuild" ]]; then
pkgbuild=repos/"${repo_src}-${CARCH}"/PKGBUILD
[[ -f repos/"${repo_src}"-any/PKGBUILD ]] && pkgbuild=repos/"${repo_src}"-any/PKGBUILD
fi
# shellcheck disable=1090
. "$pkgbuild"
}
get_repo_commit_msg() {
echo "[${repo_src}] -> [${repo_dest}] '${package}-$(get_full_version)' ${action}"
printf "[%s] -> [%s] '%s' %s\n" "${repo_src}" "${repo_dest}" "${package}-$(get_full_version)" "${action}"
}
get_commit_msg() {
echo "[${repo_src}] '${package}-$(get_full_version)' ${action}"
printf "[%s] '%s' %s\n" "${repo_src}" "${package}-$(get_full_version)" "${action}"
}
commit_pkg() {
@@ -130,7 +74,6 @@ commit_pkg() {
if [[ "${repo_src}" == 'trunk' ]];then
git rm -r trunk
else
prepare_commit
git rm -r "$CARCH/${repo_src}"
fi
else
@@ -144,20 +87,23 @@ commit_pkg() {
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"
prepare_commit
check_rebuild
cp trunk/* "$CARCH/${repo_dest}"/
cp -r 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"
prepare_commit
cp "$CARCH/${repo_src}"/* "$CARCH/${repo_dest}"/
cp -r "$CARCH/${repo_src}"/* "$CARCH/${repo_dest}"/
git rm -r "$CARCH/${repo_src}"
fi
git add .
@@ -165,11 +111,11 @@ repo_commit_pkg() {
}
run(){
local artixpath head group
local artixpath head tree
artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}")
if [[ -n ${artixpath} ]];then
group=${artixpath%/*}
cd "${group}" || return
tree=${artixpath%/*}
cd "$tree" || return
head=$(get_local_head)
cd "${artixpath}" || return
@@ -182,18 +128,20 @@ run(){
repo_commit_pkg
fi
cd "${group}" || return
cd "$tree" || return
${push} && pull_tree "${group##*/}" "$head"
# subrepo_pull "${package}"
subrepo_push "${package}"
subrepo_clean "${package}"
msg "Checking (%s) (Artix)" "${tree##*/}"
pull_tree "${tree##*/}" "$head"
${push} && push_tree "${group##*/}"
git prune
[[ "${cmd}" != 'commitpkg' ]] && check_team
if braid push "${package}"; then
braid update "${package}"
msg "Update (%s)" "${tree##*/}"
git push origin master
git prune
[[ "${cmd}" != 'commitpkg' ]] && check_team
else
warning "'braid push %s' failed.\n" "${package}"
fi
else
die "Package '%s' does not exist!" "${package}"
fi
@@ -219,7 +167,6 @@ load_valid_names
repo_src='trunk'
package=''
remove=false
push=false
pkgbuild=trunk/PKGBUILD
@@ -227,27 +174,24 @@ cmd=${0##*/}
repo_dest=${cmd%pkg}
usage() {
echo "Usage: ${0##*/} [options]"
echo " -s <name> Source repository [default:${repo_src}]"
echo ' -p <pkg> Package name'
echo ' -r Delete from repo (commitpkg only)'
echo ' -u Push'
echo ' -h This help'
echo ''
echo ''
printf "Usage: %s [options]\n" "${0##*/}"
printf " -s <name> Source repository [default: %s]\n" "${repo_src}"
printf ' -p <pkg> Package name\n'
printf ' -r Delete from repo (commitpkg only)\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
opts='p:s:urh'
opts='p:s:rh'
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

View File

@@ -31,36 +31,48 @@ write_list(){
printf "%s\n" "$line" >> "${TREE_DIR_ARTIX}"/"$name".list
}
get_group() {
local group
group="${artixpath%/*}"
group=${group##*/}
printf "%s\n" "${group#*-}"
}
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
# if [ "$result" -eq 0 ];then
case "$artixrepo" in
*testing*|*staging*|*rebuild)
if [[ "${archrepo}" == "${artixrepo}" ]]; then
msg_row "${table}" "${archrepo}" "${artixrepo}" "$pkg" "$archver" "$artixver" "$(get_group)"
elif [[ "${archrepo}" == 'staging' && "${artixrepo}" == 'rebuild' ]]; then
msg_row_yellow "${table}" "${archrepo}" "${artixrepo}" "$pkg" "$archver" "$artixver" "$(get_group)"
else
write_list "@repo@:${b}:$pkg" artix
msg_row_green "${table}" "${archrepo}" "${artixrepo}" "$pkg" "$archver" "$artixver" "$(get_group)"
if [[ -n "${archrepo}" ]]; then
write_list "${archrepo}:${artixrepo}:$pkg" pkg_moves
else
write_list "@repo@:${artixrepo}:$pkg" artix
fi
fi
fi
;;
esac
;;
esac
# fi
}
compare_u(){
if [ "$result" -eq -1 ];then
msg_row_red "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
write_list "${a}:$pkg" pkg_upgrades
# local arel=${archver##*-} brel=${artixver##*-}
# local reldiff
# reldiff=$(( $arel-${brel%.*} ))
msg_row_red "${table}" "${archrepo}" "${artixrepo}" "$pkg" "$archver" "$artixver" "$(get_group)"
write_list "${archrepo}:$pkg" pkg_upgrades
fi
}
compare_d(){
if [ "$result" -eq 1 ];then
if [[ -n "$archver" ]] && [[ -n "$archrepo" ]];then
msg_row_yellow "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
if [[ -n "$archver" ]] && [[ -n "${archrepo}" ]];then
msg_row_yellow "${table}" "${archrepo}" "${artixrepo}" "$pkg" "$archver" "$artixver" "$(get_group)"
fi
fi
}
@@ -71,31 +83,26 @@ get_archpath(){
for tree in "${ARCH_TREE[@]}"; do
[[ -d ${TREE_DIR_ARCH}/$tree/$pkg/repos ]] && archpath=${TREE_DIR_ARCH}/$tree/$pkg
done
echo "$archpath"
printf "%s\n" "$archpath"
}
pre_compare(){
local func="$1" pkgpath="$2" result group pkg
group="${pkgpath%/*}"
group=${group##*/}
pkg=${pkgpath##*/}
local artixpath="$1" func="$2" pkg
pkg=${artixpath##*/}
local artixrepo archrepo pkgbuild artixver archver archpath node a b
artixrepo=$(find_repo "$pkgpath")
pkgbuild=$pkgpath/$artixrepo/PKGBUILD
local artixrepo archrepo pkgbuild artixver archver archpath epoch
if [[ -f $pkgbuild ]]; then
artixrepo=$(find_repo "$artixpath")
pkgbuild=$artixpath/$CARCH/$artixrepo/PKGBUILD
if [[ -f "$pkgbuild" ]]; then
# shellcheck disable=1090
. "$pkgbuild" 2>/dev/null
artixver=$(get_full_version)
archpath=$(get_archpath "$pkg")
archrepo=$(find_repo "${archpath}")
pkgbuild=$archpath/$archrepo/PKGBUILD
node=${artixrepo%/*}
a=${archrepo#*/} b=${artixrepo#*/}
a="${a%-*}"
[[ "$node" != "$CARCH" ]] && b=${b%-*}
archrepo=$(find_repo "$archpath")
pkgbuild=$archpath/repos/$archrepo/PKGBUILD
archrepo="${archrepo%-*}"
if [[ -f "$pkgbuild" ]]; then
# shellcheck disable=1090
@@ -103,27 +110,26 @@ pre_compare(){
archver=$(get_full_version)
fi
local result
result=$(vercmp "$artixver" "$archver")
"$func"
unset epoch
fi
}
compare_upgrades(){
local pkgpath="${1%/*}"
pre_compare compare_u "$pkgpath"
local artixpath="${1%/*}"
pre_compare "$artixpath" compare_u
}
compare_downgrades(){
local pkgpath="${1%/*}"
pre_compare compare_d "$pkgpath"
local artixpath="${1%/*}"
pre_compare "$artixpath" compare_d
}
compare_move(){
local pkgpath="${1%/*}"
pre_compare compare_m "$pkgpath"
local artixpath="${1%/*}"
pre_compare "$artixpath" compare_m
}
#}}}
@@ -162,19 +168,19 @@ upgrades=false
downgrades=false
move=false
readonly table="%-18s %-18s %-25s %-27s %-27s %-10s"
readonly table="%-18s %-18s %-29s %-27s %-27s %-7s"
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 ''
printf 'Usage: %s [options]\n' "${0##*/}"
printf ' -u Show upgrade packages\n'
printf ' -d Show downgrade packages\n'
printf ' -m Show packages to move\n'
printf ' -x Do not inlcude testing packages\n'
printf ' -y Do not inlcude staging packages\n'
printf ' -z Include unstable kde and gnome\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
@@ -189,7 +195,6 @@ while getopts "${opts}" arg; do
y) staging=false ;;
z) unstable=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done

View File

@@ -61,14 +61,14 @@ cmd=${0##*/}
dest_repo=${cmd#*-}
usage() {
echo "Usage: ${cmd} [options]"
echo ' -d <dest> 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 ''
printf "Usage: %s [options]\n" "${cmd}"
printf ' -d <dest> Destination repository\n'
printf ' -a Add package(s) to repository\n'
printf ' -r Remove package(s) from repository\n'
printf ' -l Use links db\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
@@ -81,7 +81,6 @@ while getopts "${opts}" arg; do
r) rm_pkg=true; add_pkg=false ;;
l) linksdb=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done

229
bin/pkg/diffpkg.in Normal file
View File

@@ -0,0 +1,229 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
shopt -s extglob
m4_include(lib/base/message.sh)
m4_include(lib/pkg/diff.sh)
usage() {
cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] [MODES] [FILE|PKGNAME...]
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 package archives using different modes while using
simple tar content list by default.
When given one package, use it to diff against the locally built one.
When given two packages, diff both packages against each other.
In either case, a package name will be converted to a filename from the
cache, and diffpkg will proceed as though this filename was initially
specified.
OPTIONS
-M, --makepkg-config Set an alternate makepkg configuration file
-v, --verbose Provide more detailed/unfiltered output
-h, --help Show this help text
MODES
-l, --list Activate content list diff mode (default)
-d, --diffoscope Activate diffoscope diff mode
-p, --pkginfo Activate .PKGINFO diff mode
-b, --buildinfo Activate .BUILDINFO diff mode
_EOF_
}
MAKEPKG_CONF=/etc/makepkg.conf
VERBOSE=0
TARLIST=0
DIFFOSCOPE=0
PKGINFO=0
BUILDINFO=0
# option checking
while (( $# )); do
case $1 in
-h|--help)
usage
exit 0
;;
-M|--makepkg-config)
MAKEPKG_CONF="$2"
shift 2
;;
-l|--list)
TARLIST=1
shift
;;
-d|--diffoscope)
DIFFOSCOPE=1
shift
;;
-p|--pkginfo)
PKGINFO=1
shift
;;
-b|--buildinfo)
BUILDINFO=1
shift
;;
-v|--verbose)
VERBOSE=1
shift
;;
--)
shift
break
;;
-*,--*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
if ! (( DIFFOSCOPE || TARLIST || PKGINFO || BUILDINFO )); then
TARLIST=1
fi
# Source makepkg.conf; fail if it is not found
if [[ -r "${MAKEPKG_CONF}" ]]; then
# shellcheck source=makepkg-x86_64.conf
source "${MAKEPKG_CONF}"
else
die "${MAKEPKG_CONF} not found!"
fi
# Source user-specific makepkg.conf overrides
if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
elif [[ -r "$HOME/.makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "$HOME/.makepkg.conf"
fi
STARTDIR=$(pwd)
trap 'rm -rf $TMPDIR' EXIT INT TERM QUIT
TMPDIR=$(mktemp -d --tmpdir diffpkg-script.XXXXXXXX)
export TMPDIR
tar_list() {
bsdtar tf "$*" | if (( VERBOSE )); then
cat
else
sed -E 's|^usr/lib/modules/[0-9][^/]+|usr/lib/modules/[…]|g'
fi | sort
}
diff_pkgs() {
local oldpkg newpkg
oldpkg=$(readlink -m "$1")
newpkg=$(readlink -m "$2")
[[ -f $oldpkg ]] || die "No such file: %s" "${oldpkg}"
[[ -f $newpkg ]] || die "No such file: %s" "${newpkg}"
if (( TARLIST )); then
tar_list "$oldpkg" > "$TMPDIR/filelist-old"
tar_list "$newpkg" > "$TMPDIR/filelist"
sdiff -s "$TMPDIR/filelist-old" "$TMPDIR/filelist"
fi
if (( PKGINFO )); then
bsdtar xOqf "$oldpkg" .PKGINFO > "$TMPDIR/pkginfo-old"
bsdtar xOqf "$newpkg" .PKGINFO > "$TMPDIR/pkginfo"
sdiff -s "$TMPDIR/pkginfo-old" "$TMPDIR/pkginfo"
fi
if (( BUILDINFO )); then
bsdtar xOqf "$oldpkg" .BUILDINFO > "$TMPDIR/buildinfo-old"
bsdtar xOqf "$newpkg" .BUILDINFO > "$TMPDIR/buildinfo"
sdiff -s "$TMPDIR/buildinfo-old" "$TMPDIR/buildinfo"
fi
if (( DIFFOSCOPE )); then
diffoscope "$oldpkg" "$newpkg"
fi
}
fetch_pkg() {
local pkg pkgdest pkgurl
case $1 in
*://*)
pkgurl=$1 ;;
/*|*/*)
pkgurl=$(readlink -m "$1") ;;
*.pkg.tar*)
pkgurl=$1 ;;
'')
;;
*)
pkg=$1 ;;
esac
[[ -n $pkgurl ]] || pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$pkg") ||
die "Couldn't download previous package for %s." "$pkg"
pkg=${pkgurl##*/}
pkgdest=$(mktemp -t -d "${pkg}-XXXXXX")/${pkg}
if [[ $pkgurl = file://* || ( $pkgurl = /* && -f $pkgurl ) ]]; then
ln -sf "${pkgurl#file://}" "$pkgdest"
elif [[ -f "$PKGDEST/$pkg" ]]; then
ln -sf "$PKGDEST/$pkg" "$pkgdest"
elif [[ -f "$STARTDIR/$pkg" ]]; then
ln -sf "$STARTDIR/$pkg" "$pkgdest"
elif [[ $pkgurl = *://* ]]; then
curl -fsLC - --retry 3 --retry-delay 3 -o "$pkgdest" "$pkgurl" || \
die "Couldn't download %s" "$pkgurl"
else
die "File not found: %s" "$pkgurl"
fi
echo "$pkgdest"
}
if (( $# < 2 )); then
if [[ ! -f PKGBUILD ]]; then
die "This must be run in the directory of a built package.\nTry '$(basename "$0") --help' for more information."
fi
# shellcheck source=PKGBUILD.proto
. ./PKGBUILD
if [[ ${arch[0]} == 'any' ]]; then
CARCH='any'
fi
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" "$TMPDIR"
if (( $# )); then
comparepkg="$1"
fi
oldpkg=$(fetch_pkg "$comparepkg") || exit 1
diff_pkgs "$oldpkg" "$pkgfile"
done
else
file1=$(fetch_pkg "$1") || exit 1
file2=$(fetch_pkg "$2") || exit 1
diff_pkgs "$file1" "$file2"
fi

View File

@@ -0,0 +1,70 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
m4_include(lib/base/message.sh)
usage() {
cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/}
Export the PGP keys from a PKGBUILDs validpgpkeys array into the keys/pgp/
subdirectory. Useful for distributing packager validated source signing
keys alongside PKGBUILDs.
OPTIONS
-h, --help Show this help text
_EOF_
}
# option checking
while (( $# )); do
case $1 in
-h|--help) usage; exit 0 ;;
*) die "invalid argument: %s" "$1" ;;
esac
done
if [[ ! -f PKGBUILD ]]; then
die "This must be run a directory containing a PKGBUILD."
fi
mapfile -t validpgpkeys < <(
# shellcheck source=PKGBUILD.proto
. ./PKGBUILD
if (( ${#validpgpkeys[@]} )); then
printf "%s\n" "${validpgpkeys[@]}"
fi
)
msg "Exporting ${#validpgpkeys[@]} PGP keys..."
if (( ${#validpgpkeys[@]} == 0 )); then
exit 0
fi
trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT
TEMPDIR=$(mktemp -d --tmpdir export-pkgbuild-keys.XXXXXXXXXX)
mkdir -p keys/pgp
error=0
for key in "${validpgpkeys[@]}"; do
gpg --output "$TEMPDIR/$key.asc" --armor --export --export-options export-minimal "$key" 2>/dev/null
# gpg does not give a non-zero return value if it fails to export...
if [[ -f $TEMPDIR/$key.asc ]]; then
msg2 "Exported $key"
mv "$TEMPDIR/$key.asc" "keys/pgp/$key.asc"
else
if [[ -f keys/pgp/$key.asc ]]; then
warning "Failed to update key: $key"
else
error "Key unavailable: $key"
error=1
fi
fi
done
if (( error )); then
die "Failed to export all \'validpgpkeys\' entries."
fi

View File

@@ -32,9 +32,9 @@ case $script_mode in
esac
if [[ -z $1 ]]; then
echo "${0##*/} [options] <package file|extracted package dir>"
echo "Options:"
echo " --ignore-internal ignore internal libraries"
printf "%s [options] <package file|extracted package dir>\n" "${0##*/}"
printf "Options:\n"
printf " --ignore-internal ignore internal libraries\n"
exit 1
fi
@@ -61,7 +61,7 @@ process_sofile() {
fi
if ! in_array "${soname}=${soversion}-${soarch}" "${soobjects[@]}"; then
# libfoo.so=1-64
echo "${soname}=${soversion}-${soarch}"
printf "%s\n" "${soname}=${soversion}-${soarch}"
soobjects+=("${soname}=${soversion}-${soarch}")
fi
}

View File

@@ -17,11 +17,11 @@ m4_include(lib/base/message.sh)
match=$1
if [[ -z $match ]]; then
echo 'Usage: finddeps <depname>'
echo ''
echo 'Find packages that depend on a given depname.'
echo 'Run this script from the top-level directory of your ABS tree.'
echo ''
printf 'Usage: finddeps <depname>\n'
printf '\n'
printf 'Find packages that depend on a given depname.\n'
printf 'Run this script from the top-level directory of your ABS tree.\n'
printf '\n'
exit 1
fi

View File

@@ -55,13 +55,13 @@ transfer_repo() {
#}}}
usage() {
echo "Usage: ${0##*/} [options]"
echo ' -r <repo> Repo name'
echo ' -c Create git repo'
echo ' -t Transfer git repo to landfill org'
echo ' -h This help'
echo ''
echo ''
printf "Usage: %s [options]\n" "${0##*/}"
printf ' -r <repo> Repo name\n'
printf ' -c Create git repo\n'
printf ' -t Transfer git repo to landfill org\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
@@ -76,7 +76,6 @@ while getopts "${opts}" arg; do
c) create=true ;;
t) transfer=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done

View File

@@ -40,7 +40,7 @@ for tree in $PATH $libdirs $extras; do
# Is an ELF binary.
if (( $(ldd "$i" 2>/dev/null | grep -c 'not found') != 0 )); then
# Missing lib.
echo "$i:" >> "$TEMPDIR/raw.txt"
printf "%s\n" "$i:" >> "$TEMPDIR/raw.txt"
ldd "$i" 2>/dev/null | grep 'not found' >> "$TEMPDIR/raw.txt"
fi
fi

View File

@@ -87,7 +87,7 @@ find_pkgentry() {
for pkgentry in "$tmpdir/${REPO_DB_NAME}/$pkgname"*; do
name=${pkgentry##*/}
if [[ ${name%-*-*} = "$pkgname" ]]; then
echo "$pkgentry"
printf "%s\n" "$pkgentry"
return 0
fi
done
@@ -238,7 +238,7 @@ db_remove_entry() {
# remove entries in "links" database
local linksentry
linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//')
linksentry=$(printf "%s\n" "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//')
rm -rf "$linksentry"
pkgentry=$(find_pkgentry "$pkgname")
@@ -258,7 +258,7 @@ prepare_repo_db() {
fi
# check lock file
if ( set -o noclobber; echo "$$" > "$LOCKFILE") 2> /dev/null; then
if ( set -o noclobber; printf "%s\n" "$$" > "$LOCKFILE") 2> /dev/null; then
CLEAN_LOCK=1
else
error "Failed to acquire lockfile: %s." "$LOCKFILE"
@@ -399,7 +399,7 @@ trap_exit() {
# unhook all traps to avoid race conditions
trap '' EXIT TERM HUP QUIT INT ERR
echo
printf '\n'
error "$@"
clean_up 1
}

271
bin/pkg/makerepropkg.in Normal file
View File

@@ -0,0 +1,271 @@
#!/bin/bash
#
# makerepropkg - rebuild a package to see if it is reproducible
#
# Copyright (c) 2019 by Eli Schwartz <eschwartz@archlinux.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later
m4_include(lib/util-base.sh)
m4_include(lib/base/message.sh)
m4_include(lib/base/chroot.sh)
m4_include(lib/base/chroot.sh)
declare -A buildinfo
declare -a buildenv buildopts installed installpkgs
archiveurl='https://archive.artixlinux.org/packages'
buildroot="${CHROOTS_DIR}"/reproducible
diffoscope=0
chroot=$USER
[[ -n ${SUDO_USER:-} ]] && chroot=$SUDO_USER
[[ -z "$chroot" || $chroot = root ]] && chroot=copy
parse_buildinfo() {
local line var val
while read -r line; do
var="${line%% = *}"
val="${line#* = }"
case ${var} in
buildenv)
buildenv+=("${val}")
;;
options)
buildopts+=("${val}")
;;
installed)
installed+=("${val}")
;;
*)
buildinfo["${var}"]="${val}"
;;
esac
done
}
get_pkgfile() {
local cdir=${cache_dirs[0]}
local pkgfilebase=${1}
local mode=${2}
local pkgname=${pkgfilebase%-*-*-*}
local pkgfile ext
# try without downloading
if [[ ${mode} != localonly ]] && get_pkgfile "${pkgfilebase}" localonly; then
return 0
fi
for ext in .zst .xz ''; do
pkgfile=${pkgfilebase}.pkg.tar${ext}
for c in "${cache_dirs[@]}"; do
if [[ -f ${c}/${pkgfile} ]]; then
cdir=${c}
break
fi
done
for f in "${pkgfile}" "${pkgfile}.sig"; do
if [[ ! -f "${cdir}/${f}" ]]; then
if [[ ${mode} = localonly ]]; then
continue 2
fi
msg2 "retrieving '%s'..." "${f}" >&2
curl -Llf -# -o "${cdir}/${f}" "${archiveurl}/${pkgname:0:1}/${pkgname}/${f}" || continue 2
fi
done
printf '%s\n' "file://${cdir}/${pkgfile}"
return 0
done
return 1
}
get_makepkg_conf() {
local fname=${1}
local makepkg_conf="${2}"
if ! buildtool_file=$(get_pkgfile "${fname}"); then
error "failed to retrieve ${fname}"
return 1
fi
msg2 "using makepkg.conf from ${fname}"
bsdtar xOqf "${buildtool_file/file:\/\//}" usr/share/artools/makepkg.conf > "${makepkg_conf}"
return 0
}
usage() {
cat << __EOF__
usage: ${BASH_SOURCE[0]##*/} [options] <package_file>
Run this script in a PKGBUILD dir to build a package inside a
clean chroot while attempting to reproduce it. The package file
will be used to derive metadata needed for reproducing the
package, including the .PKGINFO as well as the buildinfo.
For more details see https://reproducible-builds.org/
OPTIONS
-d Run diffoscope if the package is unreproducible
-c <dir> Set pacman cache
-M <file> Location of a makepkg config file
-l <chroot> The directory name to use as the chroot namespace
Useful for maintaining multiple copies
Default: $chroot
-h Show this usage message
__EOF__
}
while getopts 'dM:c:l:h' arg; do
case "$arg" in
d) diffoscope=1 ;;
M) artixroot_args+=(-M "$OPTARG") ;;
c) cache_dirs+=("$OPTARG") ;;
l) chroot="$OPTARG" ;;
h) usage; exit 0 ;;
*|?) usage; exit 1 ;;
esac
done
shift $((OPTIND - 1))
check_root
[[ -f PKGBUILD ]] || { error "No PKGBUILD in current directory."; exit 1; }
# without arguments, get list of packages from PKGBUILD
if [[ -z $1 ]]; then
mapfile -t pkgnames < <(source PKGBUILD; pacman -Sddp --print-format '%r/%n' "${pkgname[@]}")
wait $! || {
error "No package file specified and failed to retrieve package names from './PKGBUILD'."
plain "Try '${BASH_SOURCE[0]##*/} -h' for more information." >&2
exit 1
}
msg "Reproducing all pkgnames listed in ./PKGBUILD"
set -- "${pkgnames[@]}"
fi
# check each package to see if it's a file, and if not, try to download it
# using pacman -Sw, and get the filename from there
splitpkgs=()
for p in "$@"; do
if [[ -f ${p} ]]; then
splitpkgs+=("${p}")
else
pkgfile_remote=$(pacman -Sddp "${p}" 2>/dev/null) || { error "package name '%s' not in repos" "${p}"; exit 1; }
pkgfile=${pkgfile_remote#file://}
if [[ ! -f ${pkgfile} ]]; then
msg "Downloading package '%s' into pacman's cache" "${pkgfile}"
sudo pacman -Swdd --noconfirm --logfile /dev/null "${p}" || exit 1
pkgfile_remote=$(pacman -Sddp "${p}" 2>/dev/null)
pkgfile="${pkgfile_remote#file://}"
fi
splitpkgs+=("${pkgfile}")
fi
done
for f in "${splitpkgs[@]}"; do
if ! bsdtar -tqf "${f}" .BUILDINFO >/dev/null 2>&1; then
error "file is not a valid pacman package: '%s'" "${f}"
exit 1
fi
done
if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <(pacman-conf CacheDir)
fi
ORIG_HOME=${HOME}
IFS=: read -r _ _ _ _ _ HOME _ < <(getent passwd "${SUDO_USER:-$USER}")
load_makepkg_config
HOME=${ORIG_HOME}
[[ -d ${SRCDEST} ]] || SRCDEST=${PWD}
parse_buildinfo < <(bsdtar -xOqf "${splitpkgs[0]}" .BUILDINFO)
export SOURCE_DATE_EPOCH="${buildinfo[builddate]}"
PACKAGER="${buildinfo[packager]}"
BUILDDIR="${buildinfo[builddir]}"
BUILDTOOL="${buildinfo[buildtool]}"
BUILDTOOLVER="${buildinfo[buildtoolver]}"
PKGEXT=${splitpkgs[0]#${splitpkgs[0]%.pkg.tar*}}
# nuke and restore reproducible testenv
namespace="$buildroot/$chroot"
lock 9 "${namespace}.lock" "Locking chroot namespace '%s'" "${namespace}"
for copy in "${namespace}"/*/; do
[[ -d ${copy} ]] || continue
subvolume_delete_recursive "${copy}"
done
rm -rf --one-file-system "${namespace}"
(umask 0022; mkdir -p "${namespace}")
for fname in "${installed[@]}"; do
if ! allpkgfiles+=("$(get_pkgfile "${fname}")"); then
error "failed to retrieve ${fname}"
exit 1
fi
done
trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT
TEMPDIR=$(mktemp -d --tmpdir makerepropkg.XXXXXXXXXX)
makepkg_conf="${TEMPDIR}/makepkg.conf"
# anything before buildtool support is pinned to the last none buildtool aware release
if [[ -z "${BUILDTOOL}" ]]; then
get_makepkg_conf "artools-pkg-0.28.2-1-any" "${makepkg_conf}" || exit 1
# prefere to assume artools-pkg up until matching makepkg version so repository packages remain reproducible
elif [[ "${BUILDTOOL}" = makepkg ]] && (( $(vercmp "${BUILDTOOLVER}" 6.0.1) <= 0 )); then
get_makepkg_conf "artools-pkg-0.28.2-1-any" "${makepkg_conf}" || exit 1
# all artools-pkg builds
elif [[ "${BUILDTOOL}" = artools-pkg ]] && get_makepkg_conf "${BUILDTOOL}-${BUILDTOOLVER}" "${makepkg_conf}"; then
true
# fallback to current makepkg.conf
else
warning "Unknown buildtool (${BUILDTOOL}-${BUILDTOOLVER}), using fallback"
makepkg_conf="${DATADIR}"/makepkg.conf
fi
printf '%s\n' "${allpkgfiles[@]}" | mkchroot -M "${makepkg_conf}" -U "${artixroot_args[@]}" "${namespace}/root" - || exit 1
# use makechrootpkg to prep the build directory
mkchrootpkg -r "${namespace}" -l build -- --packagelist || exit 1
# set detected makepkg.conf options
{
for var in PACKAGER BUILDDIR BUILDTOOL BUILDTOOLVER PKGEXT; do
printf '%s=%s\n' "${var}" "${!var@Q}"
done
printf 'OPTIONS=(%s)\n' "${buildopts[*]@Q}"
printf 'BUILDENV=(%s)\n' "${buildenv[*]@Q}"
} >> "${namespace}/build"/etc/makepkg.conf
install -d -o "${SUDO_UID:-$UID}" -g "$(id -g "${SUDO_UID:-$UID}")" "${namespace}/build/${BUILDDIR}"
bindmounts+=("-B:${PWD}:/startdir" "-B:${SRCDEST}:/srcdest")
# kick off the build
chroot-run \
-b "${bindmounts[*]}" \
"${namespace}/build" \
/chrootbuild -C --noconfirm --log --holdver --skipinteg
ret=$?
if (( ${ret} == 0 )); then
msg2 "built succeeded! built packages can be found in ${namespace}/build/pkgdest"
msg "comparing artifacts..."
for pkgfile in "${splitpkgs[@]}"; do
comparefiles=("${pkgfile}" "${namespace}/build/pkgdest/${pkgfile##*/}")
if cmp -s "${comparefiles[@]}"; then
msg2 "Package '%s' successfully reproduced!" "${pkgfile}"
else
ret=1
warning "Package '%s' is not reproducible. :(" "${pkgfile}"
sha256sum "${comparefiles[@]}"
if (( diffoscope )); then
diffoscope "${comparefiles[@]}"
fi
fi
done
fi
# return failure from chrootbuild, or the reproducibility status
exit ${ret}

View File

@@ -44,43 +44,43 @@ copy=$USER
src_owner=${SUDO_USER:-$USER}
usage() {
echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [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 ' <chrootdir>/{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 <chrootdir>/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 <dir> Bind directory into build chroot as read-write'
echo '-D <dir> 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 <dir> The chroot dir to use'
echo '-I <pkg> Install a package into the working copy of the chroot'
echo '-l <copy> 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'
printf 'Usage: %s [options] -r <chrootdir> [--] [makepkg args]\n' "${0##*/}"
printf ' Run this script in a PKGBUILD dir to build a package inside a\n'
printf ' clean chroot. Arguments passed to this script after the\n'
printf ' end-of-options marker (--) will be passed to makepkg.\n'
printf '\n'
printf ' The chroot dir consists of the following directories:\n'
printf ' <chrootdir>/{root, copy} but only "root" is required\n'
printf ' by default. The working copy will be created as needed\n'
printf '\n'
printf "The chroot 'root' directory must be created via the following\n"
printf 'command:\n'
printf ' mkchroot <chrootdir>/root base-devel\n'
printf '\n'
printf 'This script reads {SRC,SRCPKG,PKG,LOG}DEST, MAKEFLAGS and PACKAGER\n'
printf 'from makepkg.conf(5), if those variables are not part of the\n'
printf 'environment.\n'
printf '\n'
printf 'Default makepkg args: %s\n' "${default_makepkg_args[*]}"
printf '\n'
printf 'Flags:\n'
printf ' -h This help\n'
printf ' -c Clean the chroot before building\n'
printf ' -d <dir> Bind directory into build chroot as read-write\n'
printf ' -D <dir> Bind directory into build chroot as read-only\n'
printf ' -u Update the working copy of the chroot before building\n'
printf ' This is useful for rebuilds without dirtying the pristine\n'
printf ' chroot\n'
printf ' -r <dir> The chroot dir to use\n'
printf ' -I <pkg> Install a package into the working copy of the chroot\n'
printf ' -l <copy> The directory to use as the working copy of the chroot\n'
printf ' Useful for maintaining multiple copies\n'
printf ' Default: %s\n' "$copy"
printf ' -n Run namcap on the package\n'
printf ' -C Run checkpkg on the package\n'
printf ' -N Disable check() function\n'
printf ' -T Build in a temporary directory\n'
printf ' -U Run makepkg as a specified user\n'
exit 1
}
@@ -182,7 +182,7 @@ prepare_chroot() {
"MAKEFLAGS='${MAKEFLAGS:-}'" "PACKAGER='${PACKAGER:-}'"
do
grep -q "^$x" "$copydir/etc/makepkg.conf" && continue
echo "$x" >>"$copydir/etc/makepkg.conf"
printf "%s\n" "$x" >>"$copydir/etc/makepkg.conf"
done
cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF
@@ -239,7 +239,7 @@ _chrootbuild() {
_chrootnamcap() {
pacman -S --needed --noconfirm namcap
for pkgfile in /startdir/PKGBUILD /pkgdest/*; do
echo "Checking ${pkgfile##*/}"
printf "Checking %s\n" "${pkgfile##*/}"
sudo -u builduser namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log"
done
}
@@ -249,7 +249,7 @@ download_sources() {
chown "$makepkg_user:" "$WORKDIR"
# Ensure sources are downloaded
sudo -u "$makepkg_user" --preserve-env=GNUPGHOME \
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."

77
bin/pkg/mkdepgraph.in Normal file
View File

@@ -0,0 +1,77 @@
#!/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.
mk_tree_graph(){
printf "%s\n" "$(pactree "${tree_args[@]}" "${package}")" \
| dot -T "${ext}" > "${graph_dir}/${package}.${ext}"
}
mk_rebuild_graph(){
local tmpfile
tmpfile=/tmp/rebuild.dot
rebuild_args+=(-d "${tmpfile}")
artix-rebuild-order "${packages[@]}" "${rebuild_args[@]}"
dot -T "${ext}" "${tmpfile}" > "${graph_dir}/rebuild.${ext}"
rm -f "${tmpfile}"
}
usage() {
printf "Usage: %s [options] <package|packages>\n" "${0##*/}"
printf " -m <tree|rebuild> default mode: [%s]\n" "$mode"
printf " rebuild mode accepts packages input\n"
printf " -r list packages that depend on the named package (tree)\n"
printf " -u show dependencies with no duplicates (tree)\n"
printf " -d <#> limit the depth of recursion (tree)\n"
printf " default: [%s]\n" "$depth"
printf " -o <#> controls at which depth to stop printing optional deps\n"
printf " default: [%s]\n" "$optdepth"
printf " (-1 for no limit) (tree)\n"
printf " -i only use the pkgnames provided as input (rebuild)\n"
printf " -h display this help message\n"
exit "$1"
}
graph_dir=${XDG_PICTURES_DIR:-$(xdg-user-dir PICTURES)/artix}
ext="png"
mode=tree
tree_args=(-gs)
rebuild_args=()
depth=0
optdepth=-1
opts=':m:d:o:iruh'
while getopts "$opts" arg; do
case "${arg}" in
m) mode="$OPTARG" ;;
r) tree_args+=(-r) ;;
u) tree_args+=(-ul) ;;
d) depth="$OPTARG"; tree_args+=(-d "$depth") ;;
o) optdepth="$OPTARG"; tree_args+=(-o"$optdepth") ;;
i) rebuild_args+=(--no-reverse-depends) ;;
h|?) usage 0 ;;
esac
done
shift $(( OPTIND - 1 ))
[[ -d "${graph_dir}" ]] || mkdir -p "${graph_dir}"
case "$mode" in
tree) package=("$@"); mk_tree_graph ;;
rebuild) packages=("$@"); mk_rebuild_graph ;;
*) usage 1 ;;
esac

View File

@@ -17,6 +17,24 @@ m4_include(lib/base/yaml.sh)
#{{{ functions
print_package_names() {
local version=$(get_full_version)
local architecture pkg
for pkg in ${pkgname[@]}; do
architecture=$(get_pkg_arch $pkg)
printf "%s/%s-%s-%s%s\n" "$PKGDEST" "$pkg" "$version" "$architecture" "$PKGEXT"
done
}
print_debug_package_names() {
local version=$(get_full_version)
local architecture
if check_option "debug" "y" && check_option "strip" "y"; then
architecture=$(get_pkg_arch)
printf "%s/%s-%s-%s-%s%s\n" "$PKGDEST" "$pkgbase" "debug" "$version" "$architecture" "$PKGEXT"
fi
}
srcyaml_write_attr(){
local ident1="$1" ident2="$2" ident3="$3"
local attrname=$4 attrvalues=("${@:5}")
@@ -108,13 +126,19 @@ yaml_write_fileinfo(){
pkgbase=${pkgbase:-$pkgname}
Yaml+=$(write_yaml_map 0 "version" "${version:-0}")
Yaml+=$(write_empty_line)
local pkgfile
pkgfile=$(print_all_package_names)
local pkgfile debug_pkg
pkgfile=$(print_package_names)
Yaml+=$(write_yaml_map 0 "files")
for f in ${pkgfile}; do
Yaml+=$(write_yaml_seq 2 "${f##*/}")
done
Yaml+=$(write_empty_line)
debug_pkg=$(print_debug_package_names)
Yaml+=$(write_yaml_map 0 "debug")
for d in ${debug_pkg}; do
Yaml+=$(write_yaml_seq 2 "${d##*/}")
done
Yaml+=$(write_empty_line)
}
write_srcyaml(){
@@ -122,16 +146,16 @@ write_srcyaml(){
yaml_write_global
yaml_write_package
yaml_write_fileinfo
printf '%s' "${Yaml}"
printf '%s\n' "${Yaml}"
}
#}}}
usage() {
echo "Usage: ${0##*/} [options]"
echo " -d Don't include details"
echo ' -h This help'
echo ''
printf 'Usage: %s [options]\n' "${0##*/}"
printf ' -d Do not include details\n'
printf ' -h This help\n'
printf '\n'
exit "$1"
}
@@ -143,7 +167,6 @@ while getopts "${opts}" arg; do
case "${arg}" in
d) details=false ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done

202
bin/pkg/tidyarch.in Normal file
View File

@@ -0,0 +1,202 @@
#!/bin/bash
#
# Copyright (C) 2018-20 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/repo.sh)
git_rm() {
local r="$1"
if ! "$run_f"; then
printf "git rm -r %s\n" "$r"
printf "git commit -m 'remove %s'\n" "${r##*/}"
else
git rm -r "$r"
git commit -m "remove ${r##*/}"
fi
}
compare_ver() {
local a="$1" b="$2" tree="$3" func="$4" va vb
# shellcheck disable=1090
source "$a"/PKGBUILD 2>/dev/null
va=$(get_full_version)
unset pkgver epoch pkgrel arch
# shellcheck disable=1090
source "$b"/PKGBUILD 2>/dev/null
vb=$(get_full_version)
unset pkgver epoch pkgrel arch
msg2 "a: %s b: %s" "$va" "$vb"
local ret
ret=$(vercmp "$va" "$vb")
msg2 "ret: %s" "$ret"
if [ "$ret" -gt 0 ]; then
git_rm "$b"
elif [ "$ret" -lt 0 ]; then
git_rm "$a"
else
case "$tree" in
"${ARCH_TREE[0]}") git_rm "$a" ;;
"${ARCH_TREE[1]}") git_rm "$b" ;;
esac
fi
}
check_duplicates() {
mapfile -t duplicates < <(find "${TREE_DIR_ARCH}" -mindepth 2 -maxdepth 2 -type d -not -path "*.git" -printf '%f\n' | sort | uniq -d)
for p in "${duplicates[@]}"; do
msg "%s" "$p"
local av bv a b
a="${TREE_DIR_ARCH}/${ARCH_TREE[0]}"
# shellcheck disable=1090
source "$a/$p"/trunk/PKGBUILD 2>/dev/null
av=$(get_full_version)
b="${TREE_DIR_ARCH}/${ARCH_TREE[1]}"
# shellcheck disable=1090
source "$b/$p"/trunk/PKGBUILD 2>/dev/null
bv=$(get_full_version)
msg2 "a: %s b: %s" "$av" "$bv"
ret=$(vercmp "$av" "$bv")
msg2 "ret: %s" "$ret"
if [ "$ret" -gt 0 ]; then
cd "$b"
msg2 "%s" "${b##*/}"
git_rm "$p"
elif [ "$ret" -lt 0 ]; then
cd "$a"
msg2 "%s" "${a##*/}"
git_rm "$p"
fi
done
}
# git config core.mergeoptions --no-edit
check_tree() {
for tree in "${ARCH_TREE[@]}"; do
cd "${TREE_DIR_ARCH}/$tree" || exit
mapfile -t pkgs < <(find . -mindepth 2 -maxdepth 2 -type d -name repos | sort)
for p in "${pkgs[@]}"; do
mapfile -t repos < <(find "$p" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort)
local repos_dir=$p
p=${p%/*}
p=${p##*/}
local size=${#repos[@]}
if (( "$size" > 1 )); then
if [[ "${repos[1]}" != "${valid_names[11]}"-* ]] || [[ "${repos[1]}" != "${valid_names[12]}"-* ]]; then
local a="$repos_dir/${repos[0]}" b="$repos_dir/${repos[1]}"
# repo mismatches
if [[ "${repos[0]}" == "${valid_names[2]}"-* ]] && [[ "${repos[1]}" == "${valid_names[1]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[2]}"-* ]] && [[ "${repos[1]}" == "${valid_names[7]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[2]}"-* ]] && [[ "${repos[1]}" == "${valid_names[4]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[0]}"-* ]] && [[ "${repos[1]}" == "${valid_names[1]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[2]}"-* ]] && [[ "${repos[1]}" == "${valid_names[0]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[3]}"-* ]] && [[ "${repos[1]}" == "${valid_names[7]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[3]}"-* ]] && [[ "${repos[1]}" == "${valid_names[4]}"-* ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
fi
# same repo name but different arch
if [[ "${repos[0]}" == "${valid_names[0]}"-any ]] && [[ "${repos[1]}" == "${valid_names[0]}"-"$CARCH" ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[1]}"-any ]] && [[ "${repos[1]}" == "${valid_names[1]}"-"$CARCH" ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
elif [[ "${repos[0]}" == "${valid_names[2]}"-any ]] && [[ "${repos[1]}" == "${valid_names[2]}"-"$CARCH" ]]; then
msg "%s: %s" "$p" "${repos[*]}"
msg2 "%s" "$tree"
compare_ver "$a" "$b" "$tree"
fi
fi
fi
done
done
}
usage() {
printf 'Usage: %s\n' "${0##*/}"
printf ' -f Apply filter\n'
printf ' -r Run removal\n'
printf ' -d Check for duplicates\n'
printf ' -h This help\n'
printf '\n'
printf '\n'
exit "$1"
}
load_makepkg_config
load_valid_names
filter=false
dupl=false
run_f=false
opts='hrfd'
while getopts ${opts} arg; do
case "${arg}" in
f) filter=true ;;
r) run_f=true ;;
d) dupl=true ;;
h|?) usage 0 ;;
esac
done
shift $(( OPTIND - 1 ))
"$filter" && check_tree
"$dupl" && check_duplicates

View File

@@ -7,34 +7,13 @@
# 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-perl
# packages-java
# packages-ruby
# packages-kf5
# packages-plasma
# packages-kde
# packages-gnome
# packages-cinnamon
# packages-lxqt
# packages-mate
# packages-xfce
# packages-wm
# packages-devel
# packages-qt6
# packages-office
# packages-misc
# python-world
# python-galaxy
# packages-python
# packages-lib32
# customize buildtree
# ARTIX_TREE=(
# main
# initsys
# desktop
# addons
# lib32
# )
# TREE_DIR_ARCH=${WORKSPACE_DIR}/archlinux

View File

@@ -11,10 +11,10 @@
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
DLAGENTS=('file::/usr/bin/curl -gqC - -o %o %u'
'ftp::/usr/bin/curl -gqfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
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')
@@ -45,12 +45,13 @@ CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
-fstack-clash-protection -fcf-protection"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
LTOFLAGS="-flto=auto"
#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_CFLAGS="-g"
DEBUG_CXXFLAGS="$DEBUG_CFLAGS"
#DEBUG_RUSTFLAGS="-C debuginfo=2"
#########################################################################
@@ -93,7 +94,7 @@ BUILDENV=(!distcc color !ccache check !sign)
#-- 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)
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)

View File

@@ -3,11 +3,11 @@
#{{{ yaml
write_yaml_header(){
printf '%s' '---'
printf '%s\n' '---'
}
write_empty_line(){
printf '\n%s\n' ' '
printf '\n'
}
write_yaml_map(){

View File

@@ -13,7 +13,7 @@ write_services_conf(){
yaml+=$(write_yaml_seq 2 "$svc")
done
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
printf '%s\n' "${yaml}"
}
write_services_openrc_conf(){
@@ -29,6 +29,7 @@ write_services_runit_conf(){
write_services_s6_conf(){
local conf="$1"/services-s6.conf
write_services_conf 'svDir' '/etc/s6/sv' 'dbDir' '/etc/s6/rc/compiled' > "$conf"
printf '%s\n' "defaultBundle: default" >> "$conf"
}
write_services_suite66_conf(){

View File

@@ -10,7 +10,7 @@ prepare_initramfs_dracut(){
printf "%s\n" 'add_dracutmodules+=" dmsquash-live"' > "$mnt"/etc/dracut.conf.d/50-live.conf
msg "Starting build: %s" "${kver}"
artools-chroot "$mnt" dracut -fqM /boot/initramfs.img "$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

View File

@@ -40,7 +40,7 @@ prepare_initramfs_mkinitcpio() {
export ARTIX_GNUPG_FD
fi
artools-chroot "$mnt" mkinitcpio -k "$k" \
artix-chroot "$mnt" mkinitcpio -k "$k" \
-c /etc/"$mkinitcpio_conf" \
-g /boot/initramfs.img

View File

@@ -5,13 +5,13 @@
get_disturl(){
# shellcheck disable=1091
. /usr/lib/os-release
echo "${HOME_URL}"
printf "%s\n" "${HOME_URL}"
}
get_osname(){
# shellcheck disable=1091
. /usr/lib/os-release
echo "${NAME}"
printf "%s\n" "${NAME}"
}
assemble_iso(){

View File

@@ -56,7 +56,8 @@ read_from_list() {
read_from_services() {
for svc in "${SERVICES[@]}"; do
case "$svc" in
sddm|gdm|lightdm|mdm|greetd|lxdm|xdm) packages+=("$svc-${INITSYS}") ;;
sddm|gdm|lightdm|mdm|greetd|lxdm|xdm)
packages+=("$svc-${INITSYS}"); display_manager="$svc" ;;
NetworkManager) packages+=("networkmanager-${INITSYS}") ;;
connmand) packages+=("connman-${INITSYS}") ;;
cupsd) packages+=("cups-${INITSYS}") ;;

View File

@@ -23,24 +23,26 @@ add_svc_runit(){
}
add_svc_s6(){
local mnt="$1" names="$2" rlvl="${3:-default}" error ret
local db=/etc/s6/rc/compiled
local mnt="$1" names="$2" rlvl="${3:-default}" dep
dep="$mnt"/etc/s6/sv/"$display_manager"-srv/dependencies.d
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"
msg2 "Setting %s: [%s]" "${INITSYS}" "$svc"
chroot "$mnt" s6-service add "$rlvl" "$svc"
if [[ "$svc" == "$display_manager" ]]; then
if [[ -d "$dep" ]]; then
touch "$dep"/artix-live
fi
fi
done
local rlvl=/etc/s6/current
chroot "$mnt" s6-db-reload -r
local src=/etc/s6/current skel=/etc/s6/skel getty='/usr/bin/agetty -L -8 tty7 115200'
# 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
chroot "$mnt" rm -r "$src"
chroot "$mnt" s6-linux-init-maker -1 -N -f "$skel" -G "$getty" -c "$src" "$src"
chroot "$mnt" mv "$src"/bin/init "$src"/bin/s6-init
chroot "$mnt" cp -a "$src"/bin /usr
}
add_svc_suite66(){

View File

@@ -5,9 +5,10 @@
get_compliant_name(){
local gitname="$1"
case "$gitname" in
*+) gitname=${gitname//+/plus}
*+) gitname=${gitname//+/plus} ;;
*+*) gitname=${gitname//+/-} ;;
esac
echo "$gitname"
printf "%s\n" "$gitname"
}
get_pkg_org(){
@@ -18,7 +19,7 @@ get_pkg_org(){
python-*|python2-*) org="packagesPython" ;;
*) sub=${pkg:0:1}; org="packages${sub^^}" ;;
esac
echo "$org"
printf "%s\n" "$org"
}
api_put() {

View File

@@ -31,7 +31,7 @@ get_pkgbasename() {
rm_pkg=${rm_pkg%-*}
rm_pkg=${rm_pkg%-*}
rm_pkg=${rm_pkg%-*}
echo "$rm_pkg"
printf "%s\n" "$rm_pkg"
}
#}}}

67
lib/pkg/diff.sh Normal file
View File

@@ -0,0 +1,67 @@
#!/hint/bash
#{{{ 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
}
#}}}

View File

@@ -22,12 +22,9 @@ has_changeset(){
}
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
local tree="$1" lh="$2" rh
rh=$(get_remote_head)
if has_changeset "${lh}" "${rh}";then
git pull origin master
fi
}

View File

@@ -6,11 +6,11 @@ write_jenkinsfile(){
local pkg="$1"
local jenkins=$pkg/Jenkinsfile
echo "@Library('artix-ci') import org.artixlinux.RepoPackage" > "$jenkins"
printf "@Library('artix-ci') import org.artixlinux.RepoPackage\n" > "$jenkins"
{
echo ''
echo 'PackagePipeline(new RepoPackage(this))'
echo ''
printf '\n'
printf 'PackagePipeline(new RepoPackage(this))\n'
printf '\n'
} >> "$jenkins"
git add "$jenkins"
@@ -21,23 +21,23 @@ write_agentyaml(){
local agent="$pkg"/.artixlinux/agent.yaml label='master'
[[ -d $pkg/.artixlinux ]] || mkdir "$pkg"/.artixlinux
echo '---' > "$agent"
printf '%s\n' '---' > "$agent"
{
echo ''
echo "label: $label"
echo ''
printf '\n'
printf "label: %s\n" "$label"
printf '\n'
} >> "$agent"
git add "$agent"
}
commit_jenkins_files(){
commit_ci(){
local pkg="$1"
write_jenkinsfile "$pkg"
write_agentyaml "$pkg"
git commit -m "initial commit"
git commit -m "initial ci commit"
}
#}}}

View File

@@ -25,25 +25,25 @@ set_arch_repos(){
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"
[[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo="$r-$pkgarch"
[[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo="$r"-any
[[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$r"
done
echo "$repo"
printf "%s\n" "$repo"
}
find_pkg(){
local searchdir="$1" pkg="$2" result
result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg")
echo "$result"
printf "%s\n" "$result"
}
tree_loop(){
local func="$1" pkgs
for tree in "${ARTIX_TREE[@]}"; do
pkgs=$(find "${TREE_DIR_ARTIX}/$tree" -name repos -o -name "$CARCH" | sort)
for _package in ${pkgs}; do
"$func" "$_package"
mapfile -t pkgs < <(find "${TREE_DIR_ARTIX}/$tree" -name "$CARCH" | sort)
for p in "${pkgs[@]}"; do
"$func" "$p"
done
done
}

View File

@@ -21,34 +21,8 @@ load_pkg_config(){
TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"}
ARTIX_TREE=(
packages community
packages-{gfx,gtk,media,net,qt5,xorg}
)
local dev_tree=(
packages-{llvm,python,perl,java,ruby}
python-{world,galaxy}
)
local init_tree=(packages-{openrc,runit,s6,suite66,dinit})
local desktop_tree=(
packages-{kf5,plasma,kde,qt6}
packages-{lxqt,gnome,cinnamon,mate,xfce,wm}
)
[[ -z ${TREE_NAMES_ARTIX[*]} ]] && \
TREE_NAMES_ARTIX=(
packages-kernel
"${init_tree[@]}"
"${dev_tree[@]}"
"${desktop_tree[@]}"
packages-devel
packages-lib32
)
ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}")
[[ -z ${ARTIX_TREE[*]} ]] && \
ARTIX_TREE=(main initsys desktop addons lib32)
TREE_DIR_ARCH=${TREE_DIR_ARCH:-"${WORKSPACE_DIR}/archlinux"}