Compare commits

..

86 Commits

Author SHA1 Message Date
f7a61731ba agent-branches (#118)
All checks were successful
Artools shellcheck / lint (push) Successful in 38s
Reviewed-on: #118
2024-03-26 18:27:50 +01:00
e959ce10c3 artixpkg admin: fix maintainer parallel (#121)
All checks were successful
Artools shellcheck / lint (push) Successful in 35s
Reviewed-on: #121
2024-03-25 23:14:22 +01:00
d2bbf9d8c4 Merge pull request 'packagersign: fix signing' (#120) from psign into master
Some checks failed
Artools shellcheck / lint (push) Has been cancelled
Reviewed-on: #120
2024-03-25 23:13:48 +01:00
1dafa0fb38 packagersign: fix signing
All checks were successful
Artools shellcheck / lint (pull_request) Successful in 52s
2024-03-25 22:50:11 +01:00
982a9ed678 artixpkg: fix ci usage
All checks were successful
Artools shellcheck / lint (push) Successful in 48s
2024-03-23 14:25:20 +01:00
19a6ff09f1 minor-fixes (#117)
All checks were successful
Artools shellcheck / lint (push) Successful in 46s
Co-authored-by: Cory Sanin <corysanin@artixlinux.org>
Reviewed-on: #117
2024-03-22 23:03:09 +01:00
fac634cf14 Merge pull request 'artixpkg: add "admin maintainer" to bash completion' (#115) from corysanin/artools:completion-maintainer into master
All checks were successful
Artools shellcheck / lint (push) Successful in 43s
Reviewed-on: #115
Reviewed-by: artoo <artoo@artixlinux.org>
2024-03-22 21:09:03 +01:00
71ed464c33 artixpkg: add "admin maintainer" to bash completion 2024-03-22 14:54:58 -05:00
f7286a0661 artixpkg: remove --manual flag (#110)
All checks were successful
Artools shellcheck / lint (push) Successful in 47s
It is possible to autodetect whether or not a short name is being used.
Remove this flag to avoid breaking the interface.

Co-authored-by: artoo <artoo@artixlinux.org>
Reviewed-on: #110
Co-authored-by: Dudemanguy <dudemanguy@artixlinux.org>
Co-committed-by: Dudemanguy <dudemanguy@artixlinux.org>
2024-03-22 20:45:27 +01:00
aee7c07a04 Artixpkg admin: maintainer (#114)
All checks were successful
Artools shellcheck / lint (push) Successful in 47s
Reviewed-on: #114
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2024-03-22 19:15:12 +01:00
fbcfa79426 artixpkg admin: config archive org (#112)
All checks were successful
Artools shellcheck / lint (push) Successful in 42s
Reviewed-on: #112
2024-03-21 23:31:05 +01:00
87bd203d3e artixpkg: rename completion and update "admin topic" args (#113)
All checks were successful
Artools shellcheck / lint (push) Successful in 51s
bash completion file needs to be the same name as the command it's for

Reviewed-on: #113
Co-authored-by: Cory Sanin <corysanin@artixlinux.org>
Co-committed-by: Cory Sanin <corysanin@artixlinux.org>
2024-03-21 23:29:51 +01:00
ac0472d9ff Merge pull request 'artixpkg admin: add --delete topics' (#111) from rm-all-topics into master
All checks were successful
Artools shellcheck / lint (push) Successful in 45s
Reviewed-on: #111
2024-03-21 02:21:31 +01:00
e80c07d2fc artixpkg admin: add --delete topics
All checks were successful
Artools shellcheck / lint (pull_request) Successful in 46s
2024-03-21 02:04:11 +01:00
7584684bea artixpkg admin: archive repo after landfill transfer (#109)
All checks were successful
Artools shellcheck / lint (push) Successful in 48s
Reviewed-on: #109
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2024-03-21 01:10:34 +01:00
e415aa67b9 artools/0.33.x (#106)
All checks were successful
Artools shellcheck / lint (push) Successful in 51s
artixpkg:

* auto repo
* completions
* refactor agent config
* refactor team config

buildpkg:

* new -e arg to export PACKAGER

new packagersign script

Co-authored-by: Dudemanguy <dudemanguy@artixlinux.org>
Co-authored-by: Cory Sanin <corysanin@artixlinux.org>
Reviewed-on: #106
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2024-03-19 23:08:55 +01:00
b2512ffe68 artixpkg: undo repo addition (#104)
All checks were successful
Artools shellcheck / lint (push) Successful in 37s
Reviewed-on: #104
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2024-02-28 12:27:57 +01:00
1d8b7e83dc mod-repo (#102)
All checks were successful
Artools shellcheck / lint (push) Successful in 37s
Reviewed-on: #102
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2024-02-20 21:01:09 +01:00
e237afd788 makepkg: backport arch conf changes
All checks were successful
Artools shellcheck / lint (push) Successful in 37s
2024-02-16 18:23:06 +01:00
5d7f006ad9 buildiso: create calamares conf default symlink
All checks were successful
Artools shellcheck / lint (push) Successful in 31s
2024-02-13 20:49:16 +01:00
72104728ac buildiso: update calamares services-artix conf setting
All checks were successful
Artools shellcheck / lint (push) Successful in 24s
2024-02-04 23:55:45 +01:00
423896750a buildiso: show which calamares mode is configured
All checks were successful
Artools shellcheck / lint (push) Successful in 20s
2024-02-01 20:32:55 +01:00
ad09046044 buildiso: adopt new calamares services-artix paths
All checks were successful
Artools shellcheck / lint (push) Successful in 24s
2024-02-01 20:00:59 +01:00
c335cab68c buildiso: don't install firmware license, doesn't exist any longer
All checks were successful
Artools shellcheck / lint (push) Successful in 26s
2024-01-16 12:27:20 +01:00
e744e80c57 iso (#100)
All checks were successful
Artools shellcheck / lint (push) Successful in 26s
Reviewed-on: #100
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2024-01-02 20:19:03 +01:00
06bcd79858 iso-gpg (#99)
All checks were successful
Artools shellcheck / lint (push) Successful in 25s
Reviewed-on: #99
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-12-29 19:06:16 +01:00
dbb63dcd5e buildiso: remove obsolete cal conf
All checks were successful
Artools shellcheck / lint (push) Successful in 26s
2023-12-28 04:31:39 +01:00
4e510b2f1e buildiso: support services-artix cal module
All checks were successful
Artools shellcheck / lint (push) Successful in 28s
2023-12-28 04:27:26 +01:00
f06ac2c369 buildiso: sed the netinstall.conf for init data url
All checks were successful
Artools shellcheck / lint (push) Successful in 1m11s
2023-12-24 00:50:55 +01:00
736bac6dd7 buildiso: check for netstrap & netinstall conf files
All checks were successful
Artools shellcheck / lint (push) Successful in 25s
2023-12-21 21:50:45 +01:00
1fd3b796c5 buildiso: support netstrap & netinstall calamares modules
All checks were successful
Artools shellcheck / lint (pull_request) Successful in 29s
Artools shellcheck / lint (push) Successful in 25s
2023-12-21 16:11:56 +01:00
4c534f87b8 artools/0.32.x (#97)
All checks were successful
Artools shellcheck / lint (push) Successful in 26s
* drop artools-base.conf
* implement validity and remote checks for artixpkg
* backport arch patches for base
* move mkchroot & chroot-run in pkg
* buildiso calamares setup using yq instead of yaml shell lib

Reviewed-on: #97
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-12-20 19:48:18 +01:00
38284c5c14 artixpkg: improve remote changes checking and properly terminate if pull required 2023-12-03 01:14:43 +01:00
5e7decee42 artixpkg: delete .SRCINFO on add & move 2023-11-28 19:15:39 +01:00
dc606af137 Merge pull request 'artixpkg: don't import .SRCFILE' (#96) from Dudemanguy/artools:exclude-srcinfo into master
Reviewed-on: #96
2023-10-26 20:55:21 +02:00
5253f81f0a artixpkg: don't import .SRCFILE
We make no use of this, and there's no guarentee the .SRCFILE will
actually match the package. For example, systemd could be listed as a
dependency in here and unless the maintainer manually removes that
entry, it will be wrong. Just exclude it.
2023-10-26 13:50:49 -05:00
00ed72f96e topics-admin (#95)
Reviewed-on: #95
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-10-02 22:45:33 +02:00
70839d8609 artixpkg: don't use pager with git diff 2023-09-27 22:28:17 +02:00
65a29f73cc validation (#94)
Reviewed-on: #94
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-09-26 21:28:53 +02:00
d72df66e99 artixpkg: rename to AGENT=()
OPTIONS  is already used by makepkg.conf
2023-08-15 18:36:19 +02:00
221cc796c0 artixpkg: fix --agent opts (#93)
Reviewed-on: #93
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-08-03 19:35:52 +02:00
3ed0c310a3 artixpkg: add --agent opts to config (#92)
Reviewed-on: #92
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-07-31 02:33:09 +02:00
b1213d5c2c artixpkg: add --del flag to import (#91)
Reviewed-on: #91
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-07-30 19:29:50 +02:00
26dffde972 checkpkg: log *.so changes 2023-07-30 02:11:29 +02:00
915eca6c2e fixes (#90)
Reviewed-on: #90
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-07-30 00:27:36 +02:00
a52e32d740 db: fix pkgbase name 2023-07-28 13:21:47 +02:00
34ed4ef723 buildpkg: add -n to run namcap optionally 2023-07-27 16:01:47 +02:00
aaa319c67a check (#89)
Reviewed-on: #89
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-07-27 15:54:18 +02:00
3304c888a5 ckchrootpkg: update help 2023-07-27 00:34:30 +02:00
095c7ced45 add ckchrootpkg 2023-07-26 21:02:19 +02:00
f4eef7a3cd fixes (#88)
Reviewed-on: #88
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-07-26 19:22:32 +02:00
6fc1850f1f mkchrootpkg: revert to C locale 2023-07-25 01:27:02 +02:00
c0a3a7e796 arches (#87)
Reviewed-on: #87
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-07-25 00:53:58 +02:00
08fff866ed mkchrootpkg: source locale.conf in chroot 2023-07-23 20:22:15 +02:00
8bef697c44 remove deploypkg compat symlink 2023-07-23 19:32:22 +02:00
a6eadf1af4 artixpkg: don't query actions 2023-07-23 12:58:44 +02:00
2595cd2a3a artixpkg: exclude .artixlinux on import rsync 2023-07-22 23:51:20 +02:00
1917c252aa Merge pull request 'artixpkg: remove migration' (#86) from rm-migration into master
Reviewed-on: #86
2023-07-22 16:37:25 +02:00
4c458bf242 artixpkg: remove migration 2023-07-22 11:17:20 +02:00
5b00c80698 artixpkg: remove import patch msgs 2023-07-21 20:56:04 +02:00
98c3c8c5b0 release (#84)
Co-authored-by: Artoo <artoo@artixlinux.org>
Reviewed-on: #84
2023-07-21 15:13:09 +02:00
0786c46474 buildiso: fix bootfs initcpio 2023-07-20 22:06:36 +02:00
d22406b308 mount.sh: unquote default tmpfs_opts 2023-07-20 17:42:18 +02:00
87ea01db9b arch-patches (#83)
Co-authored-by: Artoo <artoo@artixlinux.org>
Reviewed-on: #83
2023-07-20 17:33:21 +02:00
cb347b511a rename deploypkg to repopkg 2023-07-20 11:58:10 +02:00
e15d70f732 artixpkg: remove unused source lib 2023-07-19 23:12:22 +02:00
5ad0d72378 Merge branch 'validation' 2023-07-19 23:02:28 +02:00
f8dccbf59e artixpkg: move msgs in api funcs 2023-07-19 18:17:21 +02:00
a3bcbd40d2 artixpkg: update help 2023-07-19 17:35:31 +02:00
7a6c7e61de artixpkg: add dedicated push cmd for grouped pushes 2023-07-19 17:28:08 +02:00
b517c7dcf8 artixpkg: update help 2023-07-19 17:22:12 +02:00
b5c3decf9b query (#81)
Reviewed-on: #81
2023-07-19 13:27:50 +02:00
de2d4bb4de artixpkg: rename --universe opt --all 2023-07-05 17:51:58 +02:00
f2eb80f1ab artixpkg: add check_pkgbuild_validity() 2023-07-05 17:48:36 +02:00
5f2ac0a406 artixpkg: fix ci create 2023-06-26 21:09:13 +02:00
473a5ce6aa artixpkg: add basic token check 2023-06-26 18:57:56 +02:00
f511f7c0e9 merge branch 'admin' 2023-06-26 16:15:00 +02:00
bbca425bf8 artixpkg: fix migration of non compliant pkgbase names 2023-06-26 15:58:36 +02:00
10fe40eccb artixpkg: make maintainer flags consistent 2023-06-26 15:33:16 +02:00
6ce9a5b751 artixpkg: fix repo args (#79)
Co-authored-by: Artoo <artoo@artixlinux.org>
Reviewed-on: #79
2023-06-26 15:10:30 +02:00
108dcf620a migrate-ci (#78)
Co-authored-by: Artoo <artoo@artixlinux.org>
Reviewed-on: #78
2023-06-25 17:16:55 +02:00
7fc2909a29 Merge pull request 'Add other kernels to patch_pkgbase()' (#77) from Qontinuum/artools:master into master
Reviewed-on: #77
2023-06-25 17:16:22 +02:00
Qontinuum
f248c20401 Add other kernels to patch_pkgbase() 2023-06-24 14:56:24 +02:00
1516ef432e artixpkg repo: show git status if changes 2023-06-23 00:13:57 +02:00
cc3bd8049c artixpkg (#76)
Co-authored-by: Artoo <artoo@artixlinux.org>
Reviewed-on: #76
2023-06-22 23:03:49 +02:00
13d6f8ba37 artools/0.31rc (#75)
Co-authored-by: Artoo <artoo@artixlinux.org>
Reviewed-on: #75
2023-06-22 20:19:42 +02:00
85 changed files with 4186 additions and 1211 deletions

30
.github/workflows/lint.yaml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Artools shellcheck
run-name: ${{ gitea.actor }}
on:
push:
branches:
- artools/0.33.x
- master
tags:
- 0.*
pull_request:
types: [opened, reopened]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: checkout repo
uses: actions/checkout@main
- name: build
run: make
- name: shellcheck
uses: ludeeus/action-shellcheck@master
env:
SHELLCHECK_OPTS: -x -e SC2034
with:
scandir: './build/bin'
format: tty
severity: error
additional_files: 'contrib/completion/bash/artools'

2
.gitignore vendored
View File

@@ -12,3 +12,5 @@ PKGBUILD
contrib/artixlinux contrib/artixlinux
build/ build/
tmp/ tmp/
checks/
check.sh

View File

@@ -1,9 +1,9 @@
SHELL=/bin/bash SHELL=/bin/bash
V=0.31 V=0.33
BUILDTOOLVER ?= $(V) BUILDTOOLVER ?= $(V)
CHROOTVER=0.11 CHROOTVER=0.12
TOOLS = artools TOOLS = artools
SYSCONFDIR = /etc SYSCONFDIR = /etc
@@ -32,35 +32,19 @@ MAKEPKG_CONFIGS=$(wildcard config/makepkg/*)
PACMAN_CONFIGS=$(wildcard config/pacman/*) PACMAN_CONFIGS=$(wildcard config/pacman/*)
SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*) SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*)
TOOLS_CONFIGS_BASE=$(wildcard config/conf/*base*)
TOOLS_CONFIGS_PKG=$(wildcard config/conf/*pkg*) TOOLS_CONFIGS_PKG=$(wildcard config/conf/*pkg*)
TOOLS_CONFIGS_ISO=$(wildcard config/conf/*iso*) TOOLS_CONFIGS_ISO=$(wildcard config/conf/*iso*)
LN_BUILDPKG = \ COMPLETIONS = $(addprefix $(BUILDDIR)/,$(patsubst %.in,%,$(wildcard contrib/completion/*/*)))
buildpkg-system \
buildpkg-system-gremlins \
buildpkg-system-goblins \
buildpkg-world \
buildpkg-world-gremlins \
buildpkg-world-goblins \
buildpkg-lib32 \
buildpkg-lib32-gremlins \
buildpkg-lib32-goblins \
buildpkg-galaxy \
buildpkg-galaxy-gremlins \
buildpkg-galaxy-goblins
LN_BUILDISO = \ all: binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso completion
buildiso-gremlins \
buildiso-goblins
all: binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso
binprogs_base: $(BINPROGS_BASE) binprogs_base: $(BINPROGS_BASE)
binprogs_pkg: $(BINPROGS_PKG) binprogs_pkg: $(BINPROGS_PKG)
binprogs_iso: $(BINPROGS_ISO) binprogs_iso: $(BINPROGS_ISO)
library_base: $(LIBRARY_BASE) library_base: $(LIBRARY_BASE)
library_pkg: $(LIBRARY_PKG) library_pkg: $(LIBRARY_PKG)
library_iso: $(LIBRARY_ISO) library_iso: $(LIBRARY_ISO)
completion: $(COMPLETIONS)
edit = sed -e "s|@datadir[@]|$(DATADIR)|g" \ edit = sed -e "s|@datadir[@]|$(DATADIR)|g" \
-e "s|@libdir[@]|$(LIBDIR)|g" \ -e "s|@libdir[@]|$(LIBDIR)|g" \
@@ -88,10 +72,11 @@ $(eval $(call buildInScript,build/bin,src/pkg/,.in,755))
$(eval $(call buildInScript,build/bin,src/iso/,.in,755)) $(eval $(call buildInScript,build/bin,src/iso/,.in,755))
$(eval $(call buildInScript,build/lib,src/lib/,,644)) $(eval $(call buildInScript,build/lib,src/lib/,,644))
$(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,.in,444)))
conf_base: conf_base:
@install -d $(BUILDDIR)/pacman.conf.d $(BUILDDIR)/artools @install -d $(BUILDDIR)/pacman.conf.d $(BUILDDIR)/artools
@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d @cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d
@cp -a $(TOOLS_CONFIGS_BASE) $(BUILDDIR)/artools
conf_pkg: conf_pkg:
@install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/artools @install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/artools
@@ -113,8 +98,6 @@ install_base: binprogs_base
install -dm0755 $(DESTDIR)$(LIBDIR) install -dm0755 $(DESTDIR)$(LIBDIR)
cp -ra $(BUILDDIR)/lib/base $(DESTDIR)$(LIBDIR) cp -ra $(BUILDDIR)/lib/base $(DESTDIR)$(LIBDIR)
for conf in $(notdir $(TOOLS_CONFIGS_BASE)); do install -Dm0644 $(BUILDDIR)/$(TOOLS)/$$conf $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)/$${conf##*/}; done
for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
install_pkg: binprogs_pkg install_pkg: binprogs_pkg
@@ -130,9 +113,10 @@ install_pkg: binprogs_pkg
for conf in $(notdir $(MAKEPKG_CONFIGS)); do install -Dm0644 $(BUILDDIR)/makepkg.conf.d/$$conf $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done for conf in $(notdir $(MAKEPKG_CONFIGS)); do install -Dm0644 $(BUILDDIR)/makepkg.conf.d/$$conf $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done
for a in $(SETARCH_ALIASES); do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done for a in $(SETARCH_ALIASES); do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done
for l in $(LN_BUILDPKG); do ln -sf buildpkg $(DESTDIR)$(PREFIX)/bin/$$l; done
ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides
install -Dm0644 $(BUILDDIR)/contrib/completion/bash/artixpkg $(DESTDIR)$(PREFIX)/share/bash-completion/completions/artixpkg
install_iso: binprogs_iso install_iso: binprogs_iso
install -dm0755 $(DESTDIR)$(SYSCONFDIR)/$(TOOLS) install -dm0755 $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
install -dm0755 $(DESTDIR)$(PREFIX)/bin install -dm0755 $(DESTDIR)$(PREFIX)/bin
@@ -142,8 +126,6 @@ install_iso: binprogs_iso
for conf in $(notdir $(TOOLS_CONFIGS_ISO)); do install -Dm0644 $(BUILDDIR)/$(TOOLS)/$$conf $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)/$${conf##*/}; done for conf in $(notdir $(TOOLS_CONFIGS_ISO)); do install -Dm0644 $(BUILDDIR)/$(TOOLS)/$$conf $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)/$${conf##*/}; done
for l in $(LN_BUILDISO); do ln -sf buildiso $(DESTDIR)$(PREFIX)/bin/$$l; done
install: all install_base install_pkg install_iso install: all install_base install_pkg install_iso
uninstall: uninstall:
@@ -154,8 +136,6 @@ uninstall:
for conf in $(notdir $(MAKEPKG_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done for conf in $(notdir $(MAKEPKG_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done
for conf in $(notdir $(PACMAN_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done for conf in $(notdir $(PACMAN_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
for f in $(notdir $(SETARCH_ALIASES)); do rm -f $(DESTDIR)$(DATADIR)/setarch-aliases.d/$$f; done for f in $(notdir $(SETARCH_ALIASES)); do rm -f $(DESTDIR)$(DATADIR)/setarch-aliases.d/$$f; done
for l in $(LN_BUILDPKG); do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
for l in $(LN_BUILDISO); do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides
rmdir --ignore-fail-on-non-empty \ rmdir --ignore-fail-on-non-empty \
$(DESTDIR)$(DATADIR)/setarch-aliases.d \ $(DESTDIR)$(DATADIR)/setarch-aliases.d \
@@ -171,5 +151,5 @@ dist:
check: $(BINPROGS_SRC_BASE) $(BINPROGS_SRC_PKG) $(BINPROGS_SRC_ISO) config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto check: $(BINPROGS_SRC_BASE) $(BINPROGS_SRC_PKG) $(BINPROGS_SRC_ISO) config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto
shellcheck -x $^ shellcheck -x $^
.PHONY: all binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso clean install install_base install_pkg install_iso uninstall dist check .PHONY: all binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso clean install install_base install_pkg install_iso uninstall dist check contrib
.DELETE_ON_ERROR: .DELETE_ON_ERROR:

View File

@@ -45,21 +45,22 @@ artools
* libisoburn * libisoburn
* mtools * mtools
* squashfs-tools * squashfs-tools
* go-yq
#### Configuration #### Configuration
artools-{base,pkg,iso}.conf are the configuration files for artools. artools-{pkg,iso}.conf are the configuration files for artools.
By default, the config files are installed in By default, the config files are installed in
```bash ```bash
/etc/artools/artools-{base,pkg,iso}.conf /etc/artools/artools-{pkg,iso}.conf
``` ```
A user artools-{base,pkg,iso}.conf can be placed in A user artools-{pkg,iso}.conf can be placed in
```bash ```bash
$HOME/.config/artools/artools-{base,pkg,iso}.conf $HOME/.config/artools/artools-{pkg,iso}.conf
``` ```
If the userconfig is present, artools will load the userconfig values, however, if variables have been set in the systemwide If the userconfig is present, artools will load the userconfig values, however, if variables have been set in the systemwide
@@ -68,17 +69,17 @@ These values take precedence over the userconfig.
Best practise is to leave systemwide file untouched. Best practise is to leave systemwide file untouched.
By default it is commented and shows just initialization values done in code. By default it is commented and shows just initialization values done in code.
Tools configuration is done in artools-{base,pkg,iso}.conf or by args. Tools configuration is done in artools-{pkg,iso}.conf or by args.
Specifying args will override artools-{base,pkg,iso}.conf settings. Specifying args will override artools-{pkg,iso}.conf settings.
Both, pacman.conf and makepkg.conf for chroots are loaded from Both, pacman.conf and makepkg.conf for chroots are loaded from
```bash ```bash
usr/share/artools/makepkg.conf.d/makepkg.conf usr/share/artools/makepkg.conf.d/${arch}.conf
``` ```
```bash ```bash
usr/share/artools/pacmanconf.d/${repo}.conf usr/share/artools/pacmanconf.d/${repo}-${arch}.conf
``` ```
and can be overridden dropping them in and can be overridden dropping them in

View File

@@ -1,12 +0,0 @@
#!/hint/bash
# shellcheck disable=2034
#############################################
################ artools-base ###############
#############################################
# build dir where buildpkg or buildiso chroots are created
# CHROOTS_DIR=/var/lib/artools
# the workspace directory
# WORKSPACE_DIR="${USER_HOME}/artools-workspace"

View File

@@ -5,20 +5,33 @@
################ artools-iso ################ ################ artools-iso ################
############################################# #############################################
# the iso storage directory # default chroots dir where buildiso chroots are created
# CHROOTS_DIR=/var/lib/artools
# default workspace directory
# WORKSPACE_DIR="${USER_HOME}/artools-workspace"
# default arch to build
# ARCH=$(uname -m)
# default pacman.conf to include
# possible values: {stable,gremlins,goblins}
# STABILITY="stable"
# default iso storage directory
# ISO_POOL="${WORKSPACE_DIR}/iso" # ISO_POOL="${WORKSPACE_DIR}/iso"
# the dist release; default: auto # default dist release; default: auto
# ISO_VERSION=$(date +%Y%m%d) # ISO_VERSION=$(date +%Y%m%d)
# possible values: openrc, runit, s6, suite66, dinit # default init system, possible values: openrc, runit, s6, suite66, dinit
# 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=""
# possible values: zstd (default), xz # default compression, possible values: zstd (default), xz
# COMPRESSION="zstd" # COMPRESSION="zstd"
# zstd only: range 1..22 # default compression level, zstd only: range 1..22
# COMPRESSION_LEVEL=15 # COMPRESSION_LEVEL=15

View File

@@ -5,9 +5,23 @@
################ artools-pkg ################ ################ artools-pkg ################
############################################# #############################################
# gitea user access token for buildtree # default chroots dir where buildpkg chroots are created
# CHROOTS_DIR=/var/lib/artools
# default workspace directory
# WORKSPACE_DIR="${USER_HOME}/artools-workspace"
# default arch to build
# ARCH=$(uname -m)
# default pacman.conf repos to include
# possible values: {system,world,galaxy,lib32}{-gremlins,-goblins}
# REPO="world"
# gitea user access token for gitea api
# GIT_TOKEN='' # GIT_TOKEN=''
# default workspace dir for artixpkg
# TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux # TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux
# default repos root for deploypkg # default repos root for deploypkg
@@ -18,3 +32,9 @@
# default packaging org # default packaging org
# GIT_ORG='packages' # GIT_ORG='packages'
# default archiving org
# GIT_ORG_ARCHIVE='landfill'
# default jenkins agents
# AGENTS=(orion taurus)

View File

@@ -25,7 +25,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -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::breezy'
'fossil::fossil' 'fossil::fossil'
'git::git' 'git::git'
'hg::mercurial' 'hg::mercurial'
@@ -41,10 +41,11 @@ CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags #-- Compiler and Linker Flags
#CPPFLAGS="" #CPPFLAGS=""
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \ CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
-Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection" -fstack-clash-protection -fcf-protection"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS" CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now \
-Wl,-z,pack-relative-relocs"
LTOFLAGS="-flto=auto" LTOFLAGS="-flto=auto"
RUSTFLAGS="" RUSTFLAGS=""
#-- Make Flags: change this for DistCC/SMP systems #-- Make Flags: change this for DistCC/SMP systems

View File

@@ -30,12 +30,11 @@ Architecture = auto
# Misc options # Misc options
#UseSyslog #UseSyslog
#Color Color
NoProgressBar #NoProgressBar
# We cannot check disk space from within a chroot environment CheckSpace
#CheckSpace
VerbosePkgLists VerbosePkgLists
ParallelDownloads = 5 ParallelDownloads = 10
# 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.
@@ -100,14 +99,14 @@ Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system, # If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here. # enable the lib32 repositories as required here.
[lib32-goblins] # [lib32-goblins]
Include = /etc/pacman.d/mirrorlist # Include = /etc/pacman.d/mirrorlist
#
[lib32-gremlins] # [lib32-gremlins]
Include = /etc/pacman.d/mirrorlist # Include = /etc/pacman.d/mirrorlist
#
[lib32] # [lib32]
Include = /etc/pacman.d/mirrorlist # 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.

View File

@@ -0,0 +1,103 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
Color
#NoProgressBar
CheckSpace
VerbosePkgLists
ParallelDownloads = 10
# 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-gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world-gremlins]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
# [lib32-gremlins]
# Include = /etc/pacman.d/mirrorlist
#
# [lib32]
# Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -0,0 +1,103 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
Color
#NoProgressBar
CheckSpace
VerbosePkgLists
ParallelDownloads = 10
# 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-gremlins]
# Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
# [world-gremlins]
# Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
# [galaxy-gremlins]
# Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
# [lib32-gremlins]
# Include = /etc/pacman.d/mirrorlist
#
# [lib32]
# Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -70,27 +70,30 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately # repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors. # after the header, and they will be used before the default mirrors.
[system-goblins]
Include = /etc/pacman.d/mirrorlist
[system-gremlins] [system-gremlins]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[system] [system]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[world-goblins]
Include = /etc/pacman.d/mirrorlist
[world-gremlins] [world-gremlins]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[world] [world]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system, # If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here. # enable the lib32 repositories as required here.
[lib32-goblins]
Include = /etc/pacman.d/mirrorlist
[lib32-gremlins] [lib32-gremlins]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist

View File

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

View File

@@ -82,12 +82,6 @@ Include = /etc/pacman.d/mirrorlist
[world] [world]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
#[galaxy-gremlins]
#Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system, # If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here. # enable the lib32 repositories as required here.

View File

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

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

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

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

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

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

@@ -0,0 +1,282 @@
#/usr/bin/env bash
LIBDIR=${LIBDIR:-'@libdir@'}
_artixpkg_pkgbase() {
source "${LIBDIR}"/pkg/git/config.sh
source "${LIBDIR}"/pkg/util.sh
ls -1 "${TREE_DIR_ARTIX}" | tr '\n' ' '
}
_artixpkg_completion() {
local cur prev comps comps_all repos autorepos teams agents cwords comp_cword_exflag
source "${LIBDIR}"/pkg/db/db.sh 2>/dev/null
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
for ((i = COMP_CWORD - 1; i >= 0; i--)); do
if [[ ${COMP_WORDS[i]} != -* ]]; then
last_non_flag_word="${COMP_WORDS[i]}"
break
fi
done
comps=""
comps_all=""
comp_cword_exflag=0
comp_cword_all=0
for ((i = 0; i < ${#COMP_WORDS[@]} - 1; i++)); do
word="${COMP_WORDS[i]}"
comps_all+=" $word"
((comp_cword_all++))
if [[ $word != -* ]]; then
comps+=" $word"
((comp_cword_exflag++))
fi
done
comps="${comps:1}"
comps_all="${comps_all:1}"
repos=""
for word in "${ARTIX_DB[@]}"; do
if [[ $word != -* ]]; then
repos+=" $word"
fi
done
repos="${repos:1}"
autorepos=""
for word in "${ARTIX_DB_MAP[@]}"; do
if [[ $word != -* ]]; then
autorepos+=" $word"
fi
done
autorepos="${autorepos:1}"
teams=""
for word in "${ARTIX_TEAMS[@]}"; do
if [[ $word != -* ]]; then
teams+=" $word"
fi
done
teams="${teams:1}"
agents=""
for word in "${AGENTS[@]}"; do
if [[ $word != -* ]]; then
agents+=" $word"
fi
done
agents="${agents:1}"
case "${comp_cword_exflag}" in
1)
COMPREPLY=($(compgen -W "admin ci git repo version -h --help" -- "${cur}"))
return 0
;;
2)
case ${prev} in
admin)
COMPREPLY=($(compgen -W "maintainer query team topic transfer -h --help" -- ${cur}))
;;
ci)
COMPREPLY=($(compgen -W "config -h --help" -- ${cur}))
;;
git)
COMPREPLY=($(compgen -W "clone config create pull push -h --help" -- ${cur}))
;;
repo)
COMPREPLY=($(compgen -W "add remove move import show -h --help" -- ${cur}))
;;
version)
COMPREPLY=($(compgen -W "-h --help" -- ${cur}))
;;
esac
;;
*)
case "${comps}" in
"artixpkg repo add"*)
local repoAddCommon="-p --push -r --rebuild -n --nocheck -h --help"
case "${comp_cword_exflag}" in
3)
COMPREPLY=($(compgen -W "$repoAddCommon $autorepos $repos" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "$repoAddCommon $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg repo remove"*)
case "${comp_cword_exflag}" in
3)
COMPREPLY=($(compgen -W "-p --push -h --help $autorepos $repos" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-p --push -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg repo move"*)
case "${comp_cword_exflag}" in
3|4)
COMPREPLY=($(compgen -W "-p --push -h --help $autorepos $repos" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-p --push -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg repo import"*)
case "${prev}" in
"--tag")
# this flag expects a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "--del -h --help --tag $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg repo show")
COMPREPLY=($(compgen -W "-b --base -p --pkgs -h --help" -- ${cur}))
;;
"artixpkg git clone"*)
case "${prev}" in
"-a"|"--agent")
COMPREPLY=($(compgen -W "$agents" -- ${cur}))
;;
"--protocol")
COMPREPLY=($(compgen -W "https" -- ${cur}))
;;
"-t"|"--team")
COMPREPLY=($(compgen -W "$teams" -- ${cur}))
;;
"-m"|"--maintainer"|"-s"|"--search"|"-t"|"--team"|"-j"|"--jobs")
# these flags expect a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "-m --maintainer --protocol -s --search -t --team -a --agent -j --jobs --all -h --help" -- ${cur}))
;;
esac
;;
"artixpkg git config"*)
case "${prev}" in
"--protocol")
COMPREPLY=($(compgen -W "https" -- ${cur}))
;;
"-j"|"--jobs")
# these flags expect a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "--protocol -j --jobs -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg git create"*)
case "${prev}" in
"-a"|"--agent")
COMPREPLY=($(compgen -W "$agents" -- ${cur}))
;;
"-t"|"--team")
COMPREPLY=($(compgen -W "$teams" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-c --clone -a --agent -t --team -h --help" -- ${cur}))
;;
esac
;;
"artixpkg git pull"*)
case "${prev}" in
"-t"|"--topic"|"-m"|"--maintainer"|"-j"|"--jobs")
# these flags expect a parameter
COMPREPLY=()
;;
*)
case "${comps_all}" in
*--all*)
COMPREPLY=($(compgen -W "-m --maintainer -t --topic -j --jobs -h --help" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-m --maintainer -t --topic -j --jobs --all -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
esac
;;
"artixpkg git push"*)
case "${prev}" in
"-m"|"--maintainer"|"-t"|"--topic"|"-j"|"--jobs")
# this flag expects a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "-m --maintainer -t --topic -j --jobs -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg ci config"*)
case "${prev}" in
"-j"|"--jobs")
# this flag expects a parameter
COMPREPLY=()
;;
"-a"|"--agent")
COMPREPLY=($(compgen -W "$agents" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-a --agent -s --switch -j --jobs -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg admin maintainer"*)
case "${comp_cword_all}" in
3)
COMPREPLY=($(compgen -W "-a --adopt --o --orphan -h --help" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg admin query"*)
case "${prev}" in
"-m"|"--maintainer"|"-t"|"--topic")
# this flag expects a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "-m --maintainer -t --topic -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg admin team"*)
case "${prev}" in
"-a"|"--add"|"-r"|"--remove")
COMPREPLY=($(compgen -W "$teams" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-a --add -c --check -l --list -r --remove -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg admin topic"*)
case "${prev}" in
"-a"|"--add"|"-r"|"--remove"|"-j"|"--jobs")
# this flag expects a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "-a --add -r --remove -d --del -j --jobs -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg admin transfer"*)
COMPREPLY=($(compgen -W "-h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
esac
}
complete -F _artixpkg_completion artixpkg

View File

@@ -0,0 +1,17 @@
################ install ################
# start services
# bluetoothd, cupsd, DM are added to the pkglist dynamicly
# metalog or syslog-ng is added to the pkglist dynamicly
# connmand or NetworkManager is added to the pkglist dynamicly
# only added if in array, these pkgs have no list entry
SERVICES=('acpid' 'bluetoothd' 'cronie' 'cupsd' 'metalog' 'connmand')
################# live-session #################
# default value
# PASSWORD="artix"
# Set to false to disable autologin in the live session
AUTOLOGIN="false"

View File

@@ -8,40 +8,81 @@ LIBDIR=${LIBDIR:-'@libdir@'}
# shellcheck source=src/lib/base/message.sh # shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh
# shellcheck source=src/lib/base/mount.sh # shellcheck source=src/lib/base/mount.sh
source "${LIBDIR}"/base/mount.sh source "${LIBDIR}"/base/mount.sh
# shellcheck source=src/lib/base/unshare-mount.sh
source "${LIBDIR}"/base/unshare-mount.sh
# shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh
artix-chroot() {
check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}"
# (( EUID == 0 )) || die 'This script must be run with root privileges'
[[ -d $chrootdir ]] || die "Can't create chroot on non-directory %s" "$chrootdir"
"$setup" "$chrootdir" || die "failed to setup chroot %s" "$chrootdir"
if (( ! keepresolvconf )); then
chroot_add_resolv_conf "$chrootdir" || die "failed to setup resolv.conf"
fi
if ! mountpoint -q "$chrootdir"; then
warning "$chrootdir is not a mountpoint. This may have undesirable side effects."
fi
chroot_args=()
[[ $userspec ]] && chroot_args+=(--userspec "$userspec")
SHELL=/bin/bash $pid_unshare chroot "${chroot_args[@]}" -- "$chrootdir" "${args[@]}"
}
usage() { usage() {
printf 'usage: %s chroot-dir [command]\n' "${0##*/}" cat <<EOF
printf ' -h Print this help message\n' usage: ${0##*/} chroot-dir [command] [arguments...]
printf '\n'
printf " If 'command' is unspecified, %s will launch /bin/sh.\n" "${0##*/}" -h Print this help message
printf '\n' -N Run in unshare mode as a regular user
printf '\n' -u <user>[:group] Specify non-root user and optional group to use
exit "$1" -r Do not change the resolv.conf within the chroot
If 'command' is unspecified, ${0##*/} will launch /bin/bash.
Note that when using artix-chroot, the target chroot directory *should* be a
mountpoint. This ensures that tools such as pacman(8) or findmnt(8) have an
accurate hierarchy of the mounted filesystems within the chroot.
If your chroot target is not a mountpoint, you can bind mount the directory on
itself to make it a mountpoint, i.e. 'mount --bind /your/chroot /your/chroot'.
EOF
} }
orig_args=("$@") orig_args=("$@")
opts=':h' opts=':hNu:r'
while getopts ${opts} arg; do while getopts ${opts} arg; do
case "${arg}" in case "${arg}" in
h|?) usage 0 ;; h) usage; exit 0 ;;
N) unshare=1 ;;
u) userspec=$OPTARG ;;
r) keepresolvconf=1 ;;
:) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
esac esac
done done
shift $(( OPTIND - 1 ))
check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" (( $# )) || die 'No chroot directory specified'
chrootdir=$1 chrootdir="$1"
shift shift
[[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}" args=("$@")
if (( unshare )); then
chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}" setup=unshare_setup
chroot_add_resolv_conf "${chrootdir}" "$mount_unshare" bash -c "$(declare_all); artix-chroot"
else
SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "$@" setup=chroot_setup
artix-chroot
fi

View File

@@ -18,26 +18,50 @@ LIBDIR=${LIBDIR:-'@libdir@'}
source "${LIBDIR}"/base/message.sh source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/mount.sh # shellcheck source=src/lib/base/mount.sh
source "${LIBDIR}"/base/mount.sh source "${LIBDIR}"/base/mount.sh
# shellcheck source=src/lib/base/unshare-mount.sh
source "${LIBDIR}"/base/unshare-mount.sh
# shellcheck source=src/lib/base/chroot.sh # shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh source "${LIBDIR}"/base/chroot.sh
#{{{ functions #{{{ functions
copy_mirrorlist(){ basestrap() {
cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/" check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}"
} # (( EUID == 0 )) || die 'This script must be run with root privileges'
copy_keyring(){ # create obligatory directories
if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then msg "Creating install root at %s" "$newroot"
cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/" install -d -m755 "$newroot"/var/{cache/pacman/pkg,lib/pacman,log}
install -d -m755 "$newroot"/{dev,run,etc/pacman.d}
install -d -m1777 "$newroot"/tmp
install -d -m555 "$newroot"/{sys,proc}
# mount API filesystems
"$setup" "$newroot" || die "failed to setup chroot %s" "$newroot"
if [[ ! -d $newroot/etc/pacman.d/gnupg ]]; then
if (( initkeyring )); then
pacman-key --gpgdir "$newroot"/etc/pacman.d/gnupg --init
elif (( copykeyring )) && [[ -d /etc/pacman.d/gnupg ]]; then
# if there's a keyring on the host, copy it into the new root
cp -a --no-preserve=ownership /etc/pacman.d/gnupg "$newroot/etc/pacman.d/"
fi
fi fi
}
create_min_fs(){ msg 'Installing packages to %s' "$newroot"
msg "Creating install root at %s" "$1" if ! $pid_unshare pacman -r "$newroot" "${pacman_args[@]}"; then
mkdir -m 0755 -p "$1"/var/{cache/pacman/pkg,lib/pacman,log} "$1"/{dev,run,etc/pacman.d} die 'Failed to install packages to new root'
mkdir -m 1777 -p "$1"/tmp fi
mkdir -m 0555 -p "$1"/{sys,proc}
if (( copymirrorlist )); then
# install the host's mirrorlist onto the new root
cp -a /etc/pacman.d/mirrorlist "$newroot/etc/pacman.d/"
fi
if (( copyconf )); then
cp -a "$pacman_config" "$newroot/etc/pacman.conf"
fi
} }
#}}} #}}}
@@ -46,77 +70,80 @@ newroot=/mnt
hostcache=0 hostcache=0
copykeyring=1 copykeyring=1
initkeyring=0
copymirrorlist=1 copymirrorlist=1
pacmode=-Sy pacmode=-Sy
pacman_args=()
unshare=0
copyconf=0
pacman_config=/etc/pacman.conf
usage() { usage() {
printf "usage: %s [options] root [packages...]\n" "${0##*/}" cat <<EOF
printf " -C <config> Use an alternate config file for pacman\n" usage: ${0##*/} [options] root [packages...]
printf " -c Use the package cache on the host, rather than the target\n"
printf " -G Avoid copying the host's pacman keyring to the target\n" Options:
printf " -i Avoid auto-confirmation of package selections\n" -C <config> Use an alternate config file for pacman
printf " -M Avoid copying the host's mirrorlist to the target\n" -c Use the package cache on the host, rather than the target
printf ' -U Use pacman -U to install packages\n' -D Skip pacman dependency checks
printf " -h Print this help message\n" -G Avoid copying the host's pacman keyring to the target
printf '\n' -i Prompt for package confirmation when needed (run interactively)
printf ' basestrap installs packages to the specified new root directory.\n' -K Initialize an empty pacman keyring in the target (implies '-G')
printf ' If no packages are given, basestrap defaults to the "base" group.\n' -M Avoid copying the host's mirrorlist to the target
printf '\n' -N Run in unshare mode as a regular user
printf '\n' -P Copy the host's pacman config to the target
exit "$1" -U Use pacman -U to install packages
-h Print this help message
basestrap installs packages to the specified new root directory. If no packages
are given, basestrap defaults to the "base" group.
EOF
} }
orig_args=("$@") orig_args=("$@")
opts=':C:cGiMU' opts=':C:cDGiKMNPU'
while getopts ${opts} arg; do while getopts ${opts} arg; do
case "${arg}" in case "${arg}" in
C) pacman_conf=$OPTARG ;; C) pacman_config=$OPTARG ;;
D) pacman_args+=(-dd) ;;
c) hostcache=1 ;; c) hostcache=1 ;;
i) interactive=1 ;; i) interactive=1 ;;
G) copykeyring=0 ;; G) copykeyring=0 ;;
K) initkeyring=1 ;;
M) copymirrorlist=0 ;; M) copymirrorlist=0 ;;
N) unshare=1 ;;
P) copyconf=1 ;;
U) pacmode=-U ;; U) pacmode=-U ;;
h|?) usage 0 ;; :) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
esac esac
done done
shift $(( OPTIND - 1 )) shift $(( OPTIND - 1 ))
check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}"
(( $# )) || die "No root directory specified" (( $# )) || die "No root directory specified"
newroot=$1; shift newroot=$1; shift
pacman_args=("${@:-base}")
if (( ! hostcache ));then
pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg")
fi
if (( ! interactive )); then
pacman_args+=(--noconfirm)
fi
[[ -n $pacman_conf ]] && pacman_args+=(--config="$pacman_conf")
[[ -d $newroot ]] || die "%s is not a directory" "$newroot" [[ -d $newroot ]] || die "%s is not a directory" "$newroot"
# create obligatory directories pacman_args+=("$pacmode" "${@:-base}" --config="$pacman_config")
create_min_fs "$newroot"
# mount API filesystems if (( ! hostcache )); then
chroot_api_mount "$newroot" || die "failed to setup API filesystems in new root" pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg")
if (( copykeyring ));then
copy_keyring "$newroot"
fi fi
msg2 'Installing packages to %s' "$newroot" if (( ! interactive )); then
if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then pacman_args+=(--noconfirm)
die 'Failed to install packages to new root'
fi fi
if (( unshare )); then
if (( copymirrorlist ));then setup=unshare_setup
copy_mirrorlist "$newroot" "$mount_unshare" bash -c "$(declare_all); basestrap"
else
setup=chroot_setup
basestrap
fi fi

View File

@@ -12,10 +12,12 @@ source "${LIBDIR}"/base/message.sh
#{{{ filesystems #{{{ filesystems
declare -A pseudofs_types=([anon_inodefs]=1 declare -A pseudofs_types=([anon_inodefs]=1
[apparmorfs]=1
[autofs]=1 [autofs]=1
[bdev]=1 [bdev]=1
[bpf]=1 [binder]=1
[binfmt_misc]=1 [binfmt_misc]=1
[bpf]=1
[cgroup]=1 [cgroup]=1
[cgroup2]=1 [cgroup2]=1
[configfs]=1 [configfs]=1
@@ -25,31 +27,55 @@ declare -A pseudofs_types=([anon_inodefs]=1
[devpts]=1 [devpts]=1
[devtmpfs]=1 [devtmpfs]=1
[dlmfs]=1 [dlmfs]=1
[dmabuf]=1
[drm]=1
[efivarfs]=1 [efivarfs]=1
[fuse]=1
[fuse.archivemount]=1
[fuse.avfsd]=1
[fuse.dumpfs]=1
[fuse.encfs]=1
[fuse.gvfs-fuse-daemon]=1 [fuse.gvfs-fuse-daemon]=1
[fuse.gvfsd-fuse]=1
[fuse.lxcfs]=1
[fuse.rofiles-fuse]=1
[fuse.vmware-vmblock]=1
[fuse.xwmfs]=1
[fusectl]=1 [fusectl]=1
[hugetlbfs]=1 [hugetlbfs]=1
[ipathfs]=1
[mqueue]=1 [mqueue]=1
[nfsd]=1 [nfsd]=1
[none]=1 [none]=1
[nsfs]=1
[overlay]=1
[pipefs]=1 [pipefs]=1
[proc]=1 [proc]=1
[pstore]=1 [pstore]=1
[ramfs]=1 [ramfs]=1
[resctrl]=1
[rootfs]=1 [rootfs]=1
[rpc_pipefs]=1 [rpc_pipefs]=1
[securityfs]=1 [securityfs]=1
[selinuxfs]=1
[smackfs]=1
[sockfs]=1 [sockfs]=1
[spufs]=1 [spufs]=1
[sysfs]=1 [sysfs]=1
[tmpfs]=1) [tmpfs]=1
[tracefs]=1
[vboxsf]=1
[virtiofs]=1)
declare -A fsck_types=([cramfs]=1 declare -A fsck_types=([btrfs]=0 # btrfs doesn't need a regular fsck utility
[cramfs]=1
[erofs]=1
[exfat]=1 [exfat]=1
[ext2]=1 [ext2]=1
[ext3]=1 [ext3]=1
[ext4]=1 [ext4]=1
[ext4dev]=1 [f2fs]=1
[fat]=1
[jfs]=1 [jfs]=1
[minix]=1 [minix]=1
[msdos]=1 [msdos]=1
@@ -69,11 +95,15 @@ fstype_has_fsck() {
(( fsck_types["$1"] )) (( fsck_types["$1"] ))
} }
try_cast() (
_=$(( $1#$2 ))
) 2>/dev/null
valid_number_of_base() { valid_number_of_base() {
local base=$1 len=${#2} i local base="$1" len=${#2} i
for (( i = 0; i < len; i++ )); do for (( i = 0; i < len; i++ )); do
{ _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null try_cast "$base" "${2:i:1}" || return 1
done done
return 0 return 0
@@ -81,7 +111,6 @@ valid_number_of_base() {
mangle() { mangle() {
local i chr out local i chr out
local {a..f}= {A..F}= local {a..f}= {A..F}=
for (( i = 0; i < ${#1}; i++ )); do for (( i = 0; i < ${#1}; i++ )); do
@@ -100,7 +129,6 @@ mangle() {
unmangle() { unmangle() {
local i chr out len=$(( ${#1} - 4 )) local i chr out len=$(( ${#1} - 4 ))
local {a..f}= {A..F}= local {a..f}= {A..F}=
for (( i = 0; i < len; i++ )); do for (( i = 0; i < len; i++ )); do
@@ -127,7 +155,6 @@ dm_name_for_devnode() {
else else
# don't leave the caller hanging, just print the original name # don't leave the caller hanging, just print the original name
# along with the failure. # along with the failure.
print '%s' "$1"
error 'Failed to resolve device mapper name for: %s' "$1" error 'Failed to resolve device mapper name for: %s' "$1"
fi fi
} }
@@ -185,19 +212,11 @@ optstring_append_option() {
optstring_normalize "$1" 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() { optstring_get_option() {
local opts o local _opts o
IFS=, read -ra opts <<<"${!1}" IFS=, read -ra _opts <<<"${!1}"
for o in "${opts[@]}"; do for o in "${_opts[@]}"; do
if optstring_match_option "$2" "$o"; then if optstring_match_option "$2" "$o"; then
declare -g "$o" declare -g "$o"
return 0 return 0
@@ -214,7 +233,7 @@ optstring_has_option() {
} }
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)
@@ -242,7 +261,7 @@ write_source() {
;; ;;
esac esac
[[ -n "${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")"
@@ -267,15 +286,27 @@ optstring_apply_quirks() {
fi fi
case $fstype in case $fstype in
btrfs)
# Having only one of subvol= and subvolid= is enough for mounting a btrfs subvolume
# And having subvolid= set prevents things like 'snapper rollback' to work, as it
# updates the subvolume in-place, leaving subvol= unchanged with a different subvolid.
if optstring_has_option "$varname" subvol; then
optstring_remove_option "$varname" subvolid
fi
;;
f2fs) f2fs)
# These are Kconfig options for f2fs. Kernels supporting the options will # These are build-time or runtime-unchangeable options for f2fs.
# only provide the negative versions of these (e.g. noacl), and vice versa # The former means that kernels supporting the options will only
# provide the negative versions of these (e.g. noacl), and vice versa
# for kernels without support. # for kernels without support.
optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr # The latter means that the options can only be specified/changed
# during the initial mount but not remount.
optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr,atgc
;; ;;
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 # shellcheck disable=SC2154
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
@@ -290,11 +321,12 @@ usage() {
usage: ${0##*/} [options] root usage: ${0##*/} [options] root
Options: Options:
-f FILTER Restrict output to mountpoints matching the prefix FILTER -f <filter> Restrict output to mountpoints matching the prefix FILTER
-L Use labels for source identifiers (shortcut for -t LABEL) -L Use labels for source identifiers (shortcut for -t LABEL)
-p Exclude pseudofs mounts (default behavior) -p Exclude pseudofs mounts (default behavior)
-P Include printing mounts -P Include pseudofs mounts
-t TAG Use TAG for source identifiers -t <tag> Use TAG for source identifiers (TAG should be one of: LABEL,
UUID, PARTLABEL, PARTUUID)
-U Use UUIDs for source identifiers (shortcut for -t UUID) -U Use UUIDs for source identifiers (shortcut for -t UUID)
-h Print this help message -h Print this help message
@@ -332,7 +364,6 @@ if ! mountpoint -q "$root"; then
fi fi
# handle block devices # handle block devices
findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root" |
while read -r src target fstype opts fsroot; do while read -r src target fstype opts fsroot; do
if (( !pseudofs )) && fstype_is_pseudofs "$fstype"; then if (( !pseudofs )) && fstype_is_pseudofs "$fstype"; then
continue continue
@@ -360,6 +391,7 @@ while read -r src target fstype opts fsroot; do
if [[ $fsroot != / && $fstype != btrfs ]]; then if [[ $fsroot != / && $fstype != btrfs ]]; then
# it's a bind mount # it's a bind mount
src=$(findmnt -funcevo TARGET "$src")$fsroot src=$(findmnt -funcevo TARGET "$src")$fsroot
src="/${src#"$root"/}"
if [[ $src -ef $target ]]; then if [[ $src -ef $target ]]; then
# hrmm, this is weird. we're probably looking at a file or directory # hrmm, this is weird. we're probably looking at a file or directory
# that was bound into a chroot from the host machine. Ignore it, # that was bound into a chroot from the host machine. Ignore it,
@@ -375,14 +407,14 @@ while read -r src target fstype opts fsroot; do
# filesystem quirks # filesystem quirks
case $fstype in case $fstype in
fuseblk) fuseblk)
# well-behaved FUSE filesystems will report themselves as fuse.$fstype. # well-behaved FUSE filesystems will report themselves as fuse.$fstype.
# this is probably NTFS-3g, but let's just make sure. # this is probably NTFS-3g, but let's just make sure.
if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then
# avoid blanking out fstype, leading to an invalid fstab # avoid blanking out fstype, leading to an invalid fstab
error 'Failed to derive real filesystem type for FUSE device on %s' "$target" error 'Failed to derive real filesystem type for FUSE device on %s' "$target"
else else
fstype=$newtype fstype=$newtype
fi fi
;; ;;
esac esac
@@ -393,7 +425,7 @@ while read -r src target fstype opts fsroot; do
printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts" printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts"
printf '\t%s %s' "$dump" "$pass" printf '\t%s %s' "$dump" "$pass"
printf '\n\n' printf '\n\n'
done done < <(findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root")
# handle swaps devices # handle swaps devices
{ {
@@ -409,6 +441,9 @@ done
# skip files marked deleted by the kernel # skip files marked deleted by the kernel
[[ $device = *'\040(deleted)' ]] && continue [[ $device = *'\040(deleted)' ]] && continue
# skip devices not part of the prefix
[[ $device = "$prefixfilter"* ]] || continue
if [[ $type = file ]]; then if [[ $type = file ]]; then
printf '%-20s' "${device#"${root%/}"}" printf '%-20s' "${device#"${root%/}"}"
elif [[ $device = /dev/dm-+([0-9]) ]]; then elif [[ $device = /dev/dm-+([0-9]) ]]; then

View File

@@ -6,20 +6,16 @@ LIBDIR=${LIBDIR:-'@libdir@'}
DATADIR=${DATADIR:-'@datadir@'} DATADIR=${DATADIR:-'@datadir@'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
# shellcheck source=src/lib/base/util.sh
source "${LIBDIR}"/base/util.sh
# shellcheck source=src/lib/iso/util.sh # shellcheck source=src/lib/iso/util.sh
source "${LIBDIR}"/iso/util.sh source "${LIBDIR}"/iso/util.sh
# shellcheck source=src/lib/base/message.sh # shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/chroot.sh # shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh source "${LIBDIR}"/base/chroot.sh
# shellcheck source=src/lib/base/mount.sh # shellcheck source=src/lib/iso/mount.sh
source "${LIBDIR}"/iso/mount.sh source "${LIBDIR}"/iso/mount.sh
# shellcheck source=src/lib/iso/services.sh # shellcheck source=src/lib/iso/services.sh
source "${LIBDIR}"/iso/services.sh source "${LIBDIR}"/iso/services.sh
# shellcheck source=src/lib/base/yaml.sh
source "${LIBDIR}"/base/yaml.sh
# shellcheck source=src/lib/iso/calamares.sh # shellcheck source=src/lib/iso/calamares.sh
source "${LIBDIR}"/iso/calamares.sh source "${LIBDIR}"/iso/calamares.sh
# shellcheck source=src/lib/iso/config.sh # shellcheck source=src/lib/iso/config.sh
@@ -92,9 +88,15 @@ make_rootfs() {
msg "Prepare [Base installation] (rootfs)" msg "Prepare [Base installation] (rootfs)"
local rootfs="${work_dir}/rootfs" local rootfs="${work_dir}/rootfs"
load_pkgs "${root_list}"
prepare_dir "${rootfs}" prepare_dir "${rootfs}"
basestrap "${basestrap_args[@]}" "${rootfs}" "${packages[@]}" local args=()
if "${copy_pacconf}"; then
args+=(-P)
fi
basestrap "${basestrap_args[@]}" "${args[@]}" "${rootfs}" "${packages[@]}"
copy_overlay "${root_overlay}" "${rootfs}" copy_overlay "${root_overlay}" "${rootfs}"
@@ -113,6 +115,8 @@ make_livefs() {
msg "Prepare [Live installation] (livefs)" msg "Prepare [Live installation] (livefs)"
local livefs="${work_dir}/livefs" local livefs="${work_dir}/livefs"
load_pkgs "${live_list}"
prepare_dir "${livefs}" prepare_dir "${livefs}"
mount_overlayfs "${livefs}" "${work_dir}" mount_overlayfs "${livefs}" "${work_dir}"
@@ -137,6 +141,8 @@ make_bootfs() {
if [[ ! -e ${work_dir}/bootfs.lock ]]; then if [[ ! -e ${work_dir}/bootfs.lock ]]; then
msg "Prepare [/iso/boot]" msg "Prepare [/iso/boot]"
load_pkgs "${common_dir}/Packages-boot"
prepare_dir "${iso_root}/boot" prepare_dir "${iso_root}/boot"
cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}" cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}"
@@ -148,6 +154,7 @@ make_bootfs() {
if "${use_dracut}"; then if "${use_dracut}"; then
prepare_initramfs_dracut "${bootfs}" prepare_initramfs_dracut "${bootfs}"
else else
basestrap "${basestrap_args[@]}" "${bootfs}" "${packages[@]}"
prepare_initramfs_mkinitcpio "${bootfs}" prepare_initramfs_mkinitcpio "${bootfs}"
fi fi
@@ -183,8 +190,8 @@ gen_iso_fn(){
local vars=("artix") name local vars=("artix") name
vars+=("${profile}") vars+=("${profile}")
vars+=("${INITSYS}") vars+=("${INITSYS}")
case "${repo}" in case "${STABILITY}" in
'gremlins'|'goblins') vars+=("${repo}") ;; gremlins|goblins) vars+=("${STABILITY}") ;;
esac esac
vars+=("${ISO_VERSION}") vars+=("${ISO_VERSION}")
vars+=("${arch}") vars+=("${arch}")
@@ -194,15 +201,23 @@ gen_iso_fn(){
printf "%s\n" "$name" printf "%s\n" "$name"
} }
export_gpg_publickey() {
key_export="${WORKSPACE_DIR}"/pubkey.gpg
gpg --batch --no-armor --output "${key_export}" --export "${GPG_KEY}"
}
prepare_build(){ prepare_build(){
load_profile load_profile
local pac_conf
case "${repo}" in pac_conf=iso-${arch}.conf
buildiso) repo=default ;; if [[ "${STABILITY}" != 'stable' ]]; then
esac pac_conf=iso-${STABILITY}-${arch}.conf
fi
pacman_conf="${DATADIR}/pacman.conf.d/${repo}.conf" pacman_conf="${DATADIR}/pacman.conf.d/${pac_conf}"
[[ -f "${USER_CONF_DIR}/pacman.conf.d/${repo}.conf" ]] && pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${repo}.conf" if [[ -f "${USER_CONF_DIR}/pacman.conf.d/${pac_conf}" ]]; then
pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${pac_conf}"
fi
iso_file=$(gen_iso_fn).iso iso_file=$(gen_iso_fn).iso
@@ -264,10 +279,8 @@ mk_boot(){
} }
mk_chroots(){ mk_chroots(){
load_pkgs "${root_list}"
run_safe "make_rootfs" run_safe "make_rootfs"
if [[ -n ${live_list} ]]; then if [[ -n ${live_list} ]]; then
load_pkgs "${live_list}"
run_safe "make_livefs" run_safe "make_livefs"
fi fi
} }
@@ -324,21 +337,25 @@ persist=false
use_dracut=false use_dracut=false
squash_only=false squash_only=false
boot_only=false boot_only=false
copy_pacconf=false
basestrap_args=(-GMc) basestrap_args=(-GMc)
cmd=${0##*/} cmd=${0##*/}
repo=${cmd##*-}
owner=${SUDO_USER:-$USER} owner=${SUDO_USER:-$USER}
profile='base' profile='base'
chroots_iso="${CHROOTS_DIR}/buildiso" chroots_iso="${CHROOTS_DIR}/buildiso"
arch=$(uname -m) arch=${ARCH}
usage() { usage() {
printf 'Usage: %s [options]\n' "${cmd}" printf 'Usage: %s [options]\n' "${cmd}"
printf ' -p <profile> Profile [default: %s]\n' "${profile}" printf ' -p <profile> Profile [default: %s]\n' "${profile}"
printf ' -r <dir> Chroots directory\n' printf ' -r <dir> Chroots directory\n'
printf ' [default: %s]\n' "${chroots_iso}" printf ' [default: %s]\n' "${chroots_iso}"
printf ' -R <stability> Build stability\n'
printf ' [default: %s]\n' "${STABILITY}"
printf ' -a <arch> Build arch\n'
printf ' [default: %s]\n' "${arch}"
printf ' -t <dir> Target directory\n' printf ' -t <dir> Target directory\n'
printf ' [default: %s]\n' "${ISO_POOL}" printf ' [default: %s]\n' "${ISO_POOL}"
printf ' -i <name> Init system to use\n' printf ' -i <name> Init system to use\n'
@@ -353,6 +370,7 @@ usage() {
printf ' -z Generate iso only\n' printf ' -z Generate iso only\n'
printf ' Requires pre built images (-x)\n' printf ' Requires pre built images (-x)\n'
printf ' -d Use dracut instead of mkinitcpio for iso initramfs\n' printf ' -d Use dracut instead of mkinitcpio for iso initramfs\n'
printf ' -w Copy the pacman.conf used to the rootfs\n'
printf ' -q Query settings and pretend build\n' printf ' -q Query settings and pretend build\n'
printf ' -h This help\n' printf ' -h This help\n'
printf '\n' printf '\n'
@@ -362,11 +380,13 @@ usage() {
orig_args=("$@") orig_args=("$@")
opts='p:r:t:i:g:czsbxmdqh' opts='p:r:R:t:i:g:a:czsbxwmdqh'
while getopts "${opts}" arg; do while getopts "${opts}" arg; do
case "${arg}" in case "${arg}" in
p) profile="$OPTARG" ;; p) profile="$OPTARG" ;;
a) arch="$OPTARG" ;;
R) STABILITY="$OPTARG" ;;
r) chroots_iso="$OPTARG" ;; r) chroots_iso="$OPTARG" ;;
t) ISO_POOL="$OPTARG" ;; t) ISO_POOL="$OPTARG" ;;
i) INITSYS="$OPTARG" ;; i) INITSYS="$OPTARG" ;;
@@ -378,6 +398,7 @@ while getopts "${opts}" arg; do
b) boot_only=true ;; b) boot_only=true ;;
m) persist=true ;; m) persist=true ;;
d) use_dracut=true ;; d) use_dracut=true ;;
w) copy_pacconf=true ;;
q) pretend=true ;; q) pretend=true ;;
h|?) usage 0 ;; h|?) usage 0 ;;
esac esac

View File

@@ -81,7 +81,7 @@ trap_abort() {
trap_exit() { trap_exit() {
local r=$? local r=$?
trap - EXIT INT QUIT TERM HUP trap - EXIT INT QUIT TERM HUP
cleanup $r cleanup "$r"
} }
cleanup() { cleanup() {

View File

@@ -9,72 +9,39 @@ ignore_error() {
return 0 return 0
} }
trap_setup(){ chroot_add_mount() {
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap "$1" EXIT
}
chroot_mount() {
# msg2 "mount: [%s]" "$2" # msg2 "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
} }
chroot_add_resolv_conf() { chroot_maybe_add_mount() {
local chrootdir=$1 resolv_conf=$1/etc/resolv.conf
[[ -e /etc/resolv.conf ]] || return 0
# Handle resolv.conf as a symlink to somewhere else.
if [[ -L $chrootdir/etc/resolv.conf ]]; then
# readlink(1) should always give us *something* since we know at this point
# it's a symlink. For simplicity, ignore the case of nested symlinks.
resolv_conf=$(readlink "$chrootdir/etc/resolv.conf")
if [[ $resolv_conf = /* ]]; then
resolv_conf=$chrootdir$resolv_conf
else
resolv_conf=$chrootdir/etc/$resolv_conf
fi
# ensure file exists to bind mount over
if [[ ! -f $resolv_conf ]]; then
install -Dm644 /dev/null "$resolv_conf" || return 1
fi
elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then
# The chroot might not have a resolv.conf.
return 0
fi
chroot_mount /etc/resolv.conf "$resolv_conf" --bind
}
chroot_mount_conditional() {
local cond=$1; shift local cond=$1; shift
if eval "$cond"; then if eval "$cond"; then
chroot_mount "$@" chroot_add_mount "$@"
fi fi
} }
chroot_setup(){ chroot_setup(){
local mnt="$1" local mnt="$1"
chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && local tmpfs_opts="${2:-mode=1777,strictatime,nodev,nosuid}"
chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev &&
chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \
efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid &&
chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_mount /run "$mnt/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
chroot_api_mount() {
CHROOT_ACTIVE_MOUNTS=() CHROOT_ACTIVE_MOUNTS=()
trap_setup chroot_api_umount [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
chroot_setup "$1" trap 'chroot_teardown' EXIT
#chroot_maybe_add_mount "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind &&
chroot_add_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev &&
chroot_add_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error chroot_maybe_add_mount "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \
efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
chroot_add_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid &&
chroot_add_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
chroot_add_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_add_mount /run "$mnt/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
chroot_add_mount tmp "$mnt/tmp" -t tmpfs -o "${tmpfs_opts}"
} }
chroot_api_umount() { chroot_teardown() {
if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then
# msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" # msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_MOUNTS[@]}" umount "${CHROOT_ACTIVE_MOUNTS[@]}"
@@ -82,4 +49,40 @@ chroot_api_umount() {
unset CHROOT_ACTIVE_MOUNTS unset CHROOT_ACTIVE_MOUNTS
} }
resolve_link() {
local target=$1
local root=$2
# If a root was given, make sure it ends in a slash.
[[ -n $root && $root != */ ]] && root=$root/
while [[ -L $target ]]; do
target=$(readlink -m "$target")
# If a root was given, make sure the target is under it.
# Make sure to strip any leading slash from target first.
[[ -n $root && $target != $root* ]] && target=$root${target#/}
done
printf %s "$target"
}
chroot_add_resolv_conf() {
local chrootdir=$1
local src
local dest="$chrootdir/etc/resolv.conf"
src=$(resolve_link /etc/resolv.conf)
# If we don't have a source resolv.conf file, there's nothing useful we can do.
[[ -e $src ]] || return 0
if [[ ! -e "$dest" && ! -h "$dest" ]]; then
# There may be no resolv.conf in the chroot. In this case, we'll just exit.
# The chroot environment must not be concerned with DNS resolution.
return 0
fi
chroot_add_mount "$src" "$dest" -c --bind
}
#}}} #}}}

View File

@@ -0,0 +1,78 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
#{{{ mount
chroot_add_mount_lazy() {
mount "$@" && CHROOT_ACTIVE_LAZY=("$2" "${CHROOT_ACTIVE_LAZY[@]}")
}
chroot_bind_device() {
touch "$2" && CHROOT_ACTIVE_FILES=("$2" "${CHROOT_ACTIVE_FILES[@]}")
chroot_add_mount "$1" "$2" --bind
}
chroot_add_link() {
ln -sf "$1" "$2" && CHROOT_ACTIVE_FILES=("$2" "${CHROOT_ACTIVE_FILES[@]}")
}
unshare_setup() {
CHROOT_ACTIVE_MOUNTS=()
CHROOT_ACTIVE_LAZY=()
CHROOT_ACTIVE_FILES=()
[[ $(trap -p EXIT) ]] && die '(BUG): attempting to overwrite existing EXIT trap'
trap 'unshare_teardown' EXIT
chroot_add_mount_lazy "$1" "$1" --bind &&
chroot_add_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
chroot_add_mount_lazy /sys "$1/sys" --rbind &&
chroot_add_link /proc/self/fd "$1/dev/fd" &&
chroot_add_link /proc/self/fd/0 "$1/dev/stdin" &&
chroot_add_link /proc/self/fd/1 "$1/dev/stdout" &&
chroot_add_link /proc/self/fd/2 "$1/dev/stderr" &&
chroot_bind_device /dev/full "$1/dev/full" &&
chroot_bind_device /dev/null "$1/dev/null" &&
chroot_bind_device /dev/random "$1/dev/random" &&
chroot_bind_device /dev/tty "$1/dev/tty" &&
chroot_bind_device /dev/urandom "$1/dev/urandom" &&
chroot_bind_device /dev/zero "$1/dev/zero" &&
chroot_add_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
chroot_add_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
unshare_teardown() {
chroot_teardown
if (( ${#CHROOT_ACTIVE_LAZY[@]} )); then
umount --lazy "${CHROOT_ACTIVE_LAZY[@]}"
fi
unset CHROOT_ACTIVE_LAZY
if (( ${#CHROOT_ACTIVE_FILES[@]} )); then
rm "${CHROOT_ACTIVE_FILES[@]}"
fi
unset CHROOT_ACTIVE_FILES
}
pid_unshare="unshare --fork --pid"
mount_unshare="$pid_unshare --mount --map-auto --map-root-user --setuid 0 --setgid 0"
# This outputs code for declaring all variables to stdout. For example, if
# FOO=BAR, then running
# declare -p FOO
# will result in the output
# declare -- FOO="bar"
# This function may be used to re-declare all currently used variables and
# functions in a new shell.
declare_all() {
# Remove read-only variables to avoid warnings. Unfortunately, declare +r -p
# doesn't work like it looks like it should (declaring only read-write
# variables). However, declare -rp will print out read-only variables, which
# we can then use to remove those definitions.
declare -p | grep -Fvf <(declare -rp)
# Then declare functions
declare -pf
}
#}}}

View File

@@ -1,44 +0,0 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
#{{{ base conf
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p "$1"
return 0
}
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 "${USER_CONF_DIR}"
load_base_config(){
local conf="$1/artools-base.conf"
[[ -f "$conf" ]] || return 1
# shellcheck source=config/conf/artools-base.conf
[[ -r "$conf" ]] && source "$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}"

View File

@@ -4,53 +4,34 @@
#{{{ calamares #{{{ calamares
write_services_conf(){ yaml_array() {
local key1="$1" val1="$2" key2="$3" val2="$4" local array yaml
local yaml
yaml=$(write_yaml_header) for entry in "$@"; do
yaml+=$(write_yaml_map 0 "$key1" "$val1") yaml="{name: ${entry}, action: enable}"
yaml+=$(write_yaml_map 0 "$key2" "$val2") array="${array:-}${array:+,} ${yaml}"
yaml+=$(write_yaml_map 0 'services')
for svc in "${SERVICES[@]}"; do
yaml+=$(write_yaml_seq 2 "$svc")
done done
yaml+=$(write_empty_line) printf "%s\n" "[${array}]"
printf '%s\n' "${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"
printf '%s\n' "defaultBundle: default" >> "$conf"
}
write_services_suite66_conf(){
local conf="$1"/services-suite66.conf
write_services_conf 'svDir' '/etc/66/service' 'runsvDir' '/var/lib/66/system' > "$conf"
}
write_services_dinit_conf(){
local conf="$1"/services-dinit.conf
write_services_conf 'initdDir' '/etc/dinit.d' 'runsvDir' '/etc/dinit.d/boot.d' > "$conf"
} }
configure_calamares(){ configure_calamares(){
local mods="$1/etc/calamares/modules" for config in online offline; do
if [[ -d "$mods" ]];then local mods="$1/etc/calamares-$config/modules"
msg2 "Configuring: Calamares" if [[ -d "$mods" ]];then
write_services_"${INITSYS}"_conf "$mods" msg2 "Configuring: Calamares %s" "$config"
sed -e "s|services-openrc|services-${INITSYS}|" \
-i "$1"/etc/calamares/settings.conf if [[ -f "$mods"/services-artix.conf ]]; then
local svc
svc=$(yaml_array "${SERVICES[@]}") \
yq -P 'with(.;
.command = "artix-service" |
.services = env(svc) )' \
-i "$mods"/services-artix.conf
fi
fi
done
if [[ -d "$1"/etc/calamares-offline ]]; then
ln -sf calamares-offline "$1"/etc/calamares
fi fi
} }

View File

@@ -13,7 +13,6 @@ prepare_boot_extras(){
done done
cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest
cp "$src"/usr/share/licenses/common/GPL2/license.txt "$dest"/memtest.COPYING
} }
#}}} #}}}

View File

@@ -4,41 +4,15 @@
#{{{ initcpio #{{{ initcpio
make_checksum(){
local file="$1"
msg2 "Creating md5sum ..."
cd "${iso_root}${live_dir}"
md5sum "$file" > "$file".md5
cd "${OLDPWD}"
}
make_sig () {
local file="$1"
msg2 "Creating signature file..."
chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}"
su "${owner}" -c "gpg --detach-sign --output $file.sig --default-key ${GPG_KEY} $file"
chown "root:root" "${iso_root}${live_dir}"
}
export_gpg_publickey() {
key_export=${WORKSPACE_DIR}/pubkey.gpg
if [[ ! -e "${key_export}" ]]; then
gpg --batch --output "${key_export}" --export "${GPG_KEY}"
fi
}
prepare_initramfs_mkinitcpio() { prepare_initramfs_mkinitcpio() {
local mnt="$1" packages=() mkinitcpio_conf k local mnt="$1" mkinitcpio_conf k
mkinitcpio_conf=mkinitcpio-default.conf mkinitcpio_conf=mkinitcpio-default.conf
[[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf [[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf
k=$(<"$mnt"/usr/src/linux/version) k=$(<"$mnt"/usr/src/linux/version)
read_from_list "${common_dir}/Packages-boot" if [[ -v key_export ]]; then
basestrap "${basestrap_args[@]}" "$mnt" "${packages[@]}" exec {ARTIX_GNUPG_FD}<"${key_export}"
if [[ -n "${GPG_KEY}" ]]; then
exec {ARTIX_GNUPG_FD}<>"${key_export}"
export ARTIX_GNUPG_FD export ARTIX_GNUPG_FD
fi fi
@@ -46,13 +20,11 @@ prepare_initramfs_mkinitcpio() {
-c /etc/"$mkinitcpio_conf" \ -c /etc/"$mkinitcpio_conf" \
-g /boot/initramfs.img -g /boot/initramfs.img
if [[ -n "${GPG_KEY}" ]]; then if [[ -v key_export ]]; then
exec {ARTIX_GNUPG_FD}<&- exec {ARTIX_GNUPG_FD}<&-
unset ARTIX_GNUPG_FD unset ARTIX_GNUPG_FD
fi fi
if [[ -f "${key_export}" ]]; then rm -rf -- "${key_export}"
rm "${key_export}"
fi
cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img
prepare_boot_extras "$mnt" prepare_boot_extras "$mnt"
} }

View File

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

View File

@@ -26,7 +26,7 @@ load_profile(){
[[ -f $profile_dir/${profile}/profile.conf ]] || return 1 [[ -f $profile_dir/${profile}/profile.conf ]] || return 1
# shellcheck disable=1090 # shellcheck source=contrib/iso/profile.conf.example
[[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf [[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf
AUTOLOGIN=${AUTOLOGIN:-true} AUTOLOGIN=${AUTOLOGIN:-true}
@@ -43,31 +43,15 @@ load_profile(){
read_from_list() { read_from_list() {
local list="$1" local list="$1"
local _space="s| ||g" local _space="s| ||g"
local _clean=':a;N;$!ba;s/\n/ /g' #local _clean=':a;N;$!ba;s/\n/ /g'
local _clean='/^$/d'
local _com_rm="s|#.*||g" local _com_rm="s|#.*||g"
local _init="s|@initsys@|${INITSYS}|g" local _init="s|@initsys@|${INITSYS}|g"
local pkgs
mapfile -t pkgs < <(sed "$_com_rm" "$list" \ mapfile -t pkgs < <(sed "$_com_rm" "$list" \
| sed "$_space" \ | sed "$_space" \
| sed "$_init" \ | sed "$_init" \
| sed "$_clean") | sed "$_clean" | sort -u)
printf "%s\n" "${pkgs[@]}"
}
read_from_services() {
for svc in "${SERVICES[@]}"; do
case "$svc" in
sddm|gdm|lightdm|mdm|greetd|lxdm|xdm)
packages+=("$svc-${INITSYS}"); display_manager="$svc" ;;
NetworkManager) packages+=("networkmanager-${INITSYS}") ;;
connmand) packages+=("connman-${INITSYS}") ;;
cupsd) packages+=("cups-${INITSYS}") ;;
bluetoothd) packages+=("bluez-${INITSYS}") ;;
syslog-ng|metalog) packages+=("$svc-${INITSYS}") ;;
esac
done
} }
load_pkgs(){ load_pkgs(){
@@ -77,19 +61,33 @@ load_pkgs(){
if [[ "${pkglist##*/}" == "Packages-Root" ]]; then if [[ "${pkglist##*/}" == "Packages-Root" ]]; then
for l in base apps "${INITSYS}"; do for l in base apps "${INITSYS}"; do
msg2 "Loading Packages: [%s] ..." "Packages-${l}" msg2 "Loading Packages: [%s] ..." "Packages-${l}"
packages+=($(read_from_list "${common_dir}/Packages-${l}")) read_from_list "${common_dir}/Packages-${l}"
packages+=("${pkgs[@]}")
done done
if [[ -n "${live_list}" ]]; then if [[ -n "${live_list}" ]]; then
msg2 "Loading Packages: [%s] ..." "Packages-xorg" msg2 "Loading Packages: [Packages-xorg] ..."
packages+=($(read_from_list "${common_dir}/Packages-xorg")) read_from_list "${common_dir}/Packages-xorg"
packages+=("${pkgs[@]}")
fi fi
msg2 "Loading Packages: [%s] ..." "${pkglist##*/}"
packages+=($(read_from_list "${pkglist}")) for svc in "${SERVICES[@]}"; do
read_from_services case "$svc" in
else sddm|gdm|lightdm|mdm|greetd|lxdm|xdm)
msg2 "Loading Packages: [%s] ..." "${pkglist##*/}" packages+=("$svc-${INITSYS}"); display_manager="$svc" ;;
packages+=($(read_from_list "${pkglist}")) NetworkManager) packages+=("networkmanager-${INITSYS}") ;;
connmand) packages+=("connman-${INITSYS}") ;;
cupsd) packages+=("cups-${INITSYS}") ;;
bluetoothd) packages+=("bluez-${INITSYS}") ;;
syslog-ng|metalog) packages+=("$svc-${INITSYS}") ;;
esac
done
fi fi
msg2 "Loading Packages: [%s] ..." "${pkglist##*/}"
read_from_list "${pkglist}"
packages+=("${pkgs[@]}")
} }
#}}} #}}}

View File

@@ -4,6 +4,24 @@
#{{{ squash #{{{ squash
make_checksum(){
local file="$1"
msg2 "Creating md5sum ..."
cd "${iso_root}${live_dir}"
md5sum "$file" > "$file".md5
cd "${OLDPWD}"
}
make_sig () {
local file="$1"
msg2 "Creating signature file..."
chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}"
su "${owner}" -c "gpg --batch --no-armor --no-include-key-block --output $file.sig --detach-sign \
--default-key ${GPG_KEY} ${gpg_options[@]} $file"
chown "root:root" "${iso_root}${live_dir}"
}
make_ext_img(){ make_ext_img(){
local src="$1" local src="$1"
local size=32G local size=32G

View File

@@ -4,6 +4,21 @@
#{{{ iso conf #{{{ iso conf
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p "$1"
return 0
}
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 "${USER_CONF_DIR}"
load_iso_config(){ load_iso_config(){
local conf="$1/artools-iso.conf" local conf="$1/artools-iso.conf"
@@ -13,6 +28,14 @@ load_iso_config(){
# shellcheck source=config/conf/artools-iso.conf # shellcheck source=config/conf/artools-iso.conf
[[ -r "$conf" ]] && source "$conf" [[ -r "$conf" ]] && source "$conf"
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"}
ARCH=${ARCH:-"$(uname -m)"}
STABILITY=${STABILITY:-'stable'}
ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"} ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"}
ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"} ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"}

100
src/lib/pkg/admin.sh Normal file
View File

@@ -0,0 +1,100 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_ADMIN_SH:-} ]] || return 0
ARTOOLS_INCLUDE_ADMIN_SH=1
# shellcheck source=src/lib/pkg/db/db.sh
source "${LIBDIR}"/pkg/db/db.sh
set -e
artixpkg_admin_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS]
COMMANDS
maintainer Manage repo maintainer
query Query maintainers and topics
team Manage repo team
topic Manage topics
transfer Transfer obsolete repository to landfill
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} transfer libfoo libbar
$ ${COMMAND} query --topic mytopic
$ ${COMMAND} topic --add mytopic libfoo
$ ${COMMAND} team --add ${ARTIX_TEAMS[3]} libfoo
$ ${COMMAND} --adopt libfoo libbar
_EOF_
}
artixpkg_admin() {
if (( $# < 1 )); then
artixpkg_admin_usage
exit 0
fi
# option checking
while (( $# )); do
case $1 in
-h|--help)
artixpkg_admin_usage
exit 0
;;
query)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/query.sh
source "${LIBDIR}"/pkg/admin/query.sh
artixpkg_admin_query "$@"
exit 0
;;
team)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/team.sh
source "${LIBDIR}"/pkg/admin/team.sh
artixpkg_admin_team "$@"
exit 0
;;
topic)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/query.sh
source "${LIBDIR}"/pkg/admin/topic.sh
artixpkg_admin_topic "$@"
exit 0
;;
transfer)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/transfer.sh
source "${LIBDIR}"/pkg/admin/transfer.sh
artixpkg_admin_transfer "$@"
exit 0
;;
maintainer)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/maintainer.sh
source "${LIBDIR}"/pkg/admin/maintainer.sh
artixpkg_admin_maintainer "$@"
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
die "invalid command: %s" "$1"
;;
esac
done
}

View File

@@ -0,0 +1,137 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_ADMIN_MAINTAINER_SH:-} ]] || return 0
ARTOOLS_INCLUDE_ADMIN_MAINTAINER_SH=1
# shellcheck source=src/lib/pkg/packager.sh
source "${LIBDIR}"/pkg/packager.sh
set -e
artixpkg_admin_maintainer_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-a, --adopt Adopt repo
-o, --orphan Orphan repo
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} --adopt libfoo
$ ${COMMAND} --orphan libfoo libbar
_EOF_
}
artixpkg_admin_maintainer() {
if (( $# < 1 )); then
artixpkg_admin_maintainer_usage
exit 0
fi
# options
local pkgbases=()
local pkgbase
local ADOPT=0
local ORPHAN=0
local packager_name
local maintainer
local -r orphan="orphan"
local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
while (( $# )); do
case $1 in
-h|--help)
artixpkg_admin_maintainer_usage
exit 0
;;
-a|--adopt)
ADOPT=1
RUNCMD+=" $1 $maintainer"
shift
;;
-o|--orphan)
ORPHAN=1
RUNCMD+=" $1 $orphan"
shift
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
pkgbases+=("$@")
load_makepkg_config
if [[ -n ${PACKAGER} ]]; then
if ! packager_name=$(get_packager_name "${PACKAGER}") || \
! packager_email=$(get_packager_email "${PACKAGER}"); then
die "invalid PACKAGER format '${PACKAGER}' in makepkg.conf"
fi
if ! is_packager_name_valid "${packager_name}"; then
die "invalid PACKAGER '${PACKAGER}' in makepkg.conf"
fi
fi
maintainer="maintainer-${packager_name}"
if [[ -n ${GIT_TOKEN} ]]; then
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then
# force colors in parallel if parent process is colorized
if [[ -n ${BOLD} ]]; then
export ARTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${RUNCMD}" ::: "${pkgbases[@]}"; then
die 'Failed to manange some packages, please check the output'
exit 1
fi
exit 0
fi
for pkgbase in "${pkgbases[@]}"; do
local gitname
gitname=$(get_compliant_name "${pkgbase}")
if (( ADOPT )); then
if ! add_topic "${gitname}" "$maintainer"; then
warning "failed to add topic: $maintainer"
fi
if ! remove_topic "${gitname}" "$orphan"; then
warning "failed to remove topic: $orphan"
fi
fi
if (( ORPHAN )); then
if ! add_topic "${gitname}" "$orphan"; then
warning "failed to add topic: $orphan"
fi
if ! remove_topic "${gitname}" "$maintainer"; then
warning "failed to remove topic: $maintainer"
fi
fi
done
fi
}

View File

@@ -0,0 +1,81 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_ADMIN_QUERY_SH:-} ]] || return 0
ARTOOLS_INCLUDE_ADMIN_QUERY_SH=1
set -e
artixpkg_admin_query_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-m, --maintainer NAME Query for packages of the named maintainer
-t, --topic NAME Query for packages of the named topic
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} --maintainer tux
$ ${COMMAND} --topic mytopic
_EOF_
}
artixpkg_admin_query() {
if (( $# < 1 )); then
artixpkg_admin_query_usage
exit 0
fi
# options
local MAINTAINER=
local TOPIC=
while (( $# )); do
case $1 in
-h|--help)
artixpkg_admin_query_usage
exit 0
;;
-m|--maintainer)
(( $# <= 1 )) && die "missing argument for %s" "$1"
MAINTAINER="$2"
shift 2
;;
-t|--topic)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TOPIC="$2"
shift 2
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
# Query packages of a maintainer
if [[ -n ${MAINTAINER} ]]; then
local maint
maint="maintainer-${MAINTAINER}"
mapfile -t pkgbases < <(search_topic "${maint}" | yq -r '.data | .[].name' | sort)
printf "%s\n" "${pkgbases[@]}"
fi
if [[ -n ${TOPIC} ]]; then
mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort)
printf "%s\n" "${pkgbases[@]}"
fi
}

154
src/lib/pkg/admin/team.sh Normal file
View File

@@ -0,0 +1,154 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_ADMIN_TEAM_SH:-} ]] || return 0
ARTOOLS_INCLUDE_ADMIN_TEAM_SH=1
set -e
artixpkg_admin_team_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-c, --check Check if team is assigned
-l, --list List repo teams
-a, --add NAME Add team to repo
Possible values: $(yaml_array ${ARTIX_TEAMS[@]})
-r, --remove NAME Remove team from repo
Possible values: $(yaml_array ${ARTIX_TEAMS[@]})
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} --check libfoo
$ ${COMMAND} --list libfoo
$ ${COMMAND} --add ${ARTIX_TEAMS[1]} libfoo
$ ${COMMAND} --remove ${ARTIX_TEAMS[3]} libfoo
_EOF_
}
artixpkg_admin_team() {
if (( $# < 1 )); then
artixpkg_admin_team_usage
exit 0
fi
# options
local CHECK=0
local LIST=0
local TEAM_ADD
local TEAM_RM
local pkgbases=()
local pkgbase
while (( $# )); do
case $1 in
-h|--help)
artixpkg_admin_team_usage
exit 0
;;
-a|--add)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TEAM_ADD="$2"
shift 2
;;
-r|--remove)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TEAM_RM="$2"
shift 2
;;
-c|--check)
CHECK=1
shift
;;
-l|--list)
LIST=1
shift
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
pkgbases+=("$@")
if [[ -n ${GIT_TOKEN} ]]; then
for pkgbase in "${pkgbases[@]}"; do
if [[ -d "${pkgbase}" ]];then
if [[ ! -d "${pkgbase}/.git" ]]; then
error "Not a Git repository: ${pkgbase}"
continue
fi
( cd "${pkgbase}" || return
local gitname
gitname=$(get_compliant_name "${pkgbase}")
if (( CHECK )); then
local team
team=$(team_from_yaml)
res=$(check_repo_team "${gitname}" "${team}" | yq -rP '.name')
if [[ "$res" == "null" ]]; then
error "[%s] does not have team (%s) assigned" "$pkgbase" "${team}"
else
msg "[%s] has team (%s) assigned" "$pkgbase" "${team}"
fi
fi
if (( LIST )); then
list_repo_teams "${gitname}" | yq -rP '.[] | .name'
fi
if [[ -n ${TEAM_ADD} ]]; then
if ! add_team_to_repo "${gitname}" "${TEAM_ADD}"; then
warning "failed to add team: ${TEAM_ADD}"
fi
if [[ "$(team_from_yaml)" != "${TEAM_ADD}" ]] \
|| [[ "$(team_from_yaml)" == "null" ]]; then
update_yaml_team "${TEAM_ADD}"
git add "${REPO_DB}"
git commit -m "Set team ${TEAM_ADD}"
fi
fi
if [[ -n ${TEAM_RM} ]]; then
if ! remove_team_from_repo "${gitname}" "${TEAM_RM}"; then
warning "failed to add team: ${TEAM_RM}"
fi
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
)
fi
done
fi
}

139
src/lib/pkg/admin/topic.sh Normal file
View File

@@ -0,0 +1,139 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_ADMIN_TOPIC_SH:-} ]] || return 0
ARTOOLS_INCLUDE_ADMIN_TOPIC_SH=1
set -e
artixpkg_admin_topic_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-a, --add NAME Add a topic to repo
-r, --remove NAME Remove a topic from repo
-d, --delete Delete all topics from repo
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} --add mytopic libfoo
$ ${COMMAND} --remove mytopic libbar
$ ${COMMAND} --add mytopic libfoo libbar
$ ${COMMAND} --remove mytopic libfoo libbar
$ ${COMMAND} --delete libfoo
_EOF_
}
artixpkg_admin_topic() {
if (( $# < 1 )); then
artixpkg_admin_topic_usage
exit 0
fi
# options
local pkgbases=()
local pkgbase
local ADD_TOPIC
local RM_TOPIC
local ADD=0
local RM=0
local DEL=0
local jobs=
jobs=$(nproc)
local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
while (( $# )); do
case $1 in
-h|--help)
artixpkg_admin_topic_usage
exit 0
;;
-a|--add)
(( $# <= 1 )) && die "missing argument for %s" "$1"
ADD_TOPIC="$2"
ADD=1
RUNCMD+=" $1 ${ADD_TOPIC}"
shift 2
;;
-r|--remove)
(( $# <= 1 )) && die "missing argument for %s" "$1"
RM_TOPIC="$2"
RM=1
RUNCMD+=" $1 ${RM_TOPIC}"
shift 2
;;
-d|--delete)
DEL=1
RUNCMD+=" $1"
shift
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
pkgbases+=("$@")
if [[ -n ${GIT_TOKEN} ]]; then
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then
if [[ -n ${BOLD} ]]; then
export ARTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${RUNCMD}" ::: "${pkgbases[@]}"; then
die 'Failed to manage some topic, please check the output'
exit 1
fi
exit 0
fi
for pkgbase in "${pkgbases[@]}"; do
local gitname
gitname=$(get_compliant_name "${pkgbase}")
# topics meta
if (( ADD )); then
if ! add_topic "${gitname}" "${ADD_TOPIC}"; then
warning "failed to add topic: ${ADD_TOPIC}"
fi
fi
if (( RM )); then
if ! remove_topic "${gitname}" "${RM_TOPIC}"; then
warning "failed to remove topic: ${RM_TOPIC}"
fi
fi
if (( DEL )); then
if ! remove_all_topics "${gitname}" "${GIT_ORG}"; then
warning "failed to delete all topics: ${gitname}"
fi
fi
done
fi
}

View File

@@ -0,0 +1,70 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_ADMIN_TRANSFER_SH:-} ]] || return 0
ARTOOLS_INCLUDE_ADMIN_TRANSFER_SH=1
set -e
artixpkg_admin_transfer_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} libfoo
$ ${COMMAND} libfoo libbar
_EOF_
}
artixpkg_admin_transfer() {
if (( $# < 1 )); then
artixpkg_admin_transfer_usage
exit 0
fi
# options
local pkgbases=()
local pkgbase
local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
while (( $# )); do
case $1 in
-h|--help)
artixpkg_admin_transfer_usage
exit 0
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
pkgbases+=("$@")
if [[ -n ${GIT_TOKEN} ]]; then
for pkgbase in "${pkgbases[@]}"; do
local gitname
gitname=$(get_compliant_name "${pkgbase}")
transfer_repo "${gitname}" "${GIT_ORG_ARCHIVE}"
archive_repo "${gitname}" "${GIT_ORG_ARCHIVE}"
remove_all_topics "${gitname}" "${GIT_ORG_ARCHIVE}"
done
fi
}

View File

@@ -4,24 +4,15 @@
#{{{ gitea api #{{{ gitea api
get_compliant() { get_compliant_name() {
local name=$1 local name=$1
printf "%s" "${name}" \ printf "%s\n" "${name}" \
| sed -E 's/([a-zA-Z0-9]+)\+([a-zA-Z]+)/\1-\2/g' \ | sed -E 's/([a-zA-Z0-9]+)\+([a-zA-Z]+)/\1-\2/g' \
| sed -E 's/\+/plus/g' \ | sed -E 's/\+/plus/g' \
| sed -E 's/[^a-zA-Z0-9_\-\.]/-/g' \ | sed -E 's/[^a-zA-Z0-9_\-\.]/-/g' \
| sed -E 's/[_\-]{2,}/-/g' | sed -E 's/[_\-]{2,}/-/g'
} }
get_compliant_name(){
local gitname="$1"
case "$gitname" in
*+) gitname=${gitname//+/plus} ;;
*+*) gitname=${gitname//+/-} ;;
esac
printf "%s\n" "$gitname"
}
api_put() { api_put() {
curl -s -X PUT "$@" curl -s -X PUT "$@"
} }
@@ -46,7 +37,7 @@ add_team_to_repo() {
local pkgbase="$1" local pkgbase="$1"
local team="$2" local team="$2"
local url local url
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/teams/$team" url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team"
stat_busy "Adding team ($team) to package repo [$pkgbase]" stat_busy "Adding team ($team) to package repo [$pkgbase]"
api_put "$url" \ api_put "$url" \
@@ -59,7 +50,7 @@ remove_team_from_repo() {
local pkgbase="$1" local pkgbase="$1"
local team="$2" local team="$2"
local url local url
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/teams/$team" url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team"
stat_busy "Removing team ($team) from package repo [$pkgbase]" stat_busy "Removing team ($team) from package repo [$pkgbase]"
api_delete "$url" \ api_delete "$url" \
@@ -71,8 +62,8 @@ remove_team_from_repo() {
create_repo() { create_repo() {
local pkgbase="$1" local pkgbase="$1"
local url json local url json
url="${GIT_HTTPS}/api/v1/org/${GIT_ORG}/repos" url="${API_URL}/org/${GIT_ORG}/repos"
json="{ \"auto_init\": true, \"name\": \"$pkgbase\", \"gitignores\": \"ArchLinuxPackages\", \"readme\": \"Default\" }" json="{ \"auto_init\": true, \"name\": \"$pkgbase\", \"gitignores\": \"ArtixLinuxPackages\", \"readme\": \"Default\" }"
stat_busy "Create package repo [$pkgbase] in org (${GIT_ORG})" stat_busy "Create package repo [$pkgbase] in org (${GIT_ORG})"
api_post "$url" \ api_post "$url" \
@@ -87,8 +78,8 @@ transfer_repo() {
local pkgbase="$1" local pkgbase="$1"
local new_owner="$2" local new_owner="$2"
local json url local json url
json="{ \"new_owner\": \"$new_owner\", \"team_ids\": [] }" json="{ \"new_owner\": \"$new_owner\", \"team_ids\": [], \"archived\": \"true\" }"
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/transfer" url="${API_URL}/repos/${GIT_ORG}/$pkgbase/transfer"
stat_busy "Transfer package repo [$pkgbase] in org ($new_owner)" stat_busy "Transfer package repo [$pkgbase] in org ($new_owner)"
api_post "$url" \ api_post "$url" \
@@ -101,43 +92,19 @@ transfer_repo() {
list_all_repos() { list_all_repos() {
local url local url
url="${GIT_HTTPS}/api/v1/orgs/${GIT_ORG}/repos?limit=10000" url="${API_URL}/orgs/${GIT_ORG}/repos?limit=10000"
api_get "$url" \
-H "accept: application/json"
}
replace_topic() {
local url
local repo="$1"
local maintainer="$2"
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$repo/topics"
api_put "$url" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: token ${GIT_TOKEN}" \
-d "{
\"topics\": [
\"${maintainer}\"
]
}"
}
list_topics() {
local url
local pkgbase="$1"
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics"
stat_busy "Query all packages"
api_get "$url" \ api_get "$url" \
-H "accept: application/json" -H "accept: application/json"
stat_done
} }
add_topic() { add_topic() {
local url local url
local pkgbase="$1" local pkgbase="$1"
local topic="$2" local topic="$2"
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics/$topic" url="${API_URL}/repos/${GIT_ORG}/$pkgbase/topics/$topic"
stat_busy "Add topic ($topic) to [$pkgbase]" stat_busy "Add topic ($topic) to [$pkgbase]"
api_put "$url" \ api_put "$url" \
@@ -150,7 +117,7 @@ remove_topic() {
local url local url
local pkgbase="$1" local pkgbase="$1"
local topic="$2" local topic="$2"
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics/$topic" url="${API_URL}/repos/${GIT_ORG}/$pkgbase/topics/$topic"
stat_busy "Remove topic ($topic) from [$pkgbase]" stat_busy "Remove topic ($topic) from [$pkgbase]"
api_delete "$url" \ api_delete "$url" \
@@ -161,8 +128,10 @@ remove_topic() {
search_topic() { search_topic() {
local search="$1" local search="$1"
local url local url args
url="${GIT_HTTPS}/api/v1/repos/search?q=${search}&topic=true&includeDesc=false&private=false&is_private=false&template=false&archived=false&order=asc&limit=10000" args="topic=true&includeDesc=false&private=false&is_private=false"
args+="&template=false&archived=false&order=asc&limit=10000"
url="${API_URL}/repos/search?q=${search}&${args}"
stat_busy "Query for topic (${search})" stat_busy "Query for topic (${search})"
api_get "$url" \ api_get "$url" \
@@ -170,4 +139,64 @@ search_topic() {
stat_done stat_done
} }
list_repo_teams() {
local pkgbase="$1"
local url
url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams"
stat_busy "List repo teams [$pkgbase]"
api_get "$url" \
-H 'accept: application/json' \
-H "Authorization: token ${GIT_TOKEN}"
stat_done
}
check_repo_team() {
local pkgbase="$1"
local team="$2"
local url
url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team"
stat_busy "Check if team ($team) is assigned to [$pkgbase]"
api_get "$url" \
-H 'accept: application/json' \
-H "Authorization: token ${GIT_TOKEN}"
stat_done
}
archive_repo() {
local pkgbase="$1"
local org="$2"
local url
local json
url="${API_URL}/repos/$org/$pkgbase"
json="{ \"archived\": true }"
stat_busy "Archive repo [$pkgbase] in org ($org)"
api_patch "$url" \
-H "accept: application/json" \
-H "content-type: application/json" \
-H "Authorization: token ${GIT_TOKEN}" \
-d "$json"
stat_done
}
remove_all_topics() {
local pkgbase="$1"
local org="$2"
local url
local json
url="${API_URL}/repos/$org/$pkgbase/topics"
json="{ \"topics\": [] }"
stat_busy "Delete all topics from [$pkgbase]"
api_put "$url" \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H "Authorization: token ${GIT_TOKEN}" \
-d "$json"
stat_done
}
#}}} #}}}

55
src/lib/pkg/ci.sh Normal file
View File

@@ -0,0 +1,55 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_CI_SH:-} ]] || return 0
ARTOOLS_INCLUDE_CI_SH=1
set -e
artixpkg_ci_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS]
COMMANDS
config Configure ci and build agent
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} config libfoo
_EOF_
}
artixpkg_ci() {
if (( $# < 1 )); then
artixpkg_ci_usage
exit 0
fi
# option checking
while (( $# )); do
case $1 in
-h|--help)
artixpkg_ci_usage
exit 0
;;
config)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/ci/config.sh
source "${LIBDIR}"/pkg/ci/config.sh
artixpkg_ci_config "$@"
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
die "invalid command: %s" "$1"
;;
esac
done
}

154
src/lib/pkg/ci/config.sh Normal file
View File

@@ -0,0 +1,154 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_CI_CONFIG_SH:-} ]] || return 0
ARTOOLS_INCLUDE_CI_CONFIG_SH=1
# shellcheck source=src/lib/pkg/db/db.sh
source "${LIBDIR}"/pkg/db/db.sh
set -e
artixpkg_ci_config_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-a, --agent NAME Set the CI agent (default: ${AGENTS[0]})
Possible values: $(yaml_array ${AGENTS[@]})
-s, --switch Switch agent
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} --agent ${AGENTS[1]} libfoo
$ ${COMMAND} --switch --agent ${AGENTS[1]} libfoo
$ ${COMMAND} *
_EOF_
}
artixpkg_ci_config() {
# options
local jobs=
jobs=$(nproc)
local paths=()
local AGENT=${AGENTS[0]}
local SWITCH=0
# variables
local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local path realpath pkgbase
while (( $# )); do
case $1 in
-h|--help)
artixpkg_ci_config_usage
exit 0
;;
-s|--switch)
SWITCH=1
shift
;;
-a|--agent)
(( $# <= 1 )) && die "missing argument for %s" "$1"
AGENT="$2"
RUNCMD+=" $1 ${AGENT}"
shift 2
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
paths=("$@")
break
;;
esac
done
# check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then
if [[ -f PKGBUILD ]]; then
paths=(".")
else
artixpkg_ci_config_usage
exit 1
fi
fi
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#paths[@]} > 1 )); then
if [[ -n ${BOLD} ]]; then
export ARTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${RUNCMD}" ::: "${paths[@]}"; then
die 'Failed to configure some packages, please check the output'
exit 1
fi
exit 0
fi
for path in "${paths[@]}"; do
if ! realpath=$(realpath -e "${path}"); then
error "No such directory: ${path}"
continue
fi
pkgbase=$(basename "${realpath}")
pkgbase=${pkgbase%.git}
if [[ ! -d "${path}/.git" ]]; then
error "Not a Git repository: ${path}"
continue
fi
( cd "${path}" || return
if [[ ! -f ${REPO_CI} ]]; then
[[ -d .artixlinux ]] || mkdir .artixlinux
msg "Adding ci support ..."
write_jenkinsfile "${AGENT}"
git add "${REPO_CI}"
git commit -m "add ci support"
fi
if [[ ! -f ${REPO_DB} ]]; then
msg "Creating repo db ..."
create_repo_db
if [[ -f PKGBUILD ]]; then
# shellcheck source=contrib/makepkg/PKGBUILD.proto
source PKGBUILD
update_yaml_base
fi
git add "${REPO_DB}"
git commit -m "create repo db"
fi
if (( SWITCH )); then
msg "Switching to agent (${AGENT}) ..."
write_jenkinsfile "${AGENT}"
git add "${REPO_CI}"
git commit -m "switch agent"
fi
)
done
}

View File

@@ -17,8 +17,23 @@ readonly ARTIX_DB=(
galaxy galaxy
) )
readonly ARTIX_DB_MAP=(
goblins
gremlins
stable
)
readonly ARTIX_TEAMS=(
"${ARTIX_DB[2]}"
"${ARTIX_DB[5]}"
"${ARTIX_DB[8]}"
"${ARTIX_DB[11]}"
)
readonly REPO_DB='.artixlinux/pkgbase.yaml' readonly REPO_DB='.artixlinux/pkgbase.yaml'
readonly REPO_CI='.artixlinux/Jenkinsfile'
yaml_array() { yaml_array() {
local array local array
@@ -98,6 +113,8 @@ create_repo_db() {
yq -n '"---"' > "${REPO_DB}" yq -n '"---"' > "${REPO_DB}"
yq -P '.team = null' -i "${REPO_DB}"
yq -P 'with( yq -P 'with(
.pkgbase; .pkgbase;
.name = null | .name = null |
@@ -130,18 +147,43 @@ create_repo_db() {
done done
} }
has_repos_map_key() {
local _r="$1"
local r
if ! $(r="$_r" yq -r '.repos | has(strenv(r))' "${REPO_DB}"); then
return 1
fi
return 0
}
delete_obsolete_map_keys() {
local _r
for r in asteroids{-goblins,-gremlins,}; do
if $(_r="$r" yq -r '.repos | has(strenv(_r))' "${REPO_DB}"); then
local repo
repo=".repos.${r}" \
yq 'del(eval(strenv(repo)))' -i "${REPO_DB}"
fi
done
}
update_yaml_team() {
local team="${1:-${ARTIX_DB[5]}}"
team="$team" yq -P '.team = env(team)' -i "${REPO_DB}"
}
update_yaml_base() { update_yaml_base() {
local version local version
local name local name
local pkgnames local pkgnames
local arches local arches
name="${pkgbase:-${pkgname}}" pkgbase="${pkgbase:-${pkgname}}"
version="$(get_full_version)" version="$(get_full_version)"
pkgnames=$(yaml_array "${pkgname[@]}") pkgnames=$(yaml_array "${pkgname[@]}")
arches=$(yaml_array "${arch[@]}") arches=$(yaml_array "${arch[@]}")
name="${name}" version="${version}" pkgnames="${pkgnames}" arches="${arches}" \ name="${pkgbase}" version="${version}" pkgnames="${pkgnames}" arches="${arches}" \
yq -P 'with( yq -P 'with(
.pkgbase; .pkgbase;
.name = env(name) | .name = env(name) |
@@ -270,10 +312,67 @@ update_yaml_move() {
-i "${REPO_DB}" -i "${REPO_DB}"
} }
show_agent() {
local agent="${AGENTS[0]}"
if grep @${AGENTS[1]} "${REPO_CI}" &>/dev/null; then
agent="${AGENTS[1]}"
fi
msg2 "agent: %s" "$agent"
}
team_from_yaml() {
local team
team=$(yq -rP '.team' "${REPO_DB}")
printf "$team"
}
auto_detect() {
local team
for repo in "${ARTIX_TEAMS[@]}"; do
local _r res
res=$(_r=".$repo" yq -rP '.repos | eval(strenv(_r)) | .version' "${REPO_DB}")
if [[ "${res}" != "null" ]]; then
team=${repo}
fi
done
printf "%s\n" "$team"
}
show_db() { show_db() {
if ! yq -r ${REPO_DB} 1>/dev/null 2>/dev/null; then show_agent
if ! yq -r "${REPO_DB}" 1>/dev/null 2>/dev/null; then
die "${REPO_DB} invalid!" die "${REPO_DB} invalid!"
fi fi
yq -rP '. | .repos |= with_entries(select(.value.version))' "${REPO_DB}" yq -rP 'with_entries(select(.key == "team" or .key == "pkgbase"))' "${REPO_DB}"
yq -rP '. | .repos | with_entries(select(.value.version))' "${REPO_DB}"
return 0 return 0
} }
show_srcinfo_base() {
pkg2yaml . | yq '.pkgbase'
}
show_srcinfo_pkgs() {
pkg2yaml . | yq '.pkgnames'
}
write_jenkinsfile() {
printf "@Library('artix-ci@%s') import org.artixlinux.RepoPackage\n" "${1}" > "${REPO_CI}"
{
printf '\n'
printf 'PackagePipeline(new RepoPackage(this))\n'
} >> "${REPO_CI}"
}
migrate_agent_branch() {
local branch=${AGENTS[0]}
for a in "${AGENTS[@]}"; do
if grep @"$a" "${REPO_CI}" &>/dev/null; then
branch="$a"
fi
done
if grep @galaxy "${REPO_CI}" &>/dev/null; then
branch=${AGENTS[1]}
fi
write_jenkinsfile "${branch}"
}

View File

@@ -1,35 +0,0 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
local_head(){
git log --pretty=%H ...refs/heads/master^ | head -n 1
}
remote_head(){
git ls-remote origin -h refs/heads/master | cut -f1
}
has_changeset(){
msg "Checking remote for changes"
if [[ "$(local_head)" != "$(remote_head)" ]]; then
msg2 "remote changes: yes"
return 0
fi
msg2 "remote changes: no"
return 1
}
commit_ci(){
local ci=Jenkinsfile
printf "@Library('artix-ci') import org.artixlinux.RepoPackage\n" > "${ci}"
{
printf '\n'
printf 'PackagePipeline(new RepoPackage(this))\n'
} >> "${ci}"
git add "${ci}"
git commit -m "initial ci commit"
}

View File

@@ -1,68 +0,0 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
declare -rA REPO_MAP=(
[core-rebuild]=system-goblins
[core-staging]=system-goblins
[core-testing]=system-gremlins
[core]=system
[extra-rebuild]=world-goblins
[extra-staging]=world-goblins
[extra-testing]=world-gremlins
[extra]=world
[multilib-staging]=lib32-goblins
[multilib-testing]=lib32-gremlins
[multilib]=lib32
[community-staging]=galaxy-goblins
[community-testing]=galaxy-gremlins
[community]=galaxy
)
migrate_to_yaml() {
if [[ -f trunk/PKGBUILD ]]; then
cp -r trunk/* ./
stat_busy "Migrating ${pkgbase} to new layout"
create_repo_db
stat_done
# shellcheck source=contrib/makepkg/PKGBUILD.proto
source "trunk/PKGBUILD"
update_yaml_base
if [[ -d x86_64 ]]; then
local repos
mapfile -t repos < <(ls x86_64)
for r in "${repos[@]}"; do
# shellcheck source=contrib/makepkg/PKGBUILD.proto
source "x86_64/${r}/PKGBUILD"
local repo
local pkgs
local version
local pkgfiles
mapfile -t pkgfiles < <(print_package_names)
pkgs=$(yaml_array "${pkgfiles[@]}")
version=$(get_full_version)
repo=".repos.${REPO_MAP[$r]}"
version="${version}" pkgs="${pkgs}" repo="${repo}" \
yq -P 'with(
eval(strenv(repo));
.version = env(version) |
.packages = env(pkgs) )' \
-i "${REPO_DB}"
done
git rm -r x86_64
fi
git rm -r trunk
if [[ -f .artixlinux/agent.yaml ]]; then
git rm .artixlinux/agent.yaml
fi
git add .
git commit -m "migrate to new layout"
fi
}

View File

@@ -31,13 +31,4 @@ find_cached_pkgfile() {
shopt -u extglob shopt -u extglob
get_pkgbasename() {
local name="$1"
local rm_pkg=${name%.pkg.tar*}
rm_pkg=${rm_pkg%-*}
rm_pkg=${rm_pkg%-*}
rm_pkg=${rm_pkg%-*}
printf "%s\n" "$rm_pkg"
}
#}}} #}}}

View File

@@ -16,16 +16,18 @@ artixpkg_git_usage() {
clone Clone a package repository clone Clone a package repository
config Configure a clone according to artix specs config Configure a clone according to artix specs
create Create a new Gitea package repository create Create a new Gitea package repository
pull Pull a package repository
push Push a package repository
OPTIONS OPTIONS
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} clone libfoo linux libbar $ ${COMMAND} clone libfoo linux libbar
$ ${COMMAND} clone --maintainer maintainer-mynickname $ ${COMMAND} clone --maintainer tux
$ ${COMMAND} config -t libfoo $ ${COMMAND} config --topic mytopic
$ ${COMMAND} config -u libfoo $ ${COMMAND} config --maintainer tux
$ ${COMMAND} create libfoo $ ${COMMAND} create -c libfoo
_EOF_ _EOF_
} }
@@ -74,6 +76,14 @@ artixpkg_git() {
artixpkg_git_pull "$@" artixpkg_git_pull "$@"
exit 0 exit 0
;; ;;
push)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/git/push.sh
source "${LIBDIR}"/pkg/git/push.sh
artixpkg_git_push "$@"
exit 0
;;
-*) -*)
die "invalid argument: %s" "$1" die "invalid argument: %s" "$1"
;; ;;

View File

@@ -7,6 +7,10 @@ ARTOOLS_INCLUDE_GIT_CLONE_SH=1
# shellcheck source=src/lib/pkg/git/config.sh # shellcheck source=src/lib/pkg/git/config.sh
source "${LIBDIR}"/pkg/git/config.sh source "${LIBDIR}"/pkg/git/config.sh
# shellcheck source=src/lib/pkg/ci/config.sh
source "${LIBDIR}"/pkg/ci/config.sh
# shellcheck source=src/lib/pkg/admin/team.sh
source "${LIBDIR}"/pkg/admin/team.sh
set -e set -e
@@ -17,18 +21,23 @@ artixpkg_git_clone_usage() {
Usage: ${COMMAND} [OPTIONS] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS OPTIONS
-m, --maintainer=NAME Clone all packages of the named maintainer -m, --maintainer NAME Clone all packages of the named maintainer
--protocol https Clone the repository over https -s, --search TOPIC Clone all packages of the named topic
-t, --topic=NAME Clone all packages of the named topic -a, --agent NAME Set the CI agent (default: ${AGENTS[0]})
-j, --jobs N Run up to N jobs in parallel (default: $(nproc)) Possible values: $(yaml_array ${AGENTS[@]})
--universe Clone all existing packages, useful for cache warming -t, --team NAME Assign team name (default: ${ARTIX_TEAMS[1]})
-h, --help Show this help text Possible values: $(yaml_array ${ARTIX_TEAMS[@]})
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
--protocol https Clone the repository over https
--all Clone all existing packages, useful for cache warming
-h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} libfoo linux libbar $ ${COMMAND} libfoo linux libbar
$ ${COMMAND} --maintainer maintainer-mynickname $ ${COMMAND} --maintainer tux
$ ${COMMAND} --topic myopic $ ${COMMAND} --search mytopic
$ ${COMMAND} -j 8 --topic myopic $ ${COMMAND} -j 8 --search mytopic
$ ${COMMAND} --agent ${AGENTS[1]} libfoo
_EOF_ _EOF_
} }
@@ -45,7 +54,9 @@ artixpkg_git_clone() {
local CLONE_ALL=0 local CLONE_ALL=0
local MAINTAINER= local MAINTAINER=
local TOPIC= local TOPIC=
local CONFIGURE_OPTIONS=() local CONFIG_OPTS=()
local AGENT_OPTS=()
local TEAM_OPTS=()
local jobs= local jobs=
jobs=$(nproc) jobs=$(nproc)
@@ -59,7 +70,7 @@ artixpkg_git_clone() {
;; ;;
--protocol=https) --protocol=https)
GIT_REPO_BASE_URL="${GIT_HTTPS}/" GIT_REPO_BASE_URL="${GIT_HTTPS}/"
CONFIGURE_OPTIONS+=("$1") CONFIG_OPTS+=("$1")
shift shift
;; ;;
--protocol) --protocol)
@@ -69,7 +80,7 @@ artixpkg_git_clone() {
else else
die "unsupported protocol: %s" "$2" die "unsupported protocol: %s" "$2"
fi fi
CONFIGURE_OPTIONS+=("$1" "$2") CONFIG_OPTS+=("$1" "$2")
shift 2 shift 2
;; ;;
-m|--maintainer) -m|--maintainer)
@@ -77,20 +88,22 @@ artixpkg_git_clone() {
MAINTAINER="$2" MAINTAINER="$2"
shift 2 shift 2
;; ;;
--maintainer=*) -s|--search)
MAINTAINER="${1#*=}"
shift
;;
-t|--topic)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
TOPIC="$2" TOPIC="$2"
shift 2 shift 2
;; ;;
--topic=*) -t|--team)
TOPIC="${1#*=}" (( $# <= 1 )) && die "missing argument for %s" "$1"
shift TEAM_OPTS=("--add" "$2")
shift 2
;; ;;
--universe) -a|--agent)
(( $# <= 1 )) && die "missing argument for %s" "$1"
AGENT_OPTS=("$1" "$2")
shift 2
;;
--all)
CLONE_ALL=1 CLONE_ALL=1
shift shift
;; ;;
@@ -115,24 +128,18 @@ artixpkg_git_clone() {
# Query packages of a maintainer # Query packages of a maintainer
if [[ -n ${MAINTAINER} ]]; then if [[ -n ${MAINTAINER} ]]; then
stat_busy "Query mantainer packages" local maint
local maint maint="maintainer-${MAINTAINER}"
maint="maintainer-${MAINTAINER}" mapfile -t pkgbases < <(search_topic "${maint}" | yq -P -r '.data | .[].name' | sort)
mapfile -t pkgbases < <(search_topic "${maint}" | yq -P -r '.data | .[].name' | sort)
stat_done
fi fi
if [[ -n ${TOPIC} ]]; then if [[ -n ${TOPIC} ]]; then
stat_busy "Query topic packages" mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort)
mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort)
stat_done
fi fi
# Query all released packages # Query all released packages
if (( CLONE_ALL )); then if (( CLONE_ALL )); then
stat_busy "Query all packages" mapfile -t pkgbases < <(list_all_repos | yq -P -r '.[] | .name' | sort)
mapfile -t pkgbases < <(list_all_repos | yq -P -r '.[] | .name' | sort)
stat_done
fi fi
# parallelization # parallelization
@@ -161,6 +168,8 @@ artixpkg_git_clone() {
warning "Skip cloning ${pkgbase}: Directory exists" warning "Skip cloning ${pkgbase}: Directory exists"
fi fi
artixpkg_git_config "${CONFIGURE_OPTIONS[@]}" "${pkgbase}" artixpkg_git_config "${CONFIG_OPTS[@]}" "${pkgbase}"
artixpkg_ci_config "${AGENT_OPTS[@]}" "${pkgbase}"
artixpkg_admin_team "${TEAM_OPTS[@]}" "${pkgbase}"
done done
} }

View File

@@ -5,12 +5,8 @@
[[ -z ${ARTOOLS_INCLUDE_GIT_CONFIG_SH:-} ]] || return 0 [[ -z ${ARTOOLS_INCLUDE_GIT_CONFIG_SH:-} ]] || return 0
ARTOOLS_INCLUDE_GIT_CONFIG_SH=1 ARTOOLS_INCLUDE_GIT_CONFIG_SH=1
# shellcheck source=src/lib/pkg/db/db.sh # shellcheck source=src/lib/pkg/packager.sh
source "${LIBDIR}"/pkg/db/db.sh source "${LIBDIR}"/pkg/packager.sh
# shellcheck source=src/lib/pkg/db/git.sh
source "${LIBDIR}"/pkg/db/git.sh
# shellcheck source=src/lib/pkg/db/migrate.sh
source "${LIBDIR}"/pkg/db/migrate.sh
set -e set -e
@@ -21,67 +17,15 @@ artixpkg_git_config_usage() {
Usage: ${COMMAND} [OPTIONS] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS OPTIONS
-t, --topic Set the maintainer topic via gitea api --protocol https Configure remote url to use https
-u, --upstream Add upstream arch remote -j, --jobs N Run up to N jobs in parallel (default: $(nproc))
--protocol https Configure remote url to use https -h, --help Show this help text
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} -t libfoo
$ ${COMMAND} -u libfoo
$ ${COMMAND} * $ ${COMMAND} *
_EOF_ _EOF_
} }
get_packager_name() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local name
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
name=$(echo "${packager}"|sed -E "s/${packager_pattern}/\1/")
printf "%s" "${name}"
}
get_packager_email() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local email
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
email=$(echo "${packager}"|sed -E "s/${packager_pattern}/\2/")
printf "%s" "${email}"
}
is_packager_name_valid() {
local packager_name=$1
if [[ -z ${packager_name} ]]; then
return 1
elif [[ ${packager_name} == "John Tux" ]]; then
return 1
elif [[ ${packager_name} == "Unknown Packager" ]]; then
return 1
fi
return 0
}
is_packager_email_official() {
local packager_email=$1
if [[ -z ${packager_email} ]]; then
return 1
elif [[ $packager_email =~ .+@artixlinux.org ]]; then
return 0
fi
return 1
}
artixpkg_git_config() { artixpkg_git_config() {
# options # options
local GIT_REPO_BASE_URL=${GIT_HTTPS} local GIT_REPO_BASE_URL=${GIT_HTTPS}
@@ -92,11 +36,8 @@ artixpkg_git_config() {
jobs=$(nproc) jobs=$(nproc)
local paths=() local paths=()
local SET_TOPIC=0
local UPSTREAM=0
# variables # variables
local -r command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local path realpath pkgbase local path realpath pkgbase
local PACKAGER GPGKEY packager_name packager_email local PACKAGER GPGKEY packager_name packager_email
@@ -106,14 +47,6 @@ artixpkg_git_config() {
artixpkg_git_config_usage artixpkg_git_config_usage
exit 0 exit 0
;; ;;
-t|--topic)
SET_TOPIC=1
shift
;;
-u|--upstream)
UPSTREAM=1
shift
;;
--protocol=https) --protocol=https)
proto_force=1 proto_force=1
shift shift
@@ -158,7 +91,7 @@ artixpkg_git_config() {
# Load makepkg.conf variables to be available for packager identity # Load makepkg.conf variables to be available for packager identity
msg "Collecting packager identity from makepkg.conf" msg "Collecting packager identity from makepkg.conf"
# shellcheck disable=2119 # shellcheck source=config/makepkg/x86_64.conf
load_makepkg_config load_makepkg_config
if [[ -n ${PACKAGER} ]]; then if [[ -n ${PACKAGER} ]]; then
if ! packager_name=$(get_packager_name "${PACKAGER}") || \ if ! packager_name=$(get_packager_name "${PACKAGER}") || \
@@ -201,7 +134,7 @@ artixpkg_git_config() {
for path in "${paths[@]}"; do for path in "${paths[@]}"; do
if ! realpath=$(realpath -e "${path}"); then if ! realpath=$(realpath -e "${path}"); then
error "No such directory: ${path}" error "No such directory: ${path}"
# continue continue
fi fi
pkgbase=$(basename "${realpath}") pkgbase=$(basename "${realpath}")
@@ -210,7 +143,7 @@ artixpkg_git_config() {
if [[ ! -d "${path}/.git" ]]; then if [[ ! -d "${path}/.git" ]]; then
error "Not a Git repository: ${path}" error "Not a Git repository: ${path}"
# continue continue
fi fi
( cd "${path}" || return ( cd "${path}" || return
git config pull.rebase true git config pull.rebase true
@@ -234,50 +167,6 @@ artixpkg_git_config() {
git config user.signingKey "${GPGKEY}" git config user.signingKey "${GPGKEY}"
fi fi
# topics meta
if (( SET_TOPIC )); then
if [[ -n ${GIT_TOKEN} ]]; then
local topic gitname
topic="maintainer-${packager_name}"
gitname=$(get_compliant_name "${pkgbase}")
if ! add_topic "${gitname}" "${topic}"; then
warning "failed to set the maintainer topic: ${topic}"
fi
fi
fi
if (( UPSTREAM )); then
local remote_url
remote_url="${GIT_UPSTREAM_URL}/${pkgbase}".git
if ! git remote add upstream "${remote_url}"; then
warning "failed to set the upstream: ${remote_url}"
fi
fi
migrate_to_yaml
if [[ ! -f Jenkinsfile ]]; then
msg "Adding ci support ..."
commit_ci
fi
if [[ ! -f ${REPO_DB} ]]; then
msg "Adding repo db ..."
create_repo_db
if [[ -f PKGBUILD ]]; then
# shellcheck source=contrib/makepkg/PKGBUILD.proto
source PKGBUILD
update_yaml_base
fi
git add "${REPO_DB}"
git commit -m "Create repo db"
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
) )
done done
} }

View File

@@ -9,6 +9,10 @@ ARTOOLS_INCLUDE_GIT_CREATE_SH=1
source "${LIBDIR}"/pkg/git/clone.sh source "${LIBDIR}"/pkg/git/clone.sh
# shellcheck source=src/lib/pkg/git/config.sh # shellcheck source=src/lib/pkg/git/config.sh
source "${LIBDIR}"/pkg/git/config.sh source "${LIBDIR}"/pkg/git/config.sh
# shellcheck source=src/lib/pkg/ci/config.sh
source "${LIBDIR}"/pkg/ci/config.sh
# shellcheck source=src/lib/pkg/admin/team.sh
source "${LIBDIR}"/pkg/admin/team.sh
set -e set -e
@@ -19,9 +23,12 @@ artixpkg_git_create_usage() {
Usage: ${COMMAND} [OPTIONS] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS OPTIONS
-c, --clone Clone the Git repository after creation -c, --clone Clone the Git repository after creation
-t, --team=NAME Assign team name [default: world] -a, --agent NAME Set the CI agent (default: ${AGENTS[0]})
-h, --help Show this help text Possible values: $(yaml_array ${AGENTS[@]})
-t, --team NAME Assign team name (default: ${ARTIX_TEAMS[1]})
Possible values: $(yaml_array ${ARTIX_TEAMS[@]})
-h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} libfoo $ ${COMMAND} libfoo
@@ -32,11 +39,12 @@ artixpkg_git_create() {
# options # options
local pkgbases=() local pkgbases=()
local pkgbase local pkgbase
local clone=0 local CLONE=0
local config=0 local CONFIG=0
local TEAM='world'
local AGENT_OPTS=("--agent" "${AGENTS[0]}")
local TEAM_OPTS=("--team" "${ARTIX_TEAMS[1]}")
local TEAMS=(system world lib32)
# variables # variables
local path local path
@@ -46,30 +54,32 @@ artixpkg_git_create() {
artixpkg_git_create_usage artixpkg_git_create_usage
exit 0 exit 0
;; ;;
-a|--agent)
(( $# <= 1 )) && die "missing argument for %s" "$1"
AGENT_OPTS=("$1" "$2")
shift 2
;;
-c|--clone) -c|--clone)
clone=1 CLONE=1
shift shift
;; ;;
-t|--team) -t|--team)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
TEAM="$2" TEAM_OPTS=("$1" "$2")
shift 2 shift 2
;; ;;
--team=*)
TEAM="${1#*=}"
shift
;;
-*) -*)
die "invalid argument: %s" "$1" die "invalid argument: %s" "$1"
;; ;;
*) *)
pkgbases=("$@")
break break
;; ;;
esac esac
done done
if ! in_array "${TEAM}" "${TEAMS[@]}"; then pkgbases=("$@")
if ! in_array "${TEAM_OPTS[1]}" "${ARTIX_TEAMS[@]}"; then
die "${TEAM} does not exist!" die "${TEAM} does not exist!"
fi fi
@@ -79,36 +89,41 @@ artixpkg_git_create() {
if ! path=$(realpath -e .); then if ! path=$(realpath -e .); then
die "failed to read path from current directory" die "failed to read path from current directory"
fi fi
pkgbases=("$(basename "${path}")") pkgbases=("$(basename "${path}")")
clone=0 CLONE=0
config=1 CONFIG=1
else else
artixpkg_git_create_usage artixpkg_git_create_usage
exit 1 exit 1
fi fi
fi fi
# create # create
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
local gitname local gitname
gitname=$(get_compliant_name "${pkgbase}") gitname=$(get_compliant_name "${pkgbase}")
if ! create_repo "${gitname}" >/dev/null; then
die "failed to create project: ${pkgbase}" if [[ -n ${GIT_TOKEN} ]]; then
if ! create_repo "${gitname}" >/dev/null; then
die "failed to create repository: ${pkgbase}"
else
msg_success "Successfully created ${pkgbase}"
fi
fi fi
if ! add_team_to_repo "${gitname}" "${TEAM}" >/dev/null; then
warning "failed to assign team: ${TEAM}" if (( CLONE )); then
fi artixpkg_git_clone "${AGENT_OPTS[@]}" "${TEAM_OPTS[@]}" "${pkgbase}"
msg_success "Successfully created ${pkgbase}" elif (( CONFIG )); then
if (( clone )); then artixpkg_git_config "${pkgbase}"
artixpkg_git_clone "${pkgbase}" artixpkg_ci_config "${AGENT_OPTS[@]}" "${pkgbase}"
elif (( config )); then artixpkg_admin_team "${TEAM_OPTS[@]}" "${pkgbase}"
artixpkg_git_config
fi fi
done done
# some convenience hints if not in auto clone/config mode # some convenience hints if not in auto clone/config mode
if (( ! clone )) && (( ! config )); then if (( ! CLONE )) && (( ! CONFIG )); then
cat <<- _EOF_ cat <<- _EOF_
For new clones: For new clones:

View File

@@ -5,9 +5,6 @@
[[ -z ${ARTOOLS_INCLUDE_GIT_PULL_SH:-} ]] || return 0 [[ -z ${ARTOOLS_INCLUDE_GIT_PULL_SH:-} ]] || return 0
ARTOOLS_INCLUDE_GIT_PULL_SH=1 ARTOOLS_INCLUDE_GIT_PULL_SH=1
# shellcheck source=src/lib/pkg/git/config.sh
source "${LIBDIR}"/pkg/git/config.sh
set -e set -e
@@ -17,18 +14,17 @@ artixpkg_git_pull_usage() {
Usage: ${COMMAND} [OPTIONS] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS OPTIONS
-m, --maintainer=NAME Pull all packages of the named maintainer -m, --maintainer NAME Pull all packages of the named maintainer
-t, --topic=NAME Pull all packages of the named topic -t, --topic NAME Pull all packages of the named topic
-j, --jobs N Run up to N jobs in parallel (default: $(nproc)) -j, --jobs N Run up to N jobs in parallel (default: $(nproc))
--universe Pull all existing packages --all Pull all existing packages
--fetch Fetch only -h, --help Show this help text
-h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} libfoo linux libbar $ ${COMMAND} libfoo linux libbar
$ ${COMMAND} --maintainer maintainer-mynickname $ ${COMMAND} --maintainer tux
$ ${COMMAND} --topic myopic $ ${COMMAND} --topic mytopic
$ ${COMMAND} -j 8 --topic myopic $ ${COMMAND} -j 8 --topic mytopic
_EOF_ _EOF_
} }
@@ -42,7 +38,6 @@ artixpkg_git_pull() {
# options # options
local PULL_ALL=0 local PULL_ALL=0
local FETCH=0
local MAINTAINER= local MAINTAINER=
local TOPIC= local TOPIC=
local CONFIGURE_OPTIONS=() local CONFIGURE_OPTIONS=()
@@ -62,27 +57,15 @@ artixpkg_git_pull() {
MAINTAINER="$2" MAINTAINER="$2"
shift 2 shift 2
;; ;;
--maintainer=*)
MAINTAINER="${1#*=}"
shift
;;
-t|--topic) -t|--topic)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
TOPIC="$2" TOPIC="$2"
shift 2 shift 2
;; ;;
--topic=*) --all)
TOPIC="${1#*=}"
shift
;;
--universe)
PULL_ALL=1 PULL_ALL=1
shift shift
;; ;;
--fetch)
FETCH=1
shift
;;
-j|--jobs) -j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2 jobs=$2
@@ -104,24 +87,18 @@ artixpkg_git_pull() {
# Query packages of a maintainer # Query packages of a maintainer
if [[ -n ${MAINTAINER} ]]; then if [[ -n ${MAINTAINER} ]]; then
stat_busy "Query mantainer packages" local maint
local maint maint="maintainer-${MAINTAINER}"
maint="maintainer-${MAINTAINER}" mapfile -t pkgbases < <(search_topic "${maint}" | yq -P -r '.data | .[].name' | sort)
mapfile -t pkgbases < <(search_topic "${maint}" | yq -P -r '.data | .[].name' | sort)
stat_done
fi fi
if [[ -n ${TOPIC} ]]; then if [[ -n ${TOPIC} ]]; then
stat_busy "Query topic packages" mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort)
mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort)
stat_done
fi fi
# Query all released packages # Query all released packages
if (( PULL_ALL )); then if (( PULL_ALL )); then
stat_busy "Query all packages" mapfile -t pkgbases < <(list_all_repos | yq -P -r '.[] | .name' | sort)
mapfile -t pkgbases < <(list_all_repos | yq -P -r '.[] | .name' | sort)
stat_done
fi fi
# parallelization # parallelization
@@ -139,18 +116,13 @@ artixpkg_git_pull() {
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
if [[ -d ${pkgbase} ]]; then if [[ -d ${pkgbase} ]]; then
( cd ${pkgbase} || return ( cd "${pkgbase}" || return
if (( FETCH )); then
msg "Fetching ${pkgbase} ..." msg "Pulling ${pkgbase} ..."
if ! git fetch origin; then if ! git pull origin master; then
die 'failed to fetch %s' "${pkgbase}" die 'failed to pull %s' "${pkgbase}"
fi
else
msg "Pulling ${pkgbase} ..."
if ! git pull origin master; then
die 'failed to pull %s' "${pkgbase}"
fi
fi fi
) )
else else
warning "Skip pulling ${pkgbase}: Directory does not exist" warning "Skip pulling ${pkgbase}: Directory does not exist"

120
src/lib/pkg/git/push.sh Normal file
View File

@@ -0,0 +1,120 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_GIT_PUSH_SH:-} ]] || return 0
ARTOOLS_INCLUDE_GIT_PUSH_SH=1
set -e
artixpkg_git_push_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-m, --maintainer NAME Push all packages of the named maintainer
-t, --topic NAME Push all packages of the named topic
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} libfoo linux libbar
$ ${COMMAND} --maintainer tux
$ ${COMMAND} --topic mytopic
$ ${COMMAND} -j 8 --topic mytopic
_EOF_
}
artixpkg_git_push() {
if (( $# < 1 )); then
artixpkg_git_push_usage
exit 0
fi
# options
local MAINTAINER=
local TOPIC=
local CONFIGURE_OPTIONS=()
local jobs=
jobs=$(nproc)
local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
while (( $# )); do
case $1 in
-h|--help)
artixpkg_git_push_usage
exit 0
;;
-m|--maintainer)
(( $# <= 1 )) && die "missing argument for %s" "$1"
MAINTAINER="$2"
shift 2
;;
-t|--topic)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TOPIC="$2"
shift 2
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
pkgbases=("$@")
break
;;
esac
done
# Query packages of a maintainer
if [[ -n ${MAINTAINER} ]]; then
local maint
maint="maintainer-${MAINTAINER}"
mapfile -t pkgbases < <(search_topic "${maint}" | yq -P -r '.data | .[].name' | sort)
fi
if [[ -n ${TOPIC} ]]; then
mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort)
fi
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then
# force colors in parallel if parent process is colorized
if [[ -n ${BOLD} ]]; then
export ARTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${pkgbases[@]}"; then
die 'Failed to push some packages, please check the output'
exit 1
fi
exit 0
fi
for pkgbase in "${pkgbases[@]}"; do
if [[ -d ${pkgbase} ]]; then
( cd "${pkgbase}" || return
msg "Pushing ${pkgbase} ..."
if ! git push origin master; then
die 'failed to push %s' "${pkgbase}"
fi
)
else
warning "Skip pushing ${pkgbase}: Directory does not exist"
fi
done
}

51
src/lib/pkg/packager.sh Normal file
View File

@@ -0,0 +1,51 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
get_packager_name() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local name
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
name=$(echo "${packager}"|sed -E "s/${packager_pattern}/\1/")
printf "%s" "${name}"
}
get_packager_email() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local email
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
email=$(echo "${packager}"|sed -E "s/${packager_pattern}/\2/")
printf "%s" "${email}"
}
is_packager_name_valid() {
local packager_name=$1
if [[ -z ${packager_name} ]]; then
return 1
elif [[ ${packager_name} == "John Tux" ]]; then
return 1
elif [[ ${packager_name} == "Unknown Packager" ]]; then
return 1
fi
return 0
}
is_packager_email_official() {
local packager_email=$1
if [[ -z ${packager_email} ]]; then
return 1
elif [[ $packager_email =~ .+@artixlinux.org ]]; then
return 0
fi
return 1
}

View File

@@ -11,17 +11,31 @@ source "${LIBDIR}"/pkg/db/db.sh
set -e set -e
has_remote_changes() {
local status
msg "Checking for remote changes ..."
git fetch origin &>/dev/null
status=$(git status -sb --porcelain)
if [[ "$status" == *behind* ]]; then
msg2 "changes: yes"
error "Remote changes detected! Please pull (%s)" "${pkgbase}"
return 0
fi
msg2 "changes: no"
return 1
}
artixpkg_repo_usage() { artixpkg_repo_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_ cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS] Usage: ${COMMAND} [COMMAND] [OPTIONS]
COMMANDS COMMANDS
add Add built pkgbase to repo add Add built pkgbase to repo
move Move built pkgbase between repos move Move built pkgbase between repos
remove Remove built pkgbase from repo remove Remove built pkgbase from repo
import Import latest tag from arch upstream import Import latest tag from arch upstream
show Show the pkgbase's repo db show Show the pkgbase's repo db
OPTIONS OPTIONS
-h, --help Show this help text -h, --help Show this help text

View File

@@ -5,26 +5,48 @@
[[ -z ${ARTOOLS_INCLUDE_REPO_ADD_SH:-} ]] || return 0 [[ -z ${ARTOOLS_INCLUDE_REPO_ADD_SH:-} ]] || return 0
ARTOOLS_INCLUDE_REPO_ADD_SH=1 ARTOOLS_INCLUDE_REPO_ADD_SH=1
# shellcheck source=src/lib/pkg/db/git.sh
source "${LIBDIR}"/pkg/db/git.sh
set -e set -e
check_pkgbuild_validity() {
# skip when there are no sources available
if (( ! ${#source[@]} )); then
return
fi
# validate sources hash algo is at least > sha1
local bad_algos=("cksums" "md5sums" "sha1sums")
local good_hash_algo=false
# from makepkg libmakepkg/util/schema.sh
for integ in "${known_hash_algos[@]}"; do
local sumname="${integ}sums"
if [[ -n ${!sumname} ]] && ! in_array "${sumname}" "${bad_algos[@]}"; then
good_hash_algo=true
break
fi
done
if ! $good_hash_algo; then
die "PKGBUILD lacks a secure cryptographic checksum, insecure algorithms: ${bad_algos[*]}"
fi
}
artixpkg_repo_add_usage() { artixpkg_repo_add_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_ cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]...
OPTIONS OPTIONS
-p, --push Push pkgbase -p, --push Push pkgbase
-r, --rebuild Triggers a rebuild -r, --rebuild Triggers a rebuild
-n, --nocheck Disable the check function -n, --nocheck Disable the check function
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} world-gremlins libfoo $ ${COMMAND} ${ARTIX_DB[4]} libfoo
$ ${COMMAND} -p world-gremlins libfoo $ ${COMMAND} --push ${ARTIX_DB[4]} libfoo
$ ${COMMAND} --push ${ARTIX_DB_MAP[2]} libfoo
_EOF_ _EOF_
} }
@@ -43,6 +65,7 @@ artixpkg_repo_add() {
local REBUILD=0 local REBUILD=0
local NOCHECK=0 local NOCHECK=0
local ADD=1 local ADD=1
local AUTO=0
while (( $# )); do while (( $# )); do
case $1 in case $1 in
@@ -72,10 +95,15 @@ artixpkg_repo_add() {
done done
DEST="$1" DEST="$1"
shift
pkgbases+=("$@") pkgbases+=("$@")
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then if in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
die "${DEST} does not exist!" AUTO=1
else
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!"
fi
fi fi
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
@@ -88,49 +116,80 @@ artixpkg_repo_add() {
fi fi
( cd "${pkgbase}" || return ( cd "${pkgbase}" || return
# if has_changeset; then if ! has_remote_changes; then
# die "Remote changes detected! Please pull (%s)" "${pkgbase}"
# fi
if [[ ! -f PKGBUILD ]]; then if [[ ! -f PKGBUILD ]]; then
die "No PKGBUILD found in (%s)" "${pkgbase}" die "No PKGBUILD found in (%s)" "${pkgbase}"
fi
# shellcheck source=contrib/makepkg/PKGBUILD.proto
source PKGBUILD
update_yaml_base
update_yaml_add "${REBUILD}" "${ADD}" "${NOCHECK}" "${DEST}"
local commit_msg
commit_msg=$(get_commit_msg 'add' "${DEST}")
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
for f in $(git ls-files --others); do
git add "$f"
done
for f in $(git ls-files --modified); do
git add "$f"
done
for f in $(git ls-files --deleted); do
git rm "$f"
done
stat_done
msg 'Commit'
git commit -m "${commit_msg}"
if (( PUSH )); then
msg "Push (${pkgbase})"
git push origin master
fi fi
msg "Querying ${pkgbase} ..." # shellcheck source=contrib/makepkg/PKGBUILD.proto
if ! show_db; then source PKGBUILD
warning "Could not query ${REPO_DB}"
check_pkgbuild_validity
manage-pkgbuild-keys --export
update_yaml_base
local auto
auto=$(auto_detect)
if [[ -z "${auto}" ]]; then
auto=$(team_from_yaml)
fi fi
if (( AUTO )); then
if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then
DEST="${auto}"
else
DEST="${auto}-${DEST}"
fi
fi
update_yaml_add "${REBUILD}" "${ADD}" "${NOCHECK}" "${DEST}"
update_yaml_team "${auto}"
local commit_msg
commit_msg=$(get_commit_msg 'add' "${DEST}")
if [[ -f .SRCINFO ]]; then
rm .SRCINFO
fi
delete_obsolete_map_keys
migrate_agent_branch
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
for f in $(git ls-files --others); do
git add "$f"
done
for f in $(git ls-files --modified); do
git add "$f"
done
for f in $(git ls-files --deleted); do
git rm "$f"
done
stat_done
msg 'Commit'
git commit -m "${commit_msg}"
if (( PUSH )); then
msg "Push (${pkgbase})"
git push origin master
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
fi
fi fi
) )
fi fi

View File

@@ -10,46 +10,36 @@ set -e
patch_pkgbase(){ patch_pkgbase(){
local name="$1" local name="$1"
local pkgbuild
pkgbuild=PKGBUILD
sed -e 's|arch-meson|artix-meson|' -i "${pkgbuild}"
case "${name}" in case "${name}" in
glibc) linux|linux-lts|linux-zen|linux-hardened|linux-rt*)
msg "Patching %s" "${name}" sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i PKGBUILD
sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \
-e '/nscd.service/d' \
-i "${pkgbuild}"
;;
linux|linux-lts)
msg "Patching %s" "${name}"
sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i "${pkgbuild}"
sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \ sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
-i config -i config
;; ;;
gstreamer|gst-plugins-*|licenses) *)
msg "Patching %s" "${name}"
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \ sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \
-e 's|(Arch Linux)|(Artix Linux)|' \ -e 's|(Arch Linux)|(Artix Linux)|' \
-i "${pkgbuild}" -e 's|arch-meson|artix-meson|' \
-i PKGBUILD
;; ;;
esac esac
git --no-pager diff PKGBUILD
} }
artixpkg_repo_import_usage() { artixpkg_repo_import_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_ cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS OPTIONS
--switch TAG Switch the current workspace to a specified version tag --tag TAG Switch the current workspace to a specified version tag
--del Delete files before rsync import
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} libfoo $ ${COMMAND} libfoo
$ ${COMMAND} libfoo --switch TAG $ ${COMMAND} --tag TAG libfoo
$ ${COMMAND} --tag TAG --del libfoo
_EOF_ _EOF_
} }
@@ -64,25 +54,45 @@ artixpkg_repo_import() {
local pkgbase local pkgbase
local TAG local TAG
local rsync_args=() local rsync_args=()
rsync_args+=(-aWxvci --progress --delete-before --no-R --no-implied-dirs) rsync_args+=(
rsync_args+=(--exclude '.git' --exclude 'Jenkinsfile' --exclude '.gitignore' --exclude 'README.md') -axcihW
--no-R
--no-implied-dirs
--exclude '.artixlinux'
--exclude '.git'
--exclude '.gitignore'
--exclude 'README.md'
--exclude '*.service'
--exclude '.SRCINFO'
--exclude '*.socket'
--exclude '*.timer'
)
while (( $# )); do while (( $# )); do
case $1 in case $1 in
--switch=*) --tag)
TAG="${1#*=}" (( $# <= 1 )) && die "missing argument for %s" "$1"
shift TAG="$2"
;; shift 2
-h|--help) ;;
artixpkg_repo_import_usage --tag=*)
exit 0 TAG="${1#*=}"
;; shift
-*) ;;
die "invalid argument: %s" "$1" --del)
;; rsync_args+=(--delete-before)
*) shift
break ;;
;; -h|--help)
artixpkg_repo_import_usage
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac esac
done done
@@ -98,19 +108,14 @@ artixpkg_repo_import() {
fi fi
( cd "${pkgbase}" || return ( cd "${pkgbase}" || return
# if has_changeset; then
# die "Remote changes detected! Please pull (%s)" "${pkgbase}"
# fi
stat_busy "Checking for upstream url" stat_busy "Checking for upstream url"
if ! git config --local --get remote.upstream.url &>/dev/null; then if ! git config --local --get remote.upstream.url &>/dev/null; then
git remote add upstream "${GIT_UPSTREAM_URL}/${pkgbase}".git git remote add upstream "${GIT_UPSTREAM_URL}/${pkgbase}".git
fi fi
stat_done stat_done
stat_busy "Fetching upstream tags" msg2 "Fetching upstream tags"
git fetch --tags upstream main git fetch --tags upstream main
stat_done
local latest version local latest version
latest=$(git describe --tags FETCH_HEAD) latest=$(git describe --tags FETCH_HEAD)
@@ -119,21 +124,26 @@ artixpkg_repo_import() {
version="${TAG}" version="${TAG}"
fi fi
stat_busy "Importing upstream changeset for ${version}" if ! has_remote_changes; then
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
git checkout "${version}" -b "${version}" &>/dev/null git checkout "${version}" -b "${version}" &>/dev/null
local temp local temp
temp=$(mktemp -d --tmpdir "${pkgbase}.XXXXXXXXXX") temp=$(mktemp -d --tmpdir "${pkgbase}.XXXXXXXXXX")
rsync "${rsync_args[@]}" "$(pwd)"/ "${temp}"/ &>/dev/null rsync "${rsync_args[@]}" "$(pwd)"/ "${temp}"/ &>/dev/null
git checkout master &>/dev/null git checkout master &>/dev/null
git branch -D "${version}" &>/dev/null git branch -D "${version}" &>/dev/null
rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ &>/dev/null msg "Importing upstream changeset for ${version}"
rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ #&>/dev/null
patch_pkgbase "${pkgbase}" msg2 "Patching ${pkgbase} ..."
patch_pkgbase "${pkgbase}"
stat_done fi
) )
fi fi

View File

@@ -5,9 +5,6 @@
[[ -z ${ARTOOLS_INCLUDE_REPO_MOVE_SH:-} ]] || return 0 [[ -z ${ARTOOLS_INCLUDE_REPO_MOVE_SH:-} ]] || return 0
ARTOOLS_INCLUDE_REPO_MOVE_SH=1 ARTOOLS_INCLUDE_REPO_MOVE_SH=1
# shellcheck source=src/lib/pkg/db/git.sh
source "${LIBDIR}"/pkg/db/git.sh
set -e set -e
@@ -17,12 +14,13 @@ artixpkg_repo_move_usage() {
Usage: ${COMMAND} [OPTIONS] [SOURCE_REPO] [DEST_REPO] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [SOURCE_REPO] [DEST_REPO] [PKGBASE]...
OPTIONS OPTIONS
-p, --push Push pkgbase -p, --push Push pkgbase
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} world-gremlins world libfoo $ ${COMMAND} ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo
$ ${COMMAND} -p world-gremlins world libfoo $ ${COMMAND} --push ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo
$ ${COMMAND} --push ${ARTIX_DB_MAP[1]} ${ARTIX_DB_MAP[2]} libfoo
_EOF_ _EOF_
} }
@@ -37,6 +35,7 @@ artixpkg_repo_move() {
local pkgbase local pkgbase
local PUSH=0 local PUSH=0
local AUTO=0
local DEST local DEST
local SRC local SRC
@@ -60,15 +59,19 @@ artixpkg_repo_move() {
esac esac
done done
SRC="$1" SRC="$1"
DEST="$2" DEST="$2"
shift 2 shift 2
if ! in_array "${SRC}" "${ARTIX_DB[@]}"; then if in_array "${SRC}" "${ARTIX_DB_MAP[@]}" && in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
die "${SRC} does not exist!" AUTO=1
fi else
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then if ! in_array "${SRC}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!" die "${SRC} does not exist!"
fi
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!"
fi
fi fi
pkgbases+=("$@") pkgbases+=("$@")
@@ -83,42 +86,129 @@ artixpkg_repo_move() {
fi fi
( cd "${pkgbase}" || return ( cd "${pkgbase}" || return
# if has_changeset; then if ! has_remote_changes; then
# die "Remote changes detected! Please pull (%s)" "${pkgbase}"
# fi
if [[ ! -f PKGBUILD ]]; then if [[ ! -f PKGBUILD ]]; then
die "No PKGBUILD found in (%s)" "${pkgbase}" die "No PKGBUILD found in (%s)" "${pkgbase}"
fi fi
local commit_msg local auto
commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}") auto=$(auto_detect)
update_yaml_move "${SRC}" "${DEST}" if [[ -z "${auto}" ]]; then
auto=$(team_from_yaml)
fi
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then if (( AUTO )); then
if [[ "${SRC}" == "${ARTIX_DB_MAP[2]}" ]]; then
stat_busy 'Staging files' SRC="${auto}"
for f in $(git ls-files --modified); do else
if [[ "$f" == "${REPO_DB}" ]]; then SRC="${auto}-${SRC}"
git add "$f"
fi fi
done
stat_done
msg 'Commit' if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then
git commit -m "${commit_msg}" DEST="${auto}"
else
if (( PUSH )); then DEST="${auto}-${DEST}"
msg "Push (${pkgbase})" fi
git push origin master
fi fi
msg "Querying ${pkgbase} ..." local commit_msg src_version
if ! show_db; then commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}")
warning "Could not query ${REPO_DB}"
src_version=$(version_from_yaml "${SRC}")
if [[ "$src_version" != "null" ]]; then
update_yaml_move "${SRC}" "${DEST}"
if [[ -f .SRCINFO ]]; then
rm .SRCINFO
fi
delete_obsolete_map_keys
migrate_agent_branch
update_yaml_team "$(auto_detect)"
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
for f in $(git ls-files --modified); do
if [[ "$f" == "${REPO_DB}" ]]; then
git add "$f"
fi
done
stat_done
msg 'Commit'
git commit -m "${commit_msg}"
if (( PUSH )); then
msg "Push (${pkgbase})"
git push origin master
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
fi
if (( ! AUTO )); then
local gitname
gitname=$(get_compliant_name "${pkgbase}")
# team change on cross repo move system <-> world
if [[ "${SRC}" == ${ARTIX_DB[2]}* ]] \
&& [[ "${DEST}" == ${ARTIX_DB[5]}* ]]; then
if ! add_team_to_repo "${pkgbase}" "${ARTIX_DB[5]}"; then
warning "failed to add team: ${ARTIX_DB[5]}"
fi
if ! remove_team_from_repo "${pkgbase}" "${ARTIX_DB[2]}"; then
warning "failed to remove team: ${ARTIX_DB[2]}"
fi
elif [[ "${SRC}" == ${ARTIX_DB[5]}* ]] \
&& [[ "${DEST}" == ${ARTIX_DB[2]}* ]]; then
if ! add_team_to_repo "${pkgbase}" "${ARTIX_DB[2]}"; then
warning "failed to add team: ${ARTIX_DB[2]}"
fi
if ! remove_team_from_repo "${pkgbase}" "${ARTIX_DB[5]}"; then
warning "failed to remove team: ${ARTIX_DB[5]}"
fi
fi
# team change on cross repo move world <-> galaxy
if [[ "${SRC}" == ${ARTIX_DB[11]}* ]] \
&& [[ "${DEST}" == ${ARTIX_DB[5]}* ]]; then
if ! add_team_to_repo "${gitname}" "${ARTIX_DB[5]}"; then
warning "failed to add team: ${ARTIX_DB[5]}"
fi
if ! remove_team_from_repo "${gitname}" "${ARTIX_DB[11]}"; then
warning "failed to remove team: ${ARTIX_DB[11]}"
fi
elif [[ "${SRC}" == ${ARTIX_DB[5]}* ]] \
&& [[ "${DEST}" == ${ARTIX_DB[11]}* ]]; then
if ! add_team_to_repo "${gitname}" "${ARTIX_DB[11]}"; then
warning "failed to add team: ${ARTIX_DB[11]}"
fi
if ! remove_team_from_repo "${gitname}" "${ARTIX_DB[5]}"; then
warning "failed to remove team: ${ARTIX_DB[5]}"
fi
fi
fi
else
error "${pkgbase}: invalid move: version $src_version!"
fi fi
fi fi
) )
fi fi

View File

@@ -5,9 +5,6 @@
[[ -z ${ARTOOLS_INCLUDE_REPO_REMOVE_SH:-} ]] || return 0 [[ -z ${ARTOOLS_INCLUDE_REPO_REMOVE_SH:-} ]] || return 0
ARTOOLS_INCLUDE_REPO_REMOVE_SH=1 ARTOOLS_INCLUDE_REPO_REMOVE_SH=1
# shellcheck source=src/lib/pkg/db/git.sh
source "${LIBDIR}"/pkg/db/git.sh
set -e set -e
@@ -17,12 +14,13 @@ artixpkg_repo_remove_usage() {
Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]...
OPTIONS OPTIONS
-p, --push Push pkgbase -p, --push Push pkgbase
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} world-gremlins libfoo $ ${COMMAND} ${ARTIX_DB[4]} libfoo
$ ${COMMAND} -p world-gremlins libfoo $ ${COMMAND} --push ${ARTIX_DB[4]} libfoo
$ ${COMMAND} --push ${ARTIX_DB_MAP[2]} libfoo
_EOF_ _EOF_
} }
@@ -37,6 +35,7 @@ artixpkg_repo_remove() {
local pkgbase local pkgbase
local PUSH=0 local PUSH=0
local AUTO=0
local DEST='' local DEST=''
while (( $# )); do while (( $# )); do
@@ -59,10 +58,15 @@ artixpkg_repo_remove() {
done done
DEST="$1" DEST="$1"
shift
pkgbases=("$@") pkgbases=("$@")
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then if in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
die "${DEST} does not exist!" AUTO=1
else
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!"
fi
fi fi
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
@@ -75,40 +79,59 @@ artixpkg_repo_remove() {
fi fi
( cd "${pkgbase}" || return ( cd "${pkgbase}" || return
# if has_changeset; then if ! has_remote_changes; then
# die "Remote changes detected! Please pull (%s)" "${pkgbase}"
# fi
if [[ ! -f PKGBUILD ]]; then if [[ ! -f PKGBUILD ]]; then
die "No PKGBUILD found in (%s)" "${pkgbase}" die "No PKGBUILD found in (%s)" "${pkgbase}"
fi
local commit_msg
commit_msg=$(get_commit_msg 'remove' "${DEST}")
update_yaml_remove "${DEST}"
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
for f in $(git ls-files --modified); do
if [[ "$f" == "${REPO_DB}" ]]; then
git add "$f"
fi
done
stat_done
msg 'Commit'
git commit -m "${commit_msg}"
if (( PUSH )); then
msg "Push (${pkgbase})"
git push origin master
fi fi
msg "Querying ${pkgbase} ..." local auto
if ! show_db; then auto=$(auto_detect)
warning "Could not query ${REPO_DB}"
if [[ -z "${auto}" ]]; then
auto=$(team_from_yaml)
fi
if (( AUTO )); then
if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then
DEST="${auto}"
else
DEST="${auto}-${DEST}"
fi
fi
local commit_msg
commit_msg=$(get_commit_msg 'remove' "${DEST}")
update_yaml_remove "${DEST}"
delete_obsolete_map_keys
migrate_agent_branch
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
for f in $(git ls-files --modified); do
if [[ "$f" == "${REPO_DB}" ]]; then
git add "$f"
fi
done
stat_done
msg 'Commit'
git commit -m "${commit_msg}"
if (( PUSH )); then
msg "Push (${pkgbase})"
git push origin master
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
fi fi
fi fi

100
src/lib/pkg/repo/show.sh Normal file
View File

@@ -0,0 +1,100 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_REPO_SHOW_SH:-} ]] || return 0
ARTOOLS_INCLUDE_REPO_SHOW_SH=1
set -e
artixpkg_repo_show_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]...
OPTIONS
-b, --base Show srcinfo base
-p, --pkgs Show srcinfo pkgs
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} libfoo
$ ${COMMAND} -b libfoo
$ ${COMMAND} -p libfoo
_EOF_
}
artixpkg_repo_show() {
if (( $# < 1 )); then
artixpkg_repo_show_usage
exit 0
fi
# options
local pkgbases=()
local pkgbase
local SRC_BASE=0
local SRC_PKGS=0
while (( $# )); do
case $1 in
-h|--help)
artixpkg_repo_show_usage
exit 0
;;
-b|--base)
SRC_BASE=1
shift
;;
-p|--pkgs)
SRC_PKGS=1
shift
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
pkgbases=("$@")
for pkgbase in "${pkgbases[@]}"; do
if [[ -d "${pkgbase}" ]];then
if [[ ! -d "${pkgbase}/.git" ]]; then
error "Not a Git repository: ${pkgbase}"
continue
fi
( cd "${pkgbase}" || return
if ! has_remote_changes; then
if [[ ! -f PKGBUILD ]]; then
die "No PKGBUILD found in (%s)" "${pkgbase}"
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
if (( SRC_BASE )); then
msg "Showing srcinfo base ..."
show_srcinfo_base
fi
if (( SRC_PKGS )); then
msg "Showing srcinfo pkgs ..."
show_srcinfo_pkgs
fi
fi
)
fi
done
}

View File

@@ -4,6 +4,21 @@
#{{{ pkg conf #{{{ pkg conf
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p "$1"
return 0
}
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 "${USER_CONF_DIR}"
load_pkg_config(){ load_pkg_config(){
local conf="$1/artools-pkg.conf" local conf="$1/artools-pkg.conf"
@@ -13,10 +28,20 @@ load_pkg_config(){
# shellcheck source=config/conf/artools-pkg.conf # shellcheck source=config/conf/artools-pkg.conf
[[ -r "$conf" ]] && source "$conf" [[ -r "$conf" ]] && source "$conf"
local git_domain="gitea.artixlinux.org" CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"}
ARCH=${ARCH:-"$(uname -m)"}
REPO=${REPO:-'world'}
local -r git_domain="gitea.artixlinux.org"
GIT_HTTPS=${GIT_HTTPS:-"https://${git_domain}"} GIT_HTTPS=${GIT_HTTPS:-"https://${git_domain}"}
readonly API_URL="${GIT_HTTPS}/api/v1"
GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"}
GIT_TOKEN=${GIT_TOKEN:-''} GIT_TOKEN=${GIT_TOKEN:-''}
@@ -25,6 +50,8 @@ load_pkg_config(){
GIT_UPSTREAM_URL=${GIT_UPSTREAM_URL:-"https://gitlab.archlinux.org/archlinux/packaging/packages"} GIT_UPSTREAM_URL=${GIT_UPSTREAM_URL:-"https://gitlab.archlinux.org/archlinux/packaging/packages"}
GIT_ORG_ARCHIVE=${GIT_ORG_ARCHIVE:-'landfill'}
TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"}
REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"} REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
@@ -33,6 +60,10 @@ load_pkg_config(){
DBEXT=${DBEXT:-'gz'} DBEXT=${DBEXT:-'gz'}
if [[ -z "${AGENTS[*]}" ]]; then
AGENTS=(orion taurus)
fi
return 0 return 0
} }

View File

@@ -0,0 +1,43 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_VERSION_SH:-} ]] || return 0
ARTOOLS_INCLUDE_VERSION_SH=1
set -e
artixpkg_version_usage() {
COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS]
Shows the current version information of artixpkg
OPTIONS
-h, --help Show this help text
_EOF_
}
artixpkg_version_print() {
cat <<- _EOF_
artixpkg @buildtoolver@
_EOF_
}
artixpkg_version() {
while (( $# )); do
case $1 in
-h|--help)
artixpkg_version_usage
exit 0
;;
*)
die "invalid argument: %s" "$1"
;;
esac
done
artixpkg_version_print
}

View File

@@ -20,8 +20,12 @@ usage() {
Usage: ${COMMAND} [COMMAND] [OPTIONS] Usage: ${COMMAND} [COMMAND] [OPTIONS]
COMMANDS COMMANDS
repo Pacman database modification for packge update, move etc admin Manage topics, teams and obsolete repos
ci Manage CI and build agent
git Manage Git packaging repositories and their configuration git Manage Git packaging repositories and their configuration
repo Pacman database modification for package updates, moves, etc.
version Show artixpkg version information
OPTIONS OPTIONS
-h, --help Show this help text -h, --help Show this help text
@@ -35,8 +39,6 @@ fi
export _ARTOOLS_COMMAND='artixpkg' export _ARTOOLS_COMMAND='artixpkg'
# shellcheck source=src/lib/base/util.sh
source "${LIBDIR}"/base/util.sh
# shellcheck source=src/lib/pkg/util.sh # shellcheck source=src/lib/pkg/util.sh
source "${LIBDIR}"/pkg/util.sh source "${LIBDIR}"/pkg/util.sh
@@ -67,6 +69,30 @@ while (( $# )); do
artixpkg_git "$@" artixpkg_git "$@"
exit 0 exit 0
;; ;;
ci)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/ci.sh
source "${LIBDIR}"/pkg/ci.sh
artixpkg_ci "$@"
exit 0
;;
admin)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin.sh
source "${LIBDIR}"/pkg/admin.sh
artixpkg_admin "$@"
exit 0
;;
version|--version|-V)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/version/version.sh
source "${LIBDIR}"/pkg/version/version.sh
artixpkg_version "$@"
exit 0
;;
*) *)
die "invalid command: %s" "$1" die "invalid command: %s" "$1"
;; ;;

View File

@@ -6,32 +6,39 @@ LIBDIR=${LIBDIR:-'@libdir@'}
DATADIR=${DATADIR:-'@datadir@'} DATADIR=${DATADIR:-'@datadir@'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
# shellcheck source=src/lib/base/util.sh
source "${LIBDIR}"/base/util.sh
# shellcheck source=src/lib/base/message.sh # shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/chroot.sh # shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh source "${LIBDIR}"/base/chroot.sh
# shellcheck source=src/lib/pkg/util.sh
source "${LIBDIR}"/pkg/util.sh
create_first=false create_first=false
rebuild=false rebuild=false
mkchrootpkg_args=(-c -n) mkchrootpkg_args=(-c)
cmd=${0##*/} base_packages=('base-devel')
repo=${cmd#*-}
base_devel=('base-devel')
chroots_pkg="${CHROOTS_DIR}/buildpkg" chroots_pkg="${CHROOTS_DIR}/buildpkg"
arch=$(uname -m)
arch=${ARCH}
repo=${REPO}
usage() { usage() {
printf 'Usage: %s [options] -- [mkchrootpkg_args]\n' "${0##*/}" printf 'Usage: %s [options] -- [mkchrootpkg_args]\n' "${0##*/}"
printf ' -r <dir> Create chroots in this directory\n' printf ' -r <dir> Create chroots in this directory\n'
printf ' -d <dir> Destination repo chroot\n' printf ' [default: %s]\n' "${chroots_pkg}"
printf ' -d <dest> Destination repo chroot\n'
printf ' [default: %s]\n' "${repo}"
printf ' -a <arch> Build arch chroot\n'
printf ' [default: %s]\n' "${arch}"
printf ' -e <name> Export PACKAGER\n'
printf " format: 'John Doe <john@doe.com>'\n"
printf ' -c Recreate the chroot before building\n' printf ' -c Recreate the chroot before building\n'
printf ' -m Major rebuild\n' printf ' -m Major rebuild\n'
printf ' -N Disable check() function\n' printf ' -N Disable check() function\n'
printf ' -C Run checkpkg after built\n' printf ' -C Run checkpkg after build\n'
printf ' -n Run namcap after build\n'
printf ' -h This help\n' printf ' -h This help\n'
printf '\n' printf '\n'
printf 'Default mkchrootpkg_args args: %s\n' "${mkchrootpkg_args[*]}" printf 'Default mkchrootpkg_args args: %s\n' "${mkchrootpkg_args[*]}"
@@ -39,35 +46,46 @@ usage() {
exit "$1" exit "$1"
} }
opts='hcCNmr:d:' opts='hcCNmnr:d:a:e:'
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" ;; d) repo="$OPTARG" ;;
a) arch="$OPTARG" ;;
e) packager="$OPTARG" ;;
c) create_first=true ;; c) create_first=true ;;
m) rebuild=true ;; m) rebuild=true ;;
C) mkchrootpkg_args+=(-C) ;; C) mkchrootpkg_args+=(-C) ;;
N) mkchrootpkg_args+=(-N) ;; N) mkchrootpkg_args+=(-N) ;;
n) mkchrootpkg_args+=(-n) ;;
h|?) usage 0 ;; h|?) usage 0 ;;
esac esac
done done
if ${rebuild};then if "${rebuild}"; then
repo='default' repo=${repo%-*}
else
case ${repo} in
system|world|galaxy) repo='default' ;;
lib32*) base_devel+=('multilib-devel') ;;
*-gremlins|*-goblins) repo=${repo#*-} ;;
esac
fi fi
pacman_conf="${DATADIR}/pacman.conf.d/${repo}.conf" if [[ "${repo}" == lib32* ]]; then
[[ -f "${USER_CONF_DIR}/pacman.conf.d/${repo}.conf" ]] && pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${repo}.conf" base_packages+=('multilib-devel')
fi
pacman_conf="${DATADIR}/pacman.conf.d/${repo}-${arch}.conf"
if [[ -f ${USER_CONF_DIR}/pacman.conf.d/${repo}-${arch}.conf ]]; then
pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${repo}-${arch}.conf"
fi
makepkg_conf="${DATADIR}/makepkg.conf.d/${arch}.conf" makepkg_conf="${DATADIR}/makepkg.conf.d/${arch}.conf"
[[ -f ${USER_CONF_DIR}/makepkg.conf.d/${arch}.conf ]] && makepkg_conf="${USER_CONF_DIR}/makepkg.conf.d/${arch}.conf" if [[ -f ${USER_CONF_DIR}/makepkg.conf.d/${arch}.conf ]]; then
makepkg_conf="${USER_CONF_DIR}/makepkg.conf.d/${arch}.conf"
fi
if [[ -f ${DATADIR}/makepkg.conf.d/${repo}-${arch}.conf ]]; then
makepkg_conf="${DATADIR}/makepkg.conf.d/${repo}-${arch}.conf"
if [[ -f ${USER_CONF_DIR}/makepkg.conf.d/${repo}-${arch}.conf ]]; then
makepkg_conf="${USER_CONF_DIR}/makepkg.conf.d/${repo}-${arch}.conf"
fi
fi
if [[ -f "${DATADIR}/setarch-aliases.d/${arch}" ]]; then if [[ -f "${DATADIR}/setarch-aliases.d/${arch}" ]]; then
read -r set_arch < "${DATADIR}/setarch-aliases.d/${arch}" read -r set_arch < "${DATADIR}/setarch-aliases.d/${arch}"
@@ -75,20 +93,24 @@ else
set_arch="${arch}" set_arch="${arch}"
fi fi
if [[ -n "${packager}" ]]; then
export PACKAGER=${packager}
fi
# Architecture-specific Mount # Architecture-specific Mount
# arch_mounts=() arch_mounts=()
# if [[ -f "${DATADIR}/mount.d/${arch}" ]]; then if [[ -f "${DATADIR}/mount.d/${arch}" ]]; then
# mapfile -t arch_mounts < "${DATADIR}/mount.d/${arch}" mapfile -t arch_mounts < "${DATADIR}/mount.d/${arch}"
# fi fi
# for arch_mount in "${arch_mounts[@]}"; do for arch_mount in "${arch_mounts[@]}"; do
# if [[ $arch_mount = rw* ]]; then if [[ $arch_mount = rw* ]]; then
# arch_mount=${arch_mount#rw } arch_mount=${arch_mount#rw }
# in_array "$arch_mount" "${mkchrootpkg_args[@]}" || mkchrootpkg_args+=("-d" "$arch_mount") in_array "$arch_mount" "${mkchrootpkg_args[@]}" || mkchrootpkg_args+=(-b "-B:$arch_mount")
# elif [[ $arch_mount = ro* ]]; then elif [[ $arch_mount = ro* ]]; then
# arch_mount=${arch_mount#ro } arch_mount=${arch_mount#ro }
# in_array "$arch_mount" "${mkchrootpkg_args[@]}" || mkchrootpkg_args+=("-D" "$arch_mount") in_array "$arch_mount" "${mkchrootpkg_args[@]}" || mkchrootpkg_args+=(-b "-Br:$arch_mount")
# fi fi
# done done
check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME "${BASH_SOURCE[0]}" "$@" check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME "${BASH_SOURCE[0]}" "$@"
@@ -114,7 +136,7 @@ if ${create_first} || [[ ! -d "${chroots_pkg}/${repo}-${arch}" ]];then
-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_packages[@]}" || 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 \

View File

@@ -23,41 +23,66 @@ usage() {
list for both packages and a library list for both packages. list for both packages and a library list for both packages.
OPTIONS OPTIONS
-r, --rmdir Remove the temporary directory -r, --rmdir Remove the temporary directory
-w, --warn Print a warning in case of differences -w, --warn Print a warning in case of differences
-h, --help Show this help text -M, --makepkg-config Set an alternate makepkg configuration file
-h, --help Show this help text
_EOF_ _EOF_
} }
RMDIR=0 RMDIR=0
WARN=0 WARN=0
MAKEPKG_CONF=/etc/makepkg.conf
OPT_SHORT='rwh' # option checking
OPT_LONG=('rmdir' 'warn' 'help') while (( $# )); do
if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then
exit 1
fi
set -- "${OPTRET[@]}"
while :; do
case $1 in case $1 in
-r|--rmdir)
RMDIR=1
;;
-w|--warn)
WARN=1
;;
-h|--help) -h|--help)
usage usage
exit 0 exit 0
;; ;;
-r|--rmdir)
RMDIR=1
shift
;;
-w|--warn)
WARN=1
shift
;;
-M|--makepkg-config)
MAKEPKG_CONF="$2"
shift 2
;;
--) --)
shift; break shift
break
;;
--*|-*)
die "invalid argument: %s" "$1"
;;
*)
break
;; ;;
esac esac
shift
done done
# Source makepkg.conf; fail if it is not found
if [[ -r "${MAKEPKG_CONF}" ]]; then
# shellcheck source=config/makepkg/x86_64.conf
source "${MAKEPKG_CONF}"
else
die "${MAKEPKG_CONF} not found!"
fi
# Source user-specific makepkg.conf overrides
if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
# shellcheck source=config/makepkg/x86_64.conf
source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
elif [[ -r "$HOME/.makepkg.conf" ]]; then
# shellcheck source=config/makepkg/x86_64.conf
source "$HOME/.makepkg.conf"
fi
if [[ ! -f PKGBUILD ]]; then if [[ ! -f PKGBUILD ]]; then
die 'This must be run in the directory of a built package.' die 'This must be run in the directory of a built package.'
fi fi
@@ -72,6 +97,8 @@ STARTDIR=$(pwd)
(( RMDIR )) && trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT (( RMDIR )) && trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT
TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX) TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX)
changed=0
for _pkgname in "${pkgname[@]}"; do for _pkgname in "${pkgname[@]}"; do
comparepkg=$_pkgname comparepkg=$_pkgname
pkgurl= pkgurl=
@@ -84,8 +111,10 @@ for _pkgname in "${pkgname[@]}"; do
if (( $# )); then if (( $# )); then
case $1 in case $1 in
*://*)
pkgurl=$1 ;;
/*|*/*) /*|*/*)
pkgurl=file://$(readlink -m "$1") ;; pkgurl=$(readlink -m "$1") ;;
*.pkg.tar*) *.pkg.tar*)
pkgurl=$1 ;; pkgurl=$1 ;;
'') '')
@@ -123,11 +152,21 @@ for _pkgname in "${pkgname[@]}"; do
find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname" find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname"
if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then
message="Sonames differ in $_pkgname!" message="Sonames differ in $_pkgname!"
(( WARN )) && warning "$message" || msg "$message" if (( WARN )); then
printf "%s\n" "$diff_output" warning "$message"
else
msg "$message"
fi
printf "%s\n" "$diff_output" 2>&1 | tee "${pkgfile##*/}-checkpkg.log"
changed=1
else else
msg "No soname differences for %s." "$_pkgname" msg "No soname differences for %s." "$_pkgname"
fi fi
done done
(( RMDIR )) || msg "Files saved to %s" "$TEMPDIR" if ! (( RMDIR )); then
msg "Files saved to %s" "$TEMPDIR"
fi
exit "$changed"

View File

@@ -6,8 +6,6 @@ LIBDIR=${LIBDIR:-'@libdir@'}
DATADIR=${DATADIR:-'@datadir@'} DATADIR=${DATADIR:-'@datadir@'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
# shellcheck source=src/lib/base/util.sh
source "${LIBDIR}"/base/util.sh
# shellcheck source=src/lib/pkg/util.sh # shellcheck source=src/lib/pkg/util.sh
source "${LIBDIR}"/pkg/util.sh source "${LIBDIR}"/pkg/util.sh
# shellcheck source=src/lib/base/message.sh # shellcheck source=src/lib/base/message.sh
@@ -32,6 +30,7 @@ update_linksdb_cache(){
local cachedir url local cachedir url
for repo in "${search[@]}"; do for repo in "${search[@]}"; do
cachedir=${db_cache_dir}/linksdb/$repo cachedir=${db_cache_dir}/linksdb/$repo
# shellcheck disable=SC2153
url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext} url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext}
extract_db "$url" "$cachedir" extract_db "$url" "$cachedir"
done done

View File

@@ -3,6 +3,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
LIBDIR=${LIBDIR:-'@libdir@'} LIBDIR=${LIBDIR:-'@libdir@'}
DATADIR=${DATADIR:-'@datadir@'}
# shellcheck source=src/lib/base/message.sh # shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh source "${LIBDIR}"/base/message.sh
@@ -36,9 +37,9 @@ kill_chroot_process(){
umask 0022 umask 0022
working_dir='' working_dir=''
files=()
mount_args=("-B:/etc/hosts:/etc/hosts") files=()
mount_args="-B:/etc/hosts:/etc/hosts"
usage() { usage() {
printf "Usage: %s [options] working-dir [run arguments]\n" "${0##*/}" printf "Usage: %s [options] working-dir [run arguments]\n" "${0##*/}"
@@ -50,15 +51,18 @@ usage() {
printf ' -c <dir> Set pacman cache\n' printf ' -c <dir> Set pacman cache\n'
printf ' -f <file> Copy file from the host to the chroot\n' printf ' -f <file> Copy file from the host to the chroot\n'
printf ' -s Do not run setarch\n' printf ' -s Do not run setarch\n'
printf ' -b <list> Bind mountargs\n' printf ' -t <opts> tmpfs mount opts\n'
printf ' List format [mntarg1:src1:dest1 ... mntargN:srcN:destN]\n' printf ' -b <args> Bind mountargs\n'
printf ' Format:\n'
printf ' "arg1:src1:dest1 arg2:src2:dest2"\n'
printf ' -h This message\n' printf ' -h This message\n'
exit 1 exit 1
} }
# save all args for check_root
orig_args=("$@") orig_args=("$@")
opts='hC:M:c:b:f:s' opts='hC:M:c:b:f:t:s'
while getopts ${opts} arg; do while getopts ${opts} arg; do
case "${arg}" in case "${arg}" in
@@ -67,14 +71,15 @@ 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}) ;; t) tmpfs_opts="$OPTARG" ;;
b) bindmounts="$OPTARG"; mount_args+=" ${bindmounts}" ;;
h|?) usage ;; h|?) usage ;;
*) error "invalid argument '%s'" "$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.'
check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}"
working_dir=$(readlink -f "$1") working_dir=$(readlink -f "$1")
@@ -83,7 +88,7 @@ shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.' [[ -z $working_dir ]] && die 'Please specify a working directory.'
if (( ${#cache_dirs[@]} == 0 )); then if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir) mapfile -t cache_dirs < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" CacheDir)
fi fi
# shellcheck disable=2016 # shellcheck disable=2016
@@ -91,15 +96,16 @@ mapfile -t host_mirrors < <(pacman-conf --repo world Server 2> /dev/null | sed -
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 # shellcheck disable=SC2016
host_mirror=$(printf "%s\n" "$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')
in_array "$host_mirror" "${cache_dirs[@]}" || cache_dirs+=("$host_mirror") for m in "$host_mirror"/pool/*/; do
in_array "$m" "${cache_dirs[@]}" || cache_dirs+=("$m")
done
fi fi
done done
while read -r line; do while read -r line; do
# shellcheck disable=2016 mapfile -t lines < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" \
mapfile -t lines < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" \
--repo "$line" Server | sed -r 's#(.*/)[^/]+/os/.+#\1#') --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
@@ -107,7 +113,15 @@ while read -r line; do
in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line") in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line")
fi fi
done done
done < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list) done < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" --repo-list)
mount_args+=" -B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}"
for cache_dir in "${cache_dirs[@]:1}"; do
mount_args+=" -Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}"
done
# {{{ functions
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
@@ -115,9 +129,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
@@ -125,49 +139,44 @@ copy_hostconf () {
cp -T "$file" "$working_dir$file" cp -T "$file" "$working_dir$file"
done done
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]//:/\\:}")
for cache_dir in "${cache_dirs[@]:1}"; do
mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}")
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 dest src local flag dest src
flag=${arg%%:*} flag=${arg%%:*}
dest=${arg##*:} dest=${arg##*:}
src=${arg%:*} src=${arg%:*}
src=${src#*:} src=${src#*:}
chroot_mount "${src}" "${working_dir}${dest}" "${flag}" chroot_add_mount "${src}" "${working_dir}${dest}" "${flag}"
done done
} }
# }}}
umask 0022 umask 0022
# Sanity check # Sanity check
if [[ ! -f "$working_dir/.artools" ]]; then if [[ ! -f "$working_dir/.artix-chroot" ]]; 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/.artix-chroot") != "${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
chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}" chroot_setup "${working_dir}" "${tmpfs_opts}" || 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 -a '^CARCH=' "$working_dir/etc/makepkg.conf")"
[[ -z $nosetarch ]] || unset CARCH [[ -z $nosetarch ]] || unset CARCH
if [[ -f "${DATADIR}/setarch-aliases.d/${CARCH}" ]]; then
if [[ -f "/usr/share/artools/artools/setarch-aliases.d/${CARCH}" ]]; then read -r set_arch < "${DATADIR}/setarch-aliases.d/${CARCH}"
read -r set_arch < "/usr/share/artools/artools/setarch-aliases.d/${CARCH}"
else else
set_arch="${CARCH}" set_arch="${CARCH}"
fi fi

112
src/pkg/ckchrootpkg.in Normal file
View File

@@ -0,0 +1,112 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
LIBDIR=${LIBDIR:-'@libdir@'}
# shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh
# shellcheck source=src/lib/pkg/util.sh
source "${LIBDIR}"/pkg/util.sh
shopt -s nullglob
chrootdir=
makepkg_user=
passeddir="${CHROOTS_DIR}/buildpkg"
arch=${ARCH}
repo=${REPO}
copy=$USER
[[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER
[[ -z "$copy" || $copy = root ]] && copy=copy
usage() {
printf 'Usage: %s [options] -r <chrootdir>\n' "${0##*/}"
printf ' -r <dir> Create chroots in this directory\n'
printf ' Default: %s\n' "${passeddir}"
printf ' -d <dest> Destination repo chroot\n'
printf ' Default: %s\n' "${repo}"
printf ' -a <arch> Build arch chroot\n'
printf ' Default: %s\n' "${arch}"
printf ' -l <copy> The directory to use as the working copy of the chroot\n'
printf ' Useful for maintaining multiple copies\n'
printf ' Default: %s\n' "$copy"
printf ' -U Run makepkg as a specified user\n'
exit 1
}
opts='hr:l:U:d:a:'
while getopts "${opts}" arg; do
case "$arg" in
r) passeddir="$OPTARG" ;;
l) copy="$OPTARG" ;;
U) makepkg_user="$OPTARG" ;;
d) repo="$OPTARG" ;;
a) arch="$OPTARG" ;;
h|*) usage ;;
esac
done
[[ ! -f PKGBUILD ]] && die 'This must be run in a directory containing a PKGBUILD.'
[[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.'
makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}}
check_root "" "${BASH_SOURCE[0]}" "$@"
# # Canonicalize chrootdir, getting rid of trailing /
chrootdir=$(readlink -e "$passeddir")
chrootdir="$chrootdir"/"${repo}-${arch}"
[[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir"
[[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkchroot %s/root base-devel" "$chrootdir"
if [[ ${copy:0:1} = / ]]; then
copydir=$copy
else
copydir="$chrootdir/$copy"
fi
umask 0022
ORIG_HOME=$HOME
IFS=: read -r _ _ _ _ _ HOME _ < <(getent passwd "${SUDO_USER:-$USER}")
# shellcheck source=config/makepkg/x86_64.conf
load_makepkg_config
HOME=$ORIG_HOME
[[ -d $PKGDEST ]] || PKGDEST=$PWD
[[ -d $SRCDEST ]] || SRCDEST=$PWD
[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
[[ -d $LOGDEST ]] || LOGDEST=$PWD
msg "Running checkpkg"
mapfile -t pkgnames < <(bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"')
mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \
--dbpath "$copydir"/var/lib/pacman \
-Sddp "${pkgnames[@]}")
if ! wait $!; then
warning "Skipped checkpkg due to missing repo packages"
exit 0
fi
# download package files if any non-local location exists
for remotepkg in "${remotepkgs[@]}"; do
if [[ $remotepkg != file://* ]]; then
msg2 "Downloading current versions"
chroot-run "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}"
mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \
--dbpath "$copydir"/var/lib/pacman \
-Sddp "${pkgnames[@]}")
break
fi
done
sudo -u "$makepkg_user" checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}"

View File

@@ -127,7 +127,7 @@ while (( $# )); do
shift shift
break break
;; ;;
-*|--*) --*|-*)
die "invalid argument: %s" "$1" die "invalid argument: %s" "$1"
;; ;;
*) *)

View File

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

View File

@@ -10,12 +10,12 @@ LIBDIR=${LIBDIR:-'@libdir@'}
DATADIR=${DATADIR:-'@datadir@'} DATADIR=${DATADIR:-'@datadir@'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
# shellcheck source=src/lib/base/util.sh
source "${LIBDIR}"/base/util.sh
# shellcheck source=src/lib/base/message.sh # shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/chroot.sh # shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh source "${LIBDIR}"/base/chroot.sh
# shellcheck source=src/lib/pkg/util.sh
source "${LIBDIR}"/pkg/util.sh
declare -A buildinfo declare -A buildinfo
declare -a buildenv buildopts installed installpkgs declare -a buildenv buildopts installed installpkgs
@@ -133,7 +133,7 @@ while getopts 'dM:c:l:h' arg; do
c) cache_dirs+=("$OPTARG") ;; c) cache_dirs+=("$OPTARG") ;;
l) chroot="$OPTARG" ;; l) chroot="$OPTARG" ;;
h) usage; exit 0 ;; h) usage; exit 0 ;;
*|?) usage; exit 1 ;; ?|*) usage; exit 1 ;;
esac esac
done done
shift $((OPTIND - 1)) shift $((OPTIND - 1))
@@ -222,10 +222,12 @@ TEMPDIR=$(mktemp -d --tmpdir makerepropkg.XXXXXXXXXX)
makepkg_conf="${TEMPDIR}/makepkg.conf" makepkg_conf="${TEMPDIR}/makepkg.conf"
# anything before buildtool support is pinned to the last none buildtool aware release # anything before buildtool support is pinned to the last none buildtool aware release
if [[ -z "${BUILDTOOL}" ]]; then if [[ -z "${BUILDTOOL}" ]]; then
get_makepkg_conf "artools-pkg-0.28.2-1-any" "${CARCH}" "${makepkg_conf}" || exit 1 # shellcheck disable=SC2153
get_makepkg_conf "artools-pkg-0.31.7-1-any" "${CARCH}" "${makepkg_conf}" || exit 1
# prefere to assume artools-pkg up until matching makepkg version so repository packages remain reproducible # prefere to assume artools-pkg up until matching makepkg version so repository packages remain reproducible
elif [[ "${BUILDTOOL}" = makepkg ]] && (( $(vercmp "${BUILDTOOLVER}" 6.0.1) <= 0 )); then elif [[ "${BUILDTOOL}" = makepkg ]] && (( $(vercmp "${BUILDTOOLVER}" 6.0.1) <= 0 )); then
get_makepkg_conf "artools-pkg-0.28.2-1-any" "${CARCH}" "${makepkg_conf}" || exit 1 # shellcheck disable=SC2153
get_makepkg_conf "artools-pkg-0.31.7-1-any" "${CARCH}" "${makepkg_conf}" || exit 1
# all artools-pkg builds # all artools-pkg builds
elif [[ "${BUILDTOOL}" = artools ]] && get_makepkg_conf "${BUILDTOOL}-${BUILDTOOLVER}" "${makepkg_conf}"; then elif [[ "${BUILDTOOL}" = artools ]] && get_makepkg_conf "${BUILDTOOL}-${BUILDTOOLVER}" "${makepkg_conf}"; then
true true

View File

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

View File

@@ -20,6 +20,7 @@ umode=''
files=() files=()
chroot_args=() chroot_args=()
nosetarch=0
usage() { usage() {
printf "Usage: %s [options] working-dir package-list...\n" "${0##*/}" printf "Usage: %s [options] working-dir package-list...\n" "${0##*/}"
@@ -97,7 +98,7 @@ unshare --mount basestrap -${umode}Mc ${pacman_conf:+-C "$pacman_conf"} "$workin
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"
printf 'LANG=C.UTF-8\n' > "$working_dir/etc/locale.conf" printf 'LANG=C.UTF-8\n' > "$working_dir/etc/locale.conf"
# printf 'KEYMAP=en\n' > "$working_dir/etc/vconsole.conf" # printf 'KEYMAP=en\n' > "$working_dir/etc/vconsole.conf"
printf "%s\n" "${CHROOTVERSION}" > "$working_dir/.artools" printf "%s\n" "${CHROOTVERSION}" > "$working_dir/.artix-chroot"
dbus-uuidgen --ensure="$working_dir"/etc/machine-id dbus-uuidgen --ensure="$working_dir"/etc/machine-id

View File

@@ -29,6 +29,7 @@ clean_first=0
run_namcap=0 run_namcap=0
run_checkpkg=0 run_checkpkg=0
temp_chroot=0 temp_chroot=0
tmp_opts="nosuid,nodev,size=50%,nr_inodes=2m"
bindmounts='' bindmounts=''
@@ -47,7 +48,7 @@ usage() {
printf ' <chrootdir>/{root, copy} but only "root" is required\n' printf ' <chrootdir>/{root, copy} but only "root" is required\n'
printf ' by default. The working copy will be created as needed\n' printf ' by default. The working copy will be created as needed\n'
printf '\n' printf '\n'
printf "The chroot 'root' directory must be created via the following\n" printf 'The chroot "root" directory must be created via the following\n'
printf 'command:\n' printf 'command:\n'
printf ' mkchroot <chrootdir>/root base-devel\n' printf ' mkchroot <chrootdir>/root base-devel\n'
printf '\n' printf '\n'
@@ -60,26 +61,24 @@ usage() {
printf 'Flags:\n' printf 'Flags:\n'
printf ' -h This help\n' printf ' -h This help\n'
printf ' -c Clean the chroot before building\n' printf ' -c Clean the chroot before building\n'
printf ' -d <dir> Bind directory into build chroot as read-write\n' printf ' -b <arg> Bind mount directory/file into build chroot\n'
printf ' -D <dir> Bind directory into build chroot as read-only\n'
printf ' -u Update the working copy of the chroot before building\n' printf ' -u Update the working copy of the chroot before building\n'
printf ' This is useful for rebuilds without dirtying the pristine\n' printf ' This is useful for rebuilds without dirtying the pristine\n'
printf ' chroot\n' printf ' chroot\n'
printf ' -r <dir> The chroot dir to use\n' printf ' -r <dir> The chroot dir to use\n'
printf ' -I <pkg> Install a package into the working copy of the chroot\n' printf ' -I <pkg> Install a package into the working copy of the chroot\n'
printf ' -l <copy> The directory to use as the working copy of the chroot\n' printf ' -l <copy> The directory to use as the working copy of the chroot\n'
printf ' Useful for maintaining multiple copies\n' printf ' Useful for maintaining multiple copies\n'
printf ' Default: %s\n' "$copy" printf ' Default: %s\n' "$copy"
printf ' -n Run namcap on the package\n' printf ' -n Run namcap on the package\n'
printf ' -C Run checkpkg on the package\n'
printf ' -N Disable check() function\n' printf ' -N Disable check() function\n'
printf ' -C Run checkpkg on the package\n'
printf ' -T Build in a temporary directory\n' printf ' -T Build in a temporary directory\n'
printf ' -U Run makepkg as a specified user\n' printf ' -U Run makepkg as a specified user\n'
exit 1 exit 1
} }
# {{{ functions # {{{ functions
# Usage: sync_chroot $chrootdir $copydir [$copy] # Usage: sync_chroot $chrootdir $copydir [$copy]
sync_chroot() { sync_chroot() {
local chrootdir=$1 local chrootdir=$1
@@ -142,9 +141,7 @@ install_packages() {
pkgnames=("${install_pkgs[@]##*/}") pkgnames=("${install_pkgs[@]##*/}")
cp -- "${install_pkgs[@]}" "$copydir/root/" cp -- "${install_pkgs[@]}" "$copydir/root/"
chroot-run \ chroot-run -b "${bindmounts}" "$copydir" \
-b "${bindmounts}" \
"$copydir" \
bash -c 'yes y | pacman -U -- "$@"' -bash "${pkgnames[@]/#//root/}" bash -c 'yes y | pacman -U -- "$@"' -bash "${pkgnames[@]/#//root/}"
ret=$? ret=$?
rm -- "${pkgnames[@]/#/$copydir/root/}" rm -- "${pkgnames[@]/#/$copydir/root/}"
@@ -180,7 +177,7 @@ prepare_chroot() {
done done
cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF
builduser ALL = NOPASSWD: /usr/bin/pacman builduser ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman
EOF EOF
chmod 440 "$copydir/etc/sudoers.d/builduser-pacman" chmod 440 "$copydir/etc/sudoers.d/builduser-pacman"
@@ -208,6 +205,7 @@ _chrootbuild() {
# No coredumps # No coredumps
ulimit -c 0 ulimit -c 0
# shellcheck disable=SC1091
. /etc/locale.conf . /etc/locale.conf
# shellcheck source=/dev/null # shellcheck source=/dev/null
@@ -266,6 +264,7 @@ move_products() {
# Fix broken symlink because of temporary chroot PKGDEST /pkgdest # Fix broken symlink because of temporary chroot PKGDEST /pkgdest
if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then
# shellcheck disable=SC2226
ln -sf "$PKGDEST/${pkgfile##*/}" ln -sf "$PKGDEST/${pkgfile##*/}"
fi fi
done done
@@ -278,6 +277,7 @@ move_products() {
# Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest # Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest
if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then
# shellcheck disable=SC2226
ln -sf "$SRCPKGDEST/${s##*/}" ln -sf "$SRCPKGDEST/${s##*/}"
fi fi
done done
@@ -354,13 +354,11 @@ if [[ ! -d $copydir ]] || (( clean_first )); then
sync_chroot "$chrootdir" "$copydir" "$copy" sync_chroot "$chrootdir" "$copydir" "$copy"
fi fi
(( update_first )) && chroot-run \ (( update_first )) && chroot-run \
-b "${bindmounts}" \ -b "${bindmounts}" \
"$copydir" \ "$copydir" \
pacman -Syuu --noconfirm pacman -Syuu --noconfirm
if [[ -n ${install_pkgs[*]:-} ]]; then if [[ -n ${install_pkgs[*]:-} ]]; then
install_packages install_packages
ret=$? ret=$?
@@ -378,6 +376,7 @@ download_sources
prepare_chroot prepare_chroot
if chroot-run \ if chroot-run \
-t "${tmp_opts}" \
-b "${bindmounts} -B:${PWD}:/startdir -B:${SRCDEST}:/srcdest" \ -b "${bindmounts} -B:${PWD}:/startdir -B:${SRCDEST}:/srcdest" \
"$copydir" \ "$copydir" \
/chrootbuild "${makepkg_args[@]}" /chrootbuild "${makepkg_args[@]}"
@@ -409,6 +408,7 @@ else
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
if [[ $remotepkg != file://* ]]; then if [[ $remotepkg != file://* ]]; then
@@ -420,8 +420,9 @@ else
break break
fi fi
done done
msg2 "Checking packages" msg2 "Checking packages"
sudo -u "$makepkg_user" checkpkg --rmdir --warn "${remotepkgs[@]/#file:\/\//}" sudo -u "$makepkg_user" checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}"
fi fi
true true
fi fi

55
src/pkg/packagersign.in Normal file
View File

@@ -0,0 +1,55 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
LIBDIR=${LIBDIR:-'@libdir@'}
# shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh
# shellcheck source=src/lib/pkg/deploy.sh
source "${LIBDIR}"/pkg/deploy.sh
# shellcheck source=config/makepkg/x86_64.conf
load_makepkg_config
export PKGDEST
export GPG_KEY
export GPG_PASS
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 "${GPG_KEY}" ]] && [[ -n "${GPG_PASS}" ]]; then
msg "Signing [%s]" "${file_to_sign##*/}"
gpg --homedir /etc/pacman.d/gnupg --no-permission-warning \
--no-default-keyring --default-key "${GPG_KEY}" --passphrase "${GPG_PASS}" \
-q --detach-sign "$file_to_sign"
fi
}
check_root PKGDEST,GPG_KEY,GPG_PASS "${BASH_SOURCE[0]}" "$@"
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
if ! sign_pkg "${pkgfile}"; then
die "Failed to sign package!"
fi
ret=0
else
ret=1
fi
done
exit "$ret"

View File

@@ -6,10 +6,12 @@ LIBDIR=${LIBDIR:-'@libdir@'}
# shellcheck source=src/lib/base/message.sh # shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/yaml.sh # shellcheck source=src/lib/pkg/yaml.sh
source "${LIBDIR}"/base/yaml.sh source "${LIBDIR}"/pkg/yaml.sh
# shellcheck disable=1091
source "${MAKEPKG_LIBRARY}"/util/pkgbuild.sh source "${MAKEPKG_LIBRARY}"/util/pkgbuild.sh
# shellcheck disable=1091
source "${MAKEPKG_LIBRARY}"/util/schema.sh source "${MAKEPKG_LIBRARY}"/util/schema.sh
#{{{ functions #{{{ functions
@@ -46,7 +48,7 @@ pkgbuild_extract_to_yaml() {
if get_pkgbuild_attribute "$pkgname" "$attrname" "$isarray" 'outvalue'; then if get_pkgbuild_attribute "$pkgname" "$attrname" "$isarray" 'outvalue'; then
[[ -z $pkgname ]] && srcyaml_write_attr 2 4 2 "$attrname" "${outvalue[@]}" [[ -z $pkgname ]] && srcyaml_write_attr 2 4 2 "$attrname" "${outvalue[@]}"
[[ -n $pkgname ]] && srcyaml_write_attr 6 8 4 "$attrname" "${outvalue[@]}" [[ -n $pkgname ]] && srcyaml_write_attr 4 6 2 "$attrname" "${outvalue[@]}"
fi fi
} }
@@ -82,12 +84,8 @@ yaml_write_global() {
noextract options backup noextract options backup
source validpgpkeys "${known_hash_algos[@]/%/sums}") source validpgpkeys "${known_hash_algos[@]/%/sums}")
local version
version=$(get_full_version)
Yaml+=$(write_yaml_map 0 "pkgbase") Yaml+=$(write_yaml_map 0 "pkgbase")
Yaml+=$(write_yaml_map 2 "name" "${pkgbase:-${pkgname}}") Yaml+=$(write_yaml_map 2 "name" "${pkgbase:-${pkgname}}")
Yaml+=$(write_yaml_map 2 "version" "${version}")
srcyaml_write_section_details "" srcyaml_write_section_details ""
} }
@@ -97,9 +95,9 @@ yaml_write_package() {
local multivalued=(arch groups license checkdepends depends optdepends local multivalued=(arch groups license checkdepends depends optdepends
provides conflicts replaces options backup) provides conflicts replaces options backup)
Yaml+=$(write_yaml_map 2 "packages") Yaml+=$(write_yaml_map 0 "pkgnames")
for pkg in "${pkgname[@]}"; do for pkg in "${pkgname[@]}"; do
Yaml+=$(write_yaml_seq_map 4 "pkgname" "$pkg") Yaml+=$(write_yaml_seq_map 2 "pkgname" "$pkg")
srcyaml_write_section_details "$pkg" srcyaml_write_section_details "$pkg"
done done
} }
@@ -108,6 +106,11 @@ write_srcyaml() {
Yaml=$(write_yaml_header) Yaml=$(write_yaml_header)
yaml_write_global yaml_write_global
yaml_write_package yaml_write_package
# local version
# version=$(get_full_version)
# Yaml+=$(write_yaml_map 2 "version" "${version}")
printf '%s\n' "${Yaml}" printf '%s\n' "${Yaml}"
} }
@@ -120,6 +123,7 @@ usage() {
exit "$1" exit "$1"
} }
# shellcheck source=config/makepkg/x86_64.conf
load_makepkg_config load_makepkg_config
opts='h' opts='h'

View File

@@ -6,8 +6,6 @@ LIBDIR=${LIBDIR:-'@libdir@'}
DATADIR=${DATADIR:-'@datadir@'} DATADIR=${DATADIR:-'@datadir@'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
# shellcheck source=src/lib/base/util.sh
source "${LIBDIR}"/base/util.sh
# shellcheck source=src/lib/pkg/util.sh # shellcheck source=src/lib/pkg/util.sh
source "${LIBDIR}"/pkg/util.sh source "${LIBDIR}"/pkg/util.sh
# shellcheck source=src/lib/base/message.sh # shellcheck source=src/lib/base/message.sh
@@ -34,6 +32,7 @@ remove(){
repo_action() { repo_action() {
local repo_path local repo_path
# shellcheck disable=SC2153
repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH} repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH}
local packages=() action func="$1" local packages=() action func="$1"

View File

@@ -9,6 +9,7 @@ source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/pkg/deploy.sh # shellcheck source=src/lib/pkg/deploy.sh
source "${LIBDIR}"/pkg/deploy.sh source "${LIBDIR}"/pkg/deploy.sh
# shellcheck source=config/makepkg/x86_64.conf
load_makepkg_config load_makepkg_config
passfiles=("$@") passfiles=("$@")
@@ -36,5 +37,10 @@ for pkg in "${passfiles[@]}"; do
msg2 "Found: %s" "${pkgfile}" msg2 "Found: %s" "${pkgfile}"
[[ -e "${pkgfile}".sig ]] && rm "${pkgfile}".sig [[ -e "${pkgfile}".sig ]] && rm "${pkgfile}".sig
sign_pkg "${pkgfile}" sign_pkg "${pkgfile}"
ret=0
else
ret=1
fi fi
done done
exit "$ret"