Compare commits

..

108 Commits

Author SHA1 Message Date
b019f42ee1 chroot-run: sleep 1 after killing chroot process 2021-07-06 01:18:37 +02:00
205d668630 update pkg conf defaults 2021-07-05 22:36:00 +02:00
3ae2972d2b commitpkg: fix remove commit msg 2021-07-04 23:10:12 +02:00
5ad1bb49d1 data/pacman: sync conf with pacman-6.0.0-3 2021-07-02 00:33:22 +02:00
b7e7e4c53a buildiso: use tty7 for s6-linux-init 2021-06-29 19:07:07 -05:00
5c58a6cc5b Update 'lib/iso/services.sh'
Signed-off-by: Nathan Owens <ndowens@artixlinux.org>
2021-06-20 19:17:50 +02:00
a12d0a4778 buildiso: default to 'default' tree name 2021-06-05 16:04:09 +02:00
4293f5a967 Merge pull request 'commitpkg: adjust msg' (#52) from msg into master
Reviewed-on: artix/artools#52
2021-06-01 19:27:33 +02:00
d3e42f60e1 commitpkg: adjust msg 2021-05-30 19:43:51 +02:00
7605aaf55c buildiso: don't write calamares unpack.conf 2021-05-26 20:20:49 +02:00
b57c5e668c links-add: fix db check 2021-05-26 17:52:13 +02:00
db17939f7d buildiso: don't write postcfg.conf 2021-05-25 16:35:19 +02:00
0818ea40e8 links-add: arch backports
* handle GPGKEY with spaces
* do not accept public-only keys for signing
* use more libmakepkg to handle common compression routines
2021-05-22 20:57:29 +02:00
9b2a478aed add missing m4_include 2021-05-20 20:19:08 +02:00
2c3578a850 gitea (#51)
Reviewed-on: artix/artools#51
Co-authored-by: artoo <artoo@artixlinux.org>
Co-committed-by: artoo <artoo@artixlinux.org>
2021-05-15 20:51:00 +02:00
2dcb55cef4 gitea-api (#50)
Reviewed-on: artix/artools#50
Co-authored-by: artoo <artoo@artixlinux.org>
Co-committed-by: artoo <artoo@artixlinux.org>
2021-05-15 16:41:18 +02:00
81d890cead default to gz for repo databases 2021-05-15 00:57:33 +02:00
33685e164d commitpkg: revert git add package only 2021-05-06 19:08:17 +02:00
f419683149 proto: update 2021-05-06 18:58:13 +02:00
54f31daccb comparepkg: adjust to artix.list 2021-05-06 17:40:07 +02:00
be0cfb636e Makefile: install proto pkgbuilds 2021-05-06 17:22:26 +02:00
4108a038fa rename suite66 2021-05-06 17:22:02 +02:00
4634c78520 commitpkg: only git add the pkg dir 2021-05-06 17:11:58 +02:00
a9409d3837 update proto pkgbuiild 2021-05-06 17:11:27 +02:00
02c3a079a2 comparepkg: sort pkgs; write artix pkg moves 2021-05-06 16:19:30 +02:00
72993117fa add proto pkgbuild 2021-05-05 17:34:47 +02:00
6e0c336c67 buildiso: write proper calameres services-66.conf 2021-05-03 16:53:20 +02:00
a396dafed9 buildiso: show service msg 2021-05-03 11:07:26 +02:00
c613471459 fstabgen: arch backport 2021-05-03 11:06:48 +02:00
7abd0c9453 add 66 support for package tree 2021-04-30 22:06:13 +02:00
390cc84bbf buildiso: fix 66 service adding 2021-04-30 17:37:06 +02:00
2f1cf770cd artools/0.23 (#49)
Reviewed-on: artix/artools#49
Co-authored-by: artoo <artoo@artixlinux.org>
Co-committed-by: artoo <artoo@artixlinux.org>
2021-04-29 21:27:56 +02:00
2f5a374523 comparepkg: highlight rebuild trigger pkg 2021-04-25 16:27:20 +02:00
76ca2dfdc7 deploypkg: fix return code 2021-02-08 20:00:56 +01:00
f05688dc12 rm char 2021-02-07 10:21:13 +01:00
091b5deaa8 mkchrootpkg: only expose failed build logs instead of products 2021-02-07 10:18:53 +01:00
93e4beb61f makepkg.conf: make rsync use new-style compression in makepkg.conf 2021-01-28 15:45:54 +01:00
76b4ff511d mkchrootpkg: Expose failed build logs/products 2021-01-28 15:44:23 +01:00
2995207e6b remove code now done in live-services (#48)
buildiso: simplify dm serivce

buildiso: remove openrc specific DM service handling

remove code now done in live-services

Reviewed-on: artix/artools#48
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
2021-01-08 19:06:41 +01:00
5aa8bd3333 comparepkg: remove obsolete help opt 2021-01-05 17:58:41 +01:00
699ea06445 Merge pull request 's6: force artix-live dependency on displaymanagers' (#47) from Dudemanguy/artools:master into master
Reviewed-on: artix/artools#47
2021-01-05 17:56:22 +01:00
4b9a883113 s6: force artix-live dependency on displaymanagers
A bit of a hack, but it's good enough. The liveiso has the problem of
the display manager service starting before the artix-live service
starts. This means the artix user isn't created yet and thus autologin
fails. What needs to happen is that every display manager service should
have a dependency on artix-live. However, s6-rc has no way to specify
optional dependencies so simply adding it to the script package can't be
a solution. Instead what we can do is to just check for the existence of
these services when building the iso (this is the only case where we
care about this dependency) and manually add it to the dependencies file
and rebuild the database.
2021-01-05 10:31:48 -06:00
74ab2c71b1 v0.22 (#46)
artix-chroot: tweak msg

remove unused func & var

buildiso: small msg cosmetics

deploypkg: use full filenames on removal

readd lost get_compliant_name()

update artools-pkg.conf

links-add: don't elf read kernel documentation

chroot-run: remove & tweak msgs

links-add: unquote files var

tweak msgs

shellcheck ignore colors

remove info() and use
only use config vars in caps

Makefile: start 0.22

Reviewed-on: artix/artools#46
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
2020-12-26 00:12:19 +01:00
1f64eba1e6 refactor (#45)
fix workspace defaults

buildiso: fix pac conf selection

refactor

use load_valid_names()

Reviewed-on: artix/artools#45
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
2020-12-21 16:09:56 +01:00
442d397ac0 profile.sh: use local vars in load 2020-12-20 10:52:27 +01:00
35dbadef56 comparepkg: add list funcs 2020-12-19 23:49:49 +01:00
a9852e82e5 checkrepo (#44)
checkrepo: move arrays in place

split out new checkrepo from comparepkg

Reviewed-on: artix/artools#44
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
2020-12-19 23:11:02 +01:00
ae723c88df Merge branch 'shellcheck' 2020-12-19 15:24:16 +01:00
f08ce91d81 shellcheck 2020-12-19 15:23:20 +01:00
887ed0c343 arch: switch to GH mirror 2020-12-18 23:26:01 +01:00
1baf774b53 jenkins: update agent yaml 2020-12-16 12:07:09 +01:00
2a8f36c914 commitpkg: reenable git prune 2020-12-16 11:24:12 +01:00
ea2231980c refactor (#43)
update pkg conf

update iso conf & util-iso

unquote default display name for clone and push

fixes

mkchroot: uncomment work dir checks

mkchroot: create /etc/vconsole.conf

split out deploy.sh

rm deployiso

split out osrelease.sh

var rename of  moved conf vars
reorder m4 includes

refactor & artools-*.conf update

Reviewed-on: artix/artools#43
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
2020-12-15 11:05:15 +01:00
1ebb75a09c buildiso: fix privs 2020-12-13 19:34:34 +01:00
ee3329223d refactor (#42)
shellcheck

shellcheck

simplify artools dirs mk

remove unused m4 includes

artix-chroot: fix fstab parse

Reviewed-on: artix/artools#42
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
2020-12-13 16:44:41 +01:00
bfed603033 shellcheck (#41)
use funcs for makepkg.conf & pacman.conf

update base.conf

add missing m4 includes

signpkg: make msg consistent

shellcheck

comparepkg: fix arrays

comparepkg: put array in right place

more comment blocks

valid-names: update

add comment blocks

fixes

update m4 includes

update m4 includes

Makefile: cleanup

use m4_include()

shellcheck & rm obsolete

use repo name defs

valid-names: define all repos names here

add repo.sh

simplify check_root

reenable libdir

reorganize libs

Makefile: more fix libdir

Makefile: fix lib dir

dissolve libs

prepare m4 changes

more shellcheck

commitpkg: fix layout switch

fixes

rename artools-chroot

remove exits

artools-chroot: fix args
signpkg: fix passedfiles

deploypkg: fix passedfiles

chroot-run: fix mounting

comparepkg: fix find

buildtree: fix sync

rm obsolete

shellcheck

Reviewed-on: artix/artools#41
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
2020-12-12 20:41:12 +01:00
6721a997bd Merge pull request 's6: use s6-rc-bundle-update to add services' (#40) from Dudemanguy/artools:master into master
Reviewed-on: artix/artools#40
2020-11-29 19:31:46 +01:00
6da82fb56b s6: use s6-rc-bundle-update to add services
The s6 part of the buildiso script was originally added before the
s6-rc-bundle-update script was written which allows adding/removing
services from bundles on the fly. The s6/s6-rc/s6-linux-init backend is
being changed to always have the "default" runlevel defined so this
change in the buildiso script is necessary. The previous way of calling
s6-rc-bundle at the end of the loop will fail because the bundle will
already exist. Instead, we need to use the s6-rc-bundle-update script.
2020-11-29 12:15:31 -06:00
07ad0ef44a commitpkg: fix conditional (#39)
commitpkg: quote vars

commitpkg, support switching rebuild/stable both ways

commitpkg: fix conditional

Reviewed-on: artix/artools#39
2020-11-24 17:30:09 +01:00
6e5e89f164 commitpk: cover case if rebuild changes to staging on possible update 2020-11-23 11:31:20 +01:00
6494c1f787 split out repo defs (#38)
comparepkg: revert display name manipulation and show rebuild

valid-names: fix order

valid-names: use array data

split out repo defs

Reviewed-on: artix/artools#38
2020-11-23 00:55:25 +01:00
5d7abf194a rebuilds (#37)
use file based repo definitions

comparepkg: use case statement

comparepkg: support rebuild dir

add support for rebuild dir

Reviewed-on: artix/artools#37
2020-11-22 20:32:47 +01:00
12fb8aa279 batchpkg: add missing -u flag 2020-11-09 16:42:15 +01:00
d5e3d86210 add qt6 support 2020-10-18 17:38:17 +02:00
bfb20645c6 batchpkg: add update option 2020-10-07 22:05:50 +02:00
0b2973e802 batchpkg: add create option 2020-10-06 20:57:08 +02:00
887a587954 buildtree (#36)
reorder repos

shorten repo defaults

rename var

always enable essential repos
2020-09-20 10:25:19 +02:00
59c664fb30 update TREE_NAMES_ARTIX 2020-09-19 21:41:39 +02:00
75a9c79c72 add new repos support 2020-09-14 11:05:37 +02:00
00821f6e26 data: rm arch repos from pacman.conf 2020-09-04 00:38:20 +02:00
ceb83ff765 buildtree: fix replace invalid char 2020-08-25 21:26:01 +02:00
8b3f5899d3 disable arch extra 2020-07-31 00:24:08 +02:00
c1956b0139 start 0.20 2020-07-26 14:41:54 +02:00
4206fdeff1 buildiso: cp amd fw 2020-07-26 14:41:19 +02:00
ae41ba16c6 buildiso: rm ucode license copying, not present in latest firmware 2020-07-26 12:30:39 +02:00
cf87f88580 pkg2yaml: init pkgbase 2020-07-14 13:40:09 +02:00
76e97b3702 fixes (#35)
buildtree: fix repo msg
comparepkg: fix check_db
deploypkg: use CARCH
2020-06-14 19:59:41 +02:00
d1b2da317f comparepkg: fix color for moves 2020-06-14 13:38:07 +02:00
e59680bf11 commitpkg: simplify and cover all cases 2020-06-14 09:48:24 +02:00
defafdecce commitpkg: default to new layout 2020-06-14 09:02:48 +02:00
2c21030758 comparepkg: fix db check 2020-06-13 22:30:38 +02:00
e29cd8817a merge branch 'layout' into master 2020-06-13 20:09:27 +02:00
e551f42888 yaml (#32)
pkg2yaml: fixes

deploypkg: fix remove

pkg2yaml: change format
2020-06-12 15:24:42 +02:00
ad33bccd49 rm alpm 2020-06-08 03:02:53 +02:00
31eeaa9a0d docker (#30)
dpcker: upd pacman.conf

add docker data
2020-06-08 02:19:58 +02:00
f5daac0d67 commitpkg: commit removal of obsolete arch 2020-05-28 20:12:33 +02:00
2484ea39a4 commitpkg: support are change when moving 2020-05-28 15:54:43 +02:00
9b222bdb83 commitpkg: rm old arch on change of arch
signpkg: tweak msg
2020-05-28 10:39:19 +02:00
a3e6b17c5f deploypkg: add xz compat 2020-05-25 22:49:27 +02:00
21a37f6b00 buildtree: quote vars 2020-05-25 22:10:26 +02:00
80416b76d5 buildtree: fix import for new pkgs 2020-05-25 21:01:05 +02:00
2113ffe4c6 newrepo (#29)
buildtree: only -n creates repos

buildtree: move msg in sync func

buildtree: deprecate pkglists
2020-05-25 18:29:24 +02:00
438473c878 quote vars 2020-05-25 00:14:17 +02:00
86c5c2f47b rm signfile 2020-05-24 19:06:51 +02:00
d333c245c0 next (#28)
deploypkg: fix return codes

deploypkg: only remocve if pkg is in repo

deploypkg: refactor

move unique funcs to script

signpkg: fix typo

minor tweaks
rm commented code

signpkg: load makepkg.conf

buildpkg & deploypkg: add optarg to set repo, proves to be better in pipeline to generate cmd args
add signpkg

start 0.18

deploypkg: add sign check
2020-05-24 11:15:25 +02:00
4a650f00d7 Merge pull request 's6: use database names instead of directory names' (#27) from Dudemanguy/artools:master into master 2020-04-28 17:52:27 +02:00
08b73032a2 buildtree: add gfx group 2020-04-28 17:51:53 +02:00
1a250c2167 s6: use database names instead of directory names
It's possible for a service in s6 to exist but for its name to not
actually be the same as the name of an existing directory (ex: a
pipeline of a logger and service daemon). Instead, rework this function
to detect if a service exists based on whether it is defined in the
s6-rc database.
2020-04-27 16:42:58 -05:00
46431619f2 chroot-run: don't sync tz 2020-04-26 18:49:48 +02:00
12d2159c12 deploypkg: exclude *.log 2020-04-26 18:49:23 +02:00
3865ceab58 buildtree: support new super repos 2020-03-18 22:04:37 +01:00
890e631e1b add net pkg group 2020-03-08 16:27:08 +01:00
273e928905 mkchrootpkg: kill left over nspawn 2020-03-01 10:40:23 +01:00
f5c328f8e5 mkchrootpkg: use the chroot database to find checkpkg packages 2020-02-27 20:53:06 +01:00
4089151791 buildtree: fix team assignment for *testing & *staging 2020-02-25 10:19:51 +01:00
211579f9d7 lib/gitea: remove admin 2020-02-24 00:11:18 +01:00
2a85209e1e buildtree: fix patching 2020-02-21 15:54:49 +01:00
40d691bc85 redo arch repos 2020-02-19 23:12:37 +01:00
81 changed files with 3092 additions and 3292 deletions

View File

@@ -1,12 +1,9 @@
VERSION=0.17 VERSION=0.24
CHROOT_VERSION=0.10
TOOLS = artools TOOLS = artools
PREFIX ?= /usr PREFIX ?= /usr
SYSCONFDIR = /etc SYSCONFDIR = /etc
BINDIR = $(PREFIX)/bin BINDIR = $(PREFIX)/bin
LIBDIR = $(PREFIX)/lib
DATADIR = $(PREFIX)/share DATADIR = $(PREFIX)/share
CPIODIR = $(SYSCONFDIR)/initcpio CPIODIR = $(SYSCONFDIR)/initcpio
@@ -14,18 +11,12 @@ BASE_CONF = \
data/conf/artools-base.conf data/conf/artools-base.conf
BASE_BIN = \ BASE_BIN = \
bin/base/signfile \
bin/base/chroot-run \ bin/base/chroot-run \
bin/base/mkchroot \ bin/base/mkchroot \
bin/base/basestrap \ bin/base/basestrap \
bin/base/artools-chroot \ bin/base/artix-chroot \
bin/base/fstabgen bin/base/fstabgen
BASE_LIBS = \
$(wildcard lib/base/*.sh)
BASE_UTIL = lib/util-base.sh
BASE_DATA = \ BASE_DATA = \
$(wildcard data/pacman/pacman*.conf) $(wildcard data/pacman/pacman*.conf)
@@ -45,7 +36,10 @@ PKG_BIN = \
bin/pkg/checkpkg \ bin/pkg/checkpkg \
bin/pkg/finddeps \ bin/pkg/finddeps \
bin/pkg/find-libdeps \ bin/pkg/find-libdeps \
bin/pkg/batchpkg bin/pkg/batchpkg \
bin/pkg/signpkg \
bin/pkg/checkrepo \
bin/pkg/gitearepo
LN_COMMITPKG = \ LN_COMMITPKG = \
extrapkg \ extrapkg \
@@ -59,7 +53,8 @@ LN_COMMITPKG = \
multilib-testingpkg \ multilib-testingpkg \
multilib-stagingpkg \ multilib-stagingpkg \
kde-unstablepkg \ kde-unstablepkg \
gnome-unstablepkg gnome-unstablepkg \
rebuildpkg
LN_BUILDPKG = \ LN_BUILDPKG = \
buildpkg-system \ buildpkg-system \
@@ -89,13 +84,12 @@ LN_DEPLOYPKG = \
deploypkg-kde-wobble \ deploypkg-kde-wobble \
deploypkg-gnome-wobble deploypkg-gnome-wobble
PKG_LIBS = \
$(wildcard lib/pkg/*.sh)
PKG_UTIL = lib/util-pkg.sh
PKG_DATA = \ PKG_DATA = \
data/pacman/makepkg.conf data/pacman/makepkg.conf \
data/valid-names.conf
PROTO = \
$(wildcard data/proto/*.proto)
PATCHES = \ PATCHES = \
$(wildcard data/patches/*.patch) $(wildcard data/patches/*.patch)
@@ -104,19 +98,12 @@ ISO_CONF = \
data/conf/artools-iso.conf data/conf/artools-iso.conf
ISO_BIN = \ ISO_BIN = \
bin/iso/buildiso \ bin/iso/buildiso
bin/iso/deployiso
LN_BUILDISO = \ LN_BUILDISO = \
buildiso-gremlins \ buildiso-gremlins \
buildiso-goblins buildiso-goblins
ISO_LIBS = \
$(wildcard lib/iso/*.sh)
ISO_UTIL = lib/util-iso.sh
DIRMODE = -dm0755 DIRMODE = -dm0755
FILEMODE = -m0644 FILEMODE = -m0644
MODE = -m0755 MODE = -m0755
@@ -127,32 +114,22 @@ CHMODAW = chmod a-w
CHMODX = chmod +x CHMODX = chmod +x
BIN = $(BASE_BIN) $(PKG_BIN) $(ISO_BIN) BIN = $(BASE_BIN) $(PKG_BIN) $(ISO_BIN)
UTIL = $(BASE_UTIL) $(PKG_UTIL) $(ISO_UTIL)
all: $(BIN) $(UTIL) all: $(BIN)
EDIT_UTIL = sed -e "s|@datadir[@]|$(DATADIR)|g" \ EDIT = sed -e "s|@datadir[@]|$(DATADIR)|g" \
-e "s|@sysconfdir[@]|$(SYSCONFDIR)|g" \ -e "s|@sysconfdir[@]|$(SYSCONFDIR)|g"
-e "s|@libdir[@]|$(LIBDIR)|g" \
-e "s|@chroot_version@|$(CHROOT_VERSION)|"
EDIT_BIN = sed -e "s|@libdir[@]|$(LIBDIR)|g" %: %.in Makefile lib/util-base.sh
$(UTIL): %: %.in Makefile
@echo "GEN $@" @echo "GEN $@"
@$(RM) "$@" @$(RM) "$@"
@$(M4) $@.in | $(EDIT_UTIL) >$@ @{ echo -n 'm4_changequote([[[,]]])'; cat $@.in; } | $(M4) | $(EDIT) >$@
@$(CHMODAW) "$@"
$(BIN): %: %.in Makefile
@echo "GEN $@"
@$(RM) "$@"
@$(M4) $@.in | $(EDIT_BIN) >$@
@$(CHMODAW) "$@" @$(CHMODAW) "$@"
@$(CHMODX) "$@" @$(CHMODX) "$@"
@bash -O extglob -n "$@"
clean: clean:
$(RM) $(BIN) $(UTIL) $(RM) $(BIN)
install_base: install_base:
install $(DIRMODE) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS) install $(DIRMODE) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
@@ -161,10 +138,6 @@ install_base:
install $(DIRMODE) $(DESTDIR)$(BINDIR) install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(BASE_BIN) $(DESTDIR)$(BINDIR) install $(MODE) $(BASE_BIN) $(DESTDIR)$(BINDIR)
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/base
install $(FILEMODE) $(BASE_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(BASE_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/base
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS) install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(BASE_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS) install $(FILEMODE) $(BASE_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
@@ -183,9 +156,7 @@ install_pkg:
for l in $(LN_BUILDPKG); do $(LN) buildpkg $(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 for l in $(LN_DEPLOYPKG); do $(LN) deploypkg $(DESTDIR)$(BINDIR)/$$l; done
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg $(LN) artix-chroot $(DESTDIR)$(BINDIR)/artools-chroot
install $(FILEMODE) $(PKG_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(PKG_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS) install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(PKG_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS) install $(FILEMODE) $(PKG_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
@@ -193,6 +164,9 @@ install_pkg:
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
install $(FILEMODE) $(PATCHES) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches install $(FILEMODE) $(PATCHES) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/proto
install $(FILEMODE) $(PROTO) $(DESTDIR)$(DATADIR)/$(TOOLS)/proto
install_cpio: install_cpio:
+make CPIODIR=$(CPIODIR) DESTDIR=$(DESTDIR) -C initcpio install +make CPIODIR=$(CPIODIR) DESTDIR=$(DESTDIR) -C initcpio install
@@ -205,10 +179,6 @@ install_iso: install_cpio
for l in $(LN_BUILDISO); do $(LN) buildiso $(DESTDIR)$(BINDIR)/$$l; done for l in $(LN_BUILDISO); do $(LN) buildiso $(DESTDIR)$(BINDIR)/$$l; done
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
install $(FILEMODE) $(ISO_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(ISO_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
install: install_base install_pkg install_iso install: install_base install_pkg install_iso
.PHONY: all clean install install_base install_pkg install_iso .PHONY: all clean install install_base install_pkg install_iso

View File

@@ -18,17 +18,13 @@ artools
##### Runtime: ##### Runtime:
- base: - base:
* openssh
* rsync
* haveged
* os-prober * os-prober
* gnupg
* pacman * pacman
- pkg: - pkg:
* namcap * namcap
* git-subrepo * git-subrepo
* jq * rsync
- iso: - iso:
* dosfstools * dosfstools

View File

@@ -14,23 +14,78 @@
shopt -s extglob shopt -s extglob
. @libdir@/artools/util-base.sh 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(){ select_os(){
local os_list=( $(detect) ) count=${#os_list[@]} local os_list=( "$(detect)" ) count=${#os_list[@]}
if [[ ${count} > 1 ]];then if [[ ${count} -gt 1 ]];then
msg "Detected systems:" msg "Detected systems:"
local i=0 local i=0
for os in ${os_list[@]};do for os in "${os_list[@]}"; do
local last=${os##*:} local last=${os##*:}
case $last in case $last in
'efi') count=$((count-1)) ;; 'efi') count=$((count-1)) ;;
*) info "$i) $(get_os_name $os)"; i=$((i+1)) ;; *) msg2 "$i) $(get_os_name "$os")"; i=$((i+1)) ;;
esac esac
done done
i=0 i=0
msg "Select system to mount [0-%s] : " "$((count-1))" msg "Select system to mount [0-%s] : " "$((count-1))"
read select read -r select
else else
select=0 select=0
fi fi
@@ -39,13 +94,15 @@ select_os(){
root=${os_str%%:*} root=${os_str%%:*}
type=${type##*:} type=${type##*:}
if [[ "${type##*:}" == 'linux' ]];then if [[ "${type##*:}" == 'linux' ]];then
msg "Mounting (%s) [%s]" "$(get_os_name $os_str)" "$root" msg "Mounting (%s) [%s]" "$(get_os_name "$os_str")" "$root"
mount_os "$1" "$root" mount_os "$1" "$root"
else else
die "You can't mount %s!" "$select" die "You can't mount %s!" "$select"
fi fi
} }
#}}}
automount=false automount=false
usage() { usage() {
@@ -59,11 +116,9 @@ usage() {
echo " and ${chrootdir}." echo " and ${chrootdir}."
echo '' echo ''
echo '' echo ''
exit $1 exit "$1"
} }
orig_argv=("$0" "$@")
opts=':ha' opts=':ha'
while getopts ${opts} arg; do while getopts ${opts} arg; do
@@ -79,13 +134,13 @@ check_root
if ${automount};then if ${automount};then
chrootdir=/mnt chrootdir=/mnt
run_args=/bin/bash run_args=(/bin/bash)
select_os "${chrootdir}" select_os "${chrootdir}"
else else
chrootdir=$1 chrootdir=$1
shift shift
run_args="$@" run_args=("$@")
[[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}" [[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}"
@@ -93,4 +148,4 @@ else
chroot_add_resolv_conf "${chrootdir}" chroot_add_resolv_conf "${chrootdir}"
fi fi
SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" ${run_args[*]} SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "${run_args[@]}"

View File

@@ -22,7 +22,11 @@
shopt -s extglob shopt -s extglob
. @libdir@/artools/util-base.sh m4_include(lib/base/message.sh)
m4_include(lib/base/mount.sh)
m4_include(lib/base/chroot.sh)
#{{{ functions
copy_mirrorlist(){ copy_mirrorlist(){
cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/" cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/"
@@ -36,11 +40,13 @@ copy_keyring(){
create_min_fs(){ create_min_fs(){
msg "Creating install root at %s" "$1" 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 0755 -p "$1"/var/{cache/pacman/pkg,lib/pacman,log} "$1"/{dev,run,etc/pacman.d}
mkdir -m 1777 -p $1/tmp mkdir -m 1777 -p "$1"/tmp
mkdir -m 0555 -p $1/{sys,proc} mkdir -m 0555 -p "$1"/{sys,proc}
} }
#}}}
newroot=/mnt newroot=/mnt
hostcache=0 hostcache=0
@@ -62,11 +68,9 @@ usage() {
echo ' If no packages are given, basestrap defaults to the "base" group.' echo ' If no packages are given, basestrap defaults to the "base" group.'
echo '' echo ''
echo '' echo ''
exit $1 exit "$1"
} }
orig_argv=("$0" "$@")
opts=':C:cGiMU' opts=':C:cGiMU'
while getopts ${opts} arg; do while getopts ${opts} arg; do

View File

@@ -12,9 +12,28 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
chroot_version=0.9 m4_include(lib/base/message.sh)
m4_include(lib/base/mount.sh)
m4_include(lib/base/chroot.sh)
m4_include(lib/base/chroot-version.sh)
. @libdir@/artools/util-base.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 # umask might have been changed in /etc/profile
# ensure that sane default is set again # ensure that sane default is set again
@@ -23,7 +42,7 @@ umask 0022
working_dir='' working_dir=''
files=() files=()
mount_args=() mount_args=("-B:/etc/hosts:/etc/hosts")
usage() { usage() {
echo "Usage: ${0##*/} [options] working-dir [run arguments]" echo "Usage: ${0##*/} [options] working-dir [run arguments]"
@@ -41,8 +60,6 @@ usage() {
exit 1 exit 1
} }
orig_argv=("$0" "$@")
opts='hC:M:c:b:f:s' opts='hC:M:c:b:f:s'
while getopts ${opts} arg; do while getopts ${opts} arg; do
@@ -52,12 +69,12 @@ while getopts ${opts} arg; do
c) cache_dirs+=("$OPTARG") ;; c) cache_dirs+=("$OPTARG") ;;
f) files+=("$OPTARG") ;; f) files+=("$OPTARG") ;;
s) nosetarch=1 ;; s) nosetarch=1 ;;
b) bindmounts=("$OPTARG"); mount_args+=(${bindmounts[@]}) ;; b) bindmounts+=("$OPTARG"); mount_args+=(${bindmounts[@]}) ;;
h|?) usage ;; h|?) usage ;;
*) error "invalid argument '$arg'"; usage ;; *) error "invalid argument '$arg'"; usage ;;
esac esac
done done
shift $(($OPTIND - 1)) shift $(( OPTIND - 1 ))
(( $# < 1 )) && die 'You must specify a directory.' (( $# < 1 )) && die 'You must specify a directory.'
@@ -74,26 +91,28 @@ if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir) mapfile -t cache_dirs < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir)
fi fi
host_mirrors=($($pacconf_cmd --repo world Server 2> /dev/null | sed -r 's#(.*/)world/os/.*#\1$repo/os/$arch#')) # shellcheck disable=2016
host_mirrors=($("$pacconf_cmd" --repo world Server 2> /dev/null | sed -r 's#(.*/)world/os/.*#\1$repo/os/$arch#'))
for host_mirror in "${host_mirrors[@]}"; do for host_mirror in "${host_mirrors[@]}"; do
if [[ $host_mirror == *file://* ]]; then if [[ $host_mirror == *file://* ]]; then
# shellcheck disable=2016
host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g') host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g')
info "host mirror: %s" "$host_mirror"
in_array "$host_mirror" "${cache_dirs[@]}" || cache_dirs+=("$host_mirror") in_array "$host_mirror" "${cache_dirs[@]}" || cache_dirs+=("$host_mirror")
fi fi
done done
while read -r line; do while read -r line; do
# shellcheck disable=2016
mapfile -t lines < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" \ mapfile -t lines < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" \
--repo $line Server | sed -r 's#(.*/)[^/]+/os/.+#\1#') --repo "$line" Server | sed -r 's#(.*/)[^/]+/os/.+#\1#')
for line in "${lines[@]}"; do for line in "${lines[@]}"; do
if [[ $line = file://* ]]; then if [[ $line = file://* ]]; then
line=${line#file://} line=${line#file://}
in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line") in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line")
fi fi
done done
done < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list) done < <("$pacconf_cmd" --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list)
copy_hostconf () { 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 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
@@ -101,9 +120,9 @@ copy_hostconf () {
printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist" printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $pacman_conf ]] && cp $pacman_conf "${working_dir}/etc/pacman.conf" [[ -n $pacman_conf ]] && cp "$pacman_conf" "${working_dir}/etc/pacman.conf"
[[ -n $makepkg_conf ]] && cp $makepkg_conf "${working_dir}/etc/makepkg.conf" [[ -n $makepkg_conf ]] && cp "$makepkg_conf" "${working_dir}/etc/makepkg.conf"
local file local file
for file in "${files[@]}"; do for file in "${files[@]}"; do
@@ -114,7 +133,7 @@ copy_hostconf () {
sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "${working_dir}/etc/pacman.conf" sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "${working_dir}/etc/pacman.conf"
} }
mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}" "-B:/etc/hosts:/etc/hosts") mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}")
for cache_dir in "${cache_dirs[@]:1}"; do for cache_dir in "${cache_dirs[@]:1}"; do
mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}") mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}")
@@ -123,39 +142,29 @@ done
chroot_extra_mount() { chroot_extra_mount() {
chroot_add_resolv_conf "${working_dir}" chroot_add_resolv_conf "${working_dir}"
for arg in ${mount_args[@]}; do for arg in "${mount_args[@]}"; do
local flag=${arg%%:*} local flag=${arg%%:*} dest=${arg##*:} src=${arg%:*}
local dest=${arg##*:}
local src=${arg%:*}
src=${src#*:} src=${src#*:}
chroot_mount "${src}" "${working_dir}${dest}" "${flag}" chroot_mount "${src}" "${working_dir}${dest}" "${flag}"
done done
} }
sync_host_localtime(){
if [[ -e /etc/localtime ]]; then
cp -L /etc/localtime "${working_dir}"/etc/localtime
fi
}
umask 0022 umask 0022
# Sanity check # Sanity check
if [[ ! -f "$working_dir/.artools" ]]; then if [[ ! -f "$working_dir/.artools" ]]; then
die "'%s' does not appear to be an artix chroot." "$working_dir" die "'%s' does not appear to be an artix chroot." "$working_dir"
elif [[ $(cat "$working_dir/.artools") != ${CHROOTVERSION} ]]; then elif [[ $(cat "$working_dir/.artools") != "${CHROOTVERSION}" ]]; then
die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}" die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}"
fi fi
sync_host_localtime
chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}" chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}"
chroot_extra_mount chroot_extra_mount
copy_hostconf copy_hostconf
eval $(grep '^CARCH=' "$working_dir/etc/makepkg.conf") eval "$(grep '^CARCH=' "$working_dir/etc/makepkg.conf")"
[[ -z $nosetarch ]] || unset CARCH [[ -z $nosetarch ]] || unset CARCH

View File

@@ -14,10 +14,214 @@
shopt -s extglob shopt -s extglob
. @libdir@/artools/util-base.sh m4_include(lib/base/message.sh)
#{{{ 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() { write_source() {
local src=$1 spec= label= uuid= comment=() local src=$1 spec label uuid comment=()
label=$(lsblk -rno LABEL "$1" 2>/dev/null) label=$(lsblk -rno LABEL "$1" 2>/dev/null)
uuid=$(lsblk -rno UUID "$1" 2>/dev/null) uuid=$(lsblk -rno UUID "$1" 2>/dev/null)
@@ -45,7 +249,7 @@ write_source() {
;; ;;
esac esac
[[ $comment ]] && printf '# %s\n' "${comment[*]}" [[ -n "${comment[*]}" ]] && printf '# %s\n' "${comment[*]}"
if [[ $spec ]]; then if [[ $spec ]]; then
printf '%-20s' "$bytag=$(mangle "$spec")" printf '%-20s' "$bytag=$(mangle "$spec")"
@@ -55,7 +259,7 @@ write_source() {
} }
optstring_apply_quirks() { optstring_apply_quirks() {
local varname=$1 fstype=$2 local varname="$1" fstype="$2"
# SELinux displays a 'seclabel' option in /proc/self/mountinfo. We can't know # 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 # if the system we're generating the fstab for has any support for SELinux (as
@@ -78,7 +282,7 @@ optstring_apply_quirks() {
;; ;;
vfat) vfat)
# Before Linux v3.8, "cp" is prepended to the value of the codepage. # Before Linux v3.8, "cp" is prepended to the value of the codepage.
if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]]; then if optstring_get_option "$varname" codepage && [[ "$codepage" = cp* ]]; then
optstring_remove_option "$varname" codepage optstring_remove_option "$varname" codepage
optstring_append_option "$varname" "codepage=${codepage#cp}" optstring_append_option "$varname" "codepage=${codepage#cp}"
fi fi
@@ -86,6 +290,8 @@ optstring_apply_quirks() {
esac esac
} }
#}}}
usage() { usage() {
cat <<EOF cat <<EOF
usage: ${0##*/} [options] root usage: ${0##*/} [options] root
@@ -158,23 +364,19 @@ while read -r src target fstype opts fsroot; do
pass=0 pass=0
fi fi
if [[ $fsroot != / ]]; then if [[ $fsroot != / && $fstype != btrfs ]]; then
if [[ $fstype = btrfs ]]; then # it's a bind mount
opts+=,subvol=${fsroot#/} src=$(findmnt -funcevo TARGET "$src")$fsroot
else if [[ $src -ef $target ]]; then
# it's a bind mount # hrmm, this is weird. we're probably looking at a file or directory
src=$(findmnt -funcevo TARGET "$src")$fsroot # that was bound into a chroot from the host machine. Ignore it,
if [[ $src -ef $target ]]; then # because this won't actually be a valid mount. Worst case, the user
# hrmm, this is weird. we're probably looking at a file or directory # just re-adds it.
# that was bound into a chroot from the host machine. Ignore it, continue
# 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 fi
fstype=none
opts+=,bind
pass=0
fi fi
# filesystem quirks # filesystem quirks
@@ -203,7 +405,7 @@ done
# handle swaps devices # handle swaps devices
{ {
# ignore header # ignore header
read read -r
while read -r device type _ _ prio; do while read -r device type _ _ prio; do
options=defaults options=defaults

View File

@@ -12,7 +12,9 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-base.sh m4_include(lib/base/message.sh)
m4_include(lib/base/chroot.sh)
m4_include(lib/base/chroot-version.sh)
working_dir='' working_dir=''
umode='' umode=''
@@ -33,8 +35,6 @@ usage() {
exit 1 exit 1
} }
orig_argv=("$0" "$@")
opts='hUC:M:c:f:s' opts='hUC:M:c:f:s'
while getopts ${opts} arg; do while getopts ${opts} arg; do
@@ -53,13 +53,13 @@ while getopts ${opts} arg; do
[[ -v OPTARG ]] && chroot_args+=("$OPTARG") [[ -v OPTARG ]] && chroot_args+=("$OPTARG")
fi fi
done done
shift $(($OPTIND - 1)) shift $(( OPTIND - 1 ))
(( $# < 2 )) && die 'You must specify a directory and one or more packages.' (( $# < 2 )) && die 'You must specify a directory and one or more packages.'
check_root check_root
working_dir="$(readlink -f $1)" working_dir="$(readlink -f "$1")"
shift 1 shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.' [[ -z $working_dir ]] && die 'Please specify a working directory.'
@@ -72,9 +72,9 @@ fi
umask 0022 umask 0022
#[[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir" [[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir"
#mkdir -p "$working_dir" mkdir -p "$working_dir"
[[ ! -d $working_dir ]] && mkdir -p "$working_dir" [[ ! -d $working_dir ]] && mkdir -p "$working_dir"
@@ -94,10 +94,11 @@ for f in "${files[@]}"; do
done done
basestrap -${umode}Mc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" \ basestrap -${umode}Mc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" \
${cache_dirs[@]/#/--cachedir=} "$@" || die 'Failed to install all packages' "${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" 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 'LANG=en_US.UTF-8' > "$working_dir/etc/locale.conf"
# echo 'KEYMAP=en' > "$working_dir/etc/vconsole.conf"
echo "${CHROOTVERSION}" > "$working_dir/.artools" echo "${CHROOTVERSION}" > "$working_dir/.artools"
dbus-uuidgen --ensure="$working_dir"/etc/machine-id dbus-uuidgen --ensure="$working_dir"/etc/machine-id

View File

@@ -1,32 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-base.sh
load_makepkg_config
file_to_sign="$1"
if [ ! -e "$1" ]; then
error "%s does not exist!" "$file_to_sign"
exit 1
fi
if [[ -n "${BUILDBOT_GPGP}" ]]; then
msg2 "Signing [%s]" "${file_to_sign##*/}"
gpg --batch --passphrase "${BUILDBOT_GPGP}" --detach-sign "$file_to_sign"
else
msg2 "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..."
gpg --detach-sign --use-agent -u "${GPGKEY}" "$file_to_sign"
fi

View File

@@ -12,63 +12,206 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-iso.sh 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)
prepare_artools 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 "${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
fi
: > "${work_dir}"/grub.lock
msg "Done [/iso/boot/grub]"
fi
}
gen_iso_fn(){ gen_iso_fn(){
local vars=("artix") name local vars=("artix") name
vars+=("${PROFILE}") vars+=("${profile}")
vars+=("${INITSYS}") vars+=("${INITSYS}")
case "${REPOSITORY}" in case "${repo}" in
'gremlins'|'goblins') vars+=("${REPOSITORY}") ;; 'gremlins'|'goblins') vars+=("${repo}") ;;
esac esac
vars+=("${ISO_VERSION}") vars+=("${ISO_VERSION}")
vars+=("${ARCH}") vars+=("${arch}")
for n in ${vars[@]};do for n in "${vars[@]}"; do
name=${name:-}${name:+-}${n} name=${name:-}${name:+-}${n}
done done
echo $name echo "$name"
} }
prepare_build(){ prepare_build(){
timer_start=$(get_timer)
load_profile load_profile
local pacman_conf pac_file="pacman-default.conf" case "${repo}" in
'gremlins'|'goblins') repo="${repo}" ;;
case "${REPOSITORY}" in *) repo=default ;;
'gremlins'|'goblins') pac_file="pacman-${REPOSITORY}.conf" ;;
esac esac
pacman_conf="${DATADIR}/$pac_file" get_pacman_conf "${repo}"
[[ -f ${USER_CONF_DIR}/$pac_file ]] && pacman_conf="${USER_CONF_DIR}/$pac_file"
iso_file=$(gen_iso_fn).iso iso_file=$(gen_iso_fn).iso
iso_label="ARTIX_$(date +%Y%m)" iso_label="ARTIX_$(date +%Y%m)"
basestrap_args+=(-C ${pacman_conf}) basestrap_args+=(-C "${pacman_conf}")
work_dir=${CHROOTS_ISO}/${PROFILE}/artix work_dir=${chroots_iso}/${profile}/artix
prepare_dir "${ISO_POOL}" iso_dir="${ISO_POOL}/${profile}"
iso_dir="${ISO_POOL}/${PROFILE}" iso_root=${chroots_iso}/${profile}/iso
iso_root=${CHROOTS_ISO}/${PROFILE}/iso
live_dir=/LiveOS live_dir=/LiveOS
mnt_dir=${CHROOTS_ISO}/${PROFILE}/mnt mnt_dir=${chroots_iso}/${profile}/mnt
prepare_dir "${mnt_dir}"
prepare_dir "${iso_dir}"
prepare_dir "${iso_root}"
} }
display_settings(){ display_settings(){
msg "OPTIONS:" msg "OPTIONS:"
msg2 "PROFILE: %s" "${PROFILE}" msg2 "profile: %s" "${profile}"
msg2 "INITSYS: %s" "${INITSYS}" msg2 "INITSYS: %s" "${INITSYS}"
[[ -n ${GPG_KEY} ]] && msg2 "GPG_KEY: %s" "${GPG_KEY}" [[ -n ${GPG_KEY} ]] && msg2 "GPG_KEY: %s" "${GPG_KEY}"
@@ -80,10 +223,10 @@ display_settings(){
} }
mk_squash(){ mk_squash(){
local timer=$(get_timer)
make_sfs "${work_dir}/rootfs" make_sfs "${work_dir}/rootfs"
[[ -d "${work_dir}/livefs" ]] && make_sfs "${work_dir}/livefs" if [[ -d "${work_dir}/livefs" ]]; then
show_elapsed_time "${FUNCNAME}" "${timer}" make_sfs "${work_dir}/livefs"
fi
} }
mk_iso(){ mk_iso(){
@@ -96,29 +239,25 @@ mk_iso(){
rm -rf "${iso_dir}/${iso_file}" rm -rf "${iso_dir}/${iso_file}"
fi fi
assemble_iso assemble_iso
chown -R "${OWNER}:$(id --group ${OWNER})" "${iso_dir}" chown -R "${owner}:$(id --group "${owner}")" "${iso_dir}"
} }
mk_boot(){ mk_boot(){
local timer=$(get_timer)
run_safe "make_bootfs" run_safe "make_bootfs"
run_safe "make_grub" run_safe "make_grub"
show_elapsed_time "${FUNCNAME}" "${timer}"
} }
mk_chroots(){ mk_chroots(){
local timer=$(get_timer) load_pkgs "${root_list}"
load_pkgs "${ROOT_LIST}" "${INITSYS}"
run_safe "make_rootfs" run_safe "make_rootfs"
if [[ -n ${LIVE_LIST} ]]; then if [[ -n ${live_list} ]]; then
load_pkgs "${LIVE_LIST}" "${INITSYS}" load_pkgs "${live_list}"
run_safe "make_livefs" run_safe "make_livefs"
fi fi
show_elapsed_time "${FUNCNAME}" "${timer}"
} }
build(){ build(){
msg "Start building [%s]" "${PROFILE}" msg "Start building [%s]" "${profile}"
if ${clean_first};then if ${clean_first};then
for copy in "${work_dir}"/*; do for copy in "${work_dir}"/*; do
[[ -d $copy ]] || continue [[ -d $copy ]] || continue
@@ -137,35 +276,28 @@ build(){
rm -rf --one-file-system "${iso_root}" rm -rf --one-file-system "${iso_root}"
fi fi
case true in if ${chroot_only}; then
${chroot_only}) mk_chroots
mk_chroots warning "Continue squash: %s -p %s -sc ..." "${cmd}" "${profile}"
warning "Continue squash: %s -p %s -sc ..." "${cmd}" "${PROFILE}" exit 1
exit 1 elif ${boot_only}; then
;; mk_boot
${boot_only}) warning "Continue iso: %s -p %s -zc ..." "${cmd}" "${profile}"
mk_boot exit 1
warning "Continue iso: %s -p %s -zc ..." "${cmd}" "${PROFILE}" elif ${squash_only}; then
exit 1 mk_squash
;; warning "Continue boot: %s -p %s -bc ..." "${cmd}" "${profile}"
${squash_only}) exit 1
mk_squash elif ${iso_only}; then
warning "Continue boot: %s -p %s -bc ..." "${cmd}" "${PROFILE}" [[ ! -d ${work_dir} ]] && die "Create chroot: %s -p %s -x" "${cmd}" "${profile}"
exit 1 mk_iso
;; else
${iso_only}) mk_chroots
[[ ! -d ${work_dir} ]] && die "Create chroot: %s -p %s -x" "${cmd}" "${PROFILE}" mk_boot
mk_iso mk_squash
;; mk_iso
*) fi
mk_chroots msg "Finished building [%s]" "${profile}"
mk_boot
mk_squash
mk_iso
;;
esac
msg "Finished building [%s]" "${PROFILE}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
} }
clean_first=true clean_first=true
@@ -180,13 +312,17 @@ boot_only=false
basestrap_args=(-GMc) basestrap_args=(-GMc)
cmd=${0##*/} cmd=${0##*/}
REPOSITORY=${cmd##*-} repo=${cmd##*-}
owner=${SUDO_USER:-$USER}
profile='base'
chroots_iso="${CHROOTS_DIR}/buildiso"
arch=$(uname -m)
usage() { usage() {
echo "Usage: ${cmd} [options]" echo "Usage: ${cmd} [options]"
echo " -p <profile> Profile [default: ${PROFILE}]" echo " -p <profile> Profile [default: ${profile}]"
echo ' -r <dir> Chroots directory' echo ' -r <dir> Chroots directory'
echo " [default: ${CHROOTS_ISO}]" echo " [default: ${chroots_iso}]"
echo ' -t <dir> Target directory' echo ' -t <dir> Target directory'
echo " [default: ${ISO_POOL}]" echo " [default: ${ISO_POOL}]"
echo ' -i <name> Init system to use' echo ' -i <name> Init system to use'
@@ -205,17 +341,15 @@ usage() {
echo ' -h This help' echo ' -h This help'
echo '' echo ''
echo '' echo ''
exit $1 exit "$1"
} }
orig_argv=("$0" "$@")
opts='p:r:t:i:g:czsbxmdqh' opts='p:r:t:i:g:czsbxmdqh'
while getopts "${opts}" arg; do while getopts "${opts}" arg; do
case "${arg}" in case "${arg}" in
p) PROFILE="$OPTARG" ;; p) profile="$OPTARG" ;;
r) CHROOTS_ISO="$OPTARG" ;; r) chroots_iso="$OPTARG" ;;
t) ISO_POOL="$OPTARG" ;; t) ISO_POOL="$OPTARG" ;;
i) INITSYS="$OPTARG" ;; i) INITSYS="$OPTARG" ;;
g) GPG_KEY="$OPTARG" ;; g) GPG_KEY="$OPTARG" ;;
@@ -232,14 +366,18 @@ while getopts "${opts}" arg; do
esac esac
done done
shift $(($OPTIND - 1)) shift $(( OPTIND - 1 ))
check_root
prepare_traps
prepare_build prepare_build
${pretend} && display_settings && exit 1 ${pretend} && display_settings && exit 1
check_root
prepare_dir "${mnt_dir}"
prepare_dir "${iso_dir}"
prepare_dir "${iso_root}"
prepare_traps
build build

View File

@@ -1,73 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-iso.sh
prepare_artools
connect(){
echo "${ACCOUNT}@${FILE_HOST}:${FILE_HOME}"
}
prepare_transfer(){
DEST_DIR="/iso/${PROFILE}/"
SRC_DIR="${ISO_POOL}/${PROFILE}/"
}
sync_dir(){
msg "Start upload [%s] ..." "${PROFILE}"
rsync "${rsync_args[@]}" ${SRC_DIR} $(connect)${DEST_DIR}
msg "Done upload [%s]" "${PROFILE}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
update=false
verbose=false
rsync_args=(-aP --progress -e "ssh -p ${FILE_PORT}")
usage() {
echo "Usage: ${0##*/} [options]"
echo " -p Source folder to upload [default: ${PROFILE}]"
echo " -l Limit bandwidth in kB/s [default:${UPLIMIT}]"
echo ' -u Update remote directory'
echo ' -v Verbose output'
echo ' -h This help'
echo ''
echo ''
exit $1
}
opts='p:l:uvh'
while getopts "${opts}" arg; do
case "${arg}" in
p) PROFILE="$OPTARG" ;;
l) UPLIMIT="$OPTARG" ;;
u) update=true; rsync_args+=(-u) ;;
v) verbose=true; rsync_args+=(-v --stats) ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
timer_start=$(get_timer)
rsync_args+=(--bwlimit=${UPLIMIT})
prepare_transfer
sync_dir

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# #
# Copyright (C) 2018-19 artoo@artixlinux.org # Copyright (C) 2018-20 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers # Copyright (C) 2018 Artix Linux Developers
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@@ -12,15 +12,17 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. /usr/lib/artools/util-pkg.sh m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
prepare_artools #{{{ functions
batch_move() { batch_move() {
local name="${1:-pkg_moves}" local name="${1:-pkg_moves}"
local pkglist=${TREE_DIR_ARTIX}/$name.list local pkglist="${TREE_DIR_ARTIX}"/"$name".list
[[ -f $pkglist ]] || die "%s does not exist!" "$pkglist" [[ -f $pkglist ]] || die "%s does not exist!" "$pkglist"
while read entry;do while read -r entry; do
local pkg=${entry##*:} local pkg=${entry##*:}
local src=${entry%:*} local src=${entry%:*}
src=${src#*:} src=${src#*:}
@@ -30,44 +32,84 @@ batch_move() {
else else
msg "%s" "${dest}pkg -s ${src} -u -p ${pkg}" msg "%s" "${dest}pkg -s ${src} -u -p ${pkg}"
fi fi
done < $pkglist done < "$pkglist"
} }
# batch_upgrade() { batch_create() {
# local pkglist=${TREE_DIR_ARTIX}/pkg_upgrades.list local name="${1:-pkg_create}"
# [[ -f $pkglist ]] || die "%s does not exist!" "$pkglist" local pkglist="${TREE_DIR_ARTIX}"/"$name".list
# while read entry;do [[ -f $pkglist ]] || die "%s does not exist!" "$pkglist"
# local pkg=${entry#*:} while read -r entry; do
# local dest=${entry%:*} local pkg=${entry##*:}
# echo "buildtree -i -p ${pkg}" local group=${entry%:*}
# echo "${dest}pkg -u -p ${pkg}" group=${group#*:}
# done < $pkglist 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() { usage() {
echo "Usage: ${0##*/} [optional listname]" echo "Usage: ${0##*/} [optional listname]"
echo ' -r Run generated commands' echo ' -r Run generated commands'
echo ' -c Create subrepos from list'
echo ' -u Update subrepos from list'
echo ' -h This help' echo ' -h This help'
echo '' echo ''
echo '' echo ''
exit $1 exit "$1"
} }
movelistname=pkg_moves
runlist=false runlist=false
create=false
update=false
opts='rh' opts='rcuh'
while getopts "${opts}" arg; do while getopts "${opts}" arg; do
case "${arg}" in case "${arg}" in
r) runlist=true ;; r) runlist=true ;;
c) create=true ;;
u) update=true ;;
h|?) usage 0 ;; h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;; *) echo "invalid argument '${arg}'"; usage 1 ;;
esac esac
done done
shift $(($OPTIND - 1)) shift $(( OPTIND - 1 ))
movelistname="$1"; shift listname="$1"; shift
batch_move "$movelistname" if ${create}; then
batch_create "${listname}"
elif ${update}; then
batch_update "${listname}"
else
batch_move "${listname}"
fi

View File

@@ -12,24 +12,26 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh m4_include(lib/util-base.sh)
m4_include(lib/base/message.sh)
prepare_artools m4_include(lib/base/common.sh)
m4_include(lib/base/chroot.sh)
create_first=false create_first=false
rebuild=false rebuild=false
no_check=false
is_checkpkg=false
mkchrootpkg_args=(-c -n) mkchrootpkg_args=(-c -n)
cmd=${0##*/} cmd=${0##*/}
repo=${cmd#*-} repo=${cmd#*-}
base_devel=('base-devel') base_devel=('base-devel')
chroots_pkg="${CHROOTS_DIR}/buildpkg"
arch=$(uname -m)
usage() { usage() {
echo "Usage: ${0##*/} [options] -- [mkchrootpkg_args]" echo "Usage: ${0##*/} [options] -- [mkchrootpkg_args]"
echo " -r <dir> Create chroots in this directory" echo " -r <dir> Create chroots in this directory"
echo " -d <dir> Destination repo chroot"
echo ' -c Recreate the chroot before building' echo ' -c Recreate the chroot before building'
echo ' -m Major rebuild' echo ' -m Major rebuild'
echo ' -N Disable check() function' echo ' -N Disable check() function'
@@ -38,20 +40,19 @@ usage() {
echo '' echo ''
echo "Default mkchrootpkg_args args: ${mkchrootpkg_args[*]}" echo "Default mkchrootpkg_args args: ${mkchrootpkg_args[*]}"
echo '' echo ''
exit $1 exit "$1"
} }
orig_argv=("$0" "$@") opts='hcCNmr:d:'
opts='hcCNmr:'
while getopts "${opts}" arg; do while getopts "${opts}" arg; do
case "${arg}" in case "${arg}" in
r) CHROOTS_PKG="$OPTARG" ;; r) chroots_pkg="$OPTARG" ;;
d) repo="$OPTARG" ;;
c) create_first=true ;; c) create_first=true ;;
m) rebuild=true ;; m) rebuild=true ;;
C) is_checkpkg=true; mkchrootpkg_args+=(-C) ;; C) mkchrootpkg_args+=(-C) ;;
N) no_check=true; mkchrootpkg_args+=(-N) ;; N) mkchrootpkg_args+=(-N) ;;
h|?) usage 0 ;; h|?) usage 0 ;;
*) echo "invalid argument '%s'" "${arg}"; usage 1 ;; *) echo "invalid argument '%s'" "${arg}"; usage 1 ;;
esac esac
@@ -67,20 +68,18 @@ else
esac esac
fi fi
pacman_conf="${DATADIR}/pacman-${repo}.conf" get_pacman_conf "${repo}"
[[ -f ${USER_CONF_DIR}/pacman-${repo}.conf ]] && pacman_conf="${USER_CONF_DIR}/pacman-${repo}.conf"
makepkg_conf="${DATADIR}/makepkg.conf" get_makepkg_conf
[[ -f ${USER_CONF_DIR}/makepkg.conf ]] && makepkg_conf="${USER_CONF_DIR}/makepkg.conf"
check_root SOURCE_DATE_EPOCH check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME
mkchrootpkg_args+=("${@:$OPTIND}") mkchrootpkg_args+=("${@:$OPTIND}")
if ${create_first} || [[ ! -d "${CHROOTS_PKG}/${repo}-${ARCH}" ]];then if ${create_first} || [[ ! -d "${chroots_pkg}/${repo}-${arch}" ]];then
msg "Creating chroot for [%s] (%s)..." "${repo}" "${ARCH}" msg "Creating chroot for [%s] (%s)..." "${repo}" "${arch}"
for copy in "${CHROOTS_PKG}/${repo}-${ARCH}"/*; do for copy in "${chroots_pkg}/${repo}-${arch}"/*; do
[[ -d $copy ]] || continue [[ -d $copy ]] || continue
msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")" msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")"
@@ -91,19 +90,19 @@ if ${create_first} || [[ ! -d "${CHROOTS_PKG}/${repo}-${ARCH}" ]];then
done done
lock_close 9 lock_close 9
rm -rf --one-file-system "${CHROOTS_PKG}/${repo}-${ARCH}" rm -rf --one-file-system "${chroots_pkg}/${repo}-${arch}"
(umask 0022; mkdir -p "${CHROOTS_PKG}/${repo}-${ARCH}") (umask 0022; mkdir -p "${chroots_pkg}/${repo}-${arch}")
setarch "${ARCH}" mkchroot \ setarch "${arch}" mkchroot \
-C "${pacman_conf}" \ -C "${pacman_conf}" \
-M "${makepkg_conf}" \ -M "${makepkg_conf}" \
"${CHROOTS_PKG}/${repo}-${ARCH}/root" \ "${chroots_pkg}/${repo}-${arch}/root" \
"${base_devel[@]}" || abort "${base_devel[@]}" || abort
else else
lock 9 "${CHROOTS_PKG}/${repo}-${ARCH}/root.lock" "Locking clean chroot" lock 9 "${chroots_pkg}/${repo}-${arch}/root.lock" "Locking clean chroot"
chroot-run \ chroot-run \
-C "${pacman_conf}" \ -C "${pacman_conf}" \
-M "${makepkg_conf}" \ -M "${makepkg_conf}" \
"${CHROOTS_PKG}/${repo}-${ARCH}/root" \ "${chroots_pkg}/${repo}-${arch}/root" \
pacman -Syuu --noconfirm || abort pacman -Syuu --noconfirm || abort
fi fi
@@ -112,9 +111,5 @@ if [[ ! -v SOURCE_DATE_EPOCH ]]; then
export SOURCE_DATE_EPOCH=$(date +%s) export SOURCE_DATE_EPOCH=$(date +%s)
fi fi
timer_start=$(get_timer) msg "Building in chroot for [%s] (%s)..." "${repo}" "${arch}"
exec mkchrootpkg -r "${chroots_pkg}/${repo}-${arch}" "${mkchrootpkg_args[@]}"
msg "Building in chroot for [%s] (%s)..." "${repo}" "${ARCH}"
exec mkchrootpkg -r "${CHROOTS_PKG}/${repo}-${ARCH}" "${mkchrootpkg_args[@]}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"

View File

@@ -12,170 +12,229 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh 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)
prepare_artools #{{{ new git repo
patch_pkg(){ subrepo_clone(){
local pkg="$1" local pkg="$1"
case $pkg in local org="$2"
glibc) local name="$3"
sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \
-e '/nscd.service/d' \ msg2 "Subrepo clone [%s] from (%s)" "$pkg" "$org/$name"
-i $pkg/PKGBUILD git subrepo clone "${GIT_SSH}":"$org"/"$name".git "$pkg"
;; }
linux|linux-lts)
sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i $pkg/PKGBUILD subrepo_new(){
sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \ cd "${TREE_DIR_ARTIX}/${group}" || return
-i $pkg/config
;; local org gitname
bash) org=$(get_pkg_org "${package}")
sed -e 's|system.bash_logout)|system.bash_logout artix.bashrc)|' \ gitname=$(get_compliant_name "${package}")
-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|' \ gitearepo -cr "$gitname"
-i $pkg/PKGBUILD
cd $pkg add_team_to_repo "$gitname" "$org" "${team}"
patch -Np 1 -i ${DATADIR}/patches/artix-bash.patch
updpkgsums subrepo_clone "${package}" "$org" "$gitname"
cd ../..
;; mkdir -p "${TREE_DIR_ARTIX}/${group}/${package}/trunk"
gstreamer|gst-plugins-*|licenses)
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \ commit_jenkins_files "${package}"
-e 's|(Arch Linux)|(Artix Linux)|' \ }
-i $pkg/PKGBUILD
;; #}}}
esac
#{{{ 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(){ pull_tree_arch(){
cd ${TREE_DIR_ARCH} cd "${TREE_DIR_ARCH}" || return
for tree in ${TREE_NAMES_ARCH[@]};do for tree in "${ARCH_TREE[@]}";do
if [[ -d ${tree} ]];then if [[ -d "${tree}" ]];then
cd ${tree} ( cd "${tree}" || return
pull_tree "${tree}" "$(get_local_head)" "Arch" pull_tree "${tree}" "$(get_local_head)" "Arch"
cd .. )
else else
clone_tree "${HOST_TREE_ARCH}" "${tree}" "Arch" clone_tree "${HOST_TREE_ARCH}" "${tree}" "Arch"
fi fi
done done
} }
pull_tree_artix(){ config_tree(){
local repos=("$1") local tree="$1"
cd ${TREE_DIR_ARTIX} cd "$tree" || return
for tree in ${repos[@]};do git config --bool pull.rebase true
if [[ -d ${tree} ]];then git config commit.gpgsign true
config_tree "${tree}" if [[ -n "${GPGKEY}" ]];then
cd ${tree} git config user.signingkey "${GPGKEY}"
pull_tree "${tree}" "$(get_local_head)"
cd ..
else else
clone_tree "${HOST_TREE_ARTIX}" "${tree}" 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}" config_tree "${tree}"
fi fi
done done
} }
#}}}
#{{{ patch
patch_pkg(){
local pkgpath="$1"
local pkg=${pkgpath%/*}
pkg=${pkg##*/}
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(){ sync_pkg(){
local rsync_args=(-aWxvci --progress --delete-before --no-R --no-implied-dirs) local rsync_args=(-aWxvci --progress --delete-before --no-R --no-implied-dirs)
local src="$1" dest="$2" local src="$1" dest="$2"
msg "Sync from Arch [%s] to Artix [%s]" "${src##*archlinux/}" "${dest##*artixlinux/}"
rsync "${rsync_args[@]}" $src/ $dest/ rsync "${rsync_args[@]}" "$src"/ "$dest"/
} }
show_deps(){ show_deps(){
local src="$1" local src="$1" archver
. $src/PKGBUILD 2>/dev/null # shellcheck disable=1090
. "$src"/PKGBUILD 2>/dev/null
[[ $arch == 'any' ]] && CARCH=any archver=$(get_full_version)
local archver=$(get_full_version)
# shellcheck disable=2154
[[ -n ${pkgbase} ]] && msg2 "pkgbase: %s" "${pkgbase}" [[ -n ${pkgbase} ]] && msg2 "pkgbase: %s" "${pkgbase}"
# shellcheck disable=2154
msg2 "pkgname: %s" "${pkgname[*]}" msg2 "pkgname: %s" "${pkgname[*]}"
[[ -n $pkgdesc ]] && msg2 "pkgdesc: %s" "${pkgdesc}" # shellcheck disable=2154
[[ -n "${pkgdesc}" ]] && msg2 "pkgdesc: %s" "${pkgdesc}"
# shellcheck disable=2154
msg2 "Arch Version: %s" "$archver" msg2 "Arch Version: %s" "$archver"
msg2 "arch: %s" "$CARCH" # shellcheck disable=2154
msg2 "arch: %s" "$arch"
[[ -n ${makedepends[@]} ]] && msg2 "makedepends: %s" "${makedepends[*]}" # shellcheck disable=2154
[[ -n ${checkdepends[@]} ]] && msg2 "checkdepends: %s" "${checkdepends[*]}" [[ -n ${makedepends[*]} ]] && msg2 "makedepends: %s" "${makedepends[*]}"
[[ -n ${depends[@]} ]] && msg2 "depends: %s" "${depends[*]}" # shellcheck disable=2154
[[ -n ${optdepends[@]} ]] && msg2 "optdepends: %s" "${optdepends[@]}" [[ -n ${checkdepends[*]} ]] && msg2 "checkdepends: %s" "${checkdepends[*]}"
} # shellcheck disable=2154
[[ -n ${depends[*]} ]] && msg2 "depends: %s" "${depends[*]}"
subrepo_new(){ # shellcheck disable=2154
local group="${1:-$GROUP}" team="${2:-$TEAM}" [[ -n ${optdepends[*]} ]] && msg2 "optdepends: %s" "${optdepends[@]}"
local dest=${TREE_DIR_ARTIX}/$group/${PACKAGE}/trunk
cd ${TREE_DIR_ARTIX}/$group
msg2 "team: %s" "$team"
msg2 "group: %s" "$group"
local org=$(get_pkg_org "${PACKAGE}")
create_repo "${PACKAGE}" "$org"
add_repo_to_team "${PACKAGE}" "$org" "$team"
subrepo_clone "${PACKAGE}" "$org"
prepare_dir "$dest"
commit_jenkins_files "${PACKAGE}"
} }
from_arch(){ from_arch(){
cd ${TREE_DIR_ARTIX} cd "${TREE_DIR_ARTIX}" || return
local srcpath=$(find_pkg "${TREE_DIR_ARCH}" "${PACKAGE}") local srcpath repo archpath artixpath
[[ -z $srcpath ]] && die "Package '%s' does not exist!" "${PACKAGE}" srcpath=$(find_pkg "${TREE_DIR_ARCH}" "${package}")
[[ -z $srcpath ]] && die "Package '%s' does not exist!" "${package}"
local repo=$(find_repo "$srcpath" "${testing}" "${staging}" "${unstable}") repo=$(find_repo "$srcpath")
msg "repo: %s" "${repo#*/}"
archpath=$srcpath/repos/$repo archpath=$srcpath/$repo
local artixpath=$(find_pkg ${TREE_DIR_ARTIX} ${PACKAGE}) artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}")
local tree=${srcpath%/*}
local tree=${tree##*/}
local group=$(get_group "${PACKAGE}" "$tree")
msg "repo: %s" "$repo"
artixpath=$artixpath/trunk
show_deps "$archpath" show_deps "$archpath"
if [[ -f $artixpath/PKGBUILD ]];then if [[ -f "$artixpath"/.gitrepo ]]; then
artixpath="$artixpath"/trunk
. $artixpath/PKGBUILD 2>/dev/null if [[ -d "$artixpath" ]];then
local artixver=$(get_full_version) sync_pkg "$archpath" "$artixpath"
patch_pkg "$artixpath"
msg2 "Artix Version: %s" "$artixver" fi
else else
artixpath=${TREE_DIR_ARTIX}/$group/${PACKAGE}/trunk die "Package '%s' does not exist!" "${package}"
subrepo_new "${group}" "${repo%-*}"
fi fi
msg "Sync (%s) from Arch [%s] to Artix [%s]" "${PACKAGE}" "${archpath##*archlinux/}" "${artixpath##*artixlinux/}"
sync_pkg "$archpath" "$artixpath"
patch_pkg "$artixpath"
} }
#}}}
view_build(){ view_build(){
local archpath=$(find_pkg "${TREE_DIR_ARCH}" "${PACKAGE}") local archpath repo
[[ -z $archpath ]] && die "Package '%s' does not exist!" "${PACKAGE}" archpath=$(find_pkg "${TREE_DIR_ARCH}" "${package}")
local repo=$(find_repo "${archpath}" "${testing}" "${staging}" "${unstable}") [[ -z $archpath ]] && die "Package '%s' does not exist!" "${package}"
archpath=$archpath/repos/$repo repo=$(find_repo "${archpath}")
msg2 "repo: %s" "$repo" archpath=$archpath/$repo
msg "repo: %s" "${repo#*/}"
show_deps "$archpath" show_deps "$archpath"
} }
check_tree(){ check_tree(){
local archpath=$(find_pkg "${TREE_DIR_ARCH}" "${PACKAGE}") local archpath artixpath group
[[ -z $archpath ]] && die "Package '%s' does not exist!" "${PACKAGE}" archpath=$(find_pkg "${TREE_DIR_ARCH}" "${package}")
local artixpath=$(find_pkg "${TREE_DIR_ARTIX}" ${PACKAGE}) [[ -z $archpath ]] && die "Package '%s' does not exist!" "${package}"
local group=${artixpath%/*} artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${package}")
group=${artixpath%/*}
msg "group: %s" "${group##*/}" msg "group: %s" "${group##*/}"
[[ -z $artixpath ]] && msg2 "exists: %s" "no" [[ -z $artixpath ]] && msg2 "exists: %s" "no"
@@ -184,87 +243,82 @@ check_tree(){
sync_repos(){ sync_repos(){
${sync_arch} && pull_tree_arch ${sync_arch} && pull_tree_arch
if ${sync_artix};then ${sync_artix} && pull_tree_artix
if ${sync_group}; then
pull_tree_artix "${GROUP}"
else
pull_tree_artix "${TREE_NAMES_ARTIX[*]}"
fi
fi
} }
load_makepkg_config load_makepkg_config
load_valid_names
testing=true
staging=true
unstable=false
sync=false sync=false
sync_arch=true sync_arch=true
sync_artix=true sync_artix=true
import=false import=false
view=false view=false
createnew=false createnew=false
conf=false
unstable=false
staging=true
testing=true
sync_group=false sync_group=false
check=false check=false
PACKAGE='' package=''
TEAM='community' team='community'
GROUP=${TREE_NAMES_ARTIX[0]} group="${ARTIX_TREE[0]}"
host_tree_artix="${GIT_SSH}:artixlinux"
usage() { usage() {
echo "Usage: ${0##*/} [options]" echo "Usage: ${0##*/} [options]"
echo ' -p <pkg> Package name' echo ' -p <pkg> Package name'
echo ' -t <team> Team name (only with -n)' echo ' -t <team> Team name (only with -n)'
echo ' Possible values: core,extra,community,multilib' echo ' Possible values: core,extra,community,multilib'
echo " [default: ${TEAM}]" echo " [default: ${team}]"
echo ' -g <group> Group name, the superrepo (only with -n or -s)' echo ' -g <group> Group name, the superrepo (only with -n or -s)'
echo " [default: ${GROUP}]" echo " [default: ${group}]"
echo " -s Clone or pull repos" echo " -s Clone or pull repos"
echo " -z Don't clone or pull arch repos" echo " -a Don't clone or pull arch repos"
echo " -y Don't clone or pull artix repos" echo " -b Don't clone or pull artix repos"
echo ' -i Import a package from arch repos' echo ' -i Import a package from arch repos'
echo ' -n Make new remote subrepo and clone it' echo ' -n New remote subrepo and clone it'
echo ' -u Include kde & gnome unstable (only with -i)'
echo ' -w Exclude staging (only with -i)'
echo ' -x Exclude testing (only with -i)'
echo ' -v Check if a package is in the artix tree(s)' echo ' -v Check if a package is in the artix tree(s)'
echo ' -c View package depends' 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 ' -h This help'
echo '' echo ''
echo '' echo ''
exit $1 exit "$1"
} }
orig_argv=("$0" "$@") opts='p:t:g:sinabcvxyzh'
opts='p:t:g:uwsinxzycvh'
while getopts "${opts}" arg; do while getopts "${opts}" arg; do
case "${arg}" in case "${arg}" in
p) PACKAGE="$OPTARG" ;; p) package="$OPTARG" ;;
t) TEAM="$OPTARG" ;; t) team="$OPTARG" ;;
g) GROUP="$OPTARG"; sync_group=true ;; g) group="$OPTARG"; sync_group=true ;;
s) sync=true ;; s) sync=true ;;
z) sync_arch=false ;; a) sync_arch=false ;;
y) sync_artix=false ;; b) sync_artix=false ;;
i) import=true ;; i) import=true ;;
n) createnew=true ;; n) createnew=true ;;
w) staging=false ;;
x) testing=false ;;
u) unstable=true ;;
c) check=true ;; c) check=true ;;
v) view=true ;; v) view=true ;;
x) testing=false ;;
y) staging=false ;;
z) unstable=true ;;
h|?) usage 0 ;; h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;; *) echo "invalid argument '${arg}'"; usage 1 ;;
esac esac
done done
shift $(($OPTIND - 1)) shift $(( OPTIND - 1 ))
prepare_dir "${TREE_DIR_ARTIX}" set_arch_repos "$testing" "$staging" "$unstable"
prepare_dir "${TREE_DIR_ARCH}"
${sync} && sync_repos ${sync} && sync_repos

View File

@@ -12,12 +12,78 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh m4_include(lib/base/message.sh)
shopt -s extglob shopt -s extglob
load_makepkg_config 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() { usage() {
cat <<- _EOF_ cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] Usage: ${BASH_SOURCE[0]##*/} [OPTIONS]

188
bin/pkg/checkrepo.in Normal file
View File

@@ -0,0 +1,188 @@
#!/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)
#{{{ sogrep
query_db() {
for repo in "${searchrepos[@]}"; do
local db
db=${db_cache_dir}/${linksdb_ext}/${CARCH}/${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_ext}/${CARCH}/$repo/$pkgname
if [[ -d "$entry" ]];then
return 0
fi
return 1
}
check_db(){
local pkgpath="${1%/*}"
for repo in "${!REPOS[@]}"; do
local pkgbuild artixver
[[ -f $pkgpath/$CARCH/$repo/PKGBUILD ]] && pkgbuild=$pkgpath/$CARCH/$repo/PKGBUILD
[[ -f $pkgpath/repos/$repo-$CARCH/PKGBUILD ]] && pkgbuild=$pkgpath/repos/$repo-$CARCH/PKGBUILD
[[ -f $pkgpath/repos/$repo-any/PKGBUILD ]] && pkgbuild=$pkgpath/repos/$repo-any/PKGBUILD
# 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
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
}
update_db_cache(){
msg "Updating database cache ..."
local cachedir url
for repo in "${searchrepos[@]}"; do
cachedir=${db_cache_dir}/${linksdb_ext}/${CARCH}/${repo}
rm -rf "$cachedir"
mkdir -p "$cachedir"
msg2 "%s" "$repo"
url=${REPOS_MIRROR}/${repo}/os/${CARCH}/${repo}.${linksdb_ext}
curl -L -s "$url" | bsdtar -xf - -C "$cachedir"
done
msg "Done"
}
db_cache_dir="${XDG_CACHE_HOME:-$USER_HOME/.cache}/artools"
linksdb_ext="links.tar.${DBEXT}"
load_makepkg_config
sync=false
check=false
query=false
all_db=false
readonly tableU="%-20s %-35s %-30s %-10s"
readonly tableQ="%-20s %-45s %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> Repo name to query'
echo ' [default: all]'
echo " -s Sync repo databases"
echo ' -c Check repos'
echo ' -a Show repo db (-c)'
echo " -q Query repo databases for so libs"
echo ' -h This help'
echo ''
echo ''
exit "$1"
}
opts='r:qcsah'
while getopts "${opts}" arg; do
case "${arg}" in
r) searchrepos=("$OPTARG") ;;
s) sync=true ;;
c) check=true ;;
a) all_db=true ;;
q) query=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

View File

@@ -12,185 +12,240 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh 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)
prepare_artools #{{{ functions
get_path(){ push_tree(){
local repo="$1" pkg=trunk/PKGBUILD local tree="$1"
if [[ $repo != trunk ]]; then msg "Update (%s)" "${tree}"
[[ -f repos/$repo-${ARCH}/PKGBUILD ]] && pkg=repos/$repo-${ARCH}/PKGBUILD git push origin master
[[ -f repos/$repo-any/PKGBUILD ]] && pkg=repos/$repo-any/PKGBUILD }
fi
echo $pkg subrepo_push(){
local pkg="$1"
msg2 "Subrepo push (%s)" "$pkg"
git subrepo push "$pkg" || die "%s push failed" "$pkg"
}
subrepo_clean(){
local pkg="$1"
msg2 "Subrepo clean (%s)" "$pkg"
git subrepo clean "$pkg"
}
subrepo_pull(){
local pkg="$1"
msg2 "Subrepo pull (%s)" "$pkg"
git subrepo pull "$pkg"
} }
prepare_commit(){ prepare_commit(){
local dest="$1" # create new layout, copy & remove repos
[[ -d repos/$dest ]] && git rm -r repos/$dest if [[ -d repos ]]; then
[[ ! -d repos ]] && mkdir repos msg2 "Switching to new layout ..."
[[ ! -d repos/$dest ]] && mkdir repos/$dest [[ ! -d "$CARCH" ]] && mkdir "$CARCH"
for r in repos/*; do
local name noarch
name=${r#*/}
noarch=${name%-*}
mkdir "$CARCH/${noarch}"
cp repos/"${name}"/* "$CARCH/${noarch}/"
git add "$CARCH/${noarch}"
done
git rm -r repos
git commit -m "switch to new repo layout"
msg2 "Done switch"
fi
if [[ $action == 'add' ]] || [[ $action == 'move' ]] ;then
[[ -d "$CARCH/${repo_dest}" ]] && git rm -r "$CARCH/${repo_dest}"
[[ ! -d "$CARCH" ]] && mkdir "$CARCH"
[[ ! -d "$CARCH/${repo_dest}" ]] && mkdir "$CARCH/${repo_dest}"
fi
}
check_rebuild(){
if [[ -d "$CARCH"/"${valid_names[10]}" ]] \
&& [[ "${repo_dest}" == "${valid_names[7]}" ]]; then
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(){ check_team(){
if [[ ${REPO_SRC} == "core" && ${REPO_DEST} == "extra" ]] || \ if [[ "${repo_src}" == "${valid_names[0]}" \
[[ ${REPO_SRC} == "extra" && ${REPO_DEST} == "core" ]] || \ && "${repo_dest}" == "${valid_names[1]}" ]] || \
[[ ${REPO_SRC} == "extra" && ${REPO_DEST} == "community" ]] || \ [[ "${repo_src}" == "${valid_names[1]}" \
[[ ${REPO_SRC} == "community" && ${REPO_DEST} == "extra" ]] ;then && "${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]}" ]] ;then
local org=$(get_pkg_org "${PACKAGE}") local org gitname
add_repo_to_team "${PACKAGE}" "$org" "${REPO_DEST}" org=$(get_pkg_org "${package}")
remove_repo_from_team "${PACKAGE}" "$org" "${REPO_SRC}" gitname=$(get_compliant_name "${package}")
add_team_to_repo "$gitname" "${org}" "${repo_dest}"
remove_team_from_repo "$gitname" "${org}" "${repo_src}"
fi fi
} }
commit_pkg(){ path_config() {
local artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${PACKAGE}") [[ "${repo_src}" != 'trunk' ]] && pkgbuild="$CARCH/${repo_src}"/PKGBUILD
if [[ -n ${artixpath} ]];then if [[ ! -f "$pkgbuild" ]]; then
pkgbuild=repos/"${repo_src}-${CARCH}"/PKGBUILD
local group=${artixpath%/*} [[ -f repos/"${repo_src}"-any/PKGBUILD ]] && pkgbuild=repos/"${repo_src}"-any/PKGBUILD
cd ${group}
local head=$(get_local_head)
cd ${artixpath}
local pkgbuild=$(get_path "${REPO_SRC}")
. $pkgbuild
[[ $arch == 'any' ]] && CARCH=any
local version=$(get_full_version)
local commit_msg=""
if ${remove};then
local action='remove'
if [[ "${REPO_SRC}" == 'trunk' ]];then
local pkg=${PACKAGE}
git rm -r trunk
else
local pkg="${PACKAGE}-$version"
git rm -r repos/"${REPO_SRC}-$CARCH"
fi
commit_msg="[${REPO_SRC}] '$pkg' ${action}"
msg "Action: %s" "$commit_msg"
else
local action='modify'
commit_msg="[${REPO_SRC}] '${PACKAGE}-$version' ${action}"
msg "Action: %s" "$commit_msg"
git add .
fi
git commit -m "$commit_msg"
cd ${group}
${push} && pull_tree "${group##*/}" "$head"
# subrepo_pull "${PACKAGE}"
subrepo_push "${PACKAGE}"
subrepo_clean "${PACKAGE}"
${push} && push_tree "${group##*/}"
git prune
else
error "Package '%s' does not exist!" "${PACKAGE}"
fi fi
# shellcheck disable=1090
. "$pkgbuild"
} }
repo_commit_pkg(){ get_repo_commit_msg() {
local artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${PACKAGE}") echo "[${repo_src}] -> [${repo_dest}] '${package}-$(get_full_version)' ${action}"
if [[ -n ${artixpath} ]];then }
local group=${artixpath%/*} get_commit_msg() {
echo "[${repo_src}] '${package}-$(get_full_version)' ${action}"
}
cd ${group} commit_pkg() {
local commit_msg pkg
local head=$(get_local_head) if ${remove}; then
action='remove'
cd ${artixpath} commit_msg=$(get_commit_msg)
msg "Action: %s" "$commit_msg"
local pkgbuild=$(get_path "${REPO_SRC}") if [[ "${repo_src}" == 'trunk' ]];then
git rm -r trunk
. $pkgbuild else
[[ $arch == 'any' ]] && CARCH=any prepare_commit
git rm -r "$CARCH/${repo_src}"
local version=$(get_full_version) fi
else
if [[ ${REPO_SRC} == 'trunk' ]];then action='modify'
local action='add' commit_msg=$(get_commit_msg)
local dest="${REPO_DEST}-$CARCH"
prepare_commit "$dest"
cp trunk/* repos/$dest/
else
local action='move'
local src="${REPO_SRC}-$CARCH" dest="${REPO_DEST}-$CARCH"
[[ ! -f repos/$src/PKGBUILD ]] && die "%s does not exist!" "repos/$src/PKGBUILD"
prepare_commit "$dest"
cp repos/$src/* repos/$dest/
git rm -r repos/$src
fi
local commit_msg="[${REPO_SRC}] -> [${REPO_DEST}] '${PACKAGE}-$version' ${action}"
msg "Action: %s" "$commit_msg" msg "Action: %s" "$commit_msg"
git add . git add .
git commit -m "$commit_msg" fi
git commit -m "$commit_msg"
}
cd ${group} repo_commit_pkg() {
local commit_msg
if [[ "${repo_src}" == 'trunk' ]]; then
action='add'
commit_msg=$(get_repo_commit_msg)
msg "Action: %s" "$commit_msg"
prepare_commit
check_rebuild
cp trunk/* "$CARCH/${repo_dest}"/
else
action='move'
[[ ! -f $pkgbuild ]] && die "%s does not exist!" "$pkgbuild"
commit_msg=$(get_repo_commit_msg)
msg "Action: %s" "$commit_msg"
prepare_commit
cp "$CARCH/${repo_src}"/* "$CARCH/${repo_dest}"/
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" ${push} && pull_tree "${group##*/}" "$head"
# subrepo_pull "${package}"
# subrepo_pull "${PACKAGE}" subrepo_push "${package}"
subrepo_push "${PACKAGE}" subrepo_clean "${package}"
subrepo_clean "${PACKAGE}"
${push} && push_tree "${group##*/}" ${push} && push_tree "${group##*/}"
git prune git prune
check_team [[ "${cmd}" != 'commitpkg' ]] && check_team
else else
error "Package '%s' does not exist!" "${PACKAGE}" die "Package '%s' does not exist!" "${package}"
fi 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_makepkg_config
REPO_SRC='trunk' load_valid_names
PACKAGE=''
repo_src='trunk'
package=''
remove=false remove=false
push=false push=false
pkgbuild=trunk/PKGBUILD
cmd=${0##*/} cmd=${0##*/}
REPO_DEST=${cmd%pkg} repo_dest=${cmd%pkg}
usage() { usage() {
echo "Usage: ${0##*/} [options]" echo "Usage: ${0##*/} [options]"
echo " -s <name> Source repository [default:${REPO_SRC}]" echo " -s <name> Source repository [default:${repo_src}]"
echo ' -p <pkg> Package name' echo ' -p <pkg> Package name'
echo ' -r Delete from repo (commitpkg only)' echo ' -r Delete from repo (commitpkg only)'
echo ' -u Push' echo ' -u Push'
echo ' -h This help' echo ' -h This help'
echo '' echo ''
echo '' echo ''
exit $1 exit "$1"
} }
orig_argv=("$0" "$@")
opts='p:s:urh' opts='p:s:urh'
while getopts "${opts}" arg; do while getopts "${opts}" arg; do
case "${arg}" in case "${arg}" in
s) REPO_SRC="$OPTARG" ;; s) repo_src="$OPTARG" ;;
p) PACKAGE="$OPTARG" ;; p) package="$OPTARG" ;;
r) remove=true ;; r) remove=true ;;
u) push=true ;; u) push=true ;;
h|?) usage 0 ;; h|?) usage 0 ;;
@@ -198,14 +253,10 @@ while getopts "${opts}" arg; do
esac esac
done done
shift $(($OPTIND - 1)) shift $(( OPTIND - 1 ))
if $(is_valid_repo "${REPO_SRC}");then if is_valid_repo;then
if [[ "${cmd}" == 'commitpkg' ]];then run
commit_pkg
else
repo_commit_pkg
fi
else else
error "source repository '%s' is not valid!" "${REPO_SRC}" die "source repository '%s' is not valid!" "${repo_src}"
fi fi

View File

@@ -12,78 +12,102 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh 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)
prepare_artools
get_import_path(){ #{{{ upgrades, downgrades, moves
local pkg="$1" import_path=
for tree in ${TREE_NAMES_ARCH[@]};do remove_list(){
[[ -d ${TREE_DIR_ARCH}/$tree/$pkg/repos ]] && import_path=${TREE_DIR_ARCH}/$tree/$pkg local name="$1"
done [[ -f "${TREE_DIR_ARTIX}"/$name.list ]] && rm "${TREE_DIR_ARTIX}"/"$name".list
echo $import_path }
write_list(){
local line="$1" name="$2"
printf "%s\n" "$line" >> "${TREE_DIR_ARTIX}"/"$name".list
} }
compare_m(){ compare_m(){
local result=$(vercmp "$artixver" "$archver") case ${artixrepo} in
local artixver="$1" artixrepo="$2" archver="$3" archrepo="$4" *testing*|*staging*|*rebuild)
if [[ $artixrepo == *testing* ]] || [[ $artixrepo == *staging* ]]; then if [[ "${a}" == "${b}" ]]; then
if [[ "$archrepo" == "$artixrepo" ]]; then msg_row "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
msg_row "${table}" "${archrepo%-*}" "${artixrepo%-*}" "$pkg" "$archver" "$artixver" "${group#*-}" elif [[ "${a}" == 'staging' && "${b}" == 'rebuild' ]]; then
else msg_row_yellow "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
msg_row_notify "${table}" "${archrepo%-*}" "${artixrepo%-*}" "$pkg" "$archver" "$artixver" "${group#*-}" else
if [[ -n "$archrepo" ]]; then msg_row_green "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
printf "%s\n" "${archrepo%-*}:${artixrepo%-*}:$pkg" >> ${TREE_DIR_ARTIX}/pkg_moves.list if [[ -n "$archrepo" ]]; then
write_list "${a}:${b}:$pkg" pkg_moves
else
write_list "@repo@:${b}:$pkg" artix
fi
fi fi
fi ;;
esac
fi
} }
compare_u(){ compare_u(){
local result=$(vercmp "$artixver" "$archver") if [ "$result" -eq -1 ];then
local artixver="$1" artixrepo="$2" archver="$3" archrepo="$4" msg_row_red "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
if [ $result -eq -1 ];then write_list "${a}:$pkg" pkg_upgrades
msg_row_upgrade "${table}" "${archrepo%-*}" "${artixrepo%-*}" "$pkg" "$archver" "$artixver" "${group#*-}"
printf "%s\n" "${archrepo%-*}:$pkg" >> ${TREE_DIR_ARTIX}/pkg_upgrades.list
fi fi
} }
compare_d(){ compare_d(){
local result=$(vercmp "$artixver" "$archver") if [ "$result" -eq 1 ];then
local artixver="$1" artixrepo="$2" archver="$3" archrepo="$4"
if [ $result -eq 1 ];then
if [[ -n "$archver" ]] && [[ -n "$archrepo" ]];then if [[ -n "$archver" ]] && [[ -n "$archrepo" ]];then
msg_row_downgrade "${table}" "${archrepo%-*}" "${artixrepo%-*}" "$pkg" "$archver" "$artixver" "${group#*-}" msg_row_yellow "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
fi fi
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(){ pre_compare(){
local func="$1" pkgpath="$2" local func="$1" pkgpath="$2" result group pkg
local group="${pkgpath%/*}" group="${pkgpath%/*}"
group=${group##*/} group=${group##*/}
local pkg=${pkgpath##*/} pkg=${pkgpath##*/}
local artixrepo=$(find_repo "$pkgpath" "${testing}" "${staging}" "${unstable}")
local pkgbuild=$pkgpath/repos/$artixrepo/PKGBUILD
if [[ -f $pkgbuild ]];then local artixrepo archrepo pkgbuild artixver archver archpath node a b
. $pkgbuild 2>/dev/null artixrepo=$(find_repo "$pkgpath")
local artixver=$(get_full_version) pkgbuild=$pkgpath/$artixrepo/PKGBUILD
local archpath=$(get_import_path $pkg) if [[ -f $pkgbuild ]]; then
local archrepo=$(find_repo "${archpath}" "${testing}" "${staging}" "${unstable}") # shellcheck disable=1090
pkgbuild=$archpath/repos/$archrepo/PKGBUILD . "$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%-*}"
if [[ -f "$pkgbuild" ]];then [[ "$node" != "$CARCH" ]] && b=${b%-*}
. $pkgbuild 2>/dev/null
local archver=$(get_full_version) if [[ -f "$pkgbuild" ]]; then
# shellcheck disable=1090
. "$pkgbuild" 2>/dev/null
archver=$(get_full_version)
fi fi
"$func" "$artixver" "$artixrepo" "$archver" "$archrepo" result=$(vercmp "$artixver" "$archver")
unset pkgver epoch pkgrel artixver archver pkgbuild archpath "$func"
unset epoch
fi fi
} }
@@ -102,15 +126,7 @@ compare_move(){
pre_compare compare_m "$pkgpath" pre_compare compare_m "$pkgpath"
} }
tree_loop(){ #}}}
local func="$1"
for tree in ${TREE_NAMES_ARTIX[@]};do
local pkgs=$(find ${TREE_DIR_ARTIX}/$tree -name trunk)
for package in ${pkgs[@]}; do
"$func" "$package"
done
done
}
show_compare_header(){ show_compare_header(){
msg_table_header "${table}" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version" "Group" msg_table_header "${table}" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version" "Group"
@@ -118,7 +134,7 @@ show_compare_header(){
show_upgrades_table(){ show_upgrades_table(){
show_compare_header show_compare_header
[[ -f ${TREE_DIR_ARTIX}/pkg_upgrades.list ]] && rm ${TREE_DIR_ARTIX}/pkg_upgrades.list remove_list pkg_upgrades
tree_loop compare_upgrades tree_loop compare_upgrades
} }
@@ -129,177 +145,60 @@ show_downgrades_table(){
show_move_table(){ show_move_table(){
show_compare_header show_compare_header
[[ -f ${TREE_DIR_ARTIX}/pkg_moves.list ]] && rm ${TREE_DIR_ARTIX}/pkg_moves.list remove_list pkg_moves
remove_list artix
tree_loop compare_move tree_loop compare_move
} }
update_db_cache(){
msg "Updating database cache"
for repo in "${searchrepos[@]}"; do
local cachedir=${db_cache_dir}/${LINKSDBEXT}/${ARCH}/${repo}
rm -rf "$cachedir"
mkdir -p "$cachedir"
msg2 "%s" "$repo"
curl -L -s "${REPOS_MIRROR}/${repo}/os/${ARCH}/${repo}.${LINKSDBEXT}" \
| bsdtar -xf - -C "$cachedir"
done
msg "Done"
}
query_db() {
for repo in "${searchrepos[@]}"; do
local prefix=
local db=${db_cache_dir}/${LINKSDBEXT}/${ARCH}/${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
}
show_lib_table() {
${sync} && update_db_cache
msg_table_header "${tableQ}" "Repo" "Package" "Library"
query_db
}
is_db_entry() {
local pkgname="$1" repo="${REPOS[$2]}"
if [[ -d ${db_cache_dir}/${LINKSDBEXT}/${ARCH}/$repo/$pkgname ]];then
return 0
fi
return 1
}
check_db(){
local pkgpath="${1%/*}"
local pkg=${pkgpath##*/}
local sarch=(any ${ARCH})
local repos=$(arch_repos "${testing}" "${staging}" "${unstable}")
for repo in ${repos[@]};do
for a in ${sarch[@]};do
local pkgbuild=$pkgpath/repos/$repo-$a/PKGBUILD
if [[ -f $pkgbuild ]];then
. $pkgbuild 2>/dev/null
local artixver=$(get_full_version)
local is_entry=false
for name in ${pkgname[@]};do
if is_db_entry "$name-$artixver" "$repo";then
is_entry=true
fi
if ! $is_entry;then
msg_row "${tableU}" "$repo" "$name" "$artixver" "$is_entry"
fi
done
unset artixver is_entry pkgbuild pkgver epoch pkgname pkgbase
fi
done
done
}
show_db_table(){
${sync} && update_db_cache
msg_table_header "${tableU}" "Repo" "Package" "Version" "Database"
tree_loop check_db
}
db_cache_dir="${XDG_CACHE_HOME:-$USER_HOME/.cache}/artools"
load_makepkg_config load_makepkg_config
unstable=false load_valid_names
testing=true
staging=true staging=true
unstable=false
upgrades=false upgrades=false
downgrades=false downgrades=false
move=false move=false
check=false
sync=false
query=false
testing=true
readonly table="%-18s %-18s %-25s %-27s %-27s %-10s" readonly table="%-18s %-18s %-25s %-27s %-27s %-10s"
readonly tableU="%-20s %-35s %-30s %-10s"
readonly tableQ="%-20s %-45s %s"
searchrepos=(
${REPOS[staging]}
${REPOS[testing]}
${REPOS[core]}
${REPOS[extra]}
${REPOS[community-staging]}
${REPOS[community-testing]}
${REPOS[community]}
${REPOS[multilib-staging]}
${REPOS[multilib-testing]}
${REPOS[multilib]}
${REPOS[kde-unstable]}
${REPOS[gnome-unstable]}
)
usage() { usage() {
echo "Usage: ${0##*/} [options] (with -q [libname])" echo "Usage: ${0##*/} [options]"
echo ' -u Show upgrade packages' echo ' -u Show upgrade packages'
echo ' -d Show downgrade packages' echo ' -d Show downgrade packages'
echo ' -m Show packages to move' echo ' -m Show packages to move'
echo " -z Don't inlcude testing packages" echo " -x Don't inlcude testing packages"
echo " -x Don't inlcude staging packages" echo " -y Don't inlcude staging packages"
echo ' -y Include unstable kde and gnome' echo ' -z Include unstable kde and gnome'
echo ' -c Check repos'
echo " -s Sync repo databases"
echo " -q Query repo databases for so libs"
echo ' -r <repo> Repo name to query'
echo ' [default: all]'
echo ' -h This help' echo ' -h This help'
echo '' echo ''
echo '' echo ''
exit $1 exit "$1"
} }
orig_argv=("$0" "$@") opts='udmxyzh'
opts='r:qcsudmzxyh'
while getopts "${opts}" arg; do while getopts "${opts}" arg; do
case "${arg}" in case "${arg}" in
u) upgrades=true ;; u) upgrades=true ;;
d) downgrades=true ;; d) downgrades=true ;;
m) move=true ;; m) move=true ;;
x) staging=false ;; x) testing=false ;;
y) unstable=true ;; y) staging=false ;;
z) testing=false ;; z) unstable=true ;;
c) check=true ;;
s) sync=true ;;
q) query=true ;;
r) searchrepos=("$OPTARG") ;;
h|?) usage 0 ;; h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;; *) echo "invalid argument '${arg}'"; usage 1 ;;
esac esac
done done
shift $(($OPTIND - 1)) shift $(( OPTIND - 1 ))
library="$1"; shift set_arch_repos "$testing" "$staging" "$unstable"
${move} && show_move_table ${move} && show_move_table
${upgrades} && show_upgrades_table ${upgrades} && show_upgrades_table
${downgrades} && show_downgrades_table ${downgrades} && show_downgrades_table
${check} && show_db_table
${query} && show_lib_table

View File

@@ -12,131 +12,49 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/deploy.sh)
prepare_artools #{{{ deploy
find_cached_pkgfile() { add(){
local searchdirs=("$PKGDEST" "$PWD") results=() if pkgfile=$(find_cached_pkgfile "${pkgname}"); then
local pkg="$1" msg "Found: %s" "${pkgfile}"
local search=${pkg%.*} packages+=("${pkgname}")
for dir in "${searchdirs[@]}"; do action='add'
[[ -d $dir ]] || continue ln -sfv "${pkgfile}"{,.sig} "$repo_path"/
results+=$(find "$dir" -type f -name "$search.*" ! -path '*.sig')
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 pkg="$1"
local pkgbasename name ver rel arch
pkgbasename=${pkg%.pkg.tar.?z}
arch=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$arch"}
rel=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$rel"}
ver=${pkgbasename##*-}
name=${pkgbasename%-"$ver"}
echo $name
}
update_repo2(){
local repo="$1"
local repo_path=${REPOS_ROOT}/$repo/os/${ARCH} packages=()
for name in ${passfiles[@]}; do
if pkgfile=$(find_cached_pkgfile "$name");then
info "Found: %s" "$name"
if ${add_pkg};then
local action='add'
packages+=("$name")
if ${sign_pkg};then
[[ -e ${pkgfile}.sig ]] && rm ${pkgfile}.sig
signfile ${pkgfile}
fi
ln -sf ${pkgfile}{,.sig} $repo_path/
elif ${del_pkg};then
local action='remove'
packages+=("$(get_pkgbasename "$name")")
[[ -e $repo_path/$name ]] && rm $repo_path/$name
[[ -e $repo_path/$name.sig ]] && rm $repo_path/$name.sig
fi
fi
done
cd $repo_path
if [[ -n $action ]]; then
repo-$action -R $repo.${PKGDBEXT} ${packages[@]}
${linksdb} && links-$action $repo.${LINKSDBEXT} ${packages[@]}
fi fi
return 0
} }
update_repo(){ remove(){
local repo="$1" pkgfile ver packages+=("$(get_pkgbasename "${pkgname}")")
local repo_path=${REPOS_ROOT}/$repo/os/${ARCH} packages=() action='remove'
rm -v "$repo_path"/"${pkgname}"{,.sig}
}
. PKGBUILD repo_action(){
local packages=() action func="$1"
local pkgsearch=(${pkgname[@]}) for pkgname in "${passfiles[@]}"; do
if check_option "debug" "y"; then "$func"
pkgbase=${pkgbase:-${pkgname[@]}}
pkgsearch+=("${pkgbase}-debug")
fi
for name in ${pkgsearch[@]}; do
pkgarch=$(get_pkg_arch "$name")
ver=$(get_full_version)
if pkgfile=$(find_cached_package "$name" "$ver" "$pkgarch");then
local pkg=${pkgfile##*/}
info "Found: %s" "$pkg"
if ${add_pkg};then
local action='add'
packages+=("$pkg")
if ${sign_pkg};then
[[ -e ${pkgfile}.sig ]] && rm ${pkgfile}.sig
signfile ${pkgfile}
fi
ln -sf ${pkgfile}{,.sig} $repo_path/
elif ${del_pkg};then
local action='remove'
packages+=("$name")
[[ -e $repo_path/$pkg ]] && rm $repo_path/$pkg
[[ -e $repo_path/$pkg.sig ]] && rm $repo_path/$pkg.sig
fi
fi
done done
cd $repo_path cd "$repo_path" || return
if [[ -n $action ]]; then if [[ -n "${action}" ]]; then
repo-$action -R $repo.${PKGDBEXT} ${packages[@]} repo-"${action}" -R "${dest_repo}"."${pkgdb_ext}" "${packages[@]}"
${linksdb} && links-$action $repo.${LINKSDBEXT} ${packages[@]} ${linksdb} && links-"${action}" "${dest_repo}"."${linksdb_ext}" "${packages[@]}"
fi fi
return 0
} }
#}}}
load_makepkg_config load_makepkg_config
pkgdb_ext="db.tar.${DBEXT}"
linksdb_ext="links.tar.${DBEXT}"
add_pkg=false add_pkg=false
del_pkg=false rm_pkg=false
sign_pkg=false
linksdb=false linksdb=false
cmd=${0##*/} cmd=${0##*/}
@@ -144,37 +62,40 @@ dest_repo=${cmd#*-}
usage() { usage() {
echo "Usage: ${cmd} [options]" echo "Usage: ${cmd} [options]"
echo ' -d <dest> Destination repository'
echo ' -a Add package(s) to repository' echo ' -a Add package(s) to repository'
echo ' -r Remove package(s) from repository' echo ' -r Remove package(s) from repository'
echo ' -l Use links db' echo ' -l Use links db'
echo ' -s Sign package(s)'
echo ' -h This help' echo ' -h This help'
echo '' echo ''
echo '' echo ''
exit $1 exit "$1"
} }
opts='arlsh' opts='arlhd:'
while getopts "${opts}" arg; do while getopts "${opts}" arg; do
case "${arg}" in case "${arg}" in
a) add_pkg=true; del_pkg=false ;; d) dest_repo="$OPTARG" ;;
r) del_pkg=true; add_pkg=false ;; a) add_pkg=true; rm_pkg=false ;;
r) rm_pkg=true; add_pkg=false ;;
l) linksdb=true ;; l) linksdb=true ;;
s) sign_pkg=true ;;
h|?) usage 0 ;; h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;; *) echo "invalid argument '${arg}'"; usage 1 ;;
esac esac
done done
shift $(($OPTIND - 1)) shift $(( OPTIND - 1 ))
passfiles="$@" passfiles=("$@")
prepare_dir "${REPOS_ROOT}" repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH}
if [[ -n ${passfiles[@]} ]]; then if [[ -n "${passfiles[*]}" ]]; then
update_repo2 "${dest_repo}" if ${add_pkg}; then
else repo_action add
update_repo "${dest_repo}" fi
if ${rm_pkg}; then
repo_action remove
fi
fi fi

View File

@@ -12,7 +12,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh m4_include(lib/base/message.sh)
set -e set -e
shopt -s extglob shopt -s extglob

View File

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

89
bin/pkg/gitearepo.in Normal file
View File

@@ -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> 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}"

View File

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

View File

@@ -19,6 +19,8 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
m4_include(lib/base/message.sh)
shopt -s extglob shopt -s extglob
declare -r REPO_DB_NAME="links" declare -r REPO_DB_NAME="links"
@@ -33,9 +35,7 @@ REPO_DB_PREFIX=
REPO_DB_SUFFIX= REPO_DB_SUFFIX=
LOCKFILE= LOCKFILE=
CLEAN_LOCK=0 CLEAN_LOCK=0
# PREVENT_DOWNGRADE=0 PREVENT_DOWNGRADE=0
. @libdir@/artools/util-base.sh
# ensure we have a sane umask set # ensure we have a sane umask set
umask 0022 umask 0022
@@ -53,7 +53,7 @@ Multiple packages to add can be specified on the command line.\n"
printf -- "\n" printf -- "\n"
printf -- "Options:\n" printf -- "Options:\n"
printf -- " -n, --new only add packages that are not already in the database\n" printf -- " -n, --new only add packages that are not already in the database\n"
# printf -- "$(gettext " -p, --prevent-downgrade do not add package to database if a newer version is already present\n")" printf -- " -p, --prevent-downgrade do not add package to database if a newer version is already present\n"
elif [[ $cmd == "links-remove" ]] ; then elif [[ $cmd == "links-remove" ]] ; then
printf -- "Usage: links-remove [options] <path-to-db> <packagename> ...\n" printf -- "Usage: links-remove [options] <path-to-db> <packagename> ...\n"
printf -- "\n" printf -- "\n"
@@ -73,12 +73,12 @@ packages to remove can be specified on the command line.\n"
printf -- " -k, --key <key> use the specified key to sign the database\n" printf -- " -k, --key <key> use the specified key to sign the database\n"
printf -- " -v, --verify verify database's signature before update\n" printf -- " -v, --verify verify database's signature before update\n"
printf -- "\n\ printf -- "\n\
See %s(8) for more details and descriptions of the available options.\n" $cmd See %s(8) for more details and descriptions of the available options.\n" "$cmd"
printf "\n" printf "\n"
if [[ $cmd == "links-add" ]] ; then if [[ $cmd == "links-add" ]] ; then
printf -- "Example: links-add /path/to/repo.${LINKSDBEXT} pacman-5.1.3-1-x86_64.pkg.tar.xz\n" 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 elif [[ $cmd == "links-remove" ]] ; then
printf -- "Example: links-remove /path/to/repo.${LINKSDBEXT} kernel26\n" printf -- "Example: links-remove /path/to/repo.links.tar.xz kernel26\n"
fi fi
} }
@@ -88,8 +88,8 @@ find_pkgentry() {
for pkgentry in "$tmpdir/${REPO_DB_NAME}/$pkgname"*; do for pkgentry in "$tmpdir/${REPO_DB_NAME}/$pkgname"*; do
name=${pkgentry##*/} name=${pkgentry##*/}
if [[ ${name%-*-*} = $pkgname ]]; then if [[ ${name%-*-*} = "$pkgname" ]]; then
echo $pkgentry echo "$pkgentry"
return 0 return 0
fi fi
done done
@@ -103,8 +103,8 @@ check_gpg() {
fi fi
if (( ! VERIFY )); then if (( ! VERIFY )); then
if ! gpg --list-key ${GPGKEY} &>/dev/null; then if ! gpg --list-secret-key ${GPGKEY:+"$GPGKEY"} &>/dev/null; then
if [[ ! -z $GPGKEY ]]; then if [[ -n "$GPGKEY" ]]; then
error "The key ${GPGKEY} does not exist in your keyring." error "The key ${GPGKEY} does not exist in your keyring."
elif (( ! KEY )); then elif (( ! KEY )); then
error "There is no key in your keyring." error "There is no key in your keyring."
@@ -121,11 +121,11 @@ create_signature() {
local ret=0 local ret=0
msg "Signing database '%s'..." "${dbfile##*/.tmp.}" msg "Signing database '%s'..." "${dbfile##*/.tmp.}"
local SIGNWITHKEY="" local SIGNWITHKEY=()
if [[ -n $GPGKEY ]]; then if [[ -n $GPGKEY ]]; then
SIGNWITHKEY="-u ${GPGKEY}" SIGNWITHKEY=(-u "${GPGKEY}")
fi fi
gpg --detach-sign --use-agent --no-armor ${SIGNWITHKEY} "$dbfile" &>/dev/null || ret=$? gpg --detach-sign --use-agent --no-armor "${SIGNWITHKEY[@]}" "$dbfile" &>/dev/null || ret=$?
if (( ! ret )); then if (( ! ret )); then
msg2 "Created signature file '%s'" "${dbfile##*/.tmp.}.sig" msg2 "Created signature file '%s'" "${dbfile##*/.tmp.}.sig"
@@ -155,21 +155,13 @@ verify_signature() {
} }
verify_repo_extension() { verify_repo_extension() {
local repofile=$1 local junk=()
if [[ $1 = *.links.tar* ]] && get_compression_command "$1" junk; then
return 0
fi
case $repofile in error "'%s' does not have a valid database archive extension." "$1"
*.links.tar.gz) TAR_OPT="z" ;; exit 1
*.links.tar.bz2) TAR_OPT="j" ;;
*.links.tar.xz) TAR_OPT="J" ;;
*.links.tar.zst) TAR_OPT="--zstd" ;;
*.links.tar.Z) TAR_OPT="Z" ;;
*.links.tar) TAR_OPT="" ;;
*) error "'%s' does not have a valid database archive extension." \
"$repofile"
exit 1 ;;
esac
printf '%s' "$TAR_OPT"
} }
# write an entry to the pacman database # write an entry to the pacman database
@@ -201,18 +193,18 @@ db_write_entry() {
if (( ONLYADDNEW )); then if (( ONLYADDNEW )); then
return 0 return 0
fi fi
# else else
# pkgentry=$(find_pkgentry "$pkgname") pkgentry=$(find_pkgentry "$pkgname")
# if [[ -n $pkgentry ]]; then if [[ -n $pkgentry ]]; then
#
# local version=$(sed -n '/^%VERSION%$/ {n;p;q}' "$pkgentry/desc") local version=$(sed -n '/^%VERSION%$/ {n;p;q}' "$pkgentry/desc")
# if (( $(vercmp "$version" "$pkgver") > 0 )); then if (( $(vercmp "$version" "$pkgver") > 0 )); then
# warning "$(gettext "A newer version for '%s' is already present in database")" "$pkgname" warning "A newer version for '%s' is already present in database" "$pkgname"
# if (( PREVENT_DOWNGRADE )); then if (( PREVENT_DOWNGRADE )); then
# return 0 return 0
# fi fi
# fi fi
# fi fi
fi fi
# remove an existing entry if it exists, ignore failures # remove an existing entry if it exists, ignore failures
@@ -222,7 +214,7 @@ db_write_entry() {
mkdir "$tmppkg" mkdir "$tmppkg"
bsdtar -xof $pkgfile -C $tmppkg --include={opt,{,usr/}{lib{,32},{s,}bin}}'/*' 2>/dev/null bsdtar -xof "$pkgfile" -C "$tmppkg" --include={opt,{,usr/}{lib{,32},{s,}bin}}'/*' 2>/dev/null
pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null
mkdir "$pkgname-$pkgver" mkdir "$pkgname-$pkgver"
@@ -232,10 +224,11 @@ db_write_entry() {
msg2 "Creating '%s' db entry..." "${REPO_DB_NAME}" msg2 "Creating '%s' db entry..." "${REPO_DB_NAME}"
local linksentry=$tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver/${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 $(find $tmppkg -type f); do for f in ${files}; do
readelf -d "$f" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p' readelf -d "$f" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'
done | sort -u > $linksentry done | sort -u > "$linksentry"
popd >/dev/null popd >/dev/null
popd >/dev/null popd >/dev/null
@@ -248,7 +241,8 @@ db_write_entry() {
db_remove_entry() { db_remove_entry() {
local pkgname=$1 local pkgname=$1
local notfound=1 local notfound=1
local pkgentry=$(find_pkgentry "$pkgname") local pkgentry
pkgentry=$(find_pkgentry "$pkgname")
while [[ -n $pkgentry ]]; do while [[ -n $pkgentry ]]; do
notfound=0 notfound=0
@@ -257,7 +251,8 @@ db_remove_entry() {
rm -rf "$pkgentry" rm -rf "$pkgentry"
# remove entries in "links" database # remove entries in "links" database
local linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//') local linksentry
linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//')
rm -rf "$linksentry" rm -rf "$linksentry"
pkgentry=$(find_pkgentry "$pkgname") pkgentry=$(find_pkgentry "$pkgname")
@@ -394,7 +389,6 @@ rotate_db() {
} }
create_db() { create_db() {
TAR_OPT=$(verify_repo_extension "$REPO_DB_FILE")
# $LOCKFILE is already guaranteed to be absolute so this is safe # $LOCKFILE is already guaranteed to be absolute so this is safe
dirname=${LOCKFILE%/*} dirname=${LOCKFILE%/*}
@@ -403,13 +397,13 @@ create_db() {
tempname=$dirname/.tmp.$filename tempname=$dirname/.tmp.$filename
pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null
if ( shopt -s nullglob; files=(*); (( ${#files[*]} )) ); then local files=(*)
bsdtar -c${TAR_OPT}f "$tempname" * if [[ ${files[*]} = '*' ]]; then
else
# we have no packages remaining? zip up some emptyness # we have no packages remaining? zip up some emptyness
warning "No packages remain, creating empty database." warning "No packages remain, creating empty database."
bsdtar -c${TAR_OPT}f "$tempname" -T /dev/null files=(-T /dev/null)
fi fi
bsdtar -cf - "${files[@]}" | compress_as "$filename" > "$tempname"
popd >/dev/null popd >/dev/null
create_signature "$tempname" create_signature "$tempname"
@@ -433,7 +427,7 @@ clean_up() {
[[ -d $tmpdir ]] && rm -rf "$tmpdir" [[ -d $tmpdir ]] && rm -rf "$tmpdir"
(( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE" (( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE"
exit $exit_code exit "$exit_code"
} }
# PROGRAM START # PROGRAM START
@@ -473,7 +467,7 @@ while (( $# )); do
-s|--sign) SIGN=1 ;; -s|--sign) SIGN=1 ;;
-k|--key) KEY=1 ; shift; GPGKEY=$1 ;; -k|--key) KEY=1 ; shift; GPGKEY=$1 ;;
-v|--verify) VERIFY=1 ;; -v|--verify) VERIFY=1 ;;
# -p|--prevent-downgrade) PREVENT_DOWNGRADE=1 ;; -p|--prevent-downgrade) PREVENT_DOWNGRADE=1 ;;
*) args+=("$1") ;; *) args+=("$1") ;;
esac esac
shift shift
@@ -491,7 +485,7 @@ else
LOCKFILE=$PWD/$REPO_DB_FILE.lck LOCKFILE=$PWD/$REPO_DB_FILE.lck
fi fi
verify_repo_extension "$REPO_DB_FILE" >/dev/null verify_repo_extension "$REPO_DB_FILE"
REPO_DB_PREFIX=${REPO_DB_FILE##*/} REPO_DB_PREFIX=${REPO_DB_FILE##*/}
REPO_DB_PREFIX=${REPO_DB_PREFIX%.links.*} REPO_DB_PREFIX=${REPO_DB_PREFIX%.links.*}

View File

@@ -12,7 +12,8 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-base.sh m4_include(lib/base/message.sh)
m4_include(lib/base/chroot.sh)
shopt -s nullglob shopt -s nullglob
@@ -31,7 +32,6 @@ clean_first=0
run_namcap=0 run_namcap=0
run_checkpkg=0 run_checkpkg=0
temp_chroot=0 temp_chroot=0
run_nocheck=0
bindmounts=() bindmounts=()
@@ -247,6 +247,15 @@ download_sources() {
die "Could not download sources." 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() { move_products() {
local pkgfile local pkgfile
for pkgfile in "$copydir"/pkgdest/*; do for pkgfile in "$copydir"/pkgdest/*; do
@@ -259,12 +268,7 @@ move_products() {
fi fi
done done
local l move_logfiles
for l in "$copydir"/logdest/*; do
[[ $l == */logpipe.* ]] && continue
chown "$src_owner" "$l"
mv "$l" "$LOGDEST"
done
for s in "$copydir"/srcpkgdest/*; do for s in "$copydir"/srcpkgdest/*; do
chown "$src_owner" "$s" chown "$src_owner" "$s"
@@ -278,8 +282,6 @@ move_products() {
} }
# }}} # }}}
orig_argv=("$0" "$@")
opts='hcur:I:l:nNCTb:U:' opts='hcur:I:l:nNCTb:U:'
while getopts "${opts}" arg; do while getopts "${opts}" arg; do
@@ -291,7 +293,7 @@ while getopts "${opts}" arg; do
I) install_pkgs+=("$OPTARG") ;; I) install_pkgs+=("$OPTARG") ;;
l) copy="$OPTARG" ;; l) copy="$OPTARG" ;;
n) run_namcap=1; makepkg_args+=(--install) ;; n) run_namcap=1; makepkg_args+=(--install) ;;
N) run_nocheck=1; makepkg_args+=(--nocheck) ;; N) makepkg_args+=(--nocheck) ;;
C) run_checkpkg=1 ;; C) run_checkpkg=1 ;;
T) temp_chroot=1; copy+="-$$" ;; T) temp_chroot=1; copy+="-$$" ;;
U) makepkg_user="$OPTARG" ;; U) makepkg_user="$OPTARG" ;;
@@ -377,14 +379,11 @@ if chroot-run \
"$copydir" \ "$copydir" \
/chrootbuild "${makepkg_args[@]}" /chrootbuild "${makepkg_args[@]}"
then then
pkgnames=() mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"')
for pkgfile in "$copydir"/pkgdest/*; do
pkgfile=${pkgfile##*/};
pkgnames+=("${pkgfile%-*-*-*}");
done
move_products move_products
else else
(( ret += 1 )) (( ret += 1 ))
move_logfiles
fi fi
(( temp_chroot )) && delete_chroot "$copydir" "$copy" (( temp_chroot )) && delete_chroot "$copydir" "$copy"
@@ -398,27 +397,28 @@ if (( ret != 0 )); then
else else
if (( run_checkpkg )); then if (( run_checkpkg )); then
msg "Running checkpkg" msg "Running checkpkg"
# sync off-site databases for up-to-date queries
trap 'rm -rf $dbpath; cleanup' EXIT INT TERM QUIT
dbpath=$(mktemp -d --tmpdir makechrootpkg-database.XXXXXXXXXX)
mkdir -p "$dbpath"
pacman -Sy --dbpath "$dbpath" --logfile /dev/null
# query current package locations mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \
remotepkgs=($(pacman -Sddp --dbpath "$dbpath" --logfile /dev/null "${pkgnames[@]}")) --dbpath "$copydir"/var/lib/pacman \
if (( $? )); then -Sddp "${pkgnames[@]}")
if ! wait $!; then
warning "Skipped checkpkg due to missing repo packages" warning "Skipped checkpkg due to missing repo packages"
exit 0 exit 0
fi fi
# download package files if any non-local location exists # download package files if any non-local location exists
for remotepkg in "${remotepkgs[@]}"; do for remotepkg in "${remotepkgs[@]}"; do
[[ $remotepkg == file://* ]] && continue if [[ $remotepkg != file://* ]]; then
msg2 "Downloading current versions" msg2 "Downloading current versions"
pacman --noconfirm -Swdd --dbpath "$dbpath" --logfile /dev/null "${pkgnames[@]}" chroot-run "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}"
break mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \
--dbpath "$copydir"/var/lib/pacman \
-Sddp "${pkgnames[@]}")
break
fi
done done
msg2 "Checking packages" msg2 "Checking packages"
sudo -u "$makepkg_user" checkpkg --rmdir --warn sudo -u "$makepkg_user" checkpkg --rmdir --warn "${remotepkgs[@]/#file:\/\//}"
fi fi
true true
fi fi

View File

@@ -12,9 +12,12 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
. @libdir@/artools/util-base.sh m4_include(lib/base/message.sh)
m4_include(lib/base/yaml.sh)
write_attr(){ #{{{ functions
srcyaml_write_attr(){
local ident1="$1" ident2="$2" ident3="$3" local ident1="$1" ident2="$2" ident3="$3"
local attrname=$4 attrvalues=("${@:5}") local attrname=$4 attrvalues=("${@:5}")
@@ -24,47 +27,41 @@ write_attr(){
attrvalues=("${attrvalues[@]%[[:space:]]}") attrvalues=("${attrvalues[@]%[[:space:]]}")
case $attrname in case $attrname in
makedepends|checkdepends|depends|provides|arch) pkgver|pkgrel|epoch|url|install|changelog)
Yaml+=$(write_yaml_map $ident1 "$attrname") for v in "${attrvalues[@]}"; do
for v in ${attrvalues[@]};do Yaml+=$(write_yaml_map "$ident3" "$attrname" "$v")
Yaml+=$(write_yaml_seq $ident2 "$v")
done done
;; ;;
*) *)
for v in ${attrvalues[@]};do Yaml+=$(write_yaml_map "$ident1" "$attrname")
Yaml+=$(write_yaml_map $ident3 "$attrname" "$v") for v in "${attrvalues[@]}"; do
Yaml+=$(write_yaml_seq "$ident2" "$v")
done done
;; ;;
esac esac
} }
extract_info() { pkgbuild_extract_to_yaml() {
local pkgname=$1 attrname=$2 isarray=$3 outvalue= local pkgname=$1 attrname=$2 isarray=$3 outvalue=
if get_pkgbuild_attribute "$pkgname" "$attrname" "$isarray" 'outvalue'; then if get_pkgbuild_attribute "$pkgname" "$attrname" "$isarray" 'outvalue'; then
[[ -z $pkgname ]] && write_attr 2 4 2 "$attrname" "${outvalue[@]}" [[ -z $pkgname ]] && srcyaml_write_attr 2 4 2 "$attrname" "${outvalue[@]}"
[[ -n $pkgname ]] && write_attr 4 6 2 "$attrname" "${outvalue[@]}" [[ -n $pkgname ]] && srcyaml_write_attr 4 6 2 "$attrname" "${outvalue[@]}"
fi fi
} }
write_details() { srcyaml_write_section_details() {
local attr package_arch a local attr package_arch a
local multivalued_arch_attrs=(provides depends makedepends checkdepends) local multivalued_arch_attrs=(source provides conflicts depends replaces
optdepends makedepends checkdepends)
local singlevalued=() # "${known_hash_algos[@]/%/sums}")
local multivalued=(arch provides depends checkdepends)
if [[ -z "$1" ]];then
singlevalued=(pkgver pkgrel epoch)
multivalued=(arch provides depends makedepends checkdepends)
fi
for attr in "${singlevalued[@]}"; do for attr in "${singlevalued[@]}"; do
extract_info "$1" "$attr" 0 pkgbuild_extract_to_yaml "$1" "$attr" 0
done done
for attr in "${multivalued[@]}"; do for attr in "${multivalued[@]}"; do
extract_info "$1" "$attr" 1 pkgbuild_extract_to_yaml "$1" "$attr" 1
done done
get_pkgbuild_attribute "$1" 'arch' 1 'package_arch' get_pkgbuild_attribute "$1" 'arch' 1 'package_arch'
@@ -73,56 +70,69 @@ write_details() {
[[ $a = any ]] && continue [[ $a = any ]] && continue
for attr in "${multivalued_arch_attrs[@]}"; do for attr in "${multivalued_arch_attrs[@]}"; do
extract_info "$1" "${attr}_$a" 1 pkgbuild_extract_to_yaml "$1" "${attr}_$a" 1
done done
done done
} }
write_pkg_yaml(){ yaml_write_global() {
local singlevalued=(pkgver pkgrel epoch url install changelog) #pkgdesc
Yaml=$(write_yaml_header) 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_empty_line)
local full=$(get_full_version)
local ver=${full:-0}
pkgbase=${pkgbase:-${pkgname[0]}}
Yaml+=$(write_yaml_map 0 "pkgbase") Yaml+=$(write_yaml_map 0 "pkgbase")
Yaml+=$(write_yaml_map 2 "pkgname" "${pkgbase}") Yaml+=$(write_yaml_map 2 "name" "${pkgbase:-$pkgname}")
${details} && write_details '' ${details} && srcyaml_write_section_details ''
Yaml+=$(write_yaml_map 2 "fullver" "${ver}")
Yaml+=$(write_empty_line) Yaml+=$(write_empty_line)
}
Yaml+=$(write_yaml_map 0 "package") 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 for pkg in "${pkgname[@]}"; do
Yaml+=$(write_yaml_seq_map 2 "pkgname" "$pkg") Yaml+=$(write_yaml_seq_map 2 "pkgname" "$pkg")
${details} && write_details "$pkg" ${details} && srcyaml_write_section_details "$pkg"
done done
Yaml+=$(write_empty_line) Yaml+=$(write_empty_line)
}
local pkgfile=$(print_all_package_names) yaml_write_fileinfo(){
local version
Yaml+=$(write_yaml_map 0 "pkgfile") version=$(get_full_version)
for f in ${pkgfile[@]};do 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##*/}") Yaml+=$(write_yaml_seq 2 "${f##*/}")
done done
Yaml+=$(write_empty_line) Yaml+=$(write_empty_line)
}
write_srcyaml(){
Yaml=$(write_yaml_header)
yaml_write_global
yaml_write_package
yaml_write_fileinfo
printf '%s' "${Yaml}" printf '%s' "${Yaml}"
} }
#}}}
usage() { usage() {
echo "Usage: ${0##*/} [options]" echo "Usage: ${0##*/} [options]"
echo " -d Don't include details" echo " -d Don't include details"
echo ' -h This help' echo ' -h This help'
echo '' echo ''
exit $1 exit "$1"
} }
details=true details=true
@@ -137,13 +147,16 @@ while getopts "${opts}" arg; do
esac esac
done done
shift $(( $OPTIND - 1 )) shift $(( OPTIND - 1 ))
[[ -f "$1"/PKGBUILD ]] || die "%s/PKGBUILD does not exist!" "$1" srcpath=$(readlink -f "$1")
PACKAGE="$1"/PKGBUILD; shift
. "$PACKAGE" [[ -f "$srcpath"/PKGBUILD ]] || die "%s/PKGBUILD does not exist!" "$srcpath"
package="$srcpath"/PKGBUILD; shift
# shellcheck disable=1090
. "${package}"
load_makepkg_config load_makepkg_config
write_pkg_yaml write_srcyaml

46
bin/pkg/signpkg.in Normal file
View File

@@ -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

View File

@@ -6,4 +6,4 @@
# CHROOTS_DIR=/var/lib/artools # CHROOTS_DIR=/var/lib/artools
# the workspace directory # the workspace directory
# WORKSPACE_DIR="/home/${OWNER}/artools-workspace" # WORKSPACE_DIR="${USER_HOME}/artools-workspace"

View File

@@ -8,14 +8,8 @@
# the dist release; default: auto # the dist release; default: auto
# ISO_VERSION=$(date +%Y%m%d) # ISO_VERSION=$(date +%Y%m%d)
# possible values: openrc, runit, s6 # possible values: openrc, runit, s6, suite66
# INITSYS="openrc" # INITSYS="openrc"
# gpg key; leave empty or commented to skip img signing # gpg key; leave empty or commented to skip img signing
# GPG_KEY="" # GPG_KEY=""
# set upload bandwidth limit in kB/s
# UPLIMIT=1000
# the server user
# ACCOUNT=[SetUser]

View File

@@ -2,44 +2,50 @@
################ artools-pkg ################ ################ artools-pkg ################
############################################# #############################################
# gitea user access token # gitea user access token for buildtree
# GIT_TOKEN='' # GIT_TOKEN=''
# HOST_TREE_ARTIX='gitea@gitea.artixlinux.org:artixlinux'
# TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux # TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux
# customize buildtree, packages and community should be enabled # customize buildtree; uncomment to include
# TREE_NAMES_ARTIX=( # TREE_NAMES_ARTIX=(
# packages
# community
# packages-kernel # packages-kernel
# packages-openrc # packages-openrc
# packages-runit # packages-runit
# packages-s6 # packages-s6
# packages-media # packages-suite66
# packages-xorg # python-world
# packages-python
# packages-perl # packages-perl
# packages-java # packages-java
# packages-qt5
# packages-devel
# packages-ruby # packages-ruby
# packages-gtk # packages-kf5
# packages-plasma
# packages-kde
# packages-gnome # packages-gnome
# packages-cinnamon # packages-cinnamon
# packages-lxqt # packages-lxqt
# packages-mate # packages-mate
# packages-kde
# packages-xfce # packages-xfce
# packages-wm
# packages-devel
# packages-lib32
# packages-qt6
# packages-office
# packages-misc
# packages-python
# python-galaxy
# ) # )
# HOST_TREE_ARCH=git://git.archlinux.org/svntogit
# TREE_DIR_ARCH=${WORKSPACE_DIR}/archlinux # TREE_DIR_ARCH=${WORKSPACE_DIR}/archlinux
# default repos root # default repos root for deploypkg
# REPOS_ROOT=${WORKSPACE_DIR}/repos # REPOS_ROOT=${WORKSPACE_DIR}/repos
# default mirror for sogrep # default mirror for checkrepo
# REPOS_MIRROR="http://mirror1.artixlinux.org/repos" # REPOS_MIRROR="http://mirror1.artixlinux.org/repos"
# enable if trouble with default github arch mirror
# ARCH_TREE=(packages community)
# enable if trouble with default github arch mirror
# HOST_TREE_ARCH='https://git.archlinux.org/svntogit'

View File

@@ -26,6 +26,7 @@ DLAGENTS=('file::/usr/bin/curl -gqC - -o %o %u'
#-- The package required by makepkg to download VCS sources #-- The package required by makepkg to download VCS sources
# Format: 'protocol::package' # Format: 'protocol::package'
VCSCLIENTS=('bzr::bzr' VCSCLIENTS=('bzr::bzr'
'fossil::fossil'
'git::git' 'git::git'
'hg::mercurial' 'hg::mercurial'
'svn::subversion') 'svn::subversion')
@@ -38,21 +39,25 @@ CARCH="x86_64"
CHOST="x86_64-pc-linux-gnu" CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags #-- Compiler and Linker Flags
CPPFLAGS="-D_FORTIFY_SOURCE=2" #CPPFLAGS=""
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt" CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt" -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" LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
#RUSTFLAGS="-C opt-level=2"
#-- Make Flags: change this for DistCC/SMP systems #-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2" #MAKEFLAGS="-j2"
#-- Debugging flags #-- Debugging flags
DEBUG_CFLAGS="-g -fvar-tracking-assignments" DEBUG_CFLAGS="-g -fvar-tracking-assignments"
DEBUG_CXXFLAGS="-g -fvar-tracking-assignments" DEBUG_CXXFLAGS="-g -fvar-tracking-assignments"
#DEBUG_RUSTFLAGS="-C debuginfo=2"
######################################################################### #########################################################################
# BUILD ENVIRONMENT # BUILD ENVIRONMENT
######################################################################### #########################################################################
# #
# Defaults: BUILDENV=(!distcc !color !ccache check !sign) # Makepkg defaults: BUILDENV=(!distcc !color !ccache check !sign)
# A negated environment option will do the opposite of the comments below. # A negated environment option will do the opposite of the comments below.
# #
#-- distcc: Use the Distributed C/C++/ObjC compiler #-- distcc: Use the Distributed C/C++/ObjC compiler
@@ -75,7 +80,7 @@ BUILDENV=(!distcc color !ccache check !sign)
# These are default values for the options=() settings # These are default values for the options=() settings
######################################################################### #########################################################################
# #
# Default: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug) # Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto)
# A negated option will do the opposite of the comments below. # A negated option will do the opposite of the comments below.
# #
#-- strip: Strip symbols from binaries/libraries #-- strip: Strip symbols from binaries/libraries
@@ -86,11 +91,12 @@ BUILDENV=(!distcc color !ccache check !sign)
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip #-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS #-- purge: Remove files specified by PURGE_TARGETS
#-- debug: Add debugging flags as specified in DEBUG_* variables #-- 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) OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug !lto)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512 #-- File integrity checks to use. Valid: md5, sha1, sha224, sha256, sha384, sha512, b2
INTEGRITY_CHECK=(md5) INTEGRITY_CHECK=(sha256)
#-- Options to be used when stripping binaries. See `man strip' for details. #-- Options to be used when stripping binaries. See `man strip' for details.
STRIP_BINARIES="--strip-all" STRIP_BINARIES="--strip-all"
#-- Options to be used when stripping shared libraries. See `man strip' for details. #-- Options to be used when stripping shared libraries. See `man strip' for details.
@@ -146,4 +152,10 @@ COMPRESSLZ=(lzip -c -f)
PKGEXT='.pkg.tar.zst' PKGEXT='.pkg.tar.zst'
SRCEXT='.src.tar.gz' 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: # vim: set ft=sh ts=2 sw=2 et:

View File

@@ -31,9 +31,11 @@ Architecture = auto
# Misc options # Misc options
#UseSyslog #UseSyslog
#Color #Color
#TotalDownload NoProgressBar
CheckSpace # We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring # 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. # trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -43,7 +45,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local # 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 # keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`. # packagers with `pacman-key --populate artix`.
# #
# REPOSITORIES # REPOSITORIES
@@ -83,39 +85,8 @@ Include = /etc/pacman.d/mirrorlist
[galaxy] [galaxy]
Include = /etc/pacman.d/mirrorlist 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 # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]
#SigLevel = Optional TrustAll #SigLevel = Optional TrustAll
#Server = file:///home/custompkgs #Server = file:///home/custompkgs
#
# ARCHLINUX
#
#[testing]
#Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
#[community-testing]
#Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -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

View File

@@ -31,9 +31,11 @@ Architecture = auto
# Misc options # Misc options
#UseSyslog #UseSyslog
#Color #Color
#TotalDownload NoProgressBar
CheckSpace # We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring # 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. # trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -43,7 +45,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local # 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 # keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`. # packagers with `pacman-key --populate artix`.
# #
# REPOSITORIES # REPOSITORIES
@@ -92,54 +94,8 @@ Include = /etc/pacman.d/mirrorlist
[galaxy] [galaxy]
Include = /etc/pacman.d/mirrorlist 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 # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]
#SigLevel = Optional TrustAll #SigLevel = Optional TrustAll
#Server = file:///home/custompkgs #Server = file:///home/custompkgs
#
# ARCHLINUX
#
[gnome-unstable]
Include = /etc/pacman.d/mirrorlist-arch
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-staging]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -31,9 +31,11 @@ Architecture = auto
# Misc options # Misc options
#UseSyslog #UseSyslog
#Color #Color
#TotalDownload NoProgressBar
CheckSpace # We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring # 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. # trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -43,7 +45,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local # 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 # keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`. # packagers with `pacman-key --populate artix`.
# #
# REPOSITORIES # REPOSITORIES
@@ -89,51 +91,8 @@ Include = /etc/pacman.d/mirrorlist
[galaxy] [galaxy]
Include = /etc/pacman.d/mirrorlist 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 # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]
#SigLevel = Optional TrustAll #SigLevel = Optional TrustAll
#Server = file:///home/custompkgs #Server = file:///home/custompkgs
#
# ARCHLINUX
#
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-staging]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -31,9 +31,11 @@ Architecture = auto
# Misc options # Misc options
#UseSyslog #UseSyslog
#Color #Color
#TotalDownload NoProgressBar
CheckSpace # We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring # 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. # trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -43,7 +45,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local # 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 # keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`. # packagers with `pacman-key --populate artix`.
# #
# REPOSITORIES # REPOSITORIES
@@ -83,39 +85,8 @@ Include = /etc/pacman.d/mirrorlist
[galaxy] [galaxy]
Include = /etc/pacman.d/mirrorlist 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 # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]
#SigLevel = Optional TrustAll #SigLevel = Optional TrustAll
#Server = file:///home/custompkgs #Server = file:///home/custompkgs
#
# ARCHLINUX
#
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -31,9 +31,11 @@ Architecture = auto
# Misc options # Misc options
#UseSyslog #UseSyslog
#Color #Color
#TotalDownload NoProgressBar
CheckSpace # We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring # 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. # trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -43,7 +45,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local # 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 # keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`. # packagers with `pacman-key --populate artix`.
# #
# REPOSITORIES # REPOSITORIES
@@ -92,54 +94,8 @@ Include = /etc/pacman.d/mirrorlist
[galaxy] [galaxy]
Include = /etc/pacman.d/mirrorlist 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 # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]
#SigLevel = Optional TrustAll #SigLevel = Optional TrustAll
#Server = file:///home/custompkgs #Server = file:///home/custompkgs
#
# ARCHLINUX
#
[kde-unstable]
Include = /etc/pacman.d/mirrorlist-arch
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-staging]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -31,9 +31,11 @@ Architecture = auto
# Misc options # Misc options
#UseSyslog #UseSyslog
#Color #Color
#TotalDownload NoProgressBar
CheckSpace # We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring # 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. # trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -43,7 +45,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local # 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 # keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`. # packagers with `pacman-key --populate artix`.
# #
# REPOSITORIES # REPOSITORIES
@@ -106,34 +108,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom] #[custom]
#SigLevel = Optional TrustAll #SigLevel = Optional TrustAll
#Server = file:///home/custompkgs #Server = file:///home/custompkgs
#
# ARCHLINUX
#
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
[multilib-staging]
Include = /etc/pacman.d/mirrorlist-arch
[multilib-testing]
Include = /etc/pacman.d/mirrorlist-arch
[multilib]
Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -31,9 +31,11 @@ Architecture = auto
# Misc options # Misc options
#UseSyslog #UseSyslog
#Color #Color
#TotalDownload NoProgressBar
CheckSpace # We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring # 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. # trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -43,7 +45,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local # 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 # keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`. # packagers with `pacman-key --populate artix`.
# #
# REPOSITORIES # REPOSITORIES
@@ -97,25 +99,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom] #[custom]
#SigLevel = Optional TrustAll #SigLevel = Optional TrustAll
#Server = file:///home/custompkgs #Server = file:///home/custompkgs
#
# ARCHLINUX
#
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
[multilib-testing]
Include = /etc/pacman.d/mirrorlist-arch
[multilib]
Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -31,9 +31,11 @@ Architecture = auto
# Misc options # Misc options
#UseSyslog #UseSyslog
#Color #Color
#TotalDownload NoProgressBar
CheckSpace # We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring # 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. # trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -43,7 +45,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local # 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 # keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`. # packagers with `pacman-key --populate artix`.
# #
# REPOSITORIES # REPOSITORIES
@@ -97,25 +99,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom] #[custom]
#SigLevel = Optional TrustAll #SigLevel = Optional TrustAll
#Server = file:///home/custompkgs #Server = file:///home/custompkgs
#
# ARCHLINUX
#
#[testing]
#Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
#[community-testing]
#Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
[multilib]
Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -0,0 +1,38 @@
# Maintainer: Your Name <youremail@domain.com>
pkgname=NAME-openrc
pkgver=VERSION
pkgrel=1
epoch=
pkgdesc="Openrc NAME init script"
arch=('any')
url="https://gitea.artixlinux.org/artixlinux/packages-openrc"
license=('GPL2')
groups=()
depends=("openrc" "NAME")
makedepends=()
checkdepends=()
optdepends=()
provides=("init-NAME")
conflicts=("init-NAME")
replaces=()
backup=()
options=()
install=
changelog=
source=(NAME.{confd,initd})
sha256sums=()
_inst_openrc() {
local sv="$1"
if [ -f "${srcdir}/$sv".confd ]; then
install -Dm644 "${srcdir}/$sv".confd "${pkgdir}"/etc/conf.d/"$sv"
fi
if [ -f "${srcdir}/$sv".initd ]; then
install -Dm755 "${srcdir}/$sv".initd "${pkgdir}"/etc/init.d/"$sv"
fi
}
package() {
_inst_openrc "NAME"
}

View File

@@ -0,0 +1,41 @@
# Maintainer: Your Name <youremail@domain.com>
pkgname=NAME-runit
pkgver=VERSION
pkgrel=1
epoch=
pkgdesc="Runit NAME init script"
arch=('any')
url="https://gitea.artixlinux.org/artixlinux/packages-runit"
license=('GPL2')
groups=()
depends=("runit" "NAME")
makedepends=()
checkdepends=()
optdepends=()
provides=("init-NAME")
conflicts=("init-NAME")
replaces=()
backup=()
options=()
install=
changelog=
source=(NAME.{run,finish,check})
sha256sums=()
_inst_runit() {
local sv="$1"
if [ -f "${srcdir}/$sv".conf ]; then
install -Dm644 "${srcdir}/$sv".conf "${pkgdir}"/etc/runit/sv/"$sv"/conf
fi
for f in run finish check; do
if [ -f "${srcdir}/$sv.$f" ]; then
install -Dm755 "${srcdir}/$sv.$f" "${pkgdir}"/etc/runit/sv/"$sv/$f"
fi
done
}
package() {
_inst_runit "NAME"
}

View File

@@ -0,0 +1,39 @@
# Maintainer: Your Name <youremail@domain.com>
pkgname=NAME-s6
pkgver=VERSION
pkgrel=1
epoch=
pkgdesc="S6 NAME init script"
arch=('any')
url="https://gitea.artixlinux.org/artixlinux/packages-s6"
license=('GPL2')
groups=()
depends=("s6-base" "NAME")
makedepends=()
checkdepends=()
optdepends=()
provides=("init-NAME")
conflicts=("init-NAME")
replaces=()
backup=()
options=()
install=
changelog=
source=(NAME.{dependencies,down,up,type})
sha256sums=()
_inst_s6(){
local sv="$1"
for f in dependencies down type up; do
if [ -f "${srcdir}/$sv.$f" ]; then
install -Dm644 "${srcdir}/$sv.$f" "${pkgdir}"/etc/s6/sv/"$sv/$f"
fi
done
}
package() {
_inst_s6 "NAME"
}

View File

@@ -0,0 +1,34 @@
# Maintainer: Your Name <youremail@domain.com>
pkgname=NAME-suite66
pkgver=VERSION
pkgrel=1
epoch=
pkgdesc="Suite66 NAME init script"
arch=('any')
url="https://gitea.artixlinux.org/artixlinux/packages-suite66"
license=('GPL2')
groups=()
depends=("suite66-base" "NAME")
makedepends=()
checkdepends=()
optdepends=()
provides=("init-NAME")
conflicts=("init-NAME")
replaces=()
backup=()
options=()
install=
changelog=
source=(NAME)
sha256sums=()
_inst_66() {
local sv="$1"
install -Dm644 "$sv" -t "${pkgdir}"/etc/66/service
}
package() {
_inst_66 "NAME"
}

42
data/valid-names.conf Normal file
View File

@@ -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]}"
)

View File

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

View File

@@ -1,16 +1,20 @@
#!/bin/bash #!/hint/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org #{{{ chroot
# Copyright (C) 2018 Artix Linux Developers
# orig_argv=("$0" "$@")
# This program is free software; you can redistribute it and/or modify check_root() {
# it under the terms of the GNU General Public License as published by local keepenv="$1"
# the Free Software Foundation; version 2 of the License.
# (( EUID == 0 )) && return
# This program is distributed in the hope that it will be useful, if type -P sudo >/dev/null; then
# but WITHOUT ANY WARRANTY; without even the implied warranty of # shellcheck disable=2154
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}"
# GNU General Public License for more details. else
# shellcheck disable=2154
exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi
}
is_btrfs() { is_btrfs() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]]
@@ -20,9 +24,9 @@ is_subvolume() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]] [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]]
} }
is_same_fs() { # is_same_fs() {
[[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]] # [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]]
} # }
subvolume_delete_recursive() { subvolume_delete_recursive() {
local subvol local subvol
@@ -42,19 +46,4 @@ subvolume_delete_recursive() {
return 0 return 0
} }
# $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=)
info "Killing chroot process: %s (%s)" "$name" "$pid"
kill -9 "$pid"
fi
fi
done
}

16
lib/base/common.sh Normal file
View File

@@ -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"
}
#}}}

View File

@@ -1,213 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
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)
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 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() {
local options_=$1
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"
}

View File

@@ -1,37 +1,31 @@
#!/bin/bash #!/hint/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org #{{{ message
# Copyright (C) 2018 Artix Linux Developers
# #set +u +o posix
# 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 # shellcheck disable=1091
# the Free Software Foundation; version 2 of the License. . /usr/share/makepkg/util.sh
#
# 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.
# export LC_MESSAGES=C
export LANG=C export LANG=C
shopt -s extglob
if [[ -t 2 && "$TERM" != dumb ]]; then if [[ -t 2 && "$TERM" != dumb ]]; then
colorize colorize
else else
# shellcheck disable=2034
declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW=''
fi fi
info() {
local mesg=$1; shift
printf "${YELLOW} -->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
stat_busy() { stat_busy() {
local mesg=$1; shift local mesg=$1; shift
# shellcheck disable=2059
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2 printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2
} }
stat_done() { stat_done() {
# shellcheck disable=2059
printf "${BOLD}done${ALL_OFF}\n" >&2 printf "${BOLD}done${ALL_OFF}\n" >&2
} }
@@ -45,9 +39,9 @@ lock() {
mkdir -p -- "$(dirname -- "$2")" mkdir -p -- "$(dirname -- "$2")"
eval "exec $1>"'"$2"' eval "exec $1>"'"$2"'
fi fi
if ! flock -n $1; then if ! flock -n "$1"; then
stat_busy "$3" stat_busy "$3"
flock $1 flock "$1"
stat_done stat_done
fi fi
} }
@@ -57,9 +51,9 @@ slock() {
mkdir -p -- "$(dirname -- "$2")" mkdir -p -- "$(dirname -- "$2")"
eval "exec $1>"'"$2"' eval "exec $1>"'"$2"'
fi fi
if ! flock -sn $1; then if ! flock -sn "$1"; then
stat_busy "$3" stat_busy "$3"
flock -s $1 flock -s "$1"
stat_done stat_done
fi fi
} }
@@ -100,28 +94,4 @@ die() {
cleanup 255 cleanup 255
} }
msg_table_header(){ #}}}
local mesg=$1; shift
printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" >&2
}
msg_row_downgrade(){
local mesg=$1; shift
printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row_notify(){
local mesg=$1; shift
printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row(){
local mesg=$1; shift
# printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row_upgrade(){
local mesg=$1; shift
printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" >&2
}

View File

@@ -1,54 +1,19 @@
#!/bin/bash #!/hint/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org #{{{ mount
# 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.
ignore_error() { ignore_error() {
"$@" 2>/dev/null "$@" 2>/dev/null
return 0 return 0
} }
parse_fstab(){
echo $(perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^UUID=#;' $1/etc/fstab)
# perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^/dev#;' $1/etc/fstab
# perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^LABEL=#;' $1/etc/fstab
}
detect(){
local 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"
}
chroot_part_mount() {
info "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_PART_MOUNTS=("$2" "${CHROOT_ACTIVE_PART_MOUNTS[@]}")
}
trap_setup(){ trap_setup(){
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap "$1" EXIT trap "$1" EXIT
} }
chroot_mount() { chroot_mount() {
# info "mount: [%s]" "$2" # msg2 "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
} }
@@ -88,8 +53,8 @@ chroot_mount_conditional() {
} }
chroot_setup(){ chroot_setup(){
local mnt="$1" os="$2" run_args='-t tmpfs -o nosuid,nodev,mode=0755' local mnt="$1" os="$2" args='-t tmpfs -o nosuid,nodev,mode=0755'
$os && run_args='--bind' $os && args='--bind'
chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind &&
chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev &&
chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
@@ -98,33 +63,10 @@ chroot_setup(){
chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && 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 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 shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_mount /run "$mnt/run" ${run_args} && chroot_mount /run "$mnt/run" ${args} &&
chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
} }
mount_os(){
CHROOT_ACTIVE_PART_MOUNTS=()
CHROOT_ACTIVE_MOUNTS=()
trap_setup chroot_part_umount
chroot_part_mount "$2" "$1"
local mounts=$(parse_fstab "$1")
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"
}
chroot_api_mount() { chroot_api_mount() {
CHROOT_ACTIVE_MOUNTS=() CHROOT_ACTIVE_MOUNTS=()
trap_setup chroot_api_umount trap_setup chroot_api_umount
@@ -133,16 +75,10 @@ chroot_api_mount() {
chroot_api_umount() { chroot_api_umount() {
if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then
# info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" # msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_MOUNTS[@]}" umount "${CHROOT_ACTIVE_MOUNTS[@]}"
fi fi
unset CHROOT_ACTIVE_MOUNTS unset CHROOT_ACTIVE_MOUNTS
} }
chroot_part_umount() { #}}}
chroot_api_umount
info "umount: [%s]" "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
unset CHROOT_ACTIVE_PART_MOUNTS
}

View File

@@ -1,47 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
get_timer(){
echo $(date +%s)
}
# $1: start timer
elapsed_time(){
echo $(echo $1 $(get_timer) | awk '{ printf "%0.2f",($2-$1)/60 }')
}
show_elapsed_time(){
info "Time %s: %s minutes" "$1" "$(elapsed_time $2)"
}
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p $1
}
get_osname(){
. /usr/lib/os-release
echo "${NAME}"
}
# orig_argv=("$0" "$@")
check_root() {
local keepenv=$1
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
exec sudo --preserve-env=$keepenv -- "${orig_argv[@]}"
else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi
}

View File

@@ -1,16 +1,6 @@
#!/bin/bash #!/hint/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org #{{{ yaml
# 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.
write_yaml_header(){ write_yaml_header(){
printf '%s' '---' printf '%s' '---'
@@ -34,3 +24,5 @@ write_yaml_seq_map(){
local ident="$1" key="$2" val="$3" local ident="$1" key="$2" val="$3"
printf "\n%${ident}s- %s: %s\n" '' "$key" "$val" printf "\n%${ident}s- %s: %s\n" '' "$key" "$val"
} }
#}}}

49
lib/iso/calamares.sh Normal file
View File

@@ -0,0 +1,49 @@
#!/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_66_conf(){
local conf="$1"/services-66.conf
write_services_conf 'svDir' '/etc/66/service' 'runsvDir' '/var/lib/66/system' > "$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
}
#}}}

View File

@@ -1,224 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
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 ..." "$svc"
[[ $svc == "xdm" ]] && set_xdm "$mnt"
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 ..." "$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" valid="" rlvl="${3:-default}"
for svc in $names; do
if [[ -d $mnt/etc/s6/sv/$svc ]]; then
msg2 "Setting %s ..." "$svc"
valid=${valid:-}${valid:+' '}${svc}
fi
done
chroot $mnt s6-rc-bundle -c /etc/s6/rc/compiled add $rlvl $valid
# rebuild s6-linux-init binaries
chroot $mnt rm -r /etc/s6/current
chroot $mnt s6-linux-init-maker -1 -N -f /etc/s6/skel -G "/usr/bin/agetty -L -8 tty1 115200" -c /etc/s6/current /etc/s6/current
chroot $mnt mv /etc/s6/current/bin/init /etc/s6/current/bin/s6-init
chroot $mnt cp -a /etc/s6/current/bin /usr
}
set_xdm(){
if [[ -f $1/etc/conf.d/xdm ]];then
local conf='DISPLAYMANAGER="'${DISPLAYMANAGER}'"'
sed -i -e "s|^.*DISPLAYMANAGER=.*|${conf}|" $1/etc/conf.d/xdm
fi
}
configure_hosts(){
sed -e "s|localhost.localdomain|localhost.localdomain ${HOST_NAME}|" -i $1/etc/hosts
}
configure_logind(){
local conf=$1/etc/$2/logind.conf
if [[ -e $conf ]];then
msg2 "Configuring logind ..."
sed -i 's/#\(HandleSuspendKey=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleLidSwitch=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleHibernateKey=\)hibernate/\1ignore/' "$conf"
fi
}
configure_services(){
local mnt="$1"
info "Configuring [%s] services" "${INITSYS}"
add_svc_${INITSYS} "$mnt" "${SERVICES[*]} ${SERVICES_LIVE[*]}"
info "Done configuring [%s] services" "${INITSYS}"
}
configure_system(){
local mnt="$1"
configure_logind "$mnt" "elogind"
echo ${HOST_NAME} > $mnt/etc/hostname
}
write_users_conf(){
local yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 'defaultGroups')
local IFS=','
for g in ${ADDGROUPS[@]};do
yaml+=$(write_yaml_seq 2 "$g")
done
unset IFS
yaml+=$(write_yaml_map 0 'autologinGroup' 'autologin')
yaml+=$(write_yaml_map 0 'doAutologin' 'false')
yaml+=$(write_yaml_map 0 'sudoersGroup' 'wheel')
yaml+=$(write_yaml_map 0 'setRootPassword' 'true')
yaml+=$(write_yaml_map 0 'availableShells' '/bin/bash, /bin/zsh')
# yaml+=$(write_yaml_map 0 'passwordRequirements')
# yaml+=$(write_yaml_map 2 'minLength' '-1')
# yaml+=$(write_yaml_map 2 'maxLength' '-1')
# yaml+=$(write_yaml_map 2 'libpwquality')
# yaml+=$(write_yaml_seq 4 "minlen=8")
# yaml+=$(write_yaml_seq 4 "minclass=80")
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
write_services_conf(){
local key1="$1" val1="$2" key2="$3" val2="$4"
local 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_postcfg(){
local yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 'keyrings')
for k in archlinux artix;do
yaml+=$(write_yaml_seq 2 "$k")
done
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
write_unpackfs() {
local yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 'unpack')
# if ${persist}; then
# yaml+=$(write_yaml_seq_map 2 'source' '"/run/artix/bootmnt/LiveOS/rootfs.img"')
# yaml+=$(write_yaml_map 4 'sourcefs' '"ext4"')
# else
yaml+=$(write_yaml_seq_map 2 'source' '"/run/artix/bootmnt/LiveOS/rootfs.img"')
yaml+=$(write_yaml_map 4 'sourcefs' '"squashfs"')
# fi
yaml+=$(write_yaml_map 4 'destination' '""')
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
configure_calamares(){
local mods="$1/etc/calamares/modules"
if [[ -d "$mods" ]];then
msg2 "Configuring Calamares"
write_users_conf > "$mods"/users.conf
write_services_"${INITSYS}"_conf "$mods"
write_postcfg > "$mods"/postcfg.conf
write_unpackfs > "$mods"/unpackfs.conf
sed -e "s|services-openrc|services-${INITSYS}|" \
-i "$1"/etc/calamares/settings.conf
fi
}
configure_chroot(){
local fs="$1"
msg "Configuring [%s]" "${fs##*/}"
configure_hosts "$fs"
configure_system "$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##*/}"
}
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
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
}

30
lib/iso/config.sh Normal file
View File

@@ -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##*/}"
}
#}}}

42
lib/iso/dracut.sh Normal file
View File

@@ -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}"
artools-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
}
#}}}

17
lib/iso/firmware.sh Normal file
View File

@@ -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
}
#}}}

View File

@@ -1,118 +1,6 @@
#!/bin/bash #!/hint/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.
prepare_boot_extras(){ #{{{ grub
local src="$1" dest=${iso_root}/boot
for u in intel amd;do
cp $src/boot/$u-ucode.img $dest/$u-ucode.img
cp $src/usr/share/licenses/$u-ucode/LICENSE $dest/$u-ucode.LICENSE
done
cp $src/boot/memtest86+/memtest.bin $dest/memtest
cp $src/usr/share/licenses/common/GPL2/license.txt $dest/memtest.COPYING
}
##################dracut##################
prepare_initramfs_dracut(){
local mnt="$1"
local 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}"
artools-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=(
"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
}
#############################################
write_mkinitcpio_conf() {
msg2 "Writing mkinitcpio.conf ..."
local conf="$1/etc/mkinitcpio-artix.conf"
printf "%s\n" 'MODULES=(loop dm-snapshot)' > $conf
printf "%s\n" 'COMPRESSION="xz"' >> $conf
if [[ "${PROFILE}" == 'base' ]];then
printf "%s\n" 'HOOKS=(base udev artix_shutdown artix artix_loop_mnt
artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs
artix_kms modconf block filesystems keyboard keymap)' >> $conf
else
printf "%s\n" 'HOOKS=(base udev artix_shutdown artix artix_loop_mnt
artix_kms modconf block filesystems keyboard keymap)' >> $conf
fi
}
prepare_initcpio(){
msg2 "Copying initcpio ..."
local dest="$1"
cp /etc/initcpio/hooks/artix* $dest/etc/initcpio/hooks
cp /etc/initcpio/install/artix* $dest/etc/initcpio/install
cp /etc/initcpio/artix_shutdown $dest/etc/initcpio
}
prepare_initramfs(){
local mnt="$1"
prepare_initcpio "$mnt"
write_mkinitcpio_conf "$mnt"
if [[ -n ${GPG_KEY} ]]; then
su ${OWNER} -c "gpg --export ${GPG_KEY} >/tmp/GPG_KEY"
exec 17<>/tmp/GPG_KEY
fi
local _kernel=$(<"$mnt"/usr/src/linux/version)
ARTIX_GNUPG_FD=${GPG_KEY:+17} artools-chroot "$mnt" \
/usr/bin/mkinitcpio -k ${_kernel} \
-c /etc/mkinitcpio-artix.conf \
-g /boot/initramfs.img
if [[ -n ${GPG_KEY} ]]; then
exec 17<&-
fi
if [[ -f /tmp/GPG_KEY ]]; then
rm /tmp/GPG_KEY
fi
cp $mnt/boot/initramfs.img ${iso_root}/boot/initramfs-${ARCH}.img
prepare_boot_extras "$mnt"
}
configure_grub(){ configure_grub(){
msg "Configuring grub kernel options ..." msg "Configuring grub kernel options ..."
@@ -120,12 +8,12 @@ configure_grub(){
local rw_opts=() local rw_opts=()
local kopts=("label=${iso_label}") local kopts=("label=${iso_label}")
[[ "${PROFILE}" != 'base' ]] && kopts+=('overlay=livefs') [[ "${profile}" != 'base' ]] && kopts+=('overlay=livefs')
sed -e "s|@kopts@|${kopts[*]}|" \ sed -e "s|@kopts@|${kopts[*]}|" \
-e "s|@ro_opts@|${ro_opts[*]}|" \ -e "s|@ro_opts@|${ro_opts[*]}|" \
-e "s|@rw_opts@|${rw_opts[*]}|" \ -e "s|@rw_opts@|${rw_opts[*]}|" \
-i ${iso_root}/boot/grub/kernels.cfg -i "${iso_root}"/boot/grub/kernels.cfg
} }
prepare_grub(){ prepare_grub(){
@@ -136,51 +24,53 @@ prepare_grub(){
local grub=${iso_root}/boot/grub efi=${iso_root}/efi/boot local grub=${iso_root}/boot/grub efi=${iso_root}/efi/boot
prepare_dir ${grub}/${platform} prepare_dir "${grub}/${platform}"
cp ${livecfg}/cfg/*.cfg ${grub} cp "${livecfg}"/cfg/*.cfg "${grub}"
cp ${lib}/${platform}/* ${grub}/${platform} cp "${lib}/${platform}"/* "${grub}/${platform}"
msg2 "Building %s ..." "${img}" msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${grub}/${platform}/${img} -O ${platform} -p ${prefix} biosdisk iso9660 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 cat "${grub}/${platform}"/cdboot.img "${grub}/${platform}/${img}" > "${grub}/${platform}"/eltorito.img
platform=x86_64-efi platform=x86_64-efi
img=bootx64.efi img=bootx64.efi
prepare_dir ${efi} prepare_dir "${efi}"
prepare_dir ${grub}/${platform} prepare_dir "${grub}/${platform}"
cp ${lib}/${platform}/* ${grub}/${platform} cp "${lib}/${platform}"/* "${grub}/${platform}"
msg2 "Building %s ..." "${img}" msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${efi}/${img} -O ${platform} -p ${prefix} iso9660 grub-mkimage -d "${grub}/${platform}" -o "${efi}/${img}" -O "${platform}" -p "${prefix}" iso9660
prepare_dir ${grub}/themes prepare_dir "${grub}"/themes
cp -r ${theme}/themes/artix ${grub}/themes cp -r "${theme}"/themes/artix "${grub}"/themes
cp -r ${livecfg}/{locales,tz} ${grub} cp -r "${livecfg}"/{locales,tz} "${grub}"
if [[ -f /usr/share/grub/unicode.pf2 ]];then if [[ -f /usr/share/grub/unicode.pf2 ]];then
msg2 "Copying %s ..." "unicode.pf2" msg2 "Copying %s ..." "unicode.pf2"
cp /usr/share/grub/unicode.pf2 ${grub}/unicode.pf2 cp /usr/share/grub/unicode.pf2 "${grub}"/unicode.pf2
else else
msg2 "Creating %s ..." "unicode.pf2" msg2 "Creating %s ..." "unicode.pf2"
grub-mkfont -o ${grub}/unicode.pf2 /usr/share/fonts/misc/unifont.bdf grub-mkfont -o "${grub}"/unicode.pf2 /usr/share/fonts/misc/unifont.bdf
fi fi
local size=4M mnt="${mnt_dir}/efiboot" efi_img="${iso_root}/boot/efi.img" local size=4M mnt="${mnt_dir}/efiboot" efi_img="${iso_root}/boot/efi.img"
msg2 "Creating fat image of %s ..." "${size}" msg2 "Creating fat image of %s ..." "${size}"
truncate -s ${size} "${efi_img}" truncate -s "${size}" "${efi_img}"
mkfs.fat -n ARTIX_EFI "${efi_img}" &>/dev/null mkfs.fat -n ARTIX_EFI "${efi_img}" &>/dev/null
prepare_dir "${mnt}" prepare_dir "${mnt}"
mount_img "${efi_img}" "${mnt}" mount_img "${efi_img}" "${mnt}"
prepare_dir ${mnt}/efi/boot prepare_dir "${mnt}"/efi/boot
msg2 "Building %s ..." "${img}" msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${mnt}/efi/boot/${img} -O ${platform} -p ${prefix} iso9660 grub-mkimage -d "${grub}/${platform}" -o "${mnt}"/efi/boot/"${img}" -O "${platform}" -p "${prefix}" iso9660
umount_img "${mnt}" umount_img "${mnt}"
} }
#}}}

57
lib/iso/initcpio.sh Normal file
View File

@@ -0,0 +1,57 @@
#!/hint/bash
#{{{ initcpio
write_mkinitcpio_conf() {
msg2 "Writing mkinitcpio.conf ..."
local conf="$1/etc/mkinitcpio-artix.conf"
printf "%s\n" 'MODULES=(loop dm-snapshot)' > "$conf"
printf "%s\n" 'COMPRESSION="xz"' >> "$conf"
if [[ "${profile}" == 'base' ]];then
printf "%s\n" 'HOOKS=(base udev artix_shutdown artix artix_loop_mnt
artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs
artix_kms modconf block filesystems keyboard keymap)' >> "$conf"
else
printf "%s\n" 'HOOKS=(base udev artix_shutdown artix artix_loop_mnt
artix_kms modconf block filesystems keyboard keymap)' >> "$conf"
fi
}
prepare_initcpio(){
msg2 "Copying initcpio ..."
local dest="$1"
cp /etc/initcpio/hooks/artix* "$dest"/etc/initcpio/hooks
cp /etc/initcpio/install/artix* "$dest"/etc/initcpio/install
cp /etc/initcpio/artix_shutdown "$dest"/etc/initcpio
}
prepare_initramfs(){
local mnt="$1"
prepare_initcpio "$mnt"
write_mkinitcpio_conf "$mnt"
if [[ -n ${GPG_KEY} ]]; then
su "${owner}" -c "gpg --export ${GPG_KEY} >/tmp/GPG_KEY"
exec 17<>/tmp/GPG_KEY
fi
local _kernel
_kernel=$(<"$mnt"/usr/src/linux/version)
ARTIX_GNUPG_FD=${GPG_KEY:+17} artools-chroot "$mnt" \
/usr/bin/mkinitcpio -k "${_kernel}" \
-c /etc/mkinitcpio-artix.conf \
-g /boot/initramfs.img
if [[ -n "${GPG_KEY}" ]]; then
exec 17<&-
fi
if [[ -f /tmp/GPG_KEY ]]; then
rm /tmp/GPG_KEY
fi
cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img
prepare_boot_extras "$mnt"
}
#}}}

View File

@@ -1,127 +1,30 @@
#!/bin/bash #!/hint/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.
make_sig () { #{{{ iso
local file="$1"
msg2 "Creating signature file..."
cd ${iso_root}${live_dir}
chown "${OWNER}:$(id --group ${OWNER})" "${iso_root}${live_dir}"
su ${OWNER} -c "gpg --detach-sign --default-key ${GPG_KEY} $file"
chown -R root "${iso_root}${live_dir}"
cd ${OLDPWD}
}
make_checksum(){
local file="$1"
msg2 "Creating md5sum ..."
cd ${iso_root}${live_dir}
md5sum $file > $file.md5
cd ${OLDPWD}
}
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=$(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 img_file=${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 xz -b 256K -Xbcj x86 -noappend)
mksquashfs "${mksfs_args[@]}"
if ! ${use_dracut}; then
make_checksum "${img_name}"
if [[ -n ${GPG_KEY} ]];then
make_sig "${img_name}"
fi
fi
${persist} && rm -r "${work_dir}/embed"
fi
}
get_disturl(){ get_disturl(){
# shellcheck disable=1091
. /usr/lib/os-release . /usr/lib/os-release
echo "${HOME_URL}" echo "${HOME_URL}"
} }
get_osname(){
# shellcheck disable=1091
. /usr/lib/os-release
echo "${NAME}"
}
assemble_iso(){ assemble_iso(){
msg "Creating ISO image..." msg "Creating ISO image..."
local mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g) local mod_date
local appid="$(get_osname) Live/Rescue CD" mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g)
local publisher="$(get_osname) <$(get_disturl)>" local appid
appid="$(get_osname) Live/Rescue CD"
local publisher
publisher="$(get_osname) <$(get_disturl)>"
xorriso -as mkisofs \ xorriso -as mkisofs \
--modification-date=${mod_date} \ --modification-date="${mod_date}" \
--protective-msdos-label \ --protective-msdos-label \
-volid "${iso_label}" \ -volid "${iso_label}" \
-appid "${appid}" \ -appid "${appid}" \
@@ -130,17 +33,18 @@ assemble_iso(){
-r -graft-points -no-pad \ -r -graft-points -no-pad \
--sort-weight 0 / \ --sort-weight 0 / \
--sort-weight 1 /boot \ --sort-weight 1 /boot \
--grub2-mbr ${iso_root}/boot/grub/i386-pc/boot_hybrid.img \ --grub2-mbr "${iso_root}"/boot/grub/i386-pc/boot_hybrid.img \
-partition_offset 16 \ -partition_offset 16 \
-b boot/grub/i386-pc/eltorito.img \ -b boot/grub/i386-pc/eltorito.img \
-c boot.catalog \ -c boot.catalog \
-no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \ -no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
-eltorito-alt-boot \ -eltorito-alt-boot \
-append_partition 2 0xef ${iso_root}/boot/efi.img \ -append_partition 2 0xef "${iso_root}"/boot/efi.img \
-e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \ -e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \
-no-emul-boot \ -no-emul-boot \
-iso-level 3 \ -iso-level 3 \
-o ${iso_dir}/${iso_file} \ -o "${iso_dir}/${iso_file}" \
${iso_root}/ "${iso_root}"/
} }
#}}}

View File

@@ -1,19 +1,9 @@
#!/bin/bash #!/hint/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org #{{{ mount
# 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.
track_img() { track_img() {
info "mount: [%s]" "$2" msg2 "mount: [%s]" "$2"
mount "$@" && IMG_ACTIVE_MOUNTS=("$2" "${IMG_ACTIVE_MOUNTS[@]}") mount "$@" && IMG_ACTIVE_MOUNTS=("$2" "${IMG_ACTIVE_MOUNTS[@]}")
} }
@@ -24,8 +14,8 @@ mount_img() {
} }
umount_img() { umount_img() {
if [[ -n ${IMG_ACTIVE_MOUNTS[@]} ]];then if [[ -n "${IMG_ACTIVE_MOUNTS[*]}" ]];then
info "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}" msg2 "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}"
umount "${IMG_ACTIVE_MOUNTS[@]}" umount "${IMG_ACTIVE_MOUNTS[@]}"
unset IMG_ACTIVE_MOUNTS unset IMG_ACTIVE_MOUNTS
rm -r "$1" rm -r "$1"
@@ -33,30 +23,33 @@ umount_img() {
} }
track_fs() { track_fs() {
info "overlayfs mount: [%s]" "$5" msg2 "overlayfs mount: [%s]" "$5"
mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}") mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}")
} }
mount_overlayfs(){ mount_overlayfs(){
FS_ACTIVE_MOUNTS=() FS_ACTIVE_MOUNTS=()
local lower= upper="$1" work="$2" local lower upper="$1" work="$2"
mkdir -p "${mnt_dir}/work" mkdir -p "${mnt_dir}/work"
mkdir -p "$upper" mkdir -p "$upper"
case $upper in case $upper in
*/livefs) lower="$work/rootfs" ;; */livefs) lower="$work/rootfs" ;;
*/bootfs) */bootfs)
lower="$work/rootfs" lower="$work/rootfs"
[[ -d "$work/livefs" ]] && lower="$work/livefs":"$work/rootfs" [[ -d "$work/livefs" ]] && lower="$work/livefs:$work/rootfs"
;; ;;
esac esac
# shellcheck disable=2140
track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper" track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper"
} }
umount_overlayfs(){ umount_overlayfs(){
if [[ -n ${FS_ACTIVE_MOUNTS[@]} ]];then if [[ -n "${FS_ACTIVE_MOUNTS[*]}" ]];then
info "overlayfs umount: [%s]" "${FS_ACTIVE_MOUNTS[@]}" msg2 "overlayfs umount: [%s]" "${FS_ACTIVE_MOUNTS[@]}"
umount "${FS_ACTIVE_MOUNTS[@]}" umount "${FS_ACTIVE_MOUNTS[@]}"
unset FS_ACTIVE_MOUNTS unset FS_ACTIVE_MOUNTS
rm -rf "${mnt_dir}/work" rm -rf "${mnt_dir}/work"
fi fi
} }
#}}}

View File

@@ -1,101 +1,85 @@
#!/bin/bash #!/hint/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org #{{{ profile
# 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.
show_profile(){ show_profile(){
msg2 "iso_file: %s" "${iso_file}" msg2 "iso_file: %s" "${iso_file}"
msg2 "AUTOLOGIN: %s" "${AUTOLOGIN}" msg2 "AUTOLOGIN: %s" "${AUTOLOGIN}"
msg2 "HOST_NAME: %s" "${HOST_NAME}"
msg2 "USER_NAME: %s" "${USER_NAME}"
msg2 "PASSWORD: %s" "${PASSWORD}" msg2 "PASSWORD: %s" "${PASSWORD}"
msg2 "ADDGROUPS: %s" "${ADDGROUPS}"
msg2 "SERVICES_LIVE: %s" "${SERVICES_LIVE[*]}"
msg2 "SERVICES: %s" "${SERVICES[*]}" msg2 "SERVICES: %s" "${SERVICES[*]}"
} }
load_profile(){ load_profile(){
local profile_dir="${DATADIR}/iso-profiles" local profile_dir="${DATADIR}/iso-profiles"
[[ -d ${WORKSPACE_DIR}/iso-profiles ]] && profile_dir=${WORKSPACE_DIR}/iso-profiles [[ -d "${WORKSPACE_DIR}"/iso-profiles ]] && profile_dir="${WORKSPACE_DIR}"/iso-profiles
ROOT_LIST="$profile_dir/${PROFILE}/Packages-Root" root_list="$profile_dir/${profile}/Packages-Root"
ROOT_OVERLAY="$profile_dir/${PROFILE}/root-overlay" root_overlay="$profile_dir/${profile}/root-overlay"
[[ -f "$profile_dir/${PROFILE}/Packages-Live" ]] && LIVE_LIST="$profile_dir/${PROFILE}/Packages-Live" [[ -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" [[ -d "$profile_dir/${profile}/live-overlay" ]] && live_overlay="$profile_dir/${profile}/live-overlay"
[[ -f $profile_dir/${PROFILE}/profile.conf ]] || return 1 common_dir="${DATADIR}/iso-profiles/common"
[[ -d "$profile_dir"/common ]] && common_dir="${profile_dir}"/common
[[ -r $profile_dir/${PROFILE}/profile.conf ]] && . $profile_dir/${PROFILE}/profile.conf [[ -f $profile_dir/${profile}/profile.conf ]] || return 1
DISPLAYMANAGER=${DISPLAYMANAGER:-'none'} # shellcheck disable=1090
[[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf
AUTOLOGIN=${AUTOLOGIN:-"true"} AUTOLOGIN=${AUTOLOGIN:-true}
[[ ${DISPLAYMANAGER} == 'none' ]] && AUTOLOGIN="false"
HOST_NAME=${HOST_NAME:-'artix'}
USER_NAME=${USER_NAME:-'artix'}
PASSWORD=${PASSWORD:-'artix'} PASSWORD=${PASSWORD:-'artix'}
ADDGROUPS=${ADDGROUPS:-"video,power,optical,network,lp,scanner,wheel,users,log"} if [[ -z "${SERVICES[*]}" ]];then
if [[ -z ${SERVICES[@]} ]];then
SERVICES=('acpid' 'bluetoothd' 'cronie' 'cupsd' 'syslog-ng' 'connmand') SERVICES=('acpid' 'bluetoothd' 'cronie' 'cupsd' 'syslog-ng' 'connmand')
fi fi
if [[ ${DISPLAYMANAGER} != "none" ]];then
case "${INITSYS}" in
'openrc') SERVICES+=('xdm') ;;
'runit'|'s6') SERVICES+=("${DISPLAYMANAGER}") ;;
esac
fi
SERVICES_LIVE=('artix-live' 'pacman-init')
return 0 return 0
} }
write_live_session_conf(){ read_from_list() {
local conf='' local list="$1"
conf+=$(printf '%s\n' '# live session configuration') local _space="s| ||g"
conf+=$(printf "\nAUTOLOGIN=%s\n" "${AUTOLOGIN}") local _clean=':a;N;$!ba;s/\n/ /g'
conf+=$(printf "\nUSER_NAME=%s\n" "${USER_NAME}") local _com_rm="s|#.*||g"
conf+=$(printf "\nPASSWORD=%s\n" "${PASSWORD}")
conf+=$(printf "\nADDGROUPS='%s'\n" "${ADDGROUPS}") local _init="s|@initsys@|${INITSYS}|g"
printf '%s' "$conf"
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(){ load_pkgs(){
local pkglist="$1" init="$2" local pkglist="$1"
info "Loading Packages: [%s] ..." "${pkglist##*/}" packages=()
local _init="s|@$init||g" if [[ "${pkglist##*/}" == "Packages-Root" ]]; then
case "$init" in read_from_list "${common_dir}/Packages-base"
'openrc') _init_rm1="s|@runit.*||g"; _init_rm2="s|@s6.*||g" ;; read_from_list "${common_dir}/Packages-apps"
's6') _init_rm1="s|@runit.*||g"; _init_rm2="s|@openrc.*||g" ;; read_from_list "${common_dir}/Packages-${INITSYS}"
'runit') _init_rm1="s|@s6.*||g"; _init_rm2="s|@openrc.*||g" ;; [[ -n "${live_list}" ]] && read_from_list "${common_dir}/Packages-xorg"
esac read_from_list "$pkglist"
read_from_services
local _space="s| ||g" \ else
_clean=':a;N;$!ba;s/\n/ /g' \ read_from_list "$pkglist"
_com_rm="s|#.*||g" fi
packages=($(sed "$_com_rm" "$pkglist" \
| sed "$_space" \
| sed "$_purge" \
| sed "$_init" \
| sed "$_init_rm1" \
| sed "$_init_rm2" \
| sed "$_clean"))
} }
#}}}

56
lib/iso/services.sh Normal file
View File

@@ -0,0 +1,56 @@
#!/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_66(){
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
}
#}}}

104
lib/iso/squash.sh Normal file
View File

@@ -0,0 +1,104 @@
#!/hint/bash
#{{{ squash
make_sig () {
local file="$1"
msg2 "Creating signature file..."
cd "${iso_root}${live_dir}"
chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}"
su "${owner}" -c "gpg --detach-sign --default-key ${GPG_KEY} $file"
chown -R root "${iso_root}${live_dir}"
cd "${OLDPWD}"
}
make_checksum(){
local file="$1"
msg2 "Creating md5sum ..."
cd "${iso_root}${live_dir}"
md5sum "$file" > "$file".md5
cd "${OLDPWD}"
}
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 xz -b 256K -Xbcj x86 -noappend)
mksquashfs "${mksfs_args[@]}"
if ! ${use_dracut}; then
make_checksum "${img_name}"
if [[ -n ${GPG_KEY} ]];then
make_sig "${img_name}"
fi
fi
if ${persist}; then
rm -r "${work_dir}/embed"
fi
fi
}
#}}}

48
lib/iso/trap.sh Normal file
View File

@@ -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
}
#}}}

View File

@@ -1,155 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
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
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
}
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 "${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
fi
: > ${work_dir}/grub.lock
msg "Done [/iso/boot/grub]"
fi
}

36
lib/pkg/common.sh Normal file
View File

@@ -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 "$@"
}
#}}}

37
lib/pkg/deploy.sh Normal file
View File

@@ -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"
}
#}}}

View File

@@ -1,35 +1,16 @@
#!/bin/bash #!/hint/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org #{{{ git
# 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.
get_local_head(){ get_local_head(){
echo $(git log --pretty=%H ...refs/heads/master^ | head -n 1) git log --pretty=%H ...refs/heads/master^ | head -n 1
} }
get_remote_head(){ get_remote_head(){
echo $(git ls-remote origin -h refs/heads/master | cut -f1) git ls-remote origin -h refs/heads/master | cut -f1
} }
clone_tree(){ has_changeset(){
local timer=$(get_timer) url="$1" tree="$2" os="${3:-$(get_osname)}"
msg "Cloning %s (%s) ..." "$tree" "$os"
git clone $url/$tree.git
show_elapsed_time "${FUNCNAME}" "${timer}"
}
has_changes(){
local head_l="$1" head_r="$2" local head_l="$1" head_r="$2"
if [[ "$head_l" == "$head_r" ]]; then if [[ "$head_l" == "$head_r" ]]; then
msg2 "remote changes: no" msg2 "remote changes: no"
@@ -41,145 +22,14 @@ has_changes(){
} }
pull_tree(){ pull_tree(){
local tree="$1" local_head="$2" os="${3:-$(get_osname)}" local tree="$1" local_head="$2" os="${3:-Artix}"
local remote_head=$(get_remote_head) local remote_head
remote_head=$(get_remote_head)
msg "Checking (%s) (%s)" "${tree}" "$os" msg "Checking (%s) (%s)" "${tree}" "$os"
if has_changes "${local_head}" "${remote_head}";then if has_changeset "${local_head}" "${remote_head}";then
git pull origin master git pull origin master
fi fi
} }
push_tree(){ #}}}
local tree="$1"
msg "Update (%s)" "${tree}"
git push origin master
}
write_jenkinsfile(){
local pkg="$1"
local jenkins=$pkg/Jenkinsfile
echo "@Library('artix-ci') import org.artixlinux.RepoPackage" > $jenkins
echo '' >> $jenkins
echo 'PackagePipeline(new RepoPackage(this))' >> $jenkins
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 '%YAML 1.2' > $agent
echo '---' >> $agent
echo '' >> $agent
echo "label: $label" >> $agent
echo '' >> $agent
git add $agent
}
commit_jenkins_files(){
local pkg="$1"
write_jenkinsfile "$pkg"
write_agentyaml "$pkg"
git commit -m "initial commit"
}
config_tree(){
local tree="$1"
cd $tree
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 ..
}
# write_gitignore() {
# local pkg="$1"
# local gitignore=$pkg/.gitignore
# echo '# ---> ArchLinuxPackages' > $gitignore
# echo '*.tar' >> $gitignore
# echo '*.tar.*' >> $gitignore
# echo '*.jar' >> $gitignore
# echo '*.exe' >> $gitignore
# echo '*.msi' >> $gitignore
# echo '*.zip' >> $gitignore
# echo '*.tgz' >> $gitignore
# echo '*.log' >> $gitignore
# echo '*.log.*' >> $gitignore
# echo '*.sig' >> $gitignore
# echo '' >> $gitignore
# echo 'pkg/' >> $gitignore
# echo 'src/' >> $gitignore
# echo '' >> $gitignore
# echo '# ---> Archives' >> $gitignore
# echo '*.7z' >> $gitignore
# echo '*.rar' >> $gitignore
# echo '*.gz' >> $gitignore
# echo '*.bzip' >> $gitignore
# echo '*.bz2' >> $gitignore
# echo '*.xz' >> $gitignore
# echo '*.lzma' >> $gitignore
# echo '*.cab' >> $gitignore
# echo '' >> $gitignore
# echo '# ---> systemd' >> $gitignore
# echo '*.service' >> $gitignore
# echo '*.socket' >> $gitignore
# echo '*.timer' >> $gitignore
# echo '' >> $gitignore
# echo '# ---> snap' >> $gitignore
# echo '*.snap' >> $gitignore
# echo '' >> $gitignore
#
# git add $gitignore
# }
#
# write_readme(){
# local pkg="$1"
# local readme=$pkg/README.md
#
# echo "# $pkg" > $readme
# echo '' >> $readme
#
# git add $readme
# }
#
# subrepo_new2(){
# local group="${1:-$GROUP}" team="${2:-$TEAM}"
# local dest=${TREE_DIR_ARTIX}/$group/${PACKAGE}/trunk
#
# cd ${TREE_DIR_ARTIX}/$group
#
# local org=$(get_pkg_org "${PACKAGE}")
#
# prepare_dir "$dest"
#
# subrepo_init "${PACKAGE}" "$org"
#
# commit_jenkins_files2 "${PACKAGE}"
#
# subrepo_push "${PACKAGE}"
#
# add_repo_to_team "${PACKAGE}" "$org" "$team"
# }
#
# commit_jenkins_files2(){
# local pkg="$1"
#
# write_jenkinsfile "$pkg"
# write_agentyaml "$pkg"
# write_readme "$pkg"
# write_gitignore "$pkg"
#
# git commit -m "initial commit"
# }

View File

@@ -1,111 +1,31 @@
#!/bin/bash #!/hint/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.
create_repo() { #{{{ gitea api
local pkg="$1" org="$2"
local gitname=$(get_compliant_name "$pkg")
local json="{ \"auto_init\": true, \"name\":\"$gitname\", \"gitignores\":\"ArchLinuxPackages\", \"readme\": \"Default\" }"
msg2 "Create package repo [%s] in org (%s)" "${pkg}" "${org}" add_team_to_repo() {
local name="$1"
local org="$2"
local team="$3"
local url
curl -s -X POST "${GIT_URL}/api/v1/org/$org/repos?access_token=${GIT_TOKEN}" \ url="${GIT_URL}/api/v1/repos/$org/$name/teams/$team?access_token=${GIT_TOKEN}"
-H "accept: application/json" \
-H "content-type: application/json" \
-d "$json"
echo msg2 "Adding team (%s) to package repo [%s]" "$team" "$name"
api_put "$url" -H "accept: application/json"
} }
delete_repo() { remove_team_from_repo() {
local pkg="$1" org="$2" local name="$1"
local gitname=$(get_compliant_name "$pkg") local org="$2"
local team="$3"
local url
msg2 "Delete package repo [%s] in org (%s)" "${pkg}" "${org}" url="${GIT_URL}/api/v1/repos/$org/$name/teams/$team?access_token=${GIT_TOKEN}"
curl -s -X DELETE "${GIT_URL}/api/v1/repos/$org/$gitname?access_token=${GIT_TOKEN}" \ msg2 "Removing team (%s) from package repo [%s]" "$team" "$name"
-H "accept: application/json"
api_delete "$url" -H "accept: application/json"
} }
get_team_id() { #}}}
local org="$1" team="$2"
local id=$(curl -s -X GET "${GIT_URL}/api/v1/orgs/$org/teams/search?q=$team&access_token=${GIT_TOKEN}" \
-H "accept: application/json" | jq '.data[] .id')
echo $id
}
list_team_repos() {
local id="$1"
local result=$(curl -X GET "${GIT_URL}/api/v1/teams/$id/repos?access_token=${GIT_TOKEN}" \
-H "accept: application/json" | jq '.[]' | jq -r '.name')
echo ${result[@]}
}
add_repo_to_team() {
local pkg="$1" org="$2" team="$3"
local id=$(get_team_id "$org" "$team")
local gitname=$(get_compliant_name "$pkg")
msg2 "Adding package repo [%s] to team (%s)" "$gitname" "$team"
curl -s -X PUT "${GIT_URL}/api/v1/teams/$id/repos/$org/$gitname?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}
remove_repo_from_team() {
local pkg="$1" org="$2" team="$3"
local id=$(get_team_id "$org" "$team")
local gitname=$(get_compliant_name "$pkg")
msg2 "Removing package repo [%s] from team (%s)" "$gitname" "$team"
curl -s -X DELETE "${GIT_URL}/api/v1/teams/$id/repos/$org/$gitname?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}
add_user_to_team() {
local org="$1" team="$2" user="$3"
local id=$(get_team_id "$org" "$team")
msg2 "Adding [%s] to team (%s) in org (%s)" "$user" "$team" "$org"
curl -X PUT "${GIT_URL}/api/v1/teams/$id/members/$user?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}
remove_user_from_team() {
local org="$1" team="$2" user="$3"
local id=$(get_team_id "$org" "$team")
msg2 "Removing [%s] from team (%s) in org (%s)" "$user" "$team" "$org"
curl -X DELETE "${GIT_URL}/api/v1/teams/$id/members/$user?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}
create_team() {
local org="$1" name="$2"
local json="{ \"can_create_org_repo\": true, \"description\": \"\", \"includes_all_repositories\": false, \"name\": \"$name\", \"permission\": \"write\", \"units\": [ \"repo.code\", \"repo.issues\", \"repo.ext_issues\", \"repo.wiki\", \"repo.pulls\", \"repo.releases\", \"repo.ext_wiki\" ]}"
curl -X POST "${GIT_URL}/api/v1/orgs/$org/teams?access_token=${GIT_TOKEN}" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-d "$json"
}
delete_team() {
local org="$1" team="$2"
local id=$(get_team_id "$org" "$team")
curl -X DELETE "${GIT_URL}/api/v1/teams/$id?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}

43
lib/pkg/jenkins.sh Normal file
View File

@@ -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"
}
#}}}

51
lib/pkg/repo.sh Normal file
View File

@@ -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 repos -o -name "$CARCH" | sort)
for _package in ${pkgs}; do
"$func" "$_package"
done
done
}
#}}}

View File

@@ -1,56 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
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
}
subrepo_init() {
local pkg="$1" org="$2"
local gitname=$(get_compliant_name "$pkg")
msg2 "Subrepo init (%s)" "$pkg"
git subrepo init "$pkg" -r gitea@"${GIT_DOMAIN}":"$org"/"$gitname".git
}
subrepo_push(){
local pkg="$1"
msg2 "Subrepo push (%s)" "$pkg"
git subrepo push "$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"
}
subrepo_clone(){
local pkg="$1" org="$2"
local gitname=$(get_compliant_name "$pkg")
msg2 "Subrepo clone [%s] from (%s)" "$pkg" "$org/$gitname"
git subrepo clone gitea@"${GIT_DOMAIN}":"$org"/"$gitname".git "$pkg"
}

36
lib/pkg/table.sh Normal file
View File

@@ -0,0 +1,36 @@
#!/hint/bash
#{{{ table
msg_table_header(){
local mesg=$1; shift
# shellcheck disable=2059
printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" >&2
}
msg_row_yellow(){
local mesg=$1; shift
# shellcheck disable=2059
printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row_green(){
local mesg=$1; shift
# shellcheck disable=2059
printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row(){
local mesg=$1; shift
# printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
# shellcheck disable=2059
printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row_red(){
local mesg=$1; shift
# shellcheck disable=2059
printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" >&2
}
#}}}

View File

@@ -1,180 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
shopt -s extglob
declare -A REPOS=(
[core]=system
[extra]=world
[community]=galaxy
[multilib]=lib32
[testing]=gremlins
[staging]=goblins
[community-testing]=galaxy-gremlins
[community-staging]=galaxy-goblins
[multilib-testing]=lib32-gremlins
[multilib-staging]=lib32-goblins
[kde-unstable]=kde-wobble
[gnome-unstable]=gnome-wobble
)
get_compliant_name(){
local gitname="$1"
case $gitname in
*+) gitname=${gitname//+/plus}
esac
echo $gitname
}
get_group_packages(){
local pkglist="${SYSCONFDIR}/pkglist.d/$1.list"
local _space="s| ||g" _clean=':a;N;$!ba;s/\n/ /g' _com_rm="s|#.*||g"
local pkgs=($(sed "$_com_rm" "$pkglist" | sed "$_space" | sed "$_clean"))
local cases=
for p in ${pkgs[@]};do
cases=${cases:-}${cases:+|}${p}
done
echo $cases
}
get_group(){
local pkg="$1" fallback="${2##*/}" tree=
eval "case $pkg in
$(get_group_packages kernel)) tree=packages-kernel ;;
$(get_group_packages python)) tree=packages-python ;;
$(get_group_packages perl)) tree=packages-perl ;;
$(get_group_packages ruby)) tree=packages-ruby ;;
$(get_group_packages openrc)) tree=packages-openrc ;;
$(get_group_packages runit)) tree=packages-runit ;;
$(get_group_packages s6)) tree=packages-s6 ;;
$(get_group_packages media)) tree=packages-media ;;
$(get_group_packages xorg)) tree=packages-xorg ;;
$(get_group_packages qt5)) tree=packages-qt5 ;;
$(get_group_packages gtk)) tree=packages-gtk ;;
$(get_group_packages java)) tree=packages-java ;;
$(get_group_packages haskell)) tree=packages-haskell ;;
$(get_group_packages devel)) tree=packages-devel ;;
$(get_group_packages lxqt)) tree=packages-lxqt ;;
$(get_group_packages cinnamon)) tree=packages-cinnamon ;;
$(get_group_packages kde)) tree=packages-kde ;;
$(get_group_packages gnome)) tree=packages-gnome ;;
$(get_group_packages mate)) tree=packages-mate ;;
$(get_group_packages xfce)) tree=packages-xfce ;;
*) tree=$fallback ;;
esac"
echo $tree
}
arch_repos(){
local testing="$1" staging="$2" unstable="$3"
local repos=(core extra community multilib)
$testing && repos=(core extra testing community community-testing multilib multilib-testing)
$staging && repos+=(staging community-staging multilib-staging)
$unstable && repos+=(gnome-unstable kde-unstable)
echo ${repos[@]}
}
find_repo(){
local pkg="$1" testing="$2" staging="$3" unstable="$4" repo=
for r in $(arch_repos "$testing" "$staging" "$unstable");do
[[ -f $pkg/repos/$r-${ARCH}/PKGBUILD ]] && repo=$r-${ARCH}
[[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=$r-any
done
echo $repo
}
find_pkg(){
local searchdir="$1" pkg="$2"
local result=$(find $searchdir -mindepth 2 -maxdepth 2 -type d -name "$pkg")
echo $result
}
is_valid_repo(){
local src="$1" cases=
for r in $(arch_repos true true true);do
cases=${cases:-}${cases:+|}${r}
done
eval "case $src in
${cases}|trunk) return 0 ;;
*) return 1 ;;
esac"
}
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
}

41
lib/util-base.sh Normal file
View File

@@ -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}"

View File

@@ -1,59 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
CHROOTVERSION=@chroot_version@
. @datadir@/makepkg/util.sh
DATADIR=${DATADIR:-'@datadir@/artools'}
LIBDIR=${LIBDIR:-'@libdir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
OWNER=${SUDO_USER:-$USER}
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"
for baselib in ${LIBDIR}/base/*.sh; do
. $baselib
done
prepare_artools(){
prepare_dir "${WORKSPACE_DIR}"
prepare_dir "${USER_CONF_DIR}"
}
load_base_config(){
local conf="$1/artools-base.conf"
[[ -f "$conf" ]] || return 1
[[ -r "$conf" ]] && . "$conf"
ARCH=$(uname -m)
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"/home/${OWNER}/artools-workspace"}
return 0
}
load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}"

29
lib/util-iso.sh Normal file
View File

@@ -0,0 +1,29 @@
#!/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:-''}
return 0
}
#}}}
load_iso_config "${USER_CONF_DIR}" || load_iso_config "${SYSCONFDIR}"
prepare_dir "${ISO_POOL}"

View File

@@ -1,54 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-base.sh
for isolib in ${LIBDIR}/iso/*.sh; do
. $isolib
done
load_iso_config(){
local conf="$1/artools-iso.conf"
[[ -f "$conf" ]] || return 1
[[ -r "$conf" ]] && . "$conf"
CHROOTS_ISO="${CHROOTS_DIR}/buildiso"
ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"}
PROFILE='base'
ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"}
INITSYS=${INITSYS:-'openrc'}
GPG_KEY=${GPG_KEY:-''}
UPLIMIT=${UPLIMIT:-1000}
FILE_HOST="download.${DOMAIN}"
FILE_HOME=${FILE_HOME:-'/srv/iso'}
FILE_PORT=${FILE_PORT:-65432}
ACCOUNT=${ACCOUNT:-'naughtyISOuploader'}
return 0
}
load_iso_config "${USER_CONF_DIR}" || load_iso_config "${SYSCONFDIR}"

75
lib/util-pkg.sh Normal file
View File

@@ -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,gtk,media,net,qt5,xorg}
)
local dev_tree=(
packages-{python,perl,java,ruby}
python-{world,galaxy}
)
local init_tree=(packages-{openrc,runit,s6,suite66})
local desktop_tree=(
packages-{kf5,plasma,kde,qt6}
packages-{lxqt,gnome,cinnamon,mate,xfce,wm}
)
[[ -z ${TREE_NAMES_ARTIX[*]} ]] && \
TREE_NAMES_ARTIX=(
packages-kernel
"${init_tree[@]}"
"${dev_tree[@]}"
"${desktop_tree[@]}"
packages-devel
packages-lib32
)
ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}")
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}"

View File

@@ -1,87 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-base.sh
for pkglib in ${LIBDIR}/pkg/*.sh; do
. $pkglib
done
load_pkg_config(){
local conf="$1/artools-pkg.conf"
[[ -f "$conf" ]] || return 1
[[ -r "$conf" ]] && . "$conf"
DOMAIN='artixlinux.org'
GIT_DOMAIN="gitea.${DOMAIN}"
GIT_URL="https://${GIT_DOMAIN}"
GIT_TOKEN=${GIT_TOKEN:-''}
TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"}
[[ -z ${TREE_NAMES_ARTIX[@]} ]] && \
TREE_NAMES_ARTIX=(
packages
community
packages-kernel
packages-openrc
packages-runit
packages-s6
packages-xorg
packages-python
packages-perl
packages-java
packages-qt5
packages-devel
packages-ruby
packages-gtk
packages-gnome
packages-cinnamon
packages-lxqt
packages-mate
packages-kde
packages-xfce
# packages-haskell
)
HOST_TREE_ARTIX=${HOST_TREE_ARTIX:-"gitea@${GIT_DOMAIN}:artixlinux"}
TREE_DIR_ARCH=${TREE_DIR_ARCH:-"${WORKSPACE_DIR}/archlinux"}
TREE_NAMES_ARCH=(packages community)
HOST_TREE_ARCH=${HOST_TREE_ARCH:-'git://git.archlinux.org/svntogit'}
CHROOTS_PKG="${CHROOTS_DIR}/buildpkg"
REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
REPOS_MIRROR=${REPOS_MIRROR:-'http://mirror1.artixlinux.org/repos'}
DBEXT=${DBEXT:-'xz'}
LINKSDBEXT=${LINKSDBEXT:-"links.tar.${DBEXT}"}
PKGDBEXT=${PKGDBEXT:-"db.tar.${DBEXT}"}
return 0
}
load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}"