From 6779605b668e3264eac416ebb785718d2b6fd065 Mon Sep 17 00:00:00 2001 From: Nathan Date: Sun, 9 Jan 2022 14:37:18 -0600 Subject: [PATCH] artools: add patch --- artools/0.26.1/artools/.gitignore | 8 + artools/0.26.1/artools/Makefile | 179 +++ artools/0.26.1/artools/README.md | 69 + artools/0.26.1/artools/bin/base/artix-chroot | 381 +++++ .../0.26.1/artools/bin/base/artix-chroot.in | 151 ++ artools/0.26.1/artools/bin/base/basestrap | 356 +++++ artools/0.26.1/artools/bin/base/basestrap.in | 126 ++ artools/0.26.1/artools/bin/base/chroot-run | 414 +++++ artools/0.26.1/artools/bin/base/chroot-run.in | 181 +++ artools/0.26.1/artools/bin/base/fstabgen | 529 +++++++ artools/0.26.1/artools/bin/base/fstabgen.in | 432 ++++++ artools/0.26.1/artools/bin/base/mkchroot | 255 ++++ artools/0.26.1/artools/bin/base/mkchroot.in | 106 ++ artools/0.26.1/artools/bin/iso/buildiso | 1327 +++++++++++++++++ artools/0.26.1/artools/bin/iso/buildiso.in | 389 +++++ artools/0.26.1/artools/bin/pkg/batchpkg | 328 ++++ artools/0.26.1/artools/bin/pkg/batchpkg.in | 115 ++ artools/0.26.1/artools/bin/pkg/buildpkg | 324 ++++ artools/0.26.1/artools/bin/pkg/buildpkg.in | 121 ++ artools/0.26.1/artools/bin/pkg/buildtree | 741 +++++++++ artools/0.26.1/artools/bin/pkg/buildtree.in | 332 +++++ artools/0.26.1/artools/bin/pkg/checkpkg | 303 ++++ artools/0.26.1/artools/bin/pkg/checkpkg.in | 206 +++ artools/0.26.1/artools/bin/pkg/checkrepo | 550 +++++++ artools/0.26.1/artools/bin/pkg/checkrepo.in | 251 ++++ artools/0.26.1/artools/bin/pkg/commitpkg | 596 ++++++++ artools/0.26.1/artools/bin/pkg/commitpkg.in | 230 +++ artools/0.26.1/artools/bin/pkg/comparepkg | 506 +++++++ artools/0.26.1/artools/bin/pkg/comparepkg.in | 207 +++ artools/0.26.1/artools/bin/pkg/deploypkg | 351 +++++ artools/0.26.1/artools/bin/pkg/deploypkg.in | 101 ++ artools/0.26.1/artools/bin/pkg/find-libdeps | 196 +++ .../0.26.1/artools/bin/pkg/find-libdeps.in | 99 ++ artools/0.26.1/artools/bin/pkg/finddeps | 147 ++ artools/0.26.1/artools/bin/pkg/finddeps.in | 50 + artools/0.26.1/artools/bin/pkg/gitearepo | 338 +++++ artools/0.26.1/artools/bin/pkg/gitearepo.in | 89 ++ artools/0.26.1/artools/bin/pkg/lddd | 154 ++ artools/0.26.1/artools/bin/pkg/lddd.in | 57 + artools/0.26.1/artools/bin/pkg/links-add | 609 ++++++++ artools/0.26.1/artools/bin/pkg/links-add.in | 512 +++++++ artools/0.26.1/artools/bin/pkg/mkchrootpkg | 578 +++++++ artools/0.26.1/artools/bin/pkg/mkchrootpkg.in | 432 ++++++ artools/0.26.1/artools/bin/pkg/pkg2yaml | 287 ++++ artools/0.26.1/artools/bin/pkg/pkg2yaml.in | 162 ++ artools/0.26.1/artools/bin/pkg/signpkg | 180 +++ artools/0.26.1/artools/bin/pkg/signpkg.in | 46 + .../artools/data/conf/artools-base.conf | 9 + .../0.26.1/artools/data/conf/artools-iso.conf | 21 + .../0.26.1/artools/data/conf/artools-pkg.conf | 59 + .../0.26.1/artools/data/pacman/makepkg.conf | 161 ++ .../artools/data/pacman/pacman-default.conf | 92 ++ .../artools/data/pacman/pacman-docker.conf | 99 ++ .../data/pacman/pacman-gnome-wobble.conf | 101 ++ .../artools/data/pacman/pacman-goblins.conf | 98 ++ .../artools/data/pacman/pacman-gremlins.conf | 92 ++ .../data/pacman/pacman-kde-wobble.conf | 101 ++ .../data/pacman/pacman-lib32-goblins.conf | 110 ++ .../data/pacman/pacman-lib32-gremlins.conf | 101 ++ .../artools/data/pacman/pacman-lib32.conf | 101 ++ .../artools/data/patches/artix-bash.patch | 87 ++ artools/0.26.1/artools/data/valid-names.conf | 42 + .../artools/installed-by-dh_installdocs | 0 .../0.26.1/artools/debian/artools.substvars | 2 + .../artools/debian/artools/DEBIAN/conffiles | 3 + .../artools/debian/artools/DEBIAN/control | 11 + .../artools/debian/artools/DEBIAN/md5sums | 36 + .../artools/etc/artools/artools-base.conf | 9 + .../artools/etc/artools/artools-iso.conf | 21 + .../artools/etc/artools/artools-pkg.conf | 59 + .../debian/artools/usr/bin/artix-chroot | 381 +++++ .../debian/artools/usr/bin/artools-chroot | 1 + .../artools/debian/artools/usr/bin/basestrap | 356 +++++ .../artools/debian/artools/usr/bin/batchpkg | 328 ++++ .../artools/debian/artools/usr/bin/buildiso | 1327 +++++++++++++++++ .../debian/artools/usr/bin/buildiso-goblins | 1 + .../debian/artools/usr/bin/buildiso-gremlins | 1 + .../artools/debian/artools/usr/bin/buildpkg | 324 ++++ .../debian/artools/usr/bin/buildpkg-galaxy | 1 + .../artools/usr/bin/buildpkg-galaxy-goblins | 1 + .../artools/usr/bin/buildpkg-galaxy-gremlins | 1 + .../artools/usr/bin/buildpkg-gnome-wobble | 1 + .../debian/artools/usr/bin/buildpkg-goblins | 1 + .../debian/artools/usr/bin/buildpkg-gremlins | 1 + .../artools/usr/bin/buildpkg-kde-wobble | 1 + .../debian/artools/usr/bin/buildpkg-lib32 | 1 + .../artools/usr/bin/buildpkg-lib32-goblins | 1 + .../artools/usr/bin/buildpkg-lib32-gremlins | 1 + .../debian/artools/usr/bin/buildpkg-system | 1 + .../debian/artools/usr/bin/buildpkg-world | 1 + .../artools/debian/artools/usr/bin/buildtree | 741 +++++++++ .../artools/debian/artools/usr/bin/checkpkg | 303 ++++ .../artools/debian/artools/usr/bin/checkrepo | 550 +++++++ .../artools/debian/artools/usr/bin/chroot-run | 414 +++++ .../artools/debian/artools/usr/bin/commitpkg | 596 ++++++++ .../artools/usr/bin/community-stagingpkg | 1 + .../artools/usr/bin/community-testingpkg | 1 + .../debian/artools/usr/bin/communitypkg | 1 + .../artools/debian/artools/usr/bin/comparepkg | 506 +++++++ .../artools/debian/artools/usr/bin/corepkg | 1 + .../artools/debian/artools/usr/bin/deploypkg | 351 +++++ .../debian/artools/usr/bin/deploypkg-galaxy | 1 + .../artools/usr/bin/deploypkg-galaxy-goblins | 1 + .../artools/usr/bin/deploypkg-galaxy-gremlins | 1 + .../artools/usr/bin/deploypkg-gnome-wobble | 1 + .../debian/artools/usr/bin/deploypkg-goblins | 1 + .../debian/artools/usr/bin/deploypkg-gremlins | 1 + .../artools/usr/bin/deploypkg-kde-wobble | 1 + .../debian/artools/usr/bin/deploypkg-lib32 | 1 + .../artools/usr/bin/deploypkg-lib32-goblins | 1 + .../artools/usr/bin/deploypkg-lib32-gremlins | 1 + .../debian/artools/usr/bin/deploypkg-system | 1 + .../debian/artools/usr/bin/deploypkg-world | 1 + .../artools/debian/artools/usr/bin/extrapkg | 1 + .../debian/artools/usr/bin/find-libdeps | 196 +++ .../debian/artools/usr/bin/find-libprovides | 1 + .../artools/debian/artools/usr/bin/finddeps | 147 ++ .../artools/debian/artools/usr/bin/fstabgen | 529 +++++++ .../artools/debian/artools/usr/bin/gitearepo | 338 +++++ .../debian/artools/usr/bin/gnome-unstablepkg | 1 + .../debian/artools/usr/bin/kde-unstablepkg | 1 + .../artools/debian/artools/usr/bin/lddd | 154 ++ .../artools/debian/artools/usr/bin/links-add | 609 ++++++++ .../debian/artools/usr/bin/links-remove | 1 + .../artools/debian/artools/usr/bin/mkchroot | 255 ++++ .../debian/artools/usr/bin/mkchrootpkg | 578 +++++++ .../artools/usr/bin/multilib-stagingpkg | 1 + .../artools/usr/bin/multilib-testingpkg | 1 + .../debian/artools/usr/bin/multilibpkg | 1 + .../artools/debian/artools/usr/bin/pkg2yaml | 287 ++++ .../artools/debian/artools/usr/bin/rebuildpkg | 1 + .../artools/debian/artools/usr/bin/signpkg | 180 +++ .../artools/debian/artools/usr/bin/stagingpkg | 1 + .../artools/debian/artools/usr/bin/testingpkg | 1 + .../artools/usr/share/artools/makepkg.conf | 161 ++ .../usr/share/artools/pacman-default.conf | 92 ++ .../usr/share/artools/pacman-docker.conf | 99 ++ .../share/artools/pacman-gnome-wobble.conf | 101 ++ .../usr/share/artools/pacman-goblins.conf | 98 ++ .../usr/share/artools/pacman-gremlins.conf | 92 ++ .../usr/share/artools/pacman-kde-wobble.conf | 101 ++ .../share/artools/pacman-lib32-goblins.conf | 110 ++ .../share/artools/pacman-lib32-gremlins.conf | 101 ++ .../usr/share/artools/pacman-lib32.conf | 101 ++ .../share/artools/patches/artix-bash.patch | 87 ++ .../usr/share/artools/valid-names.conf | 42 + .../usr/share/doc/artools/changelog.Debian.gz | Bin 0 -> 146 bytes .../artools/usr/share/doc/artools/copyright | 35 + artools/0.26.1/artools/debian/changelog | 5 + artools/0.26.1/artools/debian/control | 16 + artools/0.26.1/artools/debian/copyright | 35 + .../artools/debian/debhelper-build-stamp | 1 + artools/0.26.1/artools/debian/files | 2 + artools/0.26.1/artools/debian/patches/1 | 37 + .../add-flto-to-LDFLAGS-for-clang.patch | 24 + .../debian/patches/comparepkg-fix.patch | 16 + artools/0.26.1/artools/debian/patches/series | 2 + artools/0.26.1/artools/debian/rules | 26 + artools/0.26.1/artools/debian/source/format | 1 + .../0.26.1/artools/lib/base/chroot-version.sh | 3 + artools/0.26.1/artools/lib/base/chroot.sh | 49 + artools/0.26.1/artools/lib/base/common.sh | 16 + artools/0.26.1/artools/lib/base/message.sh | 97 ++ artools/0.26.1/artools/lib/base/mount.sh | 84 ++ artools/0.26.1/artools/lib/base/yaml.sh | 28 + artools/0.26.1/artools/lib/iso/calamares.sh | 54 + artools/0.26.1/artools/lib/iso/config.sh | 30 + artools/0.26.1/artools/lib/iso/dracut.sh | 42 + artools/0.26.1/artools/lib/iso/firmware.sh | 17 + artools/0.26.1/artools/lib/iso/grub.sh | 61 + artools/0.26.1/artools/lib/iso/initcpio.sh | 72 + artools/0.26.1/artools/lib/iso/iso.sh | 50 + artools/0.26.1/artools/lib/iso/mount.sh | 55 + artools/0.26.1/artools/lib/iso/profile.sh | 85 ++ artools/0.26.1/artools/lib/iso/services.sh | 66 + artools/0.26.1/artools/lib/iso/squash.sh | 86 ++ artools/0.26.1/artools/lib/iso/trap.sh | 48 + artools/0.26.1/artools/lib/pkg/common.sh | 36 + artools/0.26.1/artools/lib/pkg/deploy.sh | 37 + artools/0.26.1/artools/lib/pkg/git.sh | 35 + artools/0.26.1/artools/lib/pkg/gitea.sh | 31 + artools/0.26.1/artools/lib/pkg/jenkins.sh | 43 + artools/0.26.1/artools/lib/pkg/repo.sh | 51 + artools/0.26.1/artools/lib/pkg/table.sh | 35 + artools/0.26.1/artools/lib/util-base.sh | 41 + artools/0.26.1/artools/lib/util-iso.sh | 41 + artools/0.26.1/artools/lib/util-pkg.sh | 75 + artools/0.26.1/artools_0.26.1-1.debian.tar.xz | Bin 2852 -> 3112 bytes artools/0.26.1/artools_0.26.1-1.dsc | 34 +- .../0.26.1/artools_0.26.1-1_amd64.buildinfo | 199 +++ artools/0.26.1/artools_0.26.1-1_amd64.changes | 56 + artools/0.26.1/artools_0.26.1-1_amd64.deb | Bin 44362 -> 44370 bytes .../build_release/meson-logs/meson-log.txt | 16 + .../build_release/meson-private/meson.lock | 0 194 files changed, 28049 insertions(+), 17 deletions(-) create mode 100644 artools/0.26.1/artools/.gitignore create mode 100644 artools/0.26.1/artools/Makefile create mode 100644 artools/0.26.1/artools/README.md create mode 100755 artools/0.26.1/artools/bin/base/artix-chroot create mode 100644 artools/0.26.1/artools/bin/base/artix-chroot.in create mode 100755 artools/0.26.1/artools/bin/base/basestrap create mode 100644 artools/0.26.1/artools/bin/base/basestrap.in create mode 100755 artools/0.26.1/artools/bin/base/chroot-run create mode 100644 artools/0.26.1/artools/bin/base/chroot-run.in create mode 100755 artools/0.26.1/artools/bin/base/fstabgen create mode 100644 artools/0.26.1/artools/bin/base/fstabgen.in create mode 100755 artools/0.26.1/artools/bin/base/mkchroot create mode 100644 artools/0.26.1/artools/bin/base/mkchroot.in create mode 100755 artools/0.26.1/artools/bin/iso/buildiso create mode 100755 artools/0.26.1/artools/bin/iso/buildiso.in create mode 100755 artools/0.26.1/artools/bin/pkg/batchpkg create mode 100644 artools/0.26.1/artools/bin/pkg/batchpkg.in create mode 100755 artools/0.26.1/artools/bin/pkg/buildpkg create mode 100644 artools/0.26.1/artools/bin/pkg/buildpkg.in create mode 100755 artools/0.26.1/artools/bin/pkg/buildtree create mode 100644 artools/0.26.1/artools/bin/pkg/buildtree.in create mode 100755 artools/0.26.1/artools/bin/pkg/checkpkg create mode 100644 artools/0.26.1/artools/bin/pkg/checkpkg.in create mode 100755 artools/0.26.1/artools/bin/pkg/checkrepo create mode 100644 artools/0.26.1/artools/bin/pkg/checkrepo.in create mode 100755 artools/0.26.1/artools/bin/pkg/commitpkg create mode 100644 artools/0.26.1/artools/bin/pkg/commitpkg.in create mode 100755 artools/0.26.1/artools/bin/pkg/comparepkg create mode 100644 artools/0.26.1/artools/bin/pkg/comparepkg.in create mode 100755 artools/0.26.1/artools/bin/pkg/deploypkg create mode 100644 artools/0.26.1/artools/bin/pkg/deploypkg.in create mode 100755 artools/0.26.1/artools/bin/pkg/find-libdeps create mode 100644 artools/0.26.1/artools/bin/pkg/find-libdeps.in create mode 100755 artools/0.26.1/artools/bin/pkg/finddeps create mode 100644 artools/0.26.1/artools/bin/pkg/finddeps.in create mode 100755 artools/0.26.1/artools/bin/pkg/gitearepo create mode 100644 artools/0.26.1/artools/bin/pkg/gitearepo.in create mode 100755 artools/0.26.1/artools/bin/pkg/lddd create mode 100644 artools/0.26.1/artools/bin/pkg/lddd.in create mode 100755 artools/0.26.1/artools/bin/pkg/links-add create mode 100644 artools/0.26.1/artools/bin/pkg/links-add.in create mode 100755 artools/0.26.1/artools/bin/pkg/mkchrootpkg create mode 100644 artools/0.26.1/artools/bin/pkg/mkchrootpkg.in create mode 100755 artools/0.26.1/artools/bin/pkg/pkg2yaml create mode 100644 artools/0.26.1/artools/bin/pkg/pkg2yaml.in create mode 100755 artools/0.26.1/artools/bin/pkg/signpkg create mode 100644 artools/0.26.1/artools/bin/pkg/signpkg.in create mode 100644 artools/0.26.1/artools/data/conf/artools-base.conf create mode 100644 artools/0.26.1/artools/data/conf/artools-iso.conf create mode 100644 artools/0.26.1/artools/data/conf/artools-pkg.conf create mode 100644 artools/0.26.1/artools/data/pacman/makepkg.conf create mode 100644 artools/0.26.1/artools/data/pacman/pacman-default.conf create mode 100644 artools/0.26.1/artools/data/pacman/pacman-docker.conf create mode 100644 artools/0.26.1/artools/data/pacman/pacman-gnome-wobble.conf create mode 100644 artools/0.26.1/artools/data/pacman/pacman-goblins.conf create mode 100644 artools/0.26.1/artools/data/pacman/pacman-gremlins.conf create mode 100644 artools/0.26.1/artools/data/pacman/pacman-kde-wobble.conf create mode 100644 artools/0.26.1/artools/data/pacman/pacman-lib32-goblins.conf create mode 100644 artools/0.26.1/artools/data/pacman/pacman-lib32-gremlins.conf create mode 100644 artools/0.26.1/artools/data/pacman/pacman-lib32.conf create mode 100644 artools/0.26.1/artools/data/patches/artix-bash.patch create mode 100644 artools/0.26.1/artools/data/valid-names.conf create mode 100644 artools/0.26.1/artools/debian/.debhelper/generated/artools/installed-by-dh_installdocs create mode 100644 artools/0.26.1/artools/debian/artools.substvars create mode 100644 artools/0.26.1/artools/debian/artools/DEBIAN/conffiles create mode 100644 artools/0.26.1/artools/debian/artools/DEBIAN/control create mode 100644 artools/0.26.1/artools/debian/artools/DEBIAN/md5sums create mode 100644 artools/0.26.1/artools/debian/artools/etc/artools/artools-base.conf create mode 100644 artools/0.26.1/artools/debian/artools/etc/artools/artools-iso.conf create mode 100644 artools/0.26.1/artools/debian/artools/etc/artools/artools-pkg.conf create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/artix-chroot create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/artools-chroot create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/basestrap create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/batchpkg create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/buildiso create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildiso-goblins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildiso-gremlins create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy-goblins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-galaxy-gremlins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-gnome-wobble create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-goblins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-gremlins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-kde-wobble create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32 create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32-goblins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-lib32-gremlins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-system create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/buildpkg-world create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/buildtree create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/checkpkg create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/checkrepo create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/chroot-run create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/commitpkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/community-stagingpkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/community-testingpkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/communitypkg create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/comparepkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/corepkg create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy-goblins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-galaxy-gremlins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-gnome-wobble create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-goblins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-gremlins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-kde-wobble create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32 create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32-goblins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-lib32-gremlins create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-system create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/deploypkg-world create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/extrapkg create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/find-libdeps create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/find-libprovides create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/finddeps create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/fstabgen create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/gitearepo create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/gnome-unstablepkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/kde-unstablepkg create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/lddd create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/links-add create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/links-remove create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/mkchroot create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/mkchrootpkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/multilib-stagingpkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/multilib-testingpkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/multilibpkg create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/pkg2yaml create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/rebuildpkg create mode 100755 artools/0.26.1/artools/debian/artools/usr/bin/signpkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/stagingpkg create mode 120000 artools/0.26.1/artools/debian/artools/usr/bin/testingpkg create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/makepkg.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-default.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-docker.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-gnome-wobble.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-goblins.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-gremlins.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-kde-wobble.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32-goblins.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32-gremlins.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/pacman-lib32.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/patches/artix-bash.patch create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/artools/valid-names.conf create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/doc/artools/changelog.Debian.gz create mode 100644 artools/0.26.1/artools/debian/artools/usr/share/doc/artools/copyright create mode 100644 artools/0.26.1/artools/debian/changelog create mode 100644 artools/0.26.1/artools/debian/control create mode 100644 artools/0.26.1/artools/debian/copyright create mode 100644 artools/0.26.1/artools/debian/debhelper-build-stamp create mode 100644 artools/0.26.1/artools/debian/files create mode 100644 artools/0.26.1/artools/debian/patches/1 create mode 100644 artools/0.26.1/artools/debian/patches/add-flto-to-LDFLAGS-for-clang.patch create mode 100644 artools/0.26.1/artools/debian/patches/comparepkg-fix.patch create mode 100644 artools/0.26.1/artools/debian/patches/series create mode 100755 artools/0.26.1/artools/debian/rules create mode 100644 artools/0.26.1/artools/debian/source/format create mode 100644 artools/0.26.1/artools/lib/base/chroot-version.sh create mode 100644 artools/0.26.1/artools/lib/base/chroot.sh create mode 100644 artools/0.26.1/artools/lib/base/common.sh create mode 100644 artools/0.26.1/artools/lib/base/message.sh create mode 100644 artools/0.26.1/artools/lib/base/mount.sh create mode 100644 artools/0.26.1/artools/lib/base/yaml.sh create mode 100644 artools/0.26.1/artools/lib/iso/calamares.sh create mode 100644 artools/0.26.1/artools/lib/iso/config.sh create mode 100644 artools/0.26.1/artools/lib/iso/dracut.sh create mode 100644 artools/0.26.1/artools/lib/iso/firmware.sh create mode 100644 artools/0.26.1/artools/lib/iso/grub.sh create mode 100644 artools/0.26.1/artools/lib/iso/initcpio.sh create mode 100644 artools/0.26.1/artools/lib/iso/iso.sh create mode 100644 artools/0.26.1/artools/lib/iso/mount.sh create mode 100644 artools/0.26.1/artools/lib/iso/profile.sh create mode 100644 artools/0.26.1/artools/lib/iso/services.sh create mode 100644 artools/0.26.1/artools/lib/iso/squash.sh create mode 100644 artools/0.26.1/artools/lib/iso/trap.sh create mode 100644 artools/0.26.1/artools/lib/pkg/common.sh create mode 100644 artools/0.26.1/artools/lib/pkg/deploy.sh create mode 100644 artools/0.26.1/artools/lib/pkg/git.sh create mode 100644 artools/0.26.1/artools/lib/pkg/gitea.sh create mode 100644 artools/0.26.1/artools/lib/pkg/jenkins.sh create mode 100644 artools/0.26.1/artools/lib/pkg/repo.sh create mode 100644 artools/0.26.1/artools/lib/pkg/table.sh create mode 100644 artools/0.26.1/artools/lib/util-base.sh create mode 100644 artools/0.26.1/artools/lib/util-iso.sh create mode 100644 artools/0.26.1/artools/lib/util-pkg.sh create mode 100644 artools/0.26.1/artools_0.26.1-1_amd64.buildinfo create mode 100644 artools/0.26.1/artools_0.26.1-1_amd64.changes create mode 100644 elogind/246.10/elogind-246.10/build_release/meson-logs/meson-log.txt create mode 100644 elogind/246.10/elogind-246.10/build_release/meson-private/meson.lock 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 0000000000000000000000000000000000000000..fcecf0b3531bf223217eb0366aadcddaf80ae496 GIT binary patch literal 146 zcmV;D0B!#tiwFP!000020~N}<3c^4TM&UkB@s}!Yn5+;qUa-|d3!h*#LtNO*!d@`G zy|Fud9F92zpRl0Xwsm8gC5ooZPcM6vIEcQ!$5DD$#;O8VxTwpHJ)(HwBr_U=8|ODG z?jO;FgZAMcXO7uT-f5ZY5Qh`+D7psiaGhUE)}q;TmO9$PP)k((0QKk6i;VyP0LB|b AC;$Ke literal 0 HcmV?d00001 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 8888ff880805c7b08cab2a6078476dd0c846d047..93cfaab09e5cccd28c932c9ee32cefd489163d4c 100644 GIT binary patch delta 798 zcmV+(1L6Fn7N{7I8v+aHp&bc-HsbFW9qYm(>lByDfOk+6Ou+g~P=NwUx^xT>Qz1wG zxKodPfT$d=T1{c}v`koF*69WvwYC&3sVZV{r7|XXUsDG1CISw#!=ebNb$@P(#uxpA z>{in3mBB+*eeeIumM$!qI6*`?T-|1fp@;s#>uM38B^D(}52bnV6Y2SX|DXUqknv&^ zDtf3^N`X*){d%ryp)xBcLwwjuM#;* zueSIGda+sH(|For&{mz0=S(2g+AYiN6zxnnw_V02crFy#QVa2a#bbKBmU@$XZ3(Jaf)zotC3eVBP=*WGh->#>Trn(8h zZfoffo&gMgZxAy_)EFNJU+cegyE(yALAm=yY5cl<`>OSo{ufbInP{1ttDd=XoZpYu z7|9Wr`HPhKg!spQ)R-5}DIx|WZ2zQQ|LJ~D}a+y~u8ojuGA&7|fOxmd=E zMVTk8D4=Cju&7SD>RH>5;G-=zn-&vn3LHHk#%%?9%qC`LZM+pR#sXyd^zkW2)bZ2O ztEfPY`;r{<8k$DYcB`2*OLyYrdsB9+*eH}zW|5rpaY!|SU^wHL<>LSV#zW*mM4#tH c00D#;fS>^p07``3JF&!P`vL#}000D8S{j6e8vpjN}&b#vYML4@eZio z=ajI>`mg$xGEXwha`{jun8OAcL{a`2IgqaP`ts0KYg%PKHUQHf>U<>{t{L2@^ku$_ z__YqFNd`4G*kyx=u#&Rt6E`cZ2kY*o5LU5u%}SqdP3=HRB&V(h`Bxl&H;|y*uoT`z z-F)}0c_la!^-_qU-RcpYE((S;>x+S;MFs$1iuI*8$EBuM6(Gi@=Q=t^qlnrOpGuWf zLz4m^+*mRJ@tKQHMf%c72{{rh6l=alYgDQIy!@(+1OH#1s_*AN^bs4=iQW3b4dFo> zEGTHpbE=W+yDo0yfumCw1vVL2|)Di|Tu!)lv(gn#+yS2{#v~~|t z`$A6FfOS)DCj!#`R28E5@sSQW56y04w|Yzo&H6fI&_yjqFy`?PzHw+@IY&jPzYm+C zAT7iyDdb?gK7Uh2S?fw(^G%2_lDVK^Ev%9;tm=Ek9Z6d6*9x3}U38plSBZXs^rG1j z5iKO4us7q?5v?D8MZ=(HQQi5#ICx%$Jv{EG$AUtWdSu>i)~Xr2`TgfcbFO8~vZ568 z)Y8>Ft{lH7^eMRofY+NoH4ucX#$`DH!Ewz13D|Fo> a{uO|r0RUWX_i3>U#Ao{g000001X)_m8v)J$ 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 42a28499a0e094a0ff538dd31a32a0b26fec4961..fcd983efba8a1d97982999e949b4130b22cf2840 100644 GIT binary patch delta 22976 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 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