Compare commits
	
		
			97 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e17b84f4a0 | |||
| 4718c88229 | |||
| d1ddaaf06a | |||
| 9484fff9f8 | |||
| 1e2e5f44e1 | |||
| 764d47ad8f | |||
| 9e67c31d61 | |||
| 41c90f8d49 | |||
| c97a0cdd59 | |||
| 1ba16c45f9 | |||
| 95afc31152 | |||
| af81317aad | |||
| 79e12f3d10 | |||
| 917cd188d9 | |||
| bfe462432d | |||
| 896e8e195f | |||
| 12d1b784ff | |||
| d8129cbb9a | |||
| 950e0604a4 | |||
| 607fa38500 | |||
| 39a2158c48 | |||
| c67826fd2a | |||
| 3ac0122eac | |||
| 9afe8a863e | |||
| 9b1b1c46ed | |||
| 525c7dd0ee | |||
| 744eb3ca96 | |||
| 3dd3f806ef | |||
| fa245021bf | |||
| fd74b22bc2 | |||
| 538e5051e5 | |||
| ba2542c697 | |||
| 23c6cecdcc | |||
| 828844fd9a | |||
| 760f5e8281 | |||
| bb1585ad7b | |||
| be6506d6ee | |||
| 35a9c2f305 | |||
| 5347f45cc5 | |||
| c7f11a5bd5 | |||
| f3794ff2ad | |||
| c6811cca48 | |||
| a1f296ff2b | |||
| ac5e0f4b3d | |||
| 2ecfb04dc6 | |||
| e81eac2021 | |||
| e612d2c6d2 | |||
| 2bed697813 | |||
| ba4ac669e7 | |||
| 47babd20fd | |||
| d35422a74e | |||
| 94b8957494 | |||
| a0a485294c | |||
| 7b67601e44 | |||
| 8db0c1ca39 | |||
| 190340e375 | |||
| f7a61731ba | |||
| e959ce10c3 | |||
| d2bbf9d8c4 | |||
| 1dafa0fb38 | |||
| 982a9ed678 | |||
| 19a6ff09f1 | |||
| fac634cf14 | |||
| 71ed464c33 | |||
| f7286a0661 | |||
| aee7c07a04 | |||
| fbcfa79426 | |||
| 87bd203d3e | |||
| ac0472d9ff | |||
| e80c07d2fc | |||
| 7584684bea | |||
| e415aa67b9 | |||
| b2512ffe68 | |||
| 1d8b7e83dc | |||
| e237afd788 | |||
| 5d7f006ad9 | |||
| 72104728ac | |||
| 423896750a | |||
| ad09046044 | |||
| c335cab68c | |||
| e744e80c57 | |||
| 06bcd79858 | |||
| dbb63dcd5e | |||
| 4e510b2f1e | |||
| f06ac2c369 | |||
| 736bac6dd7 | |||
| 1fd3b796c5 | |||
| 4c534f87b8 | |||
| 38284c5c14 | |||
| 5e7decee42 | |||
| dc606af137 | |||
| 5253f81f0a | |||
| 00ed72f96e | |||
| 70839d8609 | |||
| 65a29f73cc | |||
| d72df66e99 | |||
| 221cc796c0 | 
							
								
								
									
										30
									
								
								.github/workflows/lint.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								.github/workflows/lint.yaml
									
									
									
									
										vendored
									
									
										Normal 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
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -12,3 +12,5 @@ PKGBUILD | ||||
| contrib/artixlinux | ||||
| build/ | ||||
| tmp/ | ||||
| checks/ | ||||
| check.sh | ||||
|   | ||||
							
								
								
									
										26
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| SHELL=/bin/bash | ||||
|  | ||||
| V=0.31 | ||||
| V=0.37 | ||||
| BUILDTOOLVER ?= $(V) | ||||
|  | ||||
| CHROOTVER=0.12 | ||||
| @@ -32,17 +32,19 @@ MAKEPKG_CONFIGS=$(wildcard config/makepkg/*) | ||||
| PACMAN_CONFIGS=$(wildcard config/pacman/*) | ||||
| SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*) | ||||
|  | ||||
| TOOLS_CONFIGS_BASE=$(wildcard config/conf/*base*) | ||||
| TOOLS_CONFIGS_PKG=$(wildcard config/conf/*pkg*) | ||||
| TOOLS_CONFIGS_ISO=$(wildcard config/conf/*iso*) | ||||
|  | ||||
| all: binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso | ||||
| COMPLETIONS = $(addprefix $(BUILDDIR)/,$(patsubst %.in,%,$(wildcard contrib/completion/*/*))) | ||||
|  | ||||
| all: binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso completion | ||||
| binprogs_base: $(BINPROGS_BASE) | ||||
| binprogs_pkg: $(BINPROGS_PKG) | ||||
| binprogs_iso: $(BINPROGS_ISO) | ||||
| library_base: $(LIBRARY_BASE) | ||||
| library_pkg: $(LIBRARY_PKG) | ||||
| library_iso: $(LIBRARY_ISO) | ||||
| completion: $(COMPLETIONS) | ||||
|  | ||||
| edit = sed -e "s|@datadir[@]|$(DATADIR)|g" \ | ||||
| 	-e "s|@libdir[@]|$(LIBDIR)|g" \ | ||||
| @@ -70,14 +72,15 @@ $(eval $(call buildInScript,build/bin,src/pkg/,.in,755)) | ||||
| $(eval $(call buildInScript,build/bin,src/iso/,.in,755)) | ||||
| $(eval $(call buildInScript,build/lib,src/lib/,,644)) | ||||
|  | ||||
| $(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,.in,444))) | ||||
|  | ||||
| conf_base: | ||||
| 	@install -d $(BUILDDIR)/pacman.conf.d $(BUILDDIR)/artools | ||||
| 	@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d | ||||
| 	@cp -a $(TOOLS_CONFIGS_BASE) $(BUILDDIR)/artools | ||||
|  | ||||
| conf_pkg: | ||||
| 	@install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/artools | ||||
| 	@cp -a $(MAKEPKG_CONFIGS) $(BUILDDIR)/makepkg.conf.d | ||||
| 	@cp -ra $(MAKEPKG_CONFIGS) $(BUILDDIR)/makepkg.conf.d | ||||
| 	@cp -a $(TOOLS_CONFIGS_PKG) $(BUILDDIR)/artools | ||||
|  | ||||
| conf_iso: | ||||
| @@ -95,8 +98,6 @@ install_base: binprogs_base | ||||
| 	install -dm0755 $(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 | ||||
|  | ||||
| install_pkg: binprogs_pkg | ||||
| @@ -110,10 +111,14 @@ install_pkg: binprogs_pkg | ||||
|  | ||||
| 	for conf in $(notdir $(TOOLS_CONFIGS_PKG)); do install -Dm0644 $(BUILDDIR)/$(TOOLS)/$$conf $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)/$${conf##*/}; done | ||||
|  | ||||
| 	for conf in $(notdir $(MAKEPKG_CONFIGS)); do install -Dm0644 $(BUILDDIR)/makepkg.conf.d/$$conf $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done | ||||
| 	cp -ra $(BUILDDIR)/makepkg.conf.d -t $(DESTDIR)$(DATADIR) | ||||
|  | ||||
| 	for a in $(SETARCH_ALIASES); do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done | ||||
| 	ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides | ||||
|  | ||||
| 	install -Dm0644 $(BUILDDIR)/contrib/completion/bash/artixpkg $(DESTDIR)$(PREFIX)/share/bash-completion/completions/artixpkg | ||||
| 	install -Dm0644 $(BUILDDIR)/contrib/completion/zsh/_artixpkg $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_artixpkg | ||||
|  | ||||
| install_iso: binprogs_iso | ||||
| 	install -dm0755 $(DESTDIR)$(SYSCONFDIR)/$(TOOLS) | ||||
| 	install -dm0755 $(DESTDIR)$(PREFIX)/bin | ||||
| @@ -130,13 +135,12 @@ uninstall: | ||||
| 	for f in $(notdir $(LIBRARY)); do rm -f $(DESTDIR)$(DATADIR)/lib/$$f; done | ||||
| 	rm -rf $(DESTDIR)$(DATADIR)/lib | ||||
| 	for conf in $(notdir $(TOOLS_CONFIGS)); do rm -f $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)/$${conf##*/}; done | ||||
| 	for conf in $(notdir $(MAKEPKG_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done | ||||
| 	rm -rf $(DESTDIR)$(DATADIR)/makepkg.conf.d | ||||
| 	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 | ||||
| 	rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides | ||||
| 	rmdir --ignore-fail-on-non-empty \ | ||||
| 		$(DESTDIR)$(DATADIR)/setarch-aliases.d \ | ||||
| 		$(DESTDIR)$(DATADIR)/makepkg.conf.d \ | ||||
| 		$(DESTDIR)$(DATADIR)/pacman.conf.d \ | ||||
| 		$(DESTDIR)$(DATADIR) \ | ||||
| 		$(DESTDIR)$(SYSCONFDIR)/$(TOOLS) | ||||
| @@ -148,5 +152,5 @@ dist: | ||||
| check: $(BINPROGS_SRC_BASE) $(BINPROGS_SRC_PKG) $(BINPROGS_SRC_ISO) config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto | ||||
| 	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: | ||||
|   | ||||
							
								
								
									
										13
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								README.md
									
									
									
									
									
								
							| @@ -45,21 +45,22 @@ artools | ||||
|   * libisoburn | ||||
|   * mtools | ||||
|   * squashfs-tools | ||||
|   * go-yq | ||||
|  | ||||
|  | ||||
| #### 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 | ||||
|  | ||||
| ```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 | ||||
| $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 | ||||
| @@ -68,8 +69,8 @@ These values take precedence over the userconfig. | ||||
| Best practise is to leave systemwide file untouched. | ||||
| By default it is commented and shows just initialization values done in code. | ||||
|  | ||||
| Tools configuration is done in artools-{base,pkg,iso}.conf or by args. | ||||
| Specifying args will override artools-{base,pkg,iso}.conf settings. | ||||
| Tools configuration is done in artools-{pkg,iso}.conf or by args. | ||||
| Specifying args will override artools-{pkg,iso}.conf settings. | ||||
|  | ||||
| Both, pacman.conf and makepkg.conf for chroots are loaded from | ||||
|  | ||||
|   | ||||
| @@ -1,20 +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" | ||||
|  | ||||
| # the arch to build | ||||
| # ARCH=$(uname -m) | ||||
|  | ||||
| # default pacman.conf repos to include | ||||
| # possible buildpkg values: {system,world,galaxy,lib32}{-gremlins,-goblins} | ||||
| # possible buildiso values: {world,galaxy}{-gremlins,-goblins} | ||||
| # REPO="world" | ||||
| @@ -5,20 +5,33 @@ | ||||
| ################ 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" | ||||
|  | ||||
| # the dist release; default: auto | ||||
| # default dist release; default: auto | ||||
| # 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" | ||||
|  | ||||
| # gpg key; leave empty or commented to skip img signing | ||||
| # GPG_KEY="" | ||||
|  | ||||
| # possible values: zstd (default), xz | ||||
| # default compression, possible values: zstd (default), xz | ||||
| # COMPRESSION="zstd" | ||||
|  | ||||
| # zstd only: range 1..22 | ||||
| # default compression level, zstd only: range 1..22 | ||||
| # COMPRESSION_LEVEL=15 | ||||
|   | ||||
| @@ -5,9 +5,23 @@ | ||||
| ################ 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='' | ||||
|  | ||||
| # default workspace dir for artixpkg | ||||
| # TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux | ||||
|  | ||||
| # default repos root for deploypkg | ||||
| @@ -18,3 +32,15 @@ | ||||
|  | ||||
| # default packaging org | ||||
| # GIT_ORG='packages' | ||||
|  | ||||
| # default archiving org | ||||
| # GIT_ORG_ARCHIVE='landfill' | ||||
|  | ||||
| # whether to include custom maintainer line when importing from arch | ||||
| # PATCH_MAINTAINER=false | ||||
|  | ||||
| # override the default git url for patches repo | ||||
| # PATCH_URL=${GIT_SSH}:artix/artix-patches.git | ||||
|  | ||||
| # override the default debug pool | ||||
| # PKGDEST_DBG=${WORKSPACE_DIR}/packages-debug | ||||
|   | ||||
							
								
								
									
										18
									
								
								config/makepkg/conf.d/fortran.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								config/makepkg/conf.d/fortran.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| #!/hint/bash | ||||
| # | ||||
| # /etc/makepkg.conf.d/fortran.conf | ||||
| # | ||||
|  | ||||
| ######################################################################### | ||||
| # FORTRAN LANGUAGE SUPPORT | ||||
| ######################################################################### | ||||
|  | ||||
| # Flags used for the Fortran compiler, similar in spirit to CFLAGS. Read | ||||
| # linkman:gfortran[1] for more details on the available flags. | ||||
| #FFLAGS="-O2 -pipe" | ||||
| #FCFLAGS="$FFLAGS" | ||||
|  | ||||
| # Additional compiler flags appended to `FFLAGS` and `FCFLAGS` for use in debugging. Usually | ||||
| # this would include: ``-g''. Read linkman:gfortran[1] for more details on the wide | ||||
| # variety of compiler flags available. | ||||
| #DEBUG_FFLAGS="-g" | ||||
							
								
								
									
										19
									
								
								config/makepkg/conf.d/rust.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								config/makepkg/conf.d/rust.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| #!/hint/bash | ||||
| # shellcheck disable=2034 | ||||
|  | ||||
| # | ||||
| # /etc/makepkg.conf.d/rust.conf | ||||
| # | ||||
|  | ||||
| ######################################################################### | ||||
| # RUST LANGUAGE SUPPORT | ||||
| ######################################################################### | ||||
|  | ||||
| # Flags used for the Rust compiler, similar in spirit to CFLAGS. Read | ||||
| # linkman:rustc[1] for more details on the available flags. | ||||
| RUSTFLAGS="-Cforce-frame-pointers=yes" | ||||
|  | ||||
| # Additional compiler flags appended to `RUSTFLAGS` for use in debugging. | ||||
| # Usually this would include: ``-C debuginfo=2''. Read linkman:rustc[1] for | ||||
| # more details on the available flags. | ||||
| DEBUG_RUSTFLAGS="-C debuginfo=2" | ||||
| @@ -25,7 +25,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u' | ||||
|  | ||||
| #-- The package required by makepkg to download VCS sources | ||||
| #  Format: 'protocol::package' | ||||
| VCSCLIENTS=('bzr::bzr' | ||||
| VCSCLIENTS=('bzr::breezy' | ||||
|             'fossil::fossil' | ||||
|             'git::git' | ||||
|             'hg::mercurial' | ||||
| @@ -41,18 +41,18 @@ CHOST="x86_64-pc-linux-gnu" | ||||
| #-- Compiler and Linker Flags | ||||
| #CPPFLAGS="" | ||||
| CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \ | ||||
|         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ | ||||
|         -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \ | ||||
|         -fstack-clash-protection -fcf-protection" | ||||
|         # -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer" | ||||
| 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" | ||||
| RUSTFLAGS="" | ||||
| #-- Make Flags: change this for DistCC/SMP systems | ||||
| #MAKEFLAGS="-j2" | ||||
| #-- Debugging flags | ||||
| DEBUG_CFLAGS="-g" | ||||
| DEBUG_CXXFLAGS="$DEBUG_CFLAGS" | ||||
| DEBUG_RUSTFLAGS="-C debuginfo=2" | ||||
|  | ||||
| ######################################################################### | ||||
| # BUILD ENVIRONMENT | ||||
| @@ -81,7 +81,7 @@ BUILDENV=(!distcc color !ccache check !sign) | ||||
| #   These are default values for the options=() settings | ||||
| ######################################################################### | ||||
| # | ||||
| # Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto) | ||||
| # Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto !autodeps) | ||||
| #  A negated option will do the opposite of the comments below. | ||||
| # | ||||
| #-- strip:      Strip symbols from binaries/libraries | ||||
| @@ -93,6 +93,7 @@ BUILDENV=(!distcc color !ccache check !sign) | ||||
| #-- purge:      Remove files specified by PURGE_TARGETS | ||||
| #-- debug:      Add debugging flags as specified in DEBUG_* variables | ||||
| #-- lto:        Add compile flags for building with link time optimization | ||||
| #-- autodeps:   Automatically add depends/provides | ||||
| # | ||||
| OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug lto) | ||||
|  | ||||
| @@ -112,6 +113,8 @@ DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) | ||||
| PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod) | ||||
| #-- Directory to store source code in for debug packages | ||||
| DBGSRCDIR="/usr/src/debug" | ||||
| #-- Prefix and directories for library autodeps | ||||
| LIB_DIRS=('lib:usr/lib' 'lib32:usr/lib32') | ||||
|  | ||||
| ######################################################################### | ||||
| # PACKAGE OUTPUT | ||||
|   | ||||
							
								
								
									
										1
									
								
								config/makepkg/x86_64.conf.d/fortran.conf
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								config/makepkg/x86_64.conf.d/fortran.conf
									
									
									
									
									
										Symbolic link
									
								
							| @@ -0,0 +1 @@ | ||||
| ../conf.d/fortran.conf | ||||
							
								
								
									
										1
									
								
								config/makepkg/x86_64.conf.d/rust.conf
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								config/makepkg/x86_64.conf.d/rust.conf
									
									
									
									
									
										Symbolic link
									
								
							| @@ -0,0 +1 @@ | ||||
| ../conf.d/rust.conf | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
							
								
								
									
										117
									
								
								config/pacman/iso-goblins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								config/pacman/iso-goblins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| # | ||||
| # /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 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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 | ||||
|  | ||||
| [galaxy-goblins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [galaxy-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [galaxy] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # If you want to run 32 bit applications on your x86_64 system, | ||||
| # enable the lib32 repositories as required here. | ||||
|  | ||||
| # [lib32-goblins] | ||||
| # Include = /etc/pacman.d/mirrorlist | ||||
| # | ||||
| # [lib32-gremlins] | ||||
| # Include = /etc/pacman.d/mirrorlist | ||||
| # | ||||
| # [lib32] | ||||
| # Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # An example of a custom package repository.  See the pacman manpage for | ||||
| # tips on creating your own repositories. | ||||
| #[custom] | ||||
| #SigLevel = Optional TrustAll | ||||
| #Server = file:///home/custompkgs | ||||
							
								
								
									
										105
									
								
								config/pacman/iso-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								config/pacman/iso-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| # | ||||
| # /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 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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 | ||||
							
								
								
									
										105
									
								
								config/pacman/iso-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								config/pacman/iso-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| # | ||||
| # /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 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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 | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
| @@ -36,6 +36,8 @@ NoProgressBar | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| DownloadUser = alpm | ||||
| #DisableSandbox | ||||
|  | ||||
| # 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. | ||||
|   | ||||
							
								
								
									
										296
									
								
								contrib/completion/bash/artixpkg.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								contrib/completion/bash/artixpkg.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,296 @@ | ||||
| #/usr/bin/env bash | ||||
|  | ||||
| LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| _artixpkg_pkgbase() { | ||||
|     source "${LIBDIR}"/pkg/util.sh | ||||
|     ls -1 "${TREE_DIR_ARTIX}" | tr '\n' ' ' | ||||
| } | ||||
|  | ||||
| _artixpkg_remotepkgbase() { | ||||
|     curl -s "https://checkupdates.artixlinux.org/api/1.0/packages?startswith=$1" | ||||
| } | ||||
|  | ||||
| _artixpkg_maintainers() { | ||||
|     curl -s "https://checkupdates.artixlinux.org/api/1.0/maintainers" | ||||
| } | ||||
|  | ||||
| _artixpkg_completion() { | ||||
|     local cur prev comps comps_all repos autorepos teams agents cwords comp_cword_exflag agent_flag_present | ||||
|     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 | ||||
|     agent_flag_present=false | ||||
|     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 | ||||
|         if [[ $word == -a || $word == --agent ]]; then | ||||
|             # -a can also refer to --adopt | ||||
|             agent_flag_present=true | ||||
|         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 git repo version -h --help" -- "${cur}")) | ||||
|             return 0 | ||||
|             ;; | ||||
|         2) | ||||
|             case ${prev} in | ||||
|                 admin) | ||||
|                     COMPREPLY=($(compgen -W "maintainer query team topic transfer -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 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 repo"*) | ||||
|                     if [ "$agent_flag_present" = true ] ; then | ||||
|                         ((comp_cword_exflag--)) | ||||
|                     fi | ||||
|                     case "${prev}" in | ||||
|                         "-a"|"--agent") | ||||
|                             COMPREPLY=($(compgen -W "$agents" -- ${cur})) | ||||
|                             ;; | ||||
|                         *) | ||||
|                             case "${comps}" in | ||||
|                                 "artixpkg repo add"*) | ||||
|                                     local repoAddCommon="-p --push -r --rebuild -n --nocheck -a --agent -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 -a --agent -h --help $autorepos $repos" -- ${cur})) | ||||
|                                             ;; | ||||
|                                         *) | ||||
|                                             COMPREPLY=($(compgen -W "-p --push -a --agent -h --help $(_artixpkg_pkgbase)" -- ${cur})) | ||||
|                                             ;; | ||||
|                                     esac | ||||
|                                     ;; | ||||
|                                 "artixpkg repo move"*) | ||||
|                                     case "${comp_cword_exflag}" in | ||||
|                                         3|4) | ||||
|                                             COMPREPLY=($(compgen -W "-p --push -a --agent -h --help $autorepos $repos" -- ${cur})) | ||||
|                                             ;; | ||||
|                                         *) | ||||
|                                             COMPREPLY=($(compgen -W "-p --push -a --agent -h --help $(_artixpkg_pkgbase)" -- ${cur})) | ||||
|                                             ;; | ||||
|                                     esac | ||||
|                                     ;; | ||||
|                             esac | ||||
|                             ;; | ||||
|                     esac | ||||
|                     ;; | ||||
|                 "artixpkg git clone"*) | ||||
|                     case "${prev}" in | ||||
|                         "--protocol") | ||||
|                             COMPREPLY=($(compgen -W "https" -- ${cur})) | ||||
|                             ;; | ||||
|                         "-t"|"--team") | ||||
|                             COMPREPLY=($(compgen -W "$teams" -- ${cur})) | ||||
|                             ;; | ||||
|                         "-m"|"--maintainer") | ||||
|                             COMPREPLY=($(compgen -W "$(_artixpkg_maintainers)" -- ${cur})) | ||||
|                             ;; | ||||
|                         "-s"|"--search"|"-j"|"--jobs") | ||||
|                             # these flags expect a parameter | ||||
|                             COMPREPLY=() | ||||
|                             ;; | ||||
|                         *) | ||||
|                             COMPREPLY=($(compgen -W "-m --maintainer --protocol -s --search -t --team -j --jobs --all -h --help $(_artixpkg_remotepkgbase ${cur})" -- ${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 | ||||
|                         "-t"|"--team") | ||||
|                             COMPREPLY=($(compgen -W "$teams" -- ${cur})) | ||||
|                             ;; | ||||
|                         *) | ||||
|                             COMPREPLY=($(compgen -W "-c --clone -t --team -h --help" -- ${cur})) | ||||
|                             ;; | ||||
|                     esac | ||||
|                     ;; | ||||
|                 "artixpkg git pull"*) | ||||
|                     case "${prev}" in | ||||
|                         "-m"|"--maintainer") | ||||
|                             COMPREPLY=($(compgen -W "$(_artixpkg_maintainers)" -- ${cur})) | ||||
|                             ;; | ||||
|                         "-t"|"--topic"|"-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") | ||||
|                             COMPREPLY=($(compgen -W "$(_artixpkg_maintainers)" -- ${cur})) | ||||
|                             ;; | ||||
|                         "-t"|"--topic") | ||||
|                             # this flag expects a parameter | ||||
|                             COMPREPLY=() | ||||
|                             ;; | ||||
|                         *) | ||||
|                             COMPREPLY=($(compgen -W "-m --maintainer -t --topic -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") | ||||
|                             COMPREPLY=($(compgen -W "$(_artixpkg_maintainers)" -- ${cur})) | ||||
|                             ;; | ||||
|                         "-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 --delete -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 | ||||
							
								
								
									
										205
									
								
								contrib/completion/zsh/_artixpkg.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								contrib/completion/zsh/_artixpkg.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | ||||
| #compdef artixpkg | ||||
|  | ||||
| local -a addcmd admincmd cicmd clonecmd configcmd createcmd gitcmd importcmd \ | ||||
|          initialcmd maintainercmd movecmd querycmd pullcmd pushcmd removecmd \ | ||||
|          repocmd showcmd teamcmd topiccmd transfercmd versioncmd | ||||
| _regex_words maintainer '' \ | ||||
|                         '-a' \ | ||||
|                         '--adopt' \ | ||||
|                         '-h' \ | ||||
|                         '--help' \ | ||||
|                         '-o' \ | ||||
|                         '--orphan' | ||||
| maintainercmd=("$reply[@]") | ||||
|  | ||||
| _regex_words query '' \ | ||||
|                    '-h' \ | ||||
|                    '--help' \ | ||||
|                    '-m' \ | ||||
|                    '-t' | ||||
| querycmd=("$reply[@]") | ||||
|  | ||||
| _regex_words team '' \ | ||||
|                   '-a' \ | ||||
|                   '--add' \ | ||||
|                   '-c' \ | ||||
|                   '--check' \ | ||||
|                   '-h' \ | ||||
|                   '--help' \ | ||||
|                   '-r' \ | ||||
|                   '--remove' | ||||
| teamcmd=("$reply[@]") | ||||
|  | ||||
| _regex_words topic '' \ | ||||
|                    '-a' \ | ||||
|                    '--add' \ | ||||
|                    '-d' \ | ||||
|                    '--delete' \ | ||||
|                    '-h' \ | ||||
|                    '--help' \ | ||||
|                    '-j' \ | ||||
|                    '--jobs' \ | ||||
|                    '-r' \ | ||||
|                    '--remove' | ||||
| topiccmd=("$reply[@]") | ||||
|  | ||||
| _regex_words transfer '' \ | ||||
|                       '-h' \ | ||||
|                       '--help' | ||||
| transfercmd=("$reply[@]") | ||||
|  | ||||
|  | ||||
| _regex_words admin '' \ | ||||
|                    '-h:Help text' \ | ||||
|                    '--help:Help text' \ | ||||
|                    'maintainer:Manage repo maintainer:$maintainercmd' \ | ||||
|                    'query:Query maintainers and topics:$querycmd' \ | ||||
|                    'team:Manage repo team:$teamcmd' \ | ||||
|                    'topic:Manage topics:$topiccmd' \ | ||||
|                    'transfer:Transfer obsolete repositories to landfill:$transfercmd' | ||||
| admincmd=("$reply[@]") | ||||
|  | ||||
| _regex_words ci '' \ | ||||
|                 '-a' \ | ||||
|                 '--agent' \ | ||||
|                 '-h' \ | ||||
|                 '--help' | ||||
| cicmd=("$reply[@]") | ||||
|  | ||||
| _regex_words clone '' \ | ||||
|                    '-a' \ | ||||
|                    '--agent' \ | ||||
|                    '--all' \ | ||||
|                    '-h' \ | ||||
|                    '--help' \ | ||||
|                    '-j' \ | ||||
|                    '--jobs' \ | ||||
|                    '-m' \ | ||||
|                    '--maintainer' \ | ||||
|                    '--protocol' \ | ||||
|                    '-s' \ | ||||
|                    '--search' \ | ||||
|                    '-t' \ | ||||
|                    '--team' | ||||
| clonecmd=("$reply[@]") | ||||
|  | ||||
| _regex_words config '' \ | ||||
|                     '-h' \ | ||||
|                     '--help' \ | ||||
|                     '-j' \ | ||||
|                     '--jobs' \ | ||||
|                     '--protocol' | ||||
| configcmd=("$reply[@]") | ||||
|  | ||||
| _regex_words create '' \ | ||||
|                     '-a' \ | ||||
|                     '--agent' \ | ||||
|                     '-c' \ | ||||
|                     '--create' \ | ||||
|                     '-h' \ | ||||
|                     '--help' \ | ||||
|                     '-t' \ | ||||
|                     '--team' | ||||
| createcmd=("$reply[@]") | ||||
|  | ||||
| _regex_words pull '' \ | ||||
|                   '--all' \ | ||||
|                   '-h' \ | ||||
|                   '--help' \ | ||||
|                   '-j' \ | ||||
|                   '--jobs' \ | ||||
|                   '-m' \ | ||||
|                   '--maintainer' \ | ||||
|                   '-t' \ | ||||
|                   '--topic' | ||||
| pullcmd=("$reply[@]") | ||||
|  | ||||
| _regex_words push '' \ | ||||
|                   '-h' \ | ||||
|                   '--help' \ | ||||
|                   '-j' \ | ||||
|                   '--jobs' \ | ||||
|                   '-m' \ | ||||
|                   '--maintainer' \ | ||||
|                   '-t' \ | ||||
|                   '--topic' | ||||
| pushcmd=("$reply[@]") | ||||
|  | ||||
| _regex_words git '' \ | ||||
|                  'ci:Configure CI agent:$cicmd' \ | ||||
|                  'clone:Clone a package:$clonecmd' \ | ||||
|                  'config:Configure a clone:$configcmd' \ | ||||
|                  'create:Create a new gitea package repository:$createcmd' \ | ||||
|                  '-h:Help text' \ | ||||
|                  '--help:Help text' \ | ||||
|                  'pull:Pull a package repository:$pullcmd' \ | ||||
|                  'push:Push a package repository:$pushcmd' | ||||
| gitcmd=("$reply[@]") | ||||
|  | ||||
| _regex_words add '' \ | ||||
|                  '-h' \ | ||||
|                  '--help' \ | ||||
|                  '-n' \ | ||||
|                  '--nocheck' \ | ||||
|                  '-p' \ | ||||
|                  '--push' \ | ||||
|                  '-r' \ | ||||
|                  '--rebuild' | ||||
| addcmd=("$reply[@]") | ||||
|  | ||||
| _regex_words import '' \ | ||||
|                     '--del' \ | ||||
|                     '-h' \ | ||||
|                     '--help' \ | ||||
|                     '--tag' | ||||
| importcmd=("$reply[@]") | ||||
|  | ||||
| _regex_words move '' \ | ||||
|                   '-h' \ | ||||
|                   '--help' \ | ||||
|                   '-p' \ | ||||
|                   '--push' | ||||
| movecmd=("$reply[@]") | ||||
|  | ||||
| _regex_words remove '' \ | ||||
|                     '-h' \ | ||||
|                     '--help' \ | ||||
|                     '-p' \ | ||||
|                     '--push' | ||||
| removecmd=("$reply[@]") | ||||
|  | ||||
| _regex_words show '' \ | ||||
|                   '-b' \ | ||||
|                   '--base' \ | ||||
|                   '-h' \ | ||||
|                   '--help' \ | ||||
|                   '-p' \ | ||||
|                   '--pkgs' | ||||
| showcmd=("$reply[@]") | ||||
|  | ||||
| _regex_words repo '' \ | ||||
|                   'add:Add pkgbase to repo:$addcmd' \ | ||||
|                   '-h:Help text' \ | ||||
|                   '--help:Help text' \ | ||||
|                   'import:Import latest tag from arch upstream:$importcmd' \ | ||||
|                   'move:Move pkgbase between repos:$movecmd' \ | ||||
|                   'remove:Remove pkgbase from repo:$removecmd' \ | ||||
|                   'show:Show pkgbase repo db:$showcmd' | ||||
| repocmd=("$reply[@]") | ||||
|  | ||||
| _regex_words version '' \ | ||||
|                      '-h' \ | ||||
|                      '--help' | ||||
| versioncmd=("$reply[@]") | ||||
|  | ||||
| _regex_words initial '' \ | ||||
|                      'admin:Manage topics:$admincmd' \ | ||||
|                      'git:Manage git:$gitcmd' \ | ||||
|                      '-h:Help text' \ | ||||
|                      '--help:Help text' \ | ||||
|                      'repo:Pacman database modification:$repocmd' \ | ||||
|                      'version:Show artixpkg version:$versioncmd' | ||||
| initialcmd=("$reply[@]") | ||||
|  | ||||
| _regex_arguments _artixpkg /$'[^\0]##\0'/ "${initialcmd[@]}" | ||||
| _artixpkg "$@" | ||||
							
								
								
									
										30
									
								
								contrib/iso/profile.yaml.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								contrib/iso/profile.yaml.example
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| --- | ||||
|  | ||||
| # required | ||||
| live-session: | ||||
|     user: "artix" | ||||
|     password: "artix" | ||||
|     autologin: true | ||||
|     use-xlibre: false | ||||
|     services: [] | ||||
|     user-services: [] | ||||
|  | ||||
| # required | ||||
| rootfs: | ||||
|     packages: [] | ||||
|     packages-init: | ||||
|         dinit: [] | ||||
|         openrc: [] | ||||
|         runit: [] | ||||
|         s6: [] | ||||
|  | ||||
| # optional | ||||
| livefs: | ||||
|     packages: [] | ||||
|     # optional | ||||
|     packages-init: | ||||
|         dinit: [] | ||||
|         openrc: [] | ||||
|         runit: [] | ||||
|         s6: [] | ||||
|  | ||||
| @@ -8,40 +8,81 @@ 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/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() { | ||||
|     printf 'usage: %s chroot-dir [command]\n' "${0##*/}" | ||||
|     printf '    -h             Print this help message\n' | ||||
|     printf '\n' | ||||
|     printf "    If 'command' is unspecified, %s will launch /bin/sh.\n" "${0##*/}" | ||||
|     printf '\n' | ||||
|     printf '\n' | ||||
|     exit "$1" | ||||
|     cat <<EOF | ||||
| usage: ${0##*/} chroot-dir [command] [arguments...] | ||||
|  | ||||
|     -h                  Print this help message | ||||
|     -N                  Run in unshare mode as a regular user | ||||
|     -u <user>[:group]   Specify non-root user and optional group to use | ||||
|     -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=("$@") | ||||
|  | ||||
| opts=':h' | ||||
| opts=':hNu:r' | ||||
|  | ||||
| while getopts ${opts} arg; do | ||||
|     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 | ||||
| done | ||||
| shift $(( OPTIND - 1 )) | ||||
|  | ||||
| check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
| (( $# )) || die 'No chroot directory specified' | ||||
|  | ||||
| chrootdir=$1 | ||||
| chrootdir="$1" | ||||
| shift | ||||
|  | ||||
| [[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}" | ||||
|  | ||||
| chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}" | ||||
| chroot_add_resolv_conf "${chrootdir}" | ||||
|  | ||||
| SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "$@" | ||||
| args=("$@") | ||||
| if (( unshare )); then | ||||
|     setup=unshare_setup | ||||
|     "$mount_unshare" bash -c "$(declare_all); artix-chroot" | ||||
| else | ||||
|     setup=chroot_setup | ||||
|     artix-chroot | ||||
| fi | ||||
|   | ||||
| @@ -18,26 +18,50 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/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 | ||||
|  | ||||
|  | ||||
| #{{{ functions | ||||
|  | ||||
| copy_mirrorlist(){ | ||||
|     cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/" | ||||
| } | ||||
| basestrap() { | ||||
|     check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
| #     (( EUID == 0 )) || die 'This script must be run with root privileges' | ||||
|  | ||||
| copy_keyring(){ | ||||
|     if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then | ||||
|         cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/" | ||||
|     # create obligatory directories | ||||
|     msg "Creating install root at %s" "$newroot" | ||||
|     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 | ||||
| } | ||||
|  | ||||
| create_min_fs(){ | ||||
|     msg "Creating install root at %s" "$1" | ||||
|     mkdir -m 0755 -p "$1"/var/{cache/pacman/pkg,lib/pacman,log} "$1"/{dev,run,etc/pacman.d} | ||||
|     mkdir -m 1777 -p "$1"/tmp | ||||
|     mkdir -m 0555 -p "$1"/{sys,proc} | ||||
|     msg 'Installing packages to %s' "$newroot" | ||||
|     if ! $pid_unshare pacman -r "$newroot" "${pacman_args[@]}"; then | ||||
|         die 'Failed to install packages to new root' | ||||
|     fi | ||||
|  | ||||
|     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,48 +70,67 @@ newroot=/mnt | ||||
|  | ||||
| hostcache=0 | ||||
| copykeyring=1 | ||||
| initkeyring=0 | ||||
| copymirrorlist=1 | ||||
| pacmode=-Sy | ||||
| pacman_args=() | ||||
| unshare=0 | ||||
| copyconf=0 | ||||
| pacman_config=/etc/pacman.conf | ||||
|  | ||||
| usage() { | ||||
|     printf "usage: %s [options] root [packages...]\n" "${0##*/}" | ||||
|     printf " -C <config>      Use an alternate config file for pacman\n" | ||||
|     printf " -c               Use the package cache on the host, rather than the target\n" | ||||
|     printf " -G               Avoid copying the host's pacman keyring to the target\n" | ||||
|     printf " -i               Avoid auto-confirmation of package selections\n" | ||||
|     printf " -M               Avoid copying the host's mirrorlist to the target\n" | ||||
|     printf ' -U               Use pacman -U to install packages\n' | ||||
|     printf " -h               Print this help message\n" | ||||
|     printf '\n' | ||||
|     printf ' basestrap installs packages to the specified new root directory.\n' | ||||
|     printf ' If no packages are given, basestrap defaults to the "base" group.\n' | ||||
|     printf '\n' | ||||
|     printf '\n' | ||||
|     exit "$1" | ||||
|   cat <<EOF | ||||
| usage: ${0##*/} [options] root [packages...] | ||||
|  | ||||
|   Options: | ||||
|     -C <config>    Use an alternate config file for pacman | ||||
|     -c             Use the package cache on the host, rather than the target | ||||
|     -D             Skip pacman dependency checks | ||||
|     -G             Avoid copying the host's pacman keyring to the target | ||||
|     -i             Prompt for package confirmation when needed (run interactively) | ||||
|     -K             Initialize an empty pacman keyring in the target (implies '-G') | ||||
|     -M             Avoid copying the host's mirrorlist to the target | ||||
|     -N             Run in unshare mode as a regular user | ||||
|     -P             Copy the host's pacman config to the target | ||||
|     -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=("$@") | ||||
|  | ||||
| opts=':C:cGiMU' | ||||
| opts=':C:cDGiKMNPU' | ||||
|  | ||||
| while getopts ${opts} arg; do | ||||
|     case "${arg}" in | ||||
|         C) pacman_conf=$OPTARG ;; | ||||
|         C) pacman_config=$OPTARG ;; | ||||
|         D) pacman_args+=(-dd) ;; | ||||
|         c) hostcache=1 ;; | ||||
|         i) interactive=1 ;; | ||||
|         G) copykeyring=0 ;; | ||||
|         K) initkeyring=1 ;; | ||||
|         M) copymirrorlist=0 ;; | ||||
|         N) unshare=1 ;; | ||||
|         P) copyconf=1 ;; | ||||
|         U) pacmode=-U ;; | ||||
|         h|?) usage 0 ;; | ||||
|         :) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;; | ||||
|         ?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;; | ||||
|     esac | ||||
| done | ||||
| shift $(( OPTIND - 1 )) | ||||
|  | ||||
| check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
|  | ||||
| (( $# )) || die "No root directory specified" | ||||
| newroot=$1; shift | ||||
| pacman_args=("${@:-base}") | ||||
|  | ||||
| [[ -d $newroot ]] || die "%s is not a directory" "$newroot" | ||||
|  | ||||
| pacman_args+=("$pacmode" "${@:-base}" --config="$pacman_config") | ||||
|  | ||||
| if (( ! hostcache )); then | ||||
|   pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg") | ||||
| @@ -97,26 +140,10 @@ if (( ! interactive )); then | ||||
|   pacman_args+=(--noconfirm) | ||||
| fi | ||||
|  | ||||
| [[ -n $pacman_conf ]] && pacman_args+=(--config="$pacman_conf") | ||||
|  | ||||
| [[ -d $newroot ]] || die "%s is not a directory" "$newroot" | ||||
|  | ||||
| # create obligatory directories | ||||
| create_min_fs "$newroot" | ||||
|  | ||||
| # mount API filesystems | ||||
| chroot_api_mount "$newroot" || die "failed to setup API filesystems in new root" | ||||
|  | ||||
| if (( copykeyring ));then | ||||
|     copy_keyring "$newroot" | ||||
| fi | ||||
|  | ||||
| msg2 'Installing packages to %s' "$newroot" | ||||
| if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then | ||||
|     die 'Failed to install packages to new root' | ||||
| fi | ||||
|  | ||||
|  | ||||
| if (( copymirrorlist ));then | ||||
|     copy_mirrorlist "$newroot" | ||||
| if (( unshare )); then | ||||
|     setup=unshare_setup | ||||
|     "$mount_unshare" bash -c "$(declare_all); basestrap" | ||||
| else | ||||
|     setup=chroot_setup | ||||
|     basestrap | ||||
| fi | ||||
|   | ||||
| @@ -12,10 +12,12 @@ source "${LIBDIR}"/base/message.sh | ||||
| #{{{ filesystems | ||||
|  | ||||
| declare -A pseudofs_types=([anon_inodefs]=1 | ||||
|                         [apparmorfs]=1 | ||||
|                         [autofs]=1 | ||||
|                         [bdev]=1 | ||||
|                         [bpf]=1 | ||||
|                         [binder]=1 | ||||
|                         [binfmt_misc]=1 | ||||
|                         [bpf]=1 | ||||
|                         [cgroup]=1 | ||||
|                         [cgroup2]=1 | ||||
|                         [configfs]=1 | ||||
| @@ -25,31 +27,55 @@ declare -A pseudofs_types=([anon_inodefs]=1 | ||||
|                         [devpts]=1 | ||||
|                         [devtmpfs]=1 | ||||
|                         [dlmfs]=1 | ||||
|                         [dmabuf]=1 | ||||
|                         [drm]=1 | ||||
|                         [efivarfs]=1 | ||||
|                         [fuse]=1 | ||||
|                         [fuse.archivemount]=1 | ||||
|                         [fuse.avfsd]=1 | ||||
|                         [fuse.dumpfs]=1 | ||||
|                         [fuse.encfs]=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 | ||||
|                         [hugetlbfs]=1 | ||||
|                         [ipathfs]=1 | ||||
|                         [mqueue]=1 | ||||
|                         [nfsd]=1 | ||||
|                         [none]=1 | ||||
|                         [nsfs]=1 | ||||
|                         [overlay]=1 | ||||
|                         [pipefs]=1 | ||||
|                         [proc]=1 | ||||
|                         [pstore]=1 | ||||
|                         [ramfs]=1 | ||||
|                         [resctrl]=1 | ||||
|                         [rootfs]=1 | ||||
|                         [rpc_pipefs]=1 | ||||
|                         [securityfs]=1 | ||||
|                         [selinuxfs]=1 | ||||
|                         [smackfs]=1 | ||||
|                         [sockfs]=1 | ||||
|                         [spufs]=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 | ||||
|                     [ext2]=1 | ||||
|                     [ext3]=1 | ||||
|                     [ext4]=1 | ||||
|                     [ext4dev]=1 | ||||
|                     [f2fs]=1 | ||||
|                     [fat]=1 | ||||
|                     [jfs]=1 | ||||
|                     [minix]=1 | ||||
|                     [msdos]=1 | ||||
| @@ -69,11 +95,15 @@ fstype_has_fsck() { | ||||
|     (( fsck_types["$1"] )) | ||||
| } | ||||
|  | ||||
| try_cast() ( | ||||
|     _=$(( $1#$2 )) | ||||
| ) 2>/dev/null | ||||
|  | ||||
| valid_number_of_base() { | ||||
|     local base=$1 len=${#2} i | ||||
|     local base="$1" len=${#2} i | ||||
|  | ||||
|     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 | ||||
|  | ||||
|     return 0 | ||||
| @@ -81,7 +111,6 @@ valid_number_of_base() { | ||||
|  | ||||
| mangle() { | ||||
|     local i chr out | ||||
|  | ||||
|     local {a..f}= {A..F}= | ||||
|  | ||||
|     for (( i = 0; i < ${#1}; i++ )); do | ||||
| @@ -100,7 +129,6 @@ mangle() { | ||||
|  | ||||
| unmangle() { | ||||
|     local i chr out len=$(( ${#1} - 4 )) | ||||
|  | ||||
|     local {a..f}= {A..F}= | ||||
|  | ||||
|     for (( i = 0; i < len; i++ )); do | ||||
| @@ -127,7 +155,6 @@ dm_name_for_devnode() { | ||||
|     else | ||||
|         # don't leave the caller hanging, just print the original name | ||||
|         # along with the failure. | ||||
|         print '%s' "$1" | ||||
|         error 'Failed to resolve device mapper name for: %s' "$1" | ||||
|     fi | ||||
| } | ||||
| @@ -185,19 +212,11 @@ optstring_append_option() { | ||||
|     optstring_normalize "$1" | ||||
| } | ||||
|  | ||||
| optstring_prepend_option() { | ||||
|     if ! optstring_has_option "$1" "$2"; then | ||||
|         declare -g "$1=$2,${!1}" | ||||
|     fi | ||||
|  | ||||
|     optstring_normalize "$1" | ||||
| } | ||||
|  | ||||
| optstring_get_option() { | ||||
|     local opts o | ||||
|     local _opts o | ||||
|  | ||||
|     IFS=, read -ra opts <<<"${!1}" | ||||
|     for o in "${opts[@]}"; do | ||||
|     IFS=, read -ra _opts <<<"${!1}" | ||||
|     for o in "${_opts[@]}"; do | ||||
|         if optstring_match_option "$2" "$o"; then | ||||
|             declare -g "$o" | ||||
|             return 0 | ||||
| @@ -214,7 +233,7 @@ optstring_has_option() { | ||||
| } | ||||
|  | ||||
| write_source() { | ||||
|     local src=$1 spec label uuid comment=() | ||||
|     local src="$1" spec label uuid comment=() | ||||
|  | ||||
|     label=$(lsblk -rno LABEL "$1" 2>/dev/null) | ||||
|     uuid=$(lsblk -rno UUID "$1" 2>/dev/null) | ||||
| @@ -242,7 +261,7 @@ write_source() { | ||||
|         ;; | ||||
|     esac | ||||
|  | ||||
|     [[ -n "${comment[*]}" ]] && printf '# %s\n' "${comment[*]}" | ||||
|     [[ -n ${comment[*]} ]] && printf '# %s\n' "${comment[*]}" | ||||
|  | ||||
|     if [[ $spec ]]; then | ||||
|         printf '%-20s' "$bytag=$(mangle "$spec")" | ||||
| @@ -267,15 +286,27 @@ optstring_apply_quirks() { | ||||
|     fi | ||||
|  | ||||
|     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) | ||||
|             # These are Kconfig options for f2fs. Kernels supporting the options will | ||||
|             # only provide the negative versions of these (e.g. noacl), and vice versa | ||||
|             # These are build-time or runtime-unchangeable options for f2fs. | ||||
|             # 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. | ||||
|             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) | ||||
|             # 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_append_option "$varname" "codepage=${codepage#cp}" | ||||
|             fi | ||||
| @@ -290,11 +321,12 @@ usage() { | ||||
| usage: ${0##*/} [options] root | ||||
|  | ||||
|   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) | ||||
|     -p             Exclude pseudofs mounts (default behavior) | ||||
|     -P             Include printing mounts | ||||
|     -t TAG         Use TAG for source identifiers | ||||
|     -P             Include pseudofs mounts | ||||
|     -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) | ||||
|  | ||||
|     -h             Print this help message | ||||
| @@ -332,7 +364,6 @@ if ! mountpoint -q "$root"; then | ||||
| fi | ||||
|  | ||||
| # handle block devices | ||||
| findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root" | | ||||
| while read -r src target fstype opts fsroot; do | ||||
|     if (( !pseudofs )) && fstype_is_pseudofs "$fstype"; then | ||||
|         continue | ||||
| @@ -360,6 +391,7 @@ while read -r src target fstype opts fsroot; do | ||||
|     if [[ $fsroot != / && $fstype != btrfs ]]; then | ||||
|         # it's a bind mount | ||||
|         src=$(findmnt -funcevo TARGET "$src")$fsroot | ||||
|         src="/${src#"$root"/}" | ||||
|         if [[ $src -ef $target ]]; then | ||||
|             # hrmm, this is weird. we're probably looking at a file or directory | ||||
|             # that was bound into a chroot from the host machine. Ignore it, | ||||
| @@ -393,7 +425,7 @@ while read -r src target fstype opts fsroot; do | ||||
|     printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts" | ||||
|     printf '\t%s %s' "$dump" "$pass" | ||||
|     printf '\n\n' | ||||
| done | ||||
| done < <(findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root") | ||||
|  | ||||
| # handle swaps devices | ||||
| { | ||||
| @@ -409,6 +441,9 @@ done | ||||
|         # skip files marked deleted by the kernel | ||||
|         [[ $device = *'\040(deleted)' ]] && continue | ||||
|  | ||||
|         # skip devices not part of the prefix | ||||
|         [[ $device = "$prefixfilter"* ]] || continue | ||||
|  | ||||
|         if [[ $type = file ]]; then | ||||
|             printf '%-20s' "${device#"${root%/}"}" | ||||
|         elif [[ $device = /dev/dm-+([0-9]) ]]; then | ||||
|   | ||||
| @@ -6,20 +6,16 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/iso/util.sh | ||||
| source "${LIBDIR}"/iso/util.sh | ||||
| # 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/base/mount.sh | ||||
| # shellcheck source=src/lib/iso/mount.sh | ||||
| source "${LIBDIR}"/iso/mount.sh | ||||
| # shellcheck source=src/lib/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 | ||||
| source "${LIBDIR}"/iso/calamares.sh | ||||
| # shellcheck source=src/lib/iso/config.sh | ||||
| @@ -92,13 +88,21 @@ make_rootfs() { | ||||
|         msg "Prepare [Base installation] (rootfs)" | ||||
|         local rootfs="${work_dir}/rootfs" | ||||
|  | ||||
|         load_pkgs "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}" | ||||
|  | ||||
|         [[ -z ${live_list} ]] && configure_chroot "${rootfs}" | ||||
|         if ! "${HAS_LIVE}"; then | ||||
|             configure_chroot "${rootfs}" | ||||
|         fi | ||||
|  | ||||
|         clean_up_chroot "${rootfs}" | ||||
|  | ||||
| @@ -113,6 +117,8 @@ make_livefs() { | ||||
|         msg "Prepare [Live installation] (livefs)" | ||||
|         local livefs="${work_dir}/livefs" | ||||
|  | ||||
|         load_pkgs "livefs" | ||||
|  | ||||
|         prepare_dir "${livefs}" | ||||
|  | ||||
|         mount_overlayfs "${livefs}" "${work_dir}" | ||||
| @@ -137,6 +143,8 @@ make_bootfs() { | ||||
|     if [[ ! -e ${work_dir}/bootfs.lock ]]; then | ||||
|         msg "Prepare [/iso/boot]" | ||||
|  | ||||
|         load_pkgs "bootfs" | ||||
|  | ||||
|         prepare_dir "${iso_root}/boot" | ||||
|  | ||||
|         cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}" | ||||
| @@ -148,6 +156,7 @@ make_bootfs() { | ||||
|         if "${use_dracut}"; then | ||||
|             prepare_initramfs_dracut "${bootfs}" | ||||
|         else | ||||
|             basestrap "${basestrap_args[@]}" "${bootfs}" "${packages[@]}" | ||||
|             prepare_initramfs_mkinitcpio "${bootfs}" | ||||
|         fi | ||||
|  | ||||
| @@ -164,7 +173,9 @@ make_grub(){ | ||||
|         msg "Prepare [/iso/boot/grub]" | ||||
|  | ||||
|         local layer=${work_dir}/rootfs | ||||
|         [[ -n ${live_list} ]] && layer=${work_dir}/livefs | ||||
|         if "${HAS_LIVE}"; then | ||||
|             layer=${work_dir}/livefs | ||||
|         fi | ||||
|  | ||||
|         prepare_grub "${work_dir}/rootfs" "$layer" | ||||
|  | ||||
| @@ -183,8 +194,8 @@ gen_iso_fn(){ | ||||
|     local vars=("artix") name | ||||
|     vars+=("${profile}") | ||||
|     vars+=("${INITSYS}") | ||||
|     case "${repo}" in | ||||
|         *-gremlins|*-goblins) vars+=("${repo#*-}") ;; | ||||
|     case "${STABILITY}" in | ||||
|         gremlins|goblins) vars+=("${STABILITY}") ;; | ||||
|     esac | ||||
|     vars+=("${ISO_VERSION}") | ||||
|     vars+=("${arch}") | ||||
| @@ -194,12 +205,22 @@ gen_iso_fn(){ | ||||
|     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(){ | ||||
|     load_profile | ||||
|     local pac_conf | ||||
|  | ||||
|     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" | ||||
|     pac_conf=iso-${arch}.conf | ||||
|     if [[ "${STABILITY}" != 'stable' ]]; then | ||||
|         pac_conf=iso-${STABILITY}-${arch}.conf | ||||
|     fi | ||||
|     pacman_conf="${DATADIR}/pacman.conf.d/${pac_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 | ||||
| @@ -262,10 +283,8 @@ mk_boot(){ | ||||
| } | ||||
|  | ||||
| mk_chroots(){ | ||||
|     load_pkgs "${root_list}" | ||||
|     run_safe "make_rootfs" | ||||
|     if [[ -n ${live_list} ]]; then | ||||
|         load_pkgs "${live_list}" | ||||
|     if "${HAS_LIVE}"; then | ||||
|         run_safe "make_livefs" | ||||
|     fi | ||||
| } | ||||
| @@ -322,11 +341,11 @@ persist=false | ||||
| use_dracut=false | ||||
| squash_only=false | ||||
| boot_only=false | ||||
| copy_pacconf=false | ||||
|  | ||||
| basestrap_args=(-GMc) | ||||
| cmd=${0##*/} | ||||
|  | ||||
| repo=${REPO} | ||||
| owner=${SUDO_USER:-$USER} | ||||
| profile='base' | ||||
| chroots_iso="${CHROOTS_DIR}/buildiso" | ||||
| @@ -337,8 +356,8 @@ usage() { | ||||
|     printf '    -p <profile>       Profile [default: %s]\n' "${profile}" | ||||
|     printf '    -r <dir>           Chroots directory\n' | ||||
|     printf '                       [default: %s]\n' "${chroots_iso}" | ||||
|     printf '    -R <repo>          Build repo\n' | ||||
|     printf '                       [default: %s]\n' "${repo}" | ||||
|     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' | ||||
| @@ -355,6 +374,7 @@ usage() { | ||||
|     printf '    -z                 Generate iso only\n' | ||||
|     printf '                       Requires pre built images (-x)\n' | ||||
|     printf '    -d                 Use dracut instead of mkinitcpio for iso initramfs\n' | ||||
|     printf '    -w                 Copy the pacman.conf used to the rootfs\n' | ||||
|     printf '    -q                 Query settings and pretend build\n' | ||||
|     printf '    -h                 This help\n' | ||||
|     printf '\n' | ||||
| @@ -364,13 +384,13 @@ usage() { | ||||
|  | ||||
| orig_args=("$@") | ||||
|  | ||||
| opts='p:r:R:t:i:g:a:czsbxmdqh' | ||||
| opts='p:r:R:t:i:g:a:czsbxwmdqh' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         p) profile="$OPTARG" ;; | ||||
|         a) arch="$OPTARG" ;; | ||||
|         R) repo="$OPTARG" ;; | ||||
|         R) STABILITY="$OPTARG" ;; | ||||
|         r) chroots_iso="$OPTARG" ;; | ||||
|         t) ISO_POOL="$OPTARG" ;; | ||||
|         i) INITSYS="$OPTARG" ;; | ||||
| @@ -382,6 +402,7 @@ while getopts "${opts}" arg; do | ||||
|         b) boot_only=true ;; | ||||
|         m) persist=true ;; | ||||
|         d) use_dracut=true ;; | ||||
|         w) copy_pacconf=true ;; | ||||
|         q) pretend=true ;; | ||||
|         h|?) usage 0 ;; | ||||
|     esac | ||||
|   | ||||
| @@ -81,7 +81,7 @@ trap_abort() { | ||||
| trap_exit() { | ||||
|     local r=$? | ||||
|     trap - EXIT INT QUIT TERM HUP | ||||
|     cleanup $r | ||||
|     cleanup "$r" | ||||
| } | ||||
|  | ||||
| cleanup() { | ||||
|   | ||||
| @@ -9,73 +9,39 @@ ignore_error() { | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| trap_setup(){ | ||||
|     [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' | ||||
|     trap "$1" EXIT | ||||
| } | ||||
|  | ||||
| chroot_mount() { | ||||
| chroot_add_mount() { | ||||
| #     msg2 "mount: [%s]" "$2" | ||||
|     mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") | ||||
| } | ||||
|  | ||||
| chroot_add_resolv_conf() { | ||||
|     local chrootdir=$1 resolv_conf=$1/etc/resolv.conf | ||||
|  | ||||
|     [[ -e /etc/resolv.conf ]] || return 0 | ||||
|  | ||||
|     # Handle resolv.conf as a symlink to somewhere else. | ||||
|     if [[ -L $chrootdir/etc/resolv.conf ]]; then | ||||
|         # readlink(1) should always give us *something* since we know at this point | ||||
|         # it's a symlink. For simplicity, ignore the case of nested symlinks. | ||||
|         resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") | ||||
|         if [[ $resolv_conf = /* ]]; then | ||||
|             resolv_conf=$chrootdir$resolv_conf | ||||
|         else | ||||
|             resolv_conf=$chrootdir/etc/$resolv_conf | ||||
|         fi | ||||
|  | ||||
|         # ensure file exists to bind mount over | ||||
|         if [[ ! -f $resolv_conf ]]; then | ||||
|             install -Dm644 /dev/null "$resolv_conf" || return 1 | ||||
|         fi | ||||
|     elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then | ||||
|         # The chroot might not have a resolv.conf. | ||||
|         return 0 | ||||
|     fi | ||||
|  | ||||
|     chroot_mount /etc/resolv.conf "$resolv_conf" --bind | ||||
| } | ||||
|  | ||||
| chroot_mount_conditional() { | ||||
| chroot_maybe_add_mount() { | ||||
|     local cond=$1; shift | ||||
|     if eval "$cond"; then | ||||
|         chroot_mount "$@" | ||||
|         chroot_add_mount "$@" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| chroot_setup(){ | ||||
|     local mnt="$1" | ||||
|     local tmpfs_opts="${2:-mode=1777,strictatime,nodev,nosuid}" | ||||
|     chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && | ||||
|     chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && | ||||
|     chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && | ||||
|     ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \ | ||||
|         efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && | ||||
|     chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && | ||||
|     chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && | ||||
|     chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && | ||||
|     chroot_mount /run "$mnt/run" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_mount tmp "$mnt/tmp" -t tmpfs -o "${tmpfs_opts}" | ||||
| } | ||||
|  | ||||
| chroot_api_mount() { | ||||
|     CHROOT_ACTIVE_MOUNTS=() | ||||
|     trap_setup chroot_api_umount | ||||
|     chroot_setup "$1" "$2" | ||||
|     [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' | ||||
|     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 | ||||
| #         msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
|         umount "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
| @@ -83,4 +49,40 @@ chroot_api_umount() { | ||||
|     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 | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
							
								
								
									
										78
									
								
								src/lib/base/unshare-mount.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								src/lib/base/unshare-mount.sh
									
									
									
									
									
										Normal 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 | ||||
| } | ||||
|  | ||||
| #}}} | ||||
| @@ -1,48 +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"} | ||||
|  | ||||
|     ARCH=${ARCH:-"$(uname -m)"} | ||||
|  | ||||
|     REPO=${REPO:-'world'} | ||||
|  | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|  | ||||
|  | ||||
| load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" | ||||
|  | ||||
| prepare_dir "${WORKSPACE_DIR}" | ||||
|  | ||||
| @@ -1,30 +0,0 @@ | ||||
| #!/hint/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #{{{ yaml | ||||
|  | ||||
| write_yaml_header(){ | ||||
|     printf '%s\n' '---' | ||||
| } | ||||
|  | ||||
| write_empty_line(){ | ||||
|     printf '\n' | ||||
| } | ||||
|  | ||||
| write_yaml_map(){ | ||||
|     local ident="$1" key="$2" val="$3" | ||||
|     printf "\n%${ident}s%s: %s\n" '' "$key" "$val" | ||||
| } | ||||
|  | ||||
| write_yaml_seq(){ | ||||
|     local ident="$1" val="$2" | ||||
|     printf "\n%${ident}s- %s\n" '' "$val" | ||||
| } | ||||
|  | ||||
| write_yaml_seq_map(){ | ||||
|     local ident="$1" key="$2" val="$3" | ||||
|     printf "\n%${ident}s- %s: %s\n" '' "$key" "$val" | ||||
| } | ||||
|  | ||||
| #}}} | ||||
| @@ -4,53 +4,43 @@ | ||||
|  | ||||
| #{{{ calamares | ||||
|  | ||||
| write_services_conf(){ | ||||
|     local key1="$1" val1="$2" key2="$3" val2="$4" | ||||
|     local yaml | ||||
|     yaml=$(write_yaml_header) | ||||
|     yaml+=$(write_yaml_map 0 "$key1" "$val1") | ||||
|     yaml+=$(write_yaml_map 0 "$key2" "$val2") | ||||
|     yaml+=$(write_yaml_map 0 'services') | ||||
|     for svc in "${SERVICES[@]}"; do | ||||
|         yaml+=$(write_yaml_seq 2 "$svc") | ||||
| yaml_array() { | ||||
|     local array yaml | ||||
|  | ||||
|     for entry in "$@"; do | ||||
|         yaml="{name: ${entry}, action: enable}" | ||||
|         array="${array:-}${array:+,} ${yaml}" | ||||
|     done | ||||
|     yaml+=$(write_empty_line) | ||||
|     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" | ||||
|     printf "%s\n" "[${array}]" | ||||
| } | ||||
|  | ||||
| configure_calamares(){ | ||||
|     local mods="$1/etc/calamares/modules" | ||||
|     for config in online offline; do | ||||
|         local mods="$1/etc/calamares-$config/modules" | ||||
|         if [[ -d "$mods" ]];then | ||||
|         msg2 "Configuring: Calamares" | ||||
|         write_services_"${INITSYS}"_conf "$mods" | ||||
|         sed -e "s|services-openrc|services-${INITSYS}|" \ | ||||
|             -i "$1"/etc/calamares/settings.conf | ||||
|             msg2 "Configuring: Calamares %s" "$config" | ||||
|  | ||||
|             if [[ -f "$mods"/services-artix.conf ]]; then | ||||
|                 local svc usvc | ||||
|                 svc=$(yaml_array "${SERVICES[@]}") \ | ||||
|                     yq -P 'with(.; | ||||
|                             .command = "artix-service" | | ||||
|                             .services = env(svc) )' \ | ||||
|                         -i "$mods"/services-artix.conf | ||||
|             fi | ||||
|             if [[ -f "$mods"/postcfg.conf ]]; then | ||||
|                 local  usvc initsys | ||||
|                 initsys="${INITSYS}" \ | ||||
|                 usvc=$(yaml_array "${USER_SERVICES[@]}") \ | ||||
|                     yq -P 'with(.; | ||||
|                             .initsys = env(initsys) | | ||||
|                             .user-services = env(usvc) )' \ | ||||
|                         -i "$mods"/postcfg.conf | ||||
|             fi | ||||
|         fi | ||||
|     done | ||||
|     if [[ -d "$1"/etc/calamares-offline ]]; then | ||||
|         ln -sf calamares-offline "$1"/etc/calamares | ||||
|     fi | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -4,9 +4,21 @@ | ||||
|  | ||||
| #{{{ session | ||||
|  | ||||
| configure_user(){ | ||||
|     local -r grps="users,lp,video,network,storage,wheel,audio,power,log,optical,network,scanner" | ||||
|  | ||||
|     chroot "$1" useradd -m -G "$grps" -s /bin/bash "${LIVEUSER}" | ||||
|     echo "${LIVEUSER}:${PASSWORD}" | chroot "$1" chpasswd | ||||
|     echo "root:${PASSWORD}" | chroot "$1" chpasswd | ||||
| } | ||||
|  | ||||
| configure_services(){ | ||||
|     local mnt="$1" | ||||
|     add_svc_"${INITSYS}" "$mnt" "${SERVICES[*]}" | ||||
|     add_svc_"${INITSYS}" "$mnt" | ||||
|  | ||||
|     if [[ "${INITSYS}" == "openrc" ]] || [[ "${INITSYS}" == "dinit" ]]; then | ||||
|         add_user_svc_"${INITSYS}" "$mnt" | ||||
|     fi | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -14,13 +26,14 @@ write_live_session_conf(){ | ||||
|     local conf='' | ||||
|     conf+=$(printf '%s\n' '# live session configuration') | ||||
|     conf+=$(printf "\nAUTOLOGIN=%s\n" "${AUTOLOGIN}") | ||||
|     conf+=$(printf "\nPASSWORD=%s\n" "${PASSWORD}") | ||||
|     conf+=$(printf "\nLIVEUSER=%s\n" "${LIVEUSER}") | ||||
|     printf '%s' "$conf" | ||||
| } | ||||
|  | ||||
| configure_chroot(){ | ||||
|     local fs="$1" | ||||
|     msg "Configuring [%s]" "${fs##*/}" | ||||
|     configure_user "$fs" | ||||
|     configure_services "$fs" | ||||
|     configure_calamares "$fs" | ||||
|     [[ ! -d "$fs/etc/artools" ]] && mkdir -p "$fs/etc/artools" | ||||
|   | ||||
| @@ -13,7 +13,6 @@ prepare_boot_extras(){ | ||||
|     done | ||||
|  | ||||
|     cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest | ||||
|     cp "$src"/usr/share/licenses/common/GPL2/license.txt "$dest"/memtest.COPYING | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
| @@ -4,41 +4,15 @@ | ||||
|  | ||||
| #{{{ initcpio | ||||
|  | ||||
| make_checksum(){ | ||||
|     local file="$1" | ||||
|     msg2 "Creating md5sum ..." | ||||
|     cd "${iso_root}${live_dir}" | ||||
|     md5sum "$file" > "$file".md5 | ||||
|     cd "${OLDPWD}" | ||||
| } | ||||
|  | ||||
| make_sig () { | ||||
|     local file="$1" | ||||
|     msg2 "Creating signature file..." | ||||
|     chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}" | ||||
|     su "${owner}" -c "gpg --detach-sign --output $file.sig --default-key ${GPG_KEY} $file" | ||||
|     chown "root:root" "${iso_root}${live_dir}" | ||||
| } | ||||
|  | ||||
| export_gpg_publickey() { | ||||
|     key_export=${WORKSPACE_DIR}/pubkey.gpg | ||||
|     if [[ ! -e "${key_export}" ]]; then | ||||
|         gpg --batch --output "${key_export}" --export "${GPG_KEY}" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| prepare_initramfs_mkinitcpio() { | ||||
|     local mnt="$1" packages=() mkinitcpio_conf k | ||||
|     local mnt="$1" mkinitcpio_conf k | ||||
|  | ||||
|     mkinitcpio_conf=mkinitcpio-default.conf | ||||
|     [[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf | ||||
|     k=$(<"$mnt"/usr/src/linux/version) | ||||
|  | ||||
|     packages+=($(read_from_list "${common_dir}/Packages-boot")) | ||||
|     basestrap "${basestrap_args[@]}" "$mnt" "${packages[@]}" | ||||
|  | ||||
|     if [[ -n "${GPG_KEY}" ]]; then | ||||
|         exec {ARTIX_GNUPG_FD}<>"${key_export}" | ||||
|     if [[ -v key_export ]]; then | ||||
|         exec {ARTIX_GNUPG_FD}<"${key_export}" | ||||
|         export ARTIX_GNUPG_FD | ||||
|     fi | ||||
|  | ||||
| @@ -46,13 +20,11 @@ prepare_initramfs_mkinitcpio() { | ||||
|         -c /etc/"$mkinitcpio_conf" \ | ||||
|         -g /boot/initramfs.img | ||||
|  | ||||
|     if [[ -n "${GPG_KEY}" ]]; then | ||||
|     if [[ -v key_export ]]; then | ||||
|         exec {ARTIX_GNUPG_FD}<&- | ||||
|         unset ARTIX_GNUPG_FD | ||||
|     fi | ||||
|     if [[ -f "${key_export}" ]]; then | ||||
|         rm "${key_export}" | ||||
|     fi | ||||
|     rm -rf -- "${key_export}" | ||||
|     cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img | ||||
|     prepare_boot_extras "$mnt" | ||||
| } | ||||
|   | ||||
| @@ -5,13 +5,13 @@ | ||||
| #{{{ iso | ||||
|  | ||||
| get_disturl(){ | ||||
|     # shellcheck disable=1091 | ||||
|     # shellcheck disable=SC2034 | ||||
|     . /usr/lib/os-release | ||||
|     printf "%s\n" "${HOME_URL}" | ||||
| } | ||||
|  | ||||
| get_osname(){ | ||||
|     # shellcheck disable=1091 | ||||
|     # shellcheck disable=SC2034 | ||||
|     . /usr/lib/os-release | ||||
|     printf "%s\n" "${NAME}" | ||||
| } | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
| show_profile(){ | ||||
|     msg2 "iso_file: %s" "${iso_file}" | ||||
|     msg2 "AUTOLOGIN: %s" "${AUTOLOGIN}" | ||||
|     msg2 "LIVEUSER: %s" "${LIVEUSER}" | ||||
|     msg2 "PASSWORD: %s" "${PASSWORD}" | ||||
|     msg2 "SERVICES: %s" "${SERVICES[*]}" | ||||
| } | ||||
| @@ -15,81 +16,121 @@ load_profile(){ | ||||
|     local profile_dir="${DATADIR}/iso-profiles" | ||||
|     [[ -d "${WORKSPACE_DIR}"/iso-profiles ]] && profile_dir="${WORKSPACE_DIR}"/iso-profiles | ||||
|  | ||||
|     root_list="$profile_dir/${profile}/Packages-Root" | ||||
|     root_overlay="$profile_dir/${profile}/root-overlay" | ||||
|  | ||||
|     [[ -f "$profile_dir/${profile}/Packages-Live" ]] && live_list="$profile_dir/${profile}/Packages-Live" | ||||
|     [[ -d "$profile_dir/${profile}/live-overlay" ]] && live_overlay="$profile_dir/${profile}/live-overlay" | ||||
|  | ||||
|     common_dir="${DATADIR}/iso-profiles/common" | ||||
|     [[ -d "$profile_dir"/common ]] && common_dir="${profile_dir}"/common | ||||
|  | ||||
|     [[ -f $profile_dir/${profile}/profile.conf ]] || return 1 | ||||
|     profile_yaml=$profile_dir/${profile}/profile.yaml | ||||
|  | ||||
|     # shellcheck disable=1090 | ||||
|     [[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf | ||||
|     common_yaml="${common_dir}/common.yaml" | ||||
|  | ||||
|     AUTOLOGIN=${AUTOLOGIN:-true} | ||||
|     [[ -f $profile_yaml ]] || return 1 | ||||
|  | ||||
|     PASSWORD=${PASSWORD:-'artix'} | ||||
|     LIVEUSER=$(yq -P '.live-session.user' "$profile_yaml") | ||||
|  | ||||
|     if [[ -z "${SERVICES[*]}" ]];then | ||||
|         SERVICES=('acpid' 'bluetoothd' 'cronie' 'cupsd' 'syslog-ng' 'connmand') | ||||
|     fi | ||||
|     PASSWORD=$(yq -P '.live-session.password' "$profile_yaml") | ||||
|  | ||||
|     AUTOLOGIN=$(yq -P '.live-session.autologin' "$profile_yaml") | ||||
|  | ||||
|     USE_XLIBRE=$(yq -P '.live-session.use-xlibre' "$profile_yaml") | ||||
|  | ||||
|     mapfile -t SERVICES < <(yq -P '.live-session.services[]' "$profile_yaml") | ||||
|  | ||||
|     mapfile -t USER_SERVICES < <(yq -P '.live-session.user-services[]' "$profile_yaml") | ||||
|  | ||||
|     HAS_LIVE=$(yq -P '. | has("livefs")' "$profile_yaml") | ||||
|  | ||||
|     HAS_LIVE_INIT=$(yq -P '.livefs | has("packages-init")' "$profile_yaml") | ||||
|  | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| read_from_list() { | ||||
|     local list="$1" | ||||
|     local _space="s| ||g" | ||||
|     local _clean=':a;N;$!ba;s/\n/ /g' | ||||
|     local _com_rm="s|#.*||g" | ||||
|     local _init="s|@initsys@|${INITSYS}|g" | ||||
|     local pkgs | ||||
|  | ||||
|     mapfile -t pkgs < <(sed "$_com_rm" "$list" \ | ||||
|             | sed "$_space" \ | ||||
|             | sed "$_init" \ | ||||
|             | sed "$_clean") | ||||
|  | ||||
|     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(){ | ||||
|     local pkglist="$1" | ||||
|     local list="$1" | ||||
|  | ||||
|     local common_base | ||||
|     local common_apps | ||||
|     local common_misc | ||||
|     local common_xorg | ||||
|     local common_boot | ||||
|     local common_init | ||||
|     local packages_root | ||||
|     local packages_live | ||||
|     local packages_root_init | ||||
|     local packages_live_init | ||||
|  | ||||
|     local common_key_init=".packages-init.${INITSYS}[]" | ||||
|     local root_key_init=".rootfs.packages-init.${INITSYS}[]" | ||||
|     local live_key_init=".livefs.packages-init.${INITSYS}[]" | ||||
|  | ||||
|     packages=() | ||||
|  | ||||
|     if [[ "${pkglist##*/}" == "Packages-Root" ]]; then | ||||
|         for l in base apps "${INITSYS}"; do | ||||
|             msg2 "Loading Packages: [%s] ..." "Packages-${l}" | ||||
|             packages+=($(read_from_list "${common_dir}/Packages-${l}")) | ||||
|         done | ||||
|         if [[ -n "${live_list}" ]]; then | ||||
|             msg2 "Loading Packages: [%s] ..." "Packages-xorg" | ||||
|             packages+=($(read_from_list "${common_dir}/Packages-xorg")) | ||||
|         fi | ||||
|         msg2 "Loading Packages: [%s] ..." "${pkglist##*/}" | ||||
|         packages+=($(read_from_list "${pkglist}")) | ||||
|         read_from_services | ||||
|     case "$list" in | ||||
|         rootfs) | ||||
|             msg2 "Loading Packages: [%s] ..." "common.packages-base" | ||||
|             mapfile -t common_base < <(yq -P '.packages-base[]' "$common_yaml") | ||||
|  | ||||
|             msg2 "Loading Packages: [%s] ..." "common.packages-init.${INITSYS}" | ||||
|             mapfile -t common_init < <(common_key_init="$common_key_init" yq -P 'eval(strenv(common_key_init))' "$common_yaml") | ||||
|  | ||||
|             msg2 "Loading Packages: [%s] ..." "common.packages-apps" | ||||
|             mapfile -t common_apps < <(yq -P '.packages-apps[]' "$common_yaml") | ||||
|  | ||||
|             if "${HAS_LIVE}"; then | ||||
|                 if ${USE_XLIBRE}; then | ||||
|                     msg2 "Loading Packages: [%s] ..." "common.packages-xlibre" | ||||
|                     mapfile -t common_xorg < <(yq -P '.packages-xlibre[]' "$common_yaml") | ||||
|                 else | ||||
|         msg2 "Loading Packages: [%s] ..." "${pkglist##*/}" | ||||
|         packages+=($(read_from_list "${pkglist}")) | ||||
|                     msg2 "Loading Packages: [%s] ..." "common.packages-xorg" | ||||
|                     mapfile -t common_xorg < <(yq -P '.packages-xorg[]' "$common_yaml") | ||||
|                 fi | ||||
|  | ||||
|                 msg2 "Loading Packages: [%s] ..." "common.packages-misc" | ||||
|                 mapfile -t common_misc < <(yq -P '.packages-misc[]' "$common_yaml") | ||||
|             fi | ||||
|  | ||||
|             msg2 "Loading Packages: [%s] ..." "rootfs.packages" | ||||
|             mapfile -t packages_root < <(yq -P '.rootfs.packages[]' "$profile_yaml") | ||||
|  | ||||
|             msg2 "Loading Packages: [%s] ..." "rootfs.packages-init.${INITSYS}" | ||||
|             mapfile -t packages_root_init < <(root_key_init="$root_key_init" yq -P 'eval(strenv(root_key_init))' "$profile_yaml") | ||||
|  | ||||
|             packages+=( | ||||
|                 "${common_base[@]}" | ||||
|                 "${common_init[@]}" | ||||
|                 "${common_apps[@]}" | ||||
|                 "${packages_root[@]}" | ||||
|                 "${packages_root_init[@]}" | ||||
|                 "${common_xorg[@]}" | ||||
|                 "${common_misc[@]}" | ||||
|             ) | ||||
|         ;; | ||||
|         livefs) | ||||
|             msg2 "Loading Packages: [%s] ..." "livefs.packages" | ||||
|             mapfile -t packages_live < <(yq -P '.livefs.packages[]' "$profile_yaml") | ||||
|  | ||||
|             if "${HAS_LIVE_INIT}"; then | ||||
|                 msg2 "Loading Packages: [%s] ..." "livefs.packages-init.${INITSYS}" | ||||
|                 mapfile -t packages_live_init < <(live_key_init="$live_key_init" yq -P 'eval(strenv(live_key_init))' "$profile_yaml") | ||||
|             fi | ||||
|  | ||||
|             packages+=( | ||||
|                 "${packages_live[@]}" | ||||
|                 "${packages_live_init[@]}" | ||||
|             ) | ||||
|         ;; | ||||
|         bootfs) | ||||
|             msg2 "Loading Packages: [%s] ..." "common.packages-boot" | ||||
|             mapfile -t common_boot < <(yq -P '.packages-boot[]' "$common_yaml") | ||||
|  | ||||
|             packages+=( | ||||
|                 "${common_boot[@]}" | ||||
|             ) | ||||
|         ;; | ||||
|     esac | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
| @@ -5,36 +5,69 @@ | ||||
| #{{{ services | ||||
|  | ||||
| add_svc_openrc(){ | ||||
|     local mnt="$1" names="$2" rlvl="${3:-default}" | ||||
|     for svc in $names; do | ||||
|     local mnt="$1" rlvl="${2:-default}" | ||||
|     for svc in "${SERVICES[@]}"; do | ||||
|         if [[ -f $mnt/etc/init.d/$svc ]];then | ||||
|             msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" | ||||
|             chroot "$mnt" rc-update add "$svc" "$rlvl" &>/dev/null | ||||
|         else | ||||
|             warning "Service %s not found. Skipping." "$svc" | ||||
|         fi | ||||
|     done | ||||
| } | ||||
|  | ||||
| add_user_svc_openrc(){ | ||||
|     local mnt="$1" rlvl="${2:-default}" | ||||
|     for svc in "${USER_SERVICES[@]}"; do | ||||
|         if [[ -f "$mnt"/etc/user/init.d/"$svc" ]];then | ||||
|             msg2 "Setting user %s: [%s]" "${INITSYS}" "$svc" | ||||
|             local rc=".config/rc/runlevels/default" | ||||
|             chroot "$mnt" mkdir -p /home/"${LIVEUSER}/$rc" | ||||
|             chroot "$mnt" ln -s /etc/user/init.d/"$svc" /home/"${LIVEUSER}/$rc/$svc" | ||||
|             chroot "$mnt" chown -R "${LIVEUSER}:${LIVEUSER}" /home/"${LIVEUSER}"/.config/rc | ||||
|         else | ||||
|             warning "Service %s not found. Skipping." "$svc" | ||||
|         fi | ||||
|     done | ||||
| } | ||||
|  | ||||
| add_svc_runit(){ | ||||
|     local mnt="$1" names="$2" rlvl="${3:-default}" | ||||
|     for svc in $names; do | ||||
|     local mnt="$1" rlvl="${2:-default}" | ||||
|     for svc in "${SERVICES[@]}"; do | ||||
|         if [[ -d $mnt/etc/runit/sv/$svc ]]; then | ||||
|             msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" | ||||
|             chroot "$mnt" ln -s /etc/runit/sv/"$svc" /etc/runit/runsvdir/"$rlvl" &>/dev/null | ||||
|         else | ||||
|             warning "Service %s not found. Skipping." "$svc" | ||||
|         fi | ||||
|     done | ||||
| } | ||||
|  | ||||
| add_svc_s6(){ | ||||
|     local mnt="$1" names="$2" rlvl="${3:-default}" dep | ||||
|     local mnt="$1" rlvl="${2:-default}" dep | ||||
|     local display_manager | ||||
|     local supported_dms=(sddm gdm lightdm mdm greetd lxdm xdm) | ||||
|  | ||||
|     for dm in "${supported_dms[@]}"; do | ||||
|         if in_array "$dm" "${SERVICES[@]}"; then | ||||
|             display_manager="$dm" | ||||
|         fi | ||||
|     done | ||||
|  | ||||
|     dep="$mnt"/etc/s6/sv/"$display_manager"-srv/dependencies.d | ||||
|     for svc in $names; do | ||||
|  | ||||
|     for svc in "${SERVICES[@]}"; do | ||||
|         msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" | ||||
|         if [[ -d "$mnt"/etc/s6/sv/"$svc" ]] || [[ -d "$mnt"/etc/s6/sv/"$svc"-srv ]]; then | ||||
|             chroot "$mnt" s6-service add "$rlvl" "$svc" | ||||
|             if [[ "$svc" == "$display_manager" ]]; then | ||||
|                 if [[ -d "$dep" ]]; then | ||||
|                     touch "$dep"/artix-live | ||||
|                 fi | ||||
|             fi | ||||
|         else | ||||
|             warning "Service %s not found. Skipping." "$svc" | ||||
|         fi | ||||
|     done | ||||
|  | ||||
|     chroot "$mnt" s6-db-reload -r | ||||
| @@ -47,22 +80,29 @@ add_svc_s6(){ | ||||
|     chroot "$mnt" cp -a "$src"/bin /usr | ||||
| } | ||||
|  | ||||
| add_svc_suite66(){ | ||||
|     local mnt="$1" names="$2" | ||||
|     for svc in $names; do | ||||
|         if [[ -f "$mnt"/etc/66/service/"$svc" ]]; then | ||||
| add_svc_dinit(){ | ||||
|     local mnt="$1" | ||||
|     for svc in "${SERVICES[@]}"; do | ||||
|         if [[ -f "$mnt"/etc/dinit.d/"$svc" ]]; then | ||||
|             msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" | ||||
|             chroot "$mnt" 66-enable -t default "$svc" &>/dev/null | ||||
|             chroot "$mnt" dinitctl enable -o "$svc" &>/dev/null | ||||
|         else | ||||
|             warning "Service %s not found. Skipping." "$svc" | ||||
|         fi | ||||
|     done | ||||
| } | ||||
|  | ||||
| add_svc_dinit(){ | ||||
|     local mnt="$1" names="$2" | ||||
|     for svc in $names; do | ||||
|         if [[ -d $mnt/etc/dinit.d/boot.d ]]; then | ||||
|             msg2 "Setting %s: [%s]" "${INITSYS}" "$svc" | ||||
|             chroot "$mnt" ln -s ../"$svc" /etc/dinit.d/boot.d/"$svc" &>/dev/null | ||||
| add_user_svc_dinit(){ | ||||
|     local mnt="$1" | ||||
|     for svc in "${USER_SERVICES[@]}"; do | ||||
|         if [[ -f "$mnt"/etc/dinit.d/user/"$svc" ]]; then | ||||
|             msg2 "Setting user %s: [%s]" "${INITSYS}" "$svc" | ||||
|             local usr_sv="/home/${LIVEUSER}/.config/dinit.d" | ||||
|             chroot "$mnt" mkdir -p "$usr_sv"/boot.d | ||||
|             chroot "$mnt" ln -s /etc/dinit.d/user/"$svc" "$usr_sv"/boot.d/"$svc" | ||||
|             chroot "$mnt" chown -R "${LIVEUSER}:${LIVEUSER}" "$usr_sv" | ||||
|         else | ||||
|             warning "Service %s not found. Skipping." "$svc" | ||||
|         fi | ||||
|     done | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,24 @@ | ||||
|  | ||||
| #{{{ 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(){ | ||||
|     local src="$1" | ||||
|     local size=32G | ||||
|   | ||||
| @@ -4,6 +4,21 @@ | ||||
|  | ||||
| #{{{ 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(){ | ||||
|  | ||||
|     local conf="$1/artools-iso.conf" | ||||
| @@ -13,6 +28,14 @@ load_iso_config(){ | ||||
|     # shellcheck source=config/conf/artools-iso.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_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"} | ||||
|   | ||||
| @@ -5,6 +5,10 @@ | ||||
| [[ -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() { | ||||
| @@ -13,16 +17,21 @@ artixpkg_admin_usage() { | ||||
|     Usage: ${COMMAND} [COMMAND] [OPTIONS] | ||||
|  | ||||
|     COMMANDS | ||||
|         transfer          Transfer obsolete repository to landfill | ||||
|         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 --maintainer tux | ||||
|         $ ${COMMAND} query --topic kf5 | ||||
|         $ ${COMMAND} query --topic mytopic | ||||
|         $ ${COMMAND} topic --add mytopic libfoo | ||||
|         $ ${COMMAND} team --add ${ARTIX_TEAMS[3]} libfoo | ||||
|         $ ${COMMAND} maintainer --adopt libfoo libbar | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -39,6 +48,31 @@ artixpkg_admin() { | ||||
|             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 | ||||
| @@ -47,12 +81,12 @@ artixpkg_admin() { | ||||
|             artixpkg_admin_transfer "$@" | ||||
|             exit 0 | ||||
|         ;; | ||||
|         query) | ||||
|         maintainer) | ||||
|             _ARTOOLS_COMMAND+=" $1" | ||||
|             shift | ||||
|             # shellcheck source=src/lib/pkg/admin/query.sh | ||||
|             source "${LIBDIR}"/pkg/admin/query.sh | ||||
|             artixpkg_admin_query "$@" | ||||
|             # shellcheck source=src/lib/pkg/admin/maintainer.sh | ||||
|             source "${LIBDIR}"/pkg/admin/maintainer.sh | ||||
|             artixpkg_admin_maintainer "$@" | ||||
|             exit 0 | ||||
|         ;; | ||||
|         -*) | ||||
|   | ||||
							
								
								
									
										139
									
								
								src/lib/pkg/admin/maintainer.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								src/lib/pkg/admin/maintainer.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,139 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| [[ -z ${ARTOOLS_INCLUDE_ADMIN_MAINTAINER_SH:-} ]] || return 0 | ||||
| ARTOOLS_INCLUDE_ADMIN_MAINTAINER_SH=1 | ||||
|  | ||||
|  | ||||
| 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" | ||||
|                 shift | ||||
|             ;; | ||||
|             -o|--orphan) | ||||
|                 ORPHAN=1 | ||||
|                 RUNCMD+=" $1" | ||||
|                 shift | ||||
|             ;; | ||||
|             --) | ||||
|                 shift | ||||
|                 break | ||||
|             ;; | ||||
|             -*) | ||||
|                 die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
|             *) | ||||
|                 break | ||||
|             ;; | ||||
|         esac | ||||
|     done | ||||
|  | ||||
|     pkgbases+=("$@") | ||||
|  | ||||
|     # shellcheck source=src/lib/pkg/util/packager.sh | ||||
|     source "${LIBDIR}"/pkg/util/packager.sh | ||||
|  | ||||
|     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 | ||||
|         if is_packager_email_official "${packager_email}"; then | ||||
|             maintainer="maintainer-${packager_name}" | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|  | ||||
|     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 | ||||
| } | ||||
| @@ -14,13 +14,13 @@ artixpkg_admin_query_usage() { | ||||
|     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 | ||||
|         -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 maintainer-mynickname | ||||
|         $ ${COMMAND} --topic myopic | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --topic mytopic | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -47,19 +47,11 @@ artixpkg_admin_query() { | ||||
|                 MAINTAINER="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --maintainer=*) | ||||
|                 MAINTAINER="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -t|--topic) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TOPIC="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --topic=*) | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             --) | ||||
|                 shift | ||||
|                 break | ||||
|   | ||||
							
								
								
									
										154
									
								
								src/lib/pkg/admin/team.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								src/lib/pkg/admin/team.sh
									
									
									
									
									
										Normal 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: (${ARTIX_TEAMS[@]}) | ||||
|         -r, --remove NAME           Remove team from repo | ||||
|                                     Possible values: (${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
									
								
							
							
						
						
									
										139
									
								
								src/lib/pkg/admin/topic.sh
									
									
									
									
									
										Normal 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 | ||||
| } | ||||
| @@ -33,7 +33,6 @@ artixpkg_admin_transfer() { | ||||
|     # options | ||||
|     local pkgbases=() | ||||
|     local pkgbase | ||||
|     local waste_org="landfill" | ||||
|  | ||||
|     local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|  | ||||
| @@ -60,7 +59,12 @@ artixpkg_admin_transfer() { | ||||
|  | ||||
|     if [[ -n ${GIT_TOKEN} ]]; then | ||||
|         for pkgbase in "${pkgbases[@]}"; do | ||||
|             transfer_repo "${pkgbase}" "${waste_org}" | ||||
|             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 | ||||
| } | ||||
|   | ||||
| @@ -37,7 +37,7 @@ add_team_to_repo() { | ||||
|     local pkgbase="$1" | ||||
|     local team="$2" | ||||
|     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]" | ||||
|     api_put "$url" \ | ||||
| @@ -50,7 +50,7 @@ remove_team_from_repo() { | ||||
|     local pkgbase="$1" | ||||
|     local team="$2" | ||||
|     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]" | ||||
|     api_delete "$url" \ | ||||
| @@ -62,7 +62,7 @@ remove_team_from_repo() { | ||||
| create_repo() { | ||||
|     local pkgbase="$1" | ||||
|     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\": \"ArtixLinuxPackages\", \"readme\": \"Default\" }" | ||||
|  | ||||
|     stat_busy "Create package repo [$pkgbase] in org (${GIT_ORG})" | ||||
| @@ -78,8 +78,8 @@ transfer_repo() { | ||||
|     local pkgbase="$1" | ||||
|     local new_owner="$2" | ||||
|     local json url | ||||
|     json="{ \"new_owner\": \"$new_owner\",  \"team_ids\": [] }" | ||||
|     url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/transfer" | ||||
|     json="{ \"new_owner\": \"$new_owner\",  \"team_ids\": [], \"archived\": \"true\" }" | ||||
|     url="${API_URL}/repos/${GIT_ORG}/$pkgbase/transfer" | ||||
|  | ||||
|     stat_busy "Transfer package repo [$pkgbase] in org ($new_owner)" | ||||
|     api_post "$url" \ | ||||
| @@ -92,7 +92,7 @@ transfer_repo() { | ||||
|  | ||||
| list_all_repos() { | ||||
|     local url | ||||
|     url="${GIT_HTTPS}/api/v1/orgs/${GIT_ORG}/repos?limit=10000" | ||||
|     url="${API_URL}/orgs/${GIT_ORG}/repos?limit=10000" | ||||
|  | ||||
|     stat_busy "Query all packages" | ||||
|     api_get "$url" \ | ||||
| @@ -104,7 +104,7 @@ add_topic() { | ||||
|     local url | ||||
|     local pkgbase="$1" | ||||
|     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]" | ||||
|     api_put "$url" \ | ||||
| @@ -117,7 +117,7 @@ remove_topic() { | ||||
|     local url | ||||
|     local pkgbase="$1" | ||||
|     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]" | ||||
|     api_delete "$url" \ | ||||
| @@ -128,8 +128,10 @@ remove_topic() { | ||||
|  | ||||
| search_topic() { | ||||
|     local search="$1" | ||||
|     local url | ||||
|     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" | ||||
|     local url args | ||||
|     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})" | ||||
|     api_get "$url" \ | ||||
| @@ -137,4 +139,63 @@ search_topic() { | ||||
|     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 | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
| @@ -17,27 +17,48 @@ readonly ARTIX_DB=( | ||||
|     galaxy | ||||
| ) | ||||
|  | ||||
| readonly ARTIX_DB_MAP=( | ||||
|     goblins | ||||
|     gremlins | ||||
|     stable | ||||
| ) | ||||
|  | ||||
| readonly AGENTS=( | ||||
|     orion | ||||
|     taurus | ||||
| ) | ||||
|  | ||||
| readonly ARTIX_TEAMS=( | ||||
|     "${ARTIX_DB[2]}" | ||||
|     "${ARTIX_DB[5]}" | ||||
|     "${ARTIX_DB[8]}" | ||||
|     "${ARTIX_DB[11]}" | ||||
| ) | ||||
|  | ||||
| declare -A AGENT_MAP=( | ||||
|     ["${ARTIX_TEAMS[0]}"]=${AGENTS[0]} | ||||
|     ["${ARTIX_TEAMS[1]}"]=${AGENTS[0]} | ||||
|     ["${ARTIX_TEAMS[2]}"]=${AGENTS[1]} | ||||
|     ["${ARTIX_TEAMS[3]}"]=${AGENTS[1]} | ||||
| ) | ||||
|  | ||||
| readonly REPO_DB='.artixlinux/pkgbase.yaml' | ||||
|  | ||||
| readonly REPO_CI='.artixlinux/Jenkinsfile' | ||||
|  | ||||
| yaml_array() { | ||||
|     local array | ||||
| readonly SRCINFO='.artixlinux/srcinfo.yaml' | ||||
|  | ||||
|     for entry in "$@"; do | ||||
|         array="${array:-}${array:+,} ${entry}" | ||||
|     done | ||||
|     printf "%s\n" "[${array}]" | ||||
| } | ||||
|  | ||||
| print_package_names() { | ||||
|     local version | ||||
|     local array | ||||
|     local architecture pkg | ||||
|     version=$(get_full_version) | ||||
|     for pkg in "${pkgname[@]}"; do | ||||
|         architecture=$(get_pkg_arch "${pkg}") | ||||
|         printf "%s-%s-%s%s\n" "$pkg" "$version" "$architecture" "$PKGEXT" | ||||
|         array="${array:-}${array:+,} $pkg-$version-$architecture$PKGEXT" | ||||
|     done | ||||
|     printf "%s\n" "[${array}]" | ||||
| } | ||||
|  | ||||
| print_debug_package_names() { | ||||
| @@ -46,7 +67,9 @@ print_debug_package_names() { | ||||
|     version=$(get_full_version) | ||||
|     if check_option "debug" "y" && check_option "strip" "y"; then | ||||
|         architecture=$(get_pkg_arch) | ||||
|         printf "%s-%s-%s-%s%s\n" "$pkgbase" "debug" "$version" "$architecture" "$PKGEXT" | ||||
|         printf "[%s-%s-%s-%s%s]\n" "$pkgbase" "debug" "$version" "$architecture" "$PKGEXT" | ||||
|     else | ||||
|         printf "%s\n" "[]" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| @@ -58,17 +81,6 @@ version_from_yaml() { | ||||
|     printf "%s\n" "${version}" | ||||
| } | ||||
|  | ||||
| packages_from_yaml() { | ||||
|     local dest="$1" | ||||
|     local repo pkgs packages | ||||
|     repo=".repos.${dest}" | ||||
|     mapfile -t packages < <(repo="${repo}" yq -r 'eval(strenv(repo)).packages[]' "${REPO_DB}") | ||||
|     for p in "${packages[@]}"; do | ||||
|         pkgs="${pkgs:-}${pkgs:+,} ${p}" | ||||
|     done | ||||
|     printf "%s\n" "[${pkgs}]" | ||||
| } | ||||
|  | ||||
| to_bool() { | ||||
|     local int="$1" | ||||
|     case "${int}" in | ||||
| @@ -100,15 +112,9 @@ create_repo_db() { | ||||
|  | ||||
|     yq -n '"---"' > "${REPO_DB}" | ||||
|  | ||||
|     yq -P 'with( | ||||
|         .pkgbase; | ||||
|             .name = null | | ||||
|             .version = null | | ||||
|             .arch = [] | | ||||
|             .pkgname = [] )' \ | ||||
|         -i "${REPO_DB}" | ||||
|  | ||||
|     yq -P 'with( | ||||
|     yq -P ' | ||||
|         .team = null | | ||||
|         with( | ||||
|         .actions; | ||||
|             .addRepo = null | | ||||
|             .removeRepo = null | | ||||
| @@ -116,41 +122,26 @@ create_repo_db() { | ||||
|             .triggersRebuild = false | | ||||
|             .triggersRepoAdd = false | | ||||
|             .triggersRepoRemove = false | | ||||
|             .triggersNoCheck = false )' \ | ||||
|         -i "${REPO_DB}" | ||||
|  | ||||
|     yq -P '.repos = {}' -i "${REPO_DB}" | ||||
|             .triggersNoCheck = false ) | | ||||
|             .repos = {} | ||||
|         ' -i "${REPO_DB}" | ||||
|  | ||||
|     for r in "${ARTIX_DB[@]}"; do | ||||
|         local repo | ||||
|         repo=".repos.${r}" \ | ||||
|             yq -P 'with( | ||||
|         yq -P ' | ||||
|             with( | ||||
|             eval(strenv(repo)); | ||||
|                 .version = null | | ||||
|                         .packages = [] )' \ | ||||
|                 -i "${REPO_DB}" | ||||
|                 .packages = [] | | ||||
|                 .debug = [] ) | ||||
|             ' -i "${REPO_DB}" | ||||
|     done | ||||
| } | ||||
|  | ||||
| update_yaml_base() { | ||||
|     local version | ||||
|     local name | ||||
|     local pkgnames | ||||
|     local arches | ||||
|  | ||||
|     pkgbase="${pkgbase:-${pkgname}}" | ||||
|     version="$(get_full_version)" | ||||
|     pkgnames=$(yaml_array "${pkgname[@]}") | ||||
|     arches=$(yaml_array "${arch[@]}") | ||||
|  | ||||
|     name="${pkgbase}" version="${version}" pkgnames="${pkgnames}" arches="${arches}" \ | ||||
|         yq -P 'with( | ||||
|             .pkgbase; | ||||
|                 .name = env(name) | | ||||
|                 .version = env(version) | | ||||
|                 .arch = env(arches) | | ||||
|                 .pkgname = env(pkgnames) )' \ | ||||
|             -i "${REPO_DB}" | ||||
| update_yaml_team() { | ||||
|     local team="${1:-${ARTIX_DB[5]}}" | ||||
|     team="$team" yq -P '.team = env(team)' -i "${REPO_DB}" | ||||
| } | ||||
|  | ||||
| update_yaml_add() { | ||||
| @@ -173,27 +164,32 @@ update_yaml_add() { | ||||
|         local pkgs | ||||
|         local version | ||||
|         local pkgfiles | ||||
|         local debug_pkgfiles | ||||
|  | ||||
|         mapfile -t pkgfiles < <(print_package_names) | ||||
|         pkgs=$(print_package_names) | ||||
|  | ||||
|         pkgs=$(yaml_array "${pkgfiles[@]}") | ||||
|         debug_pkgs=$(print_debug_package_names) | ||||
|  | ||||
|         version=$(get_full_version) | ||||
|         repo=".repos.${dest}" | ||||
|  | ||||
|         version="${version}" pkgs="${pkgs}" repo="${repo}" \ | ||||
|             yq -P 'with( | ||||
|         version="${version}" repo="${repo}" \ | ||||
|         pkgs="${pkgs}" debug_pkgs="${debug_pkgs}" \ | ||||
|         yq -P ' | ||||
|             with( | ||||
|             eval(strenv(repo)); | ||||
|                 .version = env(version) | | ||||
|                         .packages = env(pkgs) )' \ | ||||
|                 -i "${REPO_DB}" | ||||
|                 .packages = env(pkgs) | | ||||
|                 .debug = env(debug_pkgs) ) | ||||
|             ' -i "${REPO_DB}" | ||||
|     fi | ||||
|  | ||||
|     nocheck=$(to_bool "${nocheck}") | ||||
|  | ||||
|     nocheck="${nocheck}" add="${add}" \ | ||||
|     rebuild="${rebuild}" build="${build}" dest="${dest}" \ | ||||
|         yq -P 'with( | ||||
|     yq -P ' | ||||
|         with( | ||||
|         .actions; | ||||
|             .addRepo = env(dest) | | ||||
|             .removeRepo = null | | ||||
| @@ -201,8 +197,8 @@ update_yaml_add() { | ||||
|             .triggersRebuild = env(rebuild) | | ||||
|             .triggersRepoAdd = env(add) | | ||||
|             .triggersRepoRemove = false | | ||||
|                 .triggersNoCheck = env(nocheck) )' \ | ||||
|             -i "${REPO_DB}" | ||||
|             .triggersNoCheck = env(nocheck) ) | ||||
|         ' -i "${REPO_DB}" | ||||
| } | ||||
|  | ||||
| update_yaml_remove() { | ||||
| @@ -211,15 +207,14 @@ update_yaml_remove() { | ||||
|     local repo | ||||
|     repo=".repos.${dest}" | ||||
|  | ||||
|     repo="${repo}" \ | ||||
|         yq -P 'with( | ||||
|     repo="${repo}" dest="${dest}" \ | ||||
|     yq -P ' | ||||
|         with( | ||||
|         eval(strenv(repo)); | ||||
|             .version = null | | ||||
|                     .packages = [] )' \ | ||||
|             -i "${REPO_DB}" | ||||
|  | ||||
|     dest="${dest}" \ | ||||
|         yq -P 'with( | ||||
|             .packages = [] | | ||||
|             .debug = [] ) | | ||||
|         with( | ||||
|         .actions; | ||||
|             .addRepo = null | | ||||
|             .removeRepo = env(dest) | | ||||
| @@ -227,14 +222,15 @@ update_yaml_remove() { | ||||
|             .triggersRebuild = false | | ||||
|             .triggersRepoAdd = false | | ||||
|             .triggersRepoRemove = true | | ||||
|                 .triggersNoCheck = false )' \ | ||||
|             -i "${REPO_DB}" | ||||
|             .triggersNoCheck = false ) | ||||
|         ' -i "${REPO_DB}" | ||||
| } | ||||
|  | ||||
| update_yaml_move() { | ||||
|     local src="$1" | ||||
|     local dest="$2" | ||||
|     local pkgs | ||||
|     local debug_pkgs | ||||
|     local version | ||||
|     local src_repo | ||||
|     local dest_repo | ||||
| @@ -243,24 +239,25 @@ update_yaml_move() { | ||||
|     dest_repo=".repos.${dest}" | ||||
|  | ||||
|     version=$(version_from_yaml "${src}") | ||||
|     pkgs=$(packages_from_yaml "${src}") | ||||
|  | ||||
|     src_repo="${src_repo}" \ | ||||
|         yq -P 'with( | ||||
|     pkgs=$(src_repo="${src_repo}" yq -Pr -o json 'eval(strenv(src_repo)).packages' "${REPO_DB}") | ||||
|     debug_pkgs=$(src_repo="${src_repo}" yq -Pr -o json 'eval(strenv(src_repo)).debug' "${REPO_DB}") | ||||
|  | ||||
|     src_repo="${src_repo}" dest_repo="${dest_repo}" \ | ||||
|     version="${version}" src=${src} dest="${dest}" \ | ||||
|     pkgs="${pkgs}" debug_pkgs="${debug_pkgs}" \ | ||||
|     yq -P ' | ||||
|         with( | ||||
|         eval(strenv(src_repo)); | ||||
|             .version = null | | ||||
|                     .packages = [] )' \ | ||||
|             -i "${REPO_DB}" | ||||
|  | ||||
|     version="${version}" pkgs="${pkgs}" dest_repo="${dest_repo}" \ | ||||
|         yq -P 'with( | ||||
|             .packages = [] | | ||||
|             .debug = [] ) | | ||||
|         with( | ||||
|         eval(strenv(dest_repo)); | ||||
|             .version = env(version) | | ||||
|                     .packages = env(pkgs) )' \ | ||||
|             -i "${REPO_DB}" | ||||
|  | ||||
|     src=${src} dest="${dest}" \ | ||||
|         yq -P 'with( | ||||
|             .packages = env(pkgs) | | ||||
|             .debug = env(debug_pkgs) ) | | ||||
|         with( | ||||
|         .actions; | ||||
|             .addRepo = env(dest) | | ||||
|             .removeRepo = env(src) | | ||||
| @@ -268,23 +265,57 @@ update_yaml_move() { | ||||
|             .triggersRebuild = false | | ||||
|             .triggersRepoAdd = true | | ||||
|             .triggersRepoRemove = true | | ||||
|                 .triggersNoCheck = false )' \ | ||||
|             -i "${REPO_DB}" | ||||
|             .triggersNoCheck = false ) | ||||
|         ' -i "${REPO_DB}" | ||||
| } | ||||
|  | ||||
| team_from_yaml() { | ||||
|     local team | ||||
|     team=$(yq -rP '.team' "${REPO_DB}") | ||||
|     printf "$team" | ||||
| } | ||||
|  | ||||
| detect_team() { | ||||
|     local team | ||||
|  | ||||
|     for repo in "${ARTIX_TEAMS[@]}"; do | ||||
|         local key res | ||||
|         res=$(key=".repos.$repo" yq -rP 'eval(strenv(key)) | .version' "${REPO_DB}") | ||||
|         if [[ "${res}" != "null" ]]; then | ||||
|             team=${repo} | ||||
|         fi | ||||
|     done | ||||
|     printf "%s\n" "$team" | ||||
| } | ||||
|  | ||||
| show_agent() { | ||||
|     local agent | ||||
|     local ci | ||||
|     local branch | ||||
|     agent="${AGENTS[0]}" | ||||
|     ci=$(head -n 1 "${REPO_CI}" | cut -d "'" -f2) | ||||
|     branch=${ci#*@} | ||||
|     if [[ -n "$branch" ]]; then | ||||
|         agent="$branch" | ||||
|     fi | ||||
|     msg2 "agent: %s" "$agent" | ||||
| } | ||||
|  | ||||
| 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!" | ||||
|     fi | ||||
|     yq -rP '. | with_entries(select(.value.name))' "${REPO_DB}" | ||||
|     yq -rP '. | .repos | with_entries(select(.value.version))' "${REPO_DB}" | ||||
|     yq -rP 'with_entries(select(.key == "team"))' "${REPO_DB}" | ||||
|     yq -rP '.repos | with_entries(select(.value.version))' "${REPO_DB}" | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| show_srcinfo_base() { | ||||
|     pkg2yaml . | yq '.pkgbase' | ||||
| } | ||||
|  | ||||
| show_srcinfo_pkgs() { | ||||
|     pkg2yaml . | yq '.pkgnames' | ||||
| write_jenkinsfile() { | ||||
|     local branch="$1" | ||||
|     { | ||||
|         printf "@Library('artix-ci@%s') import org.artixlinux.RepoPackage\n" "${branch}" | ||||
|         printf '\n' | ||||
|         printf 'PackagePipeline(new RepoPackage(this))\n' | ||||
|     } > "${REPO_CI}" | ||||
| } | ||||
|   | ||||
							
								
								
									
										20
									
								
								src/lib/pkg/db/upgrade.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/lib/pkg/db/upgrade.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| #!/hint/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
|  | ||||
| upgrade_db() { | ||||
|     local d | ||||
|     for db in "${ARTIX_DB[@]}"; do | ||||
|         local res | ||||
|         res=$(d=".repos.$db" yq 'eval(strenv(d)) | has("debug")' "${REPO_DB}") | ||||
|         if ! "${res}"; then | ||||
|             d=".repos.$db" \ | ||||
|             yq 'eval(strenv(d)).debug = []' -i "${REPO_DB}" | ||||
|         fi | ||||
|     done | ||||
|  | ||||
|     if $(yq '. | has("pkgbase") ' "${REPO_DB}"); then | ||||
|         yq 'del(.pkgbase)' -i "${REPO_DB}" | ||||
|     fi | ||||
| } | ||||
| @@ -25,8 +25,8 @@ artixpkg_git_usage() { | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} clone libfoo linux libbar | ||||
|         $ ${COMMAND} clone --maintainer tux | ||||
|         $ ${COMMAND} config --topic mytopic | ||||
|         $ ${COMMAND} config --maintainer tux | ||||
|         $ ${COMMAND} clone --search mytopic | ||||
|         $ ${COMMAND} config libfoo | ||||
|         $ ${COMMAND} create -c libfoo | ||||
| _EOF_ | ||||
| } | ||||
|   | ||||
| @@ -7,6 +7,8 @@ ARTOOLS_INCLUDE_GIT_CLONE_SH=1 | ||||
|  | ||||
| # shellcheck source=src/lib/pkg/git/config.sh | ||||
| source "${LIBDIR}"/pkg/git/config.sh | ||||
| # shellcheck source=src/lib/pkg/admin/team.sh | ||||
| source "${LIBDIR}"/pkg/admin/team.sh | ||||
|  | ||||
| set -e | ||||
|  | ||||
| @@ -17,19 +19,20 @@ artixpkg_git_clone_usage() { | ||||
|     Usage: ${COMMAND} [OPTIONS] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -m, --maintainer=NAME      Clone all packages of the named maintainer | ||||
|         --protocol https           Clone the repository over https | ||||
|         -t, --topic=NAME           Clone all packages of the named topic | ||||
|         -a, --agent=NAME           Set the CI agent (default: official) | ||||
|         -m, --maintainer NAME      Clone all packages of the named maintainer | ||||
|         -s, --search TOPIC         Clone all packages of the named topic | ||||
|         -t, --team NAME            Assign team name (default: ${ARTIX_TEAMS[1]}) | ||||
|                                    Possible values: (${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 | ||||
|         $ ${COMMAND} libfoo linux libbar | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --topic myopic | ||||
|         $ ${COMMAND} -j 8 --topic myopic | ||||
|         $ ${COMMAND} --search mytopic | ||||
|         $ ${COMMAND} -j 8 --search mytopic | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -46,7 +49,8 @@ artixpkg_git_clone() { | ||||
|     local CLONE_ALL=0 | ||||
|     local MAINTAINER= | ||||
|     local TOPIC= | ||||
|     local CONFIGURE_OPTIONS=() | ||||
|     local CONFIG_OPTS=() | ||||
|     local TEAM_OPTS=() | ||||
|     local jobs= | ||||
|     jobs=$(nproc) | ||||
|  | ||||
| @@ -60,7 +64,7 @@ artixpkg_git_clone() { | ||||
|             ;; | ||||
|             --protocol=https) | ||||
|                 GIT_REPO_BASE_URL="${GIT_HTTPS}/" | ||||
|                 CONFIGURE_OPTIONS+=("$1") | ||||
|                 CONFIG_OPTS+=("$1") | ||||
|                 shift | ||||
|             ;; | ||||
|             --protocol) | ||||
| @@ -70,7 +74,7 @@ artixpkg_git_clone() { | ||||
|                 else | ||||
|                     die "unsupported protocol: %s" "$2" | ||||
|                 fi | ||||
|                 CONFIGURE_OPTIONS+=("$1" "$2") | ||||
|                 CONFIG_OPTS+=("$1" "$2") | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             -m|--maintainer) | ||||
| @@ -78,28 +82,16 @@ artixpkg_git_clone() { | ||||
|                 MAINTAINER="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --maintainer=*) | ||||
|                 MAINTAINER="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -t|--topic) | ||||
|             -s|--search) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TOPIC="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --topic=*) | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -a|--agent) | ||||
|             -t|--team) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 CONFIGURE_OPTIONS+=("$1" "$2") | ||||
|                 TEAM_OPTS=("--add" "$2") | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --agent=*) | ||||
|                 CONFIGURE_OPTIONS+=("${1#*=}") | ||||
|                 shift | ||||
|             ;; | ||||
|             --all) | ||||
|                 CLONE_ALL=1 | ||||
|                 shift | ||||
| @@ -165,6 +157,8 @@ artixpkg_git_clone() { | ||||
|             warning "Skip cloning ${pkgbase}: Directory exists" | ||||
|         fi | ||||
|  | ||||
|         artixpkg_git_config "${CONFIGURE_OPTIONS[@]}" "${pkgbase}" | ||||
|         artixpkg_git_config "${CONFIG_OPTS[@]}" "${pkgbase}" | ||||
|         artixpkg_admin_team "${TEAM_OPTS[@]}" "${pkgbase}" | ||||
|  | ||||
|     done | ||||
| } | ||||
|   | ||||
| @@ -11,90 +11,21 @@ source "${LIBDIR}"/pkg/db/db.sh | ||||
| set -e | ||||
|  | ||||
|  | ||||
| commit_ci(){ | ||||
|     [[ -d .artixlinux ]] || mkdir .artixlinux | ||||
|     if [[ ${AGENT} == ${ARTIX_DB[11]} ]]; then | ||||
|         printf "@Library('artix-ci@${AGENT}') import org.artixlinux.RepoPackage\n" > "${REPO_CI}" | ||||
|     else | ||||
|         printf "@Library('artix-ci') import org.artixlinux.RepoPackage\n" > "${REPO_CI}" | ||||
|     fi | ||||
|     { | ||||
|         printf '\n' | ||||
|         printf 'PackagePipeline(new RepoPackage(this))\n' | ||||
|     } >> "${REPO_CI}" | ||||
|  | ||||
|     git add "${REPO_CI}" | ||||
|     git commit -m "initial ci commit" | ||||
| } | ||||
|  | ||||
| artixpkg_git_config_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
|     Usage: ${COMMAND} [OPTIONS] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -m, --maintainer       Set the maintainer topic via gitea api | ||||
|         -u, --upstream         Add upstream arch remote | ||||
|         -a, --agent=NAME       Set the CI agent (default: official) | ||||
|         --protocol https       Configure remote url to use https | ||||
|         -j, --jobs N           Run up to N jobs in parallel (default: $(nproc)) | ||||
|         -h, --help             Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --upstream libfoo | ||||
|         $ ${COMMAND} * | ||||
| _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() { | ||||
|     # options | ||||
|     local GIT_REPO_BASE_URL=${GIT_HTTPS} | ||||
| @@ -105,13 +36,8 @@ artixpkg_git_config() { | ||||
|     jobs=$(nproc) | ||||
|     local paths=() | ||||
|  | ||||
|     local SET_TOPIC=0 | ||||
|     local UPSTREAM=0 | ||||
|     local AGENT= | ||||
|     local CI_ADDED=0 | ||||
|  | ||||
|     # variables | ||||
|     local -r command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     local path realpath pkgbase | ||||
|     local PACKAGER GPGKEY packager_name packager_email | ||||
|  | ||||
| @@ -121,23 +47,6 @@ artixpkg_git_config() { | ||||
|             artixpkg_git_config_usage | ||||
|             exit 0 | ||||
|         ;; | ||||
|         -m|--maintainer) | ||||
|             SET_TOPIC=1 | ||||
|             shift | ||||
|         ;; | ||||
|         -u|--upstream) | ||||
|             UPSTREAM=1 | ||||
|             shift | ||||
|         ;; | ||||
|         -a|--agent) | ||||
|             (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|             AGENT="$2" | ||||
|             shift 2 | ||||
|         ;; | ||||
|         --agent=*) | ||||
|             AGENT="${1#*=}" | ||||
|             shift | ||||
|         ;; | ||||
|         --protocol=https) | ||||
|             proto_force=1 | ||||
|             shift | ||||
| @@ -182,8 +91,10 @@ artixpkg_git_config() { | ||||
|  | ||||
|     # Load makepkg.conf variables to be available for packager identity | ||||
|     msg "Collecting packager identity from makepkg.conf" | ||||
|     # shellcheck disable=2119 | ||||
|     load_makepkg_config | ||||
|  | ||||
|     # shellcheck source=src/lib/pkg/util/packager.sh | ||||
|     source "${LIBDIR}"/pkg/util/packager.sh | ||||
|  | ||||
|     if [[ -n ${PACKAGER} ]]; then | ||||
|         if ! packager_name=$(get_packager_name "${PACKAGER}") || \ | ||||
|             ! packager_email=$(get_packager_email "${PACKAGER}"); then | ||||
| @@ -258,34 +169,18 @@ artixpkg_git_config() { | ||||
|                 git config user.signingKey "${GPGKEY}" | ||||
|             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 | ||||
|  | ||||
|             if [[ ! -f ${REPO_CI} ]]; then | ||||
|                 msg "Adding ci support ..." | ||||
|                 commit_ci | ||||
|                 CI_ADDED=1 | ||||
|             fi | ||||
|  | ||||
|             if [[ -n ${AGENT} ]] && (( ! CI_ADDED )); then | ||||
|                 msg "Switching ci support for [%s] ..." "${AGENT}" | ||||
|                 commit_ci | ||||
|                 [[ -d .artixlinux ]] || mkdir .artixlinux | ||||
|  | ||||
|                 msg "Adding ci support ..." | ||||
|                 local agent | ||||
|                 agent="${AGENT_MAP["${TEAM_OPTS[1]}"]}" | ||||
|                 write_jenkinsfile "$agent" | ||||
|  | ||||
|                 git add "${REPO_CI}" | ||||
|                 git commit -m "add ci support" | ||||
|  | ||||
|             fi | ||||
|  | ||||
|             if [[ ! -f ${REPO_DB} ]]; then | ||||
| @@ -294,18 +189,13 @@ artixpkg_git_config() { | ||||
|                 create_repo_db | ||||
|  | ||||
|                 if [[ -f PKGBUILD ]]; then | ||||
|                     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|                     source PKGBUILD | ||||
|                     update_yaml_base | ||||
|                     pkg2yaml -o "${SRCINFO}" | ||||
|                 fi | ||||
|                 git add "${REPO_DB}" | ||||
|                 git commit -m "Create repo db" | ||||
|                 git commit -m "create repo db" | ||||
|  | ||||
|             fi | ||||
|  | ||||
|             msg "Querying ${pkgbase} ..." | ||||
|             if ! show_db; then | ||||
|                 warning "Could not query ${REPO_DB}" | ||||
|             fi | ||||
|         ) | ||||
|     done | ||||
| } | ||||
|   | ||||
| @@ -9,6 +9,8 @@ ARTOOLS_INCLUDE_GIT_CREATE_SH=1 | ||||
| source "${LIBDIR}"/pkg/git/clone.sh | ||||
| # shellcheck source=src/lib/pkg/git/config.sh | ||||
| source "${LIBDIR}"/pkg/git/config.sh | ||||
| # shellcheck source=src/lib/pkg/admin/team.sh | ||||
| source "${LIBDIR}"/pkg/admin/team.sh | ||||
|  | ||||
| set -e | ||||
|  | ||||
| @@ -20,7 +22,8 @@ artixpkg_git_create_usage() { | ||||
|  | ||||
|     OPTIONS | ||||
|         -c, --clone           Clone the Git repository after creation | ||||
|         -t, --team=NAME       Assign team name [default: world] | ||||
|         -t, --team NAME       Assign team name (default: ${ARTIX_TEAMS[1]}) | ||||
|                               Possible values: (${ARTIX_TEAMS[@]}) | ||||
|         -h, --help            Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
| @@ -32,17 +35,11 @@ artixpkg_git_create() { | ||||
|     # options | ||||
|     local pkgbases=() | ||||
|     local pkgbase | ||||
|     local clone=0 | ||||
|     local config=0 | ||||
|     local TEAM="${ARTIX_DB[5]}" | ||||
|     local OPTIONS=() | ||||
|     local CLONE=0 | ||||
|     local CONFIG=0 | ||||
|  | ||||
|     local TEAM_OPTS=("--team" "${ARTIX_TEAMS[1]}") | ||||
|  | ||||
|     local TEAMS=( | ||||
|         "${ARTIX_DB[2]}" | ||||
|         "${ARTIX_DB[5]}" | ||||
|         "${ARTIX_DB[8]}" | ||||
|         "${ARTIX_DB[11]}" | ||||
|         ) | ||||
|     # variables | ||||
|     local path | ||||
|  | ||||
| @@ -53,29 +50,26 @@ artixpkg_git_create() { | ||||
|             exit 0 | ||||
|         ;; | ||||
|         -c|--clone) | ||||
|             clone=1 | ||||
|             CLONE=1 | ||||
|             shift | ||||
|         ;; | ||||
|         -t|--team) | ||||
|             (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|             TEAM="$2" | ||||
|             TEAM_OPTS=("$1" "$2") | ||||
|             shift 2 | ||||
|         ;; | ||||
|         --team=*) | ||||
|             TEAM="${1#*=}" | ||||
|             shift | ||||
|         ;; | ||||
|         -*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|         ;; | ||||
|         *) | ||||
|             pkgbases=("$@") | ||||
|             break | ||||
|         ;; | ||||
|         esac | ||||
|     done | ||||
|  | ||||
|     if ! in_array "${TEAM}" "${TEAMS[@]}"; then | ||||
|     pkgbases=("$@") | ||||
|  | ||||
|     if ! in_array "${TEAM_OPTS[1]}" "${ARTIX_TEAMS[@]}"; then | ||||
|         die "${TEAM} does not exist!" | ||||
|     fi | ||||
|  | ||||
| @@ -86,8 +80,8 @@ artixpkg_git_create() { | ||||
|                 die "failed to read path from current directory" | ||||
|             fi | ||||
|             pkgbases=("$(basename "${path}")") | ||||
|         clone=0 | ||||
|         config=1 | ||||
|             CLONE=0 | ||||
|             CONFIG=1 | ||||
|         else | ||||
|             artixpkg_git_create_usage | ||||
|             exit 1 | ||||
| @@ -96,30 +90,29 @@ artixpkg_git_create() { | ||||
|  | ||||
|     # create | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
|  | ||||
|         local gitname | ||||
|         gitname=$(get_compliant_name "${pkgbase}") | ||||
|  | ||||
|         if [[ -n ${GIT_TOKEN} ]]; then | ||||
|             if ! create_repo "${gitname}" >/dev/null; then | ||||
|                 die "failed to create project: ${pkgbase}" | ||||
|             fi | ||||
|             if ! add_team_to_repo "${gitname}" "${TEAM}" >/dev/null; then | ||||
|                 warning "failed to assign team: ${TEAM}" | ||||
|             fi | ||||
|                 die "failed to create repository: ${pkgbase}" | ||||
|             else | ||||
|                 msg_success "Successfully created ${pkgbase}" | ||||
|             fi | ||||
|         if [[ ${TEAM} == ${ARTIX_DB[11]} ]]; then | ||||
|             OPTIONS+=(--agent="${TEAM}") | ||||
|         fi | ||||
|         if (( clone )); then | ||||
|             artixpkg_git_clone "${OPTIONS[@]}" "${pkgbase}" | ||||
|         elif (( config )); then | ||||
|             artixpkg_git_config "${OPTIONS[@]}" | ||||
|  | ||||
|         if (( CLONE )); then | ||||
|             artixpkg_git_clone "${TEAM_OPTS[@]}" "${pkgbase}" | ||||
|         elif (( CONFIG )); then | ||||
|             artixpkg_git_config "${pkgbase}" | ||||
|             artixpkg_admin_team "${TEAM_OPTS[@]}" "${pkgbase}" | ||||
|         fi | ||||
|  | ||||
|     done | ||||
|  | ||||
|     # some convenience hints if not in auto clone/config mode | ||||
|     if (( ! clone )) && (( ! config )); then | ||||
|     if (( ! CLONE )) && (( ! CONFIG )); then | ||||
|         cat <<- _EOF_ | ||||
|  | ||||
|         For new clones: | ||||
|   | ||||
| @@ -7,6 +7,9 @@ ARTOOLS_INCLUDE_GIT_PULL_SH=1 | ||||
|  | ||||
| set -e | ||||
|  | ||||
| # shellcheck source=src/lib/pkg/db/db.sh | ||||
| source "${LIBDIR}"/pkg/db/db.sh | ||||
|  | ||||
|  | ||||
| artixpkg_git_pull_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
| @@ -14,8 +17,8 @@ artixpkg_git_pull_usage() { | ||||
|     Usage: ${COMMAND} [OPTIONS] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -m, --maintainer=NAME      Pull all packages of the named maintainer | ||||
|         -t, --topic=NAME           Pull all packages of the named topic | ||||
|         -m, --maintainer NAME      Pull all packages of the named maintainer | ||||
|         -t, --topic NAME           Pull all packages of the named topic | ||||
|         -j, --jobs N               Run up to N jobs in parallel (default: $(nproc)) | ||||
|         --all                      Pull all existing packages | ||||
|         -h, --help                 Show this help text | ||||
| @@ -57,19 +60,11 @@ artixpkg_git_pull() { | ||||
|                 MAINTAINER="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --maintainer=*) | ||||
|                 MAINTAINER="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -t|--topic) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TOPIC="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --topic=*) | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             --all) | ||||
|                 PULL_ALL=1 | ||||
|                 shift | ||||
| @@ -124,13 +119,18 @@ artixpkg_git_pull() { | ||||
|  | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
|         if [[ -d ${pkgbase} ]]; then | ||||
|             ( cd ${pkgbase} || return | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 msg "Pulling ${pkgbase} ..." | ||||
|                 if ! git pull origin master; then | ||||
|                     die 'failed to pull %s' "${pkgbase}" | ||||
|                 fi | ||||
|  | ||||
|                 msg "Querying ${pkgbase} ..." | ||||
|                 if ! show_db; then | ||||
|                     warning "Could not query ${REPO_DB}" | ||||
|                 fi | ||||
|  | ||||
|             ) | ||||
|         else | ||||
|             warning "Skip pulling ${pkgbase}: Directory does not exist" | ||||
|   | ||||
| @@ -14,16 +14,14 @@ artixpkg_git_push_usage() { | ||||
|     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)) | ||||
|         -m, --maintainer NAME      Push all packages of the named maintainer | ||||
|         -t, --topic NAME           Push all packages of the named topic | ||||
|         -h, --help                 Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} libfoo linux libbar | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --topic mytopic | ||||
|         $ ${COMMAND} -j 8 --topic mytopic | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -38,11 +36,6 @@ artixpkg_git_push() { | ||||
|     # options | ||||
|     local MAINTAINER= | ||||
|     local TOPIC= | ||||
|     local CONFIGURE_OPTIONS=() | ||||
|     local jobs= | ||||
|     jobs=$(nproc) | ||||
|  | ||||
|     local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
| @@ -55,24 +48,11 @@ artixpkg_git_push() { | ||||
|                 MAINTAINER="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --maintainer=*) | ||||
|                 MAINTAINER="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -t|--topic) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TOPIC="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --topic=*) | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -j|--jobs) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 jobs=$2 | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --) | ||||
|                 shift | ||||
|                 break | ||||
| @@ -98,22 +78,9 @@ artixpkg_git_push() { | ||||
|         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 | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 msg "Pushing ${pkgbase} ..." | ||||
|                 if ! git push origin master; then | ||||
|   | ||||
| @@ -8,34 +8,26 @@ ARTOOLS_INCLUDE_REPO_SH=1 | ||||
| # shellcheck source=src/lib/pkg/db/db.sh | ||||
| source "${LIBDIR}"/pkg/db/db.sh | ||||
|  | ||||
| # shellcheck source=src/lib/pkg/db/upgrade.sh | ||||
| source "${LIBDIR}"/pkg/db/upgrade.sh | ||||
|  | ||||
| set -e | ||||
|  | ||||
|  | ||||
| check_pkgbuild_validity() { | ||||
|     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|     . ./PKGBUILD | ||||
| load_makepkg_config | ||||
|  | ||||
|     # 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[*]}" | ||||
| no_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 1 | ||||
|     fi | ||||
|     msg2 "changes: no" | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| artixpkg_repo_usage() { | ||||
| @@ -54,9 +46,12 @@ artixpkg_repo_usage() { | ||||
|         -h, --help     Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} add world libfoo | ||||
|         $ ${COMMAND} remove world libfoo | ||||
|         $ ${COMMAND} move world-gremlins world libfoo | ||||
|         $ ${COMMAND} add ${ARTIX_DB_MAP[2]} libfoo | ||||
|         $ ${COMMAND} remove ${ARTIX_DB_MAP[2]} libfoo | ||||
|         $ ${COMMAND} move ${ARTIX_DB_MAP[1]} ${ARTIX_DB_MAP[2]} libfoo | ||||
|         $ ${COMMAND} add ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} remove ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} move ${ARTIX_DB[3]} ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} import libfoo | ||||
|         $ ${COMMAND} show libfoo | ||||
| _EOF_ | ||||
|   | ||||
| @@ -8,6 +8,30 @@ ARTOOLS_INCLUDE_REPO_ADD_SH=1 | ||||
| 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() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
| @@ -17,11 +41,15 @@ artixpkg_repo_add_usage() { | ||||
|         -p, --push              Push pkgbase | ||||
|         -r, --rebuild           Triggers a rebuild | ||||
|         -n, --nocheck           Disable the check function | ||||
|         -a, --agent NAME        Set the CI agent | ||||
|                                 [default: auto] | ||||
|                                 possible values: ${AGENTS[@]} | ||||
|         -h, --help              Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} world-gremlins libfoo | ||||
|         $ ${COMMAND} -p world-gremlins libfoo | ||||
|         $ ${COMMAND} ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} --push ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} --push ${ARTIX_DB_MAP[2]} libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -40,6 +68,8 @@ artixpkg_repo_add() { | ||||
|     local REBUILD=0 | ||||
|     local NOCHECK=0 | ||||
|     local ADD=1 | ||||
|     local AUTO=0 | ||||
|     local AGENT | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
| @@ -59,6 +89,11 @@ artixpkg_repo_add() { | ||||
|                 NOCHECK=1 | ||||
|                 shift | ||||
|             ;; | ||||
|             -a|--agent) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 AGENT="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             -*) | ||||
|                 die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
| @@ -72,9 +107,13 @@ artixpkg_repo_add() { | ||||
|     shift | ||||
|     pkgbases+=("$@") | ||||
|  | ||||
|     if in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then | ||||
|         AUTO=1 | ||||
|     else | ||||
|         if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then | ||||
|             die "${DEST} does not exist!" | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
|  | ||||
| @@ -86,6 +125,8 @@ artixpkg_repo_add() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 if no_remote_changes; then | ||||
|  | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
| @@ -93,12 +134,45 @@ artixpkg_repo_add() { | ||||
|                     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|                     source PKGBUILD | ||||
|  | ||||
|                 update_yaml_base | ||||
|                     check_pkgbuild_validity | ||||
|  | ||||
|                     manage-pkgbuild-keys --export | ||||
|  | ||||
|                     pkg2yaml -o "${SRCINFO}" | ||||
|  | ||||
|                     local team | ||||
|                     team=$(detect_team) | ||||
|  | ||||
|                     if [[ -z "${team}" ]]; then | ||||
|                         team=$(team_from_yaml) | ||||
|                     fi | ||||
|  | ||||
|                     if (( AUTO )); then | ||||
|                         if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then | ||||
|                             DEST="${team}" | ||||
|                         else | ||||
|                             DEST="${team}-${DEST}" | ||||
|                         fi | ||||
|                     fi | ||||
|  | ||||
|                     upgrade_db | ||||
|  | ||||
|                     update_yaml_add "${REBUILD}" "${ADD}" "${NOCHECK}" "${DEST}" | ||||
|  | ||||
|                     update_yaml_team "${team}" | ||||
|  | ||||
|                     if [[ -z ${AGENT} ]]; then | ||||
|                         AGENT=${AGENT_MAP["${team}"]} | ||||
|                     fi | ||||
|                     write_jenkinsfile "${AGENT}" | ||||
|  | ||||
|                     local commit_msg | ||||
|                     commit_msg=$(get_commit_msg 'add' "${DEST}") | ||||
|  | ||||
|                     if [[ -f .SRCINFO ]]; then | ||||
|                         rm .SRCINFO | ||||
|                     fi | ||||
|  | ||||
|                     if [[ -n $(git status --porcelain --untracked-files=no) ]]; then | ||||
|  | ||||
|                         stat_busy 'Staging files' | ||||
| @@ -126,6 +200,8 @@ artixpkg_repo_add() { | ||||
|                             warning "Could not query ${REPO_DB}" | ||||
|                         fi | ||||
|                     fi | ||||
|  | ||||
|                 fi | ||||
|             ) | ||||
|         fi | ||||
|  | ||||
|   | ||||
| @@ -7,34 +7,62 @@ ARTOOLS_INCLUDE_REPO_IMPORT_SH=1 | ||||
|  | ||||
| set -e | ||||
|  | ||||
| PATCHDIR=${PATCHDIR:-"${WORKSPACE_DIR}/artix-patches"} | ||||
|  | ||||
| declare -A arch_map=( | ||||
|     ["archlinux-mirrorlist"]="pacman-mirrorlist" | ||||
|     ["artix-rebuild-order"]="arch-rebuild-order" | ||||
|     ["virtualbox-host-modules-artix"]="virtualbox-host-modules-arch" | ||||
| ) | ||||
|  | ||||
| update_patches(){ | ||||
|     if [[ ! -d "${PATCHDIR}" ]]; then | ||||
|         # ${GIT_ORG} | ||||
|         if ! git clone "${PATCH_URL}" "${PATCHDIR}"; then | ||||
|             error "failed to clone %s" "${PATCHDIR}" | ||||
|         fi | ||||
|     else | ||||
|         if ! git -C "${PATCHDIR}" pull; then | ||||
|            error "Failed to pull artix-patches" | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
|  | ||||
| patch_pkgbase(){ | ||||
|     local name="$1" | ||||
|     local pkgbuild | ||||
|     pkgbuild=PKGBUILD | ||||
|     local patches="${PATCHDIR}/patches/${name}" | ||||
|     sed -e 's|arch-meson|artix-meson|' -i PKGBUILD | ||||
|  | ||||
|     sed -e 's|arch-meson|artix-meson|' -i "${pkgbuild}" | ||||
|     if "${PATCH_MAINTAINER}" && [ -n "${PACKAGER}" ]; then | ||||
|         sed -e 's|# Maintainer:|# Contributor:|' -i PKGBUILD | ||||
|         printf '%s\n%s\n' "# Maintainer: ${PACKAGER}" "$(cat "PKGBUILD")" >"PKGBUILD" | ||||
|     fi | ||||
|  | ||||
|     case "${name}" in | ||||
|         glibc) | ||||
|             sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \ | ||||
|                 -e '/nscd.service/d' \ | ||||
|                 -i "${pkgbuild}" | ||||
|         ;; | ||||
|         linux|linux-lts|linux-zen|linux-hardened|linux-rt|linux-rt-lts) | ||||
|             sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i "${pkgbuild}" | ||||
|             sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \ | ||||
|                 -i config | ||||
|         ;; | ||||
|         gstreamer|gst-plugins-*|licenses) | ||||
|             sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \ | ||||
|                 -e 's|(Arch Linux)|(Artix Linux)|' \ | ||||
|                 -i "${pkgbuild}" | ||||
|         ;; | ||||
|     esac | ||||
|     if [ -d "${patches}" ]; then | ||||
|         if [ -f "${patches}/env.txt" ]; then | ||||
|             while read -r line; do | ||||
|                 IFS="=" read -r key value <<< "$line" | ||||
|                 if [[ -z "${key}" ]] || [[ -z "${value}" ]]; then | ||||
|                     die "Invalid key value pair in env.txt" | ||||
|                 fi | ||||
|                 if declare -p "${key}" &> /dev/null; then | ||||
|                     die "Environment variable %s already exists." "${key}" | ||||
|                 fi | ||||
|                 export "${key}=${value}" | ||||
|             done < "${patches}/env.txt" | ||||
|         fi | ||||
|         for file in "${patches}"/*; do | ||||
|             if [ -x "${file}" ]; then | ||||
|                 echo "$> ${name}/$(basename "${file}")" | ||||
|                 "${file}" "${TREE_DIR_ARTIX}/${name}" | ||||
|             elif [[ "${file}" == *.diff ]]; then | ||||
|                 echo "$> git apply ${name}/$(basename "${file}")" | ||||
|                 git -C "${TREE_DIR_ARTIX}/${name}" apply "${file}" | ||||
|             fi | ||||
|         done | ||||
|     fi | ||||
| } | ||||
|  | ||||
|  | ||||
| artixpkg_repo_import_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
| @@ -43,12 +71,14 @@ artixpkg_repo_import_usage() { | ||||
|     OPTIONS | ||||
|         --tag TAG          Switch the current workspace to a specified version tag | ||||
|         --del              Delete files before rsync import | ||||
|         -n --no-patch      No patch import | ||||
|         -h, --help         Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} libfoo | ||||
|         $ ${COMMAND} --tag TAG libfoo | ||||
|         $ ${COMMAND} --tag TAG --del libfoo | ||||
|         $ ${COMMAND} --no-patch libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -62,6 +92,7 @@ artixpkg_repo_import() { | ||||
|     local pkgbases=() | ||||
|     local pkgbase | ||||
|     local TAG | ||||
|     local NP=0 | ||||
|     local rsync_args=() | ||||
|     rsync_args+=( | ||||
|         -axcihW | ||||
| @@ -72,8 +103,9 @@ artixpkg_repo_import() { | ||||
|         --exclude '.gitignore' | ||||
|         --exclude 'README.md' | ||||
|         --exclude '*.service' | ||||
|         --exclude '*.timer' | ||||
|         --exclude '.SRCINFO' | ||||
|         --exclude '*.socket' | ||||
|         --exclude '*.timer' | ||||
|     ) | ||||
|  | ||||
|     while (( $# )); do | ||||
| @@ -91,6 +123,10 @@ artixpkg_repo_import() { | ||||
|                 rsync_args+=(--delete-before) | ||||
|                 shift | ||||
|             ;; | ||||
|             -n|--no-patch) | ||||
|                 NP=1 | ||||
|                 shift | ||||
|             ;; | ||||
|             -h|--help) | ||||
|                 artixpkg_repo_import_usage | ||||
|                 exit 0 | ||||
| @@ -104,6 +140,10 @@ artixpkg_repo_import() { | ||||
|         esac | ||||
|     done | ||||
|  | ||||
|     if ! (( NP )); then | ||||
|         update_patches | ||||
|     fi | ||||
|  | ||||
|     pkgbases+=("$@") | ||||
|  | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
| @@ -116,38 +156,49 @@ artixpkg_repo_import() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 upstream="${arch_map["$pkgbase"]:-$pkgbase}" | ||||
|  | ||||
|                 stat_busy "Checking for upstream url" | ||||
|                 if ! git config --local --get remote.upstream.url &>/dev/null; then | ||||
|                     git remote add upstream "${GIT_UPSTREAM_URL}/${pkgbase}".git | ||||
|                 if ! git config get remote.upstream.url &>/dev/null; then | ||||
|                     git remote add upstream "${GIT_UPSTREAM_URL}/${upstream}".git | ||||
|                 fi | ||||
|                 stat_done | ||||
|  | ||||
|                 stat_busy "Fetching upstream tags" | ||||
|                 git fetch --tags upstream main | ||||
|                 git fetch -fq --prune --tags upstream main | ||||
|                 stat_done | ||||
|  | ||||
|                 local latest version | ||||
|                 latest=$(git describe --tags FETCH_HEAD) | ||||
|  | ||||
|                 version="${latest}" | ||||
|                 if [[ -n "${TAG}" ]]; then | ||||
|                     version="${TAG}" | ||||
|                 fi | ||||
|  | ||||
|                 stat_busy "Importing upstream changeset for ${version}" | ||||
|                 if no_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 -q "${version}" -b "${version}" | ||||
|                     local temp | ||||
|                     temp=$(mktemp -d --tmpdir "${pkgbase}.XXXXXXXXXX") | ||||
|  | ||||
|                 rsync "${rsync_args[@]}" "$(pwd)"/ "${temp}"/ &>/dev/null | ||||
|                 git checkout master &>/dev/null | ||||
|                 git branch -D "${version}" &>/dev/null | ||||
|                     rsync "${rsync_args[@]}" -q "$(pwd)"/ "${temp}"/ | ||||
|                     git checkout -q master | ||||
|                     git branch -q -D "${version}" | ||||
|  | ||||
|                 stat_done | ||||
|  | ||||
|                 rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ #&>/dev/null | ||||
|                     msg "Importing upstream changeset for ${version}" | ||||
|                     rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ | ||||
|  | ||||
|                     if ! (( NP )); then | ||||
|                         msg2 "Patching ${pkgbase} ..." | ||||
|                         patch_pkgbase "${pkgbase}" | ||||
|                     fi | ||||
|                     git --no-pager diff PKGBUILD | ||||
|                 fi | ||||
|             ) | ||||
|         fi | ||||
|  | ||||
|   | ||||
| @@ -15,11 +15,15 @@ artixpkg_repo_move_usage() { | ||||
|  | ||||
|     OPTIONS | ||||
|         -p, --push              Push pkgbase | ||||
|         -a, --agent NAME        Set the CI agent | ||||
|                                 [default: auto] | ||||
|                                 possible values: ${AGENTS[@]} | ||||
|         -h, --help              Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} world-gremlins world libfoo | ||||
|         $ ${COMMAND} -p world-gremlins world libfoo | ||||
|         $ ${COMMAND} ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo | ||||
|         $ ${COMMAND} --push ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo | ||||
|         $ ${COMMAND} --push ${ARTIX_DB_MAP[1]} ${ARTIX_DB_MAP[2]} libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -34,9 +38,11 @@ artixpkg_repo_move() { | ||||
|     local pkgbase | ||||
|  | ||||
|     local PUSH=0 | ||||
|     local AUTO=0 | ||||
|  | ||||
|     local DEST | ||||
|     local SRC | ||||
|     local AGENT | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
| @@ -48,6 +54,11 @@ artixpkg_repo_move() { | ||||
|                 PUSH=1 | ||||
|                 shift | ||||
|             ;; | ||||
|             -a|--agent) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 AGENT="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             -*) | ||||
|                 die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
| @@ -61,12 +72,16 @@ artixpkg_repo_move() { | ||||
|     DEST="$2" | ||||
|     shift 2 | ||||
|  | ||||
|     if in_array "${SRC}" "${ARTIX_DB_MAP[@]}" && in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then | ||||
|         AUTO=1 | ||||
|     else | ||||
|         if ! in_array "${SRC}" "${ARTIX_DB[@]}"; then | ||||
|             die "${SRC} does not exist!" | ||||
|         fi | ||||
|         if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then | ||||
|             die "${DEST} does not exist!" | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     pkgbases+=("$@") | ||||
|  | ||||
| @@ -80,15 +95,63 @@ artixpkg_repo_move() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 if no_remote_changes; then | ||||
|  | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
|  | ||||
|                 local commit_msg | ||||
|                     local team | ||||
|                     team=$(detect_team) | ||||
|  | ||||
|                     if [[ -z "${team}" ]]; then | ||||
|                         team=$(team_from_yaml) | ||||
|                     fi | ||||
|  | ||||
|                     if (( AUTO )); then | ||||
|                         if [[ "${SRC}" == "${ARTIX_DB_MAP[2]}" ]]; then | ||||
|                             SRC="${team}" | ||||
|                         else | ||||
|                             SRC="${team}-${SRC}" | ||||
|                         fi | ||||
|  | ||||
|                         if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then | ||||
|                             DEST="${team}" | ||||
|                         else | ||||
|                             DEST="${team}-${DEST}" | ||||
|                         fi | ||||
|                     fi | ||||
|  | ||||
|                     local commit_msg src_version | ||||
|                     commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}") | ||||
|  | ||||
|                     src_version=$(version_from_yaml "${SRC}") | ||||
|  | ||||
|                     if [[ "$src_version" != "null" ]]; then | ||||
|  | ||||
|                         if ! [[ -f "${SRCINFO}" ]]; then | ||||
|                             pkg2yaml -o "${SRCINFO}" | ||||
|                         fi | ||||
|  | ||||
|                         upgrade_db | ||||
|  | ||||
|                         update_yaml_move "${SRC}" "${DEST}" | ||||
|  | ||||
|                         team=$(detect_team) | ||||
|                         if [[ -z "$team" ]]; then | ||||
|                             team=$(team_from_yaml) | ||||
|                         fi | ||||
|                         update_yaml_team "${team}" | ||||
|  | ||||
|                         if [[ -z ${AGENT} ]]; then | ||||
|                             AGENT=${AGENT_MAP["${team}"]} | ||||
|                         fi | ||||
|                         write_jenkinsfile "${AGENT}" | ||||
|  | ||||
|                         if [[ -f .SRCINFO ]]; then | ||||
|                             rm .SRCINFO | ||||
|                         fi | ||||
|  | ||||
|                         if [[ -n $(git status --porcelain --untracked-files=no) ]]; then | ||||
|  | ||||
|                             stat_busy 'Staging files' | ||||
| @@ -96,6 +159,14 @@ artixpkg_repo_move() { | ||||
|                                 if [[ "$f" == "${REPO_DB}" ]]; then | ||||
|                                     git add "$f" | ||||
|                                 fi | ||||
|                                 if [[ "$f" == "${REPO_CI}" ]]; then | ||||
|                                     git add "$f" | ||||
|                                 fi | ||||
|                             done | ||||
|                             for f in $(git ls-files --others); do | ||||
|                                 if [[ "$f" == "${SRCINFO}" ]]; then | ||||
|                                     git add "$f" | ||||
|                                 fi | ||||
|                             done | ||||
|                             stat_done | ||||
|  | ||||
| @@ -111,7 +182,60 @@ artixpkg_repo_move() { | ||||
|                             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 "${gitname}" "${ARTIX_DB[5]}"; then | ||||
|                                     warning "failed to add team: ${ARTIX_DB[5]}" | ||||
|                                 fi | ||||
|                                 if ! remove_team_from_repo "${gitname}" "${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 "${gitname}" "${ARTIX_DB[2]}"; then | ||||
|                                     warning "failed to add team: ${ARTIX_DB[2]}" | ||||
|                                 fi | ||||
|                                 if ! remove_team_from_repo "${gitname}" "${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 | ||||
|  | ||||
|   | ||||
| @@ -15,11 +15,15 @@ artixpkg_repo_remove_usage() { | ||||
|  | ||||
|     OPTIONS | ||||
|         -p, --push              Push pkgbase | ||||
|         -a, --agent NAME        Set the CI agent | ||||
|                                 [default: auto] | ||||
|                                 possible values: ${AGENTS[@]} | ||||
|         -h, --help              Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} world-gremlins libfoo | ||||
|         $ ${COMMAND} -p world-gremlins libfoo | ||||
|         $ ${COMMAND} ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} --push ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} --push ${ARTIX_DB_MAP[2]} libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -34,7 +38,9 @@ artixpkg_repo_remove() { | ||||
|     local pkgbase | ||||
|  | ||||
|     local PUSH=0 | ||||
|     local AUTO=0 | ||||
|     local DEST='' | ||||
|     local AGENT | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
| @@ -46,6 +52,11 @@ artixpkg_repo_remove() { | ||||
|                 PUSH=1 | ||||
|                 shift | ||||
|             ;; | ||||
|             -a|--agent) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 AGENT="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             -*) | ||||
|                 die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
| @@ -59,9 +70,13 @@ artixpkg_repo_remove() { | ||||
|     shift | ||||
|     pkgbases=("$@") | ||||
|  | ||||
|     if in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then | ||||
|         AUTO=1 | ||||
|     else | ||||
|         if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then | ||||
|             die "${DEST} does not exist!" | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
|  | ||||
| @@ -73,15 +88,43 @@ artixpkg_repo_remove() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 if no_remote_changes; then | ||||
|  | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
|  | ||||
|                     local team | ||||
|                     team=$(detect_team) | ||||
|  | ||||
|                     if [[ -z "${team}" ]]; then | ||||
|                         team=$(team_from_yaml) | ||||
|                     fi | ||||
|  | ||||
|                     if (( AUTO )); then | ||||
|                         if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then | ||||
|                             DEST="${team}" | ||||
|                         else | ||||
|                             DEST="${team}-${DEST}" | ||||
|                         fi | ||||
|                     fi | ||||
|  | ||||
|                     local commit_msg | ||||
|                     commit_msg=$(get_commit_msg 'remove' "${DEST}") | ||||
|  | ||||
|                     if ! [[ -f "${SRCINFO}" ]]; then | ||||
|                         pkg2yaml -o "${SRCINFO}" | ||||
|                     fi | ||||
|  | ||||
|                     upgrade_db | ||||
|  | ||||
|                     update_yaml_remove "${DEST}" | ||||
|  | ||||
|                     if [[ -z ${AGENT} ]]; then | ||||
|                         AGENT=${AGENT_MAP["${team}"]} | ||||
|                     fi | ||||
|                     write_jenkinsfile "${AGENT}" | ||||
|  | ||||
|                     if [[ -n $(git status --porcelain --untracked-files=no) ]]; then | ||||
|  | ||||
|                         stat_busy 'Staging files' | ||||
| @@ -89,6 +132,14 @@ artixpkg_repo_remove() { | ||||
|                             if [[ "$f" == "${REPO_DB}" ]]; then | ||||
|                                 git add "$f" | ||||
|                             fi | ||||
|                             if [[ "$f" == "${REPO_CI}" ]]; then | ||||
|                                 git add "$f" | ||||
|                             fi | ||||
|                         done | ||||
|                         for f in $(git ls-files --others); do | ||||
|                             if [[ "$f" == "${SRCINFO}" ]]; then | ||||
|                                 git add "$f" | ||||
|                             fi | ||||
|                         done | ||||
|                         stat_done | ||||
|  | ||||
| @@ -106,6 +157,8 @@ artixpkg_repo_remove() { | ||||
|                         fi | ||||
|  | ||||
|                     fi | ||||
|  | ||||
|                 fi | ||||
|             ) | ||||
|         fi | ||||
|  | ||||
|   | ||||
| @@ -8,18 +8,6 @@ ARTOOLS_INCLUDE_REPO_SHOW_SH=1 | ||||
| set -e | ||||
|  | ||||
|  | ||||
| has_changeset(){ | ||||
|     git fetch origin &>/dev/null | ||||
|  | ||||
|     if [[ $(git rev-parse HEAD) != $(git rev-parse @{u}) ]]; then | ||||
|         msg2 "changes: yes" | ||||
|         git status -sb | ||||
|         return 0 | ||||
|     fi | ||||
|     msg2 "changes: no" | ||||
|     return 1 | ||||
| } | ||||
|  | ||||
| artixpkg_repo_show_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
| @@ -84,11 +72,7 @@ artixpkg_repo_show() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 msg "Checking origin for changes" | ||||
|                 if has_changeset; then | ||||
|                     warning "Remote changes detected! Please update (%s)" "${pkgbase}" | ||||
|                 fi | ||||
|  | ||||
|                 if no_remote_changes; then | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
| @@ -99,13 +83,18 @@ artixpkg_repo_show() { | ||||
|                     fi | ||||
|  | ||||
|                     if (( SRC_BASE )); then | ||||
|                     msg "Showing srcinfo base ..." | ||||
|                     show_srcinfo_base | ||||
|                         if [[ -f "${SRCINFO}" ]]; then | ||||
|                             msg "Showing srcinfo pkgbase ..." | ||||
|                             yq '.pkgbase' "${SRCINFO}" | ||||
|                         fi | ||||
|                     fi | ||||
|  | ||||
|                     if (( SRC_PKGS )); then | ||||
|                     msg "Showing srcinfo pkgs ..." | ||||
|                     show_srcinfo_pkgs | ||||
|                         if [[ -f "${SRCINFO}" ]]; then | ||||
|                             msg "Showing srcinfo pkgname ..." | ||||
|                             yq '.pkgname' "${SRCINFO}" | ||||
|                         fi | ||||
|                     fi | ||||
|                 fi | ||||
|  | ||||
|             ) | ||||
|   | ||||
| @@ -1,37 +0,0 @@ | ||||
| #!/hint/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #{{{ table | ||||
|  | ||||
| msg_table_header(){ | ||||
|     local mesg=$1; shift | ||||
|     # shellcheck disable=2059 | ||||
|     printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" | ||||
| } | ||||
|  | ||||
| msg_row_yellow(){ | ||||
|     local mesg=$1; shift | ||||
|     # shellcheck disable=2059 | ||||
|     printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" | ||||
| } | ||||
|  | ||||
| msg_row_green(){ | ||||
|     local mesg=$1; shift | ||||
|     # shellcheck disable=2059 | ||||
|     printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" | ||||
| } | ||||
|  | ||||
| msg_row(){ | ||||
|     local mesg=$1; shift | ||||
|     # shellcheck disable=2059 | ||||
|     printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" | ||||
| } | ||||
|  | ||||
| msg_row_red(){ | ||||
|     local mesg=$1; shift | ||||
|     # shellcheck disable=2059 | ||||
|     printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" | ||||
| } | ||||
|  | ||||
| #}}} | ||||
| @@ -4,6 +4,21 @@ | ||||
|  | ||||
| #{{{ 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(){ | ||||
|  | ||||
|     local conf="$1/artools-pkg.conf" | ||||
| @@ -13,10 +28,20 @@ load_pkg_config(){ | ||||
|     # shellcheck source=config/conf/artools-pkg.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}"} | ||||
|  | ||||
|     readonly API_URL="${GIT_HTTPS}/api/v1" | ||||
|  | ||||
|     GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} | ||||
|  | ||||
|     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_ORG_ARCHIVE=${GIT_ORG_ARCHIVE:-'landfill'} | ||||
|  | ||||
|     TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} | ||||
|  | ||||
|     REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"} | ||||
| @@ -33,6 +60,12 @@ load_pkg_config(){ | ||||
|  | ||||
|     DBEXT=${DBEXT:-'gz'} | ||||
|  | ||||
|     PATCH_MAINTAINER=${PATCH_MAINTAINER:-false} | ||||
|  | ||||
|     PATCH_URL=${PATCH_URL:-"${GIT_SSH}:artix/artix-patches.git"} | ||||
|  | ||||
|     PKGDEST_DBG=${PKGDEST_DBG:-"${WORKSPACE_DIR}/packages-debug"} | ||||
|  | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										54
									
								
								src/lib/pkg/util/packager.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/lib/pkg/util/packager.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| #!/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 | ||||
| } | ||||
|  | ||||
| # shellcheck source=config/makepkg/x86_64.conf | ||||
| load_makepkg_config | ||||
| @@ -20,9 +20,10 @@ usage() { | ||||
|     Usage: ${COMMAND} [COMMAND] [OPTIONS] | ||||
|  | ||||
|     COMMANDS | ||||
|         repo      Pacman database modification for packge update, move etc | ||||
|         admin     Manage topics, teams and obsolete repos | ||||
|         git       Manage Git packaging repositories and their configuration | ||||
|         admin     Managegement of topics and obsolete repos | ||||
|         repo      Pacman database modification for package updates, moves, etc. | ||||
|  | ||||
|         version   Show artixpkg version information | ||||
|  | ||||
|     OPTIONS | ||||
| @@ -37,13 +38,9 @@ fi | ||||
|  | ||||
| export _ARTOOLS_COMMAND='artixpkg' | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
|  | ||||
| load_makepkg_config | ||||
|  | ||||
| cd "${TREE_DIR_ARTIX}" | ||||
|  | ||||
| # command checking | ||||
|   | ||||
| @@ -6,12 +6,12 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # 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 | ||||
|  | ||||
| create_first=false | ||||
| rebuild=false | ||||
| @@ -32,6 +32,8 @@ usage() { | ||||
|     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 '    -m                 Major rebuild\n' | ||||
|     printf '    -N                 Disable check() function\n' | ||||
| @@ -44,15 +46,16 @@ usage() { | ||||
|     exit "$1" | ||||
| } | ||||
|  | ||||
| opts='hcCNmnr:d:a:' | ||||
| opts='hcCNmnr:d:a:e:' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         r) chroots_pkg="$OPTARG" ;; | ||||
|         d) repo="$OPTARG" ;; | ||||
|         a) arch="$OPTARG" ;; | ||||
|         e) packager="$OPTARG" ;; | ||||
|         c) create_first=true ;; | ||||
|         m) rebuild=true; repo=${repo%-*} ;; | ||||
|         m) rebuild=true ;; | ||||
|         C) mkchrootpkg_args+=(-C) ;; | ||||
|         N) mkchrootpkg_args+=(-N) ;; | ||||
|         n) mkchrootpkg_args+=(-n) ;; | ||||
| @@ -60,6 +63,10 @@ while getopts "${opts}" arg; do | ||||
|     esac | ||||
| done | ||||
|  | ||||
| if "${rebuild}"; then | ||||
|     repo=${repo%-*} | ||||
| fi | ||||
|  | ||||
| if [[ "${repo}" == lib32* ]]; then | ||||
|     base_packages+=('multilib-devel') | ||||
| fi | ||||
| @@ -86,6 +93,10 @@ else | ||||
|     set_arch="${arch}" | ||||
| fi | ||||
|  | ||||
| if [[ -n "${packager}" ]]; then | ||||
|     export PACKAGER=${packager} | ||||
| fi | ||||
|  | ||||
| # Architecture-specific Mount | ||||
| arch_mounts=() | ||||
| if [[ -f "${DATADIR}/mount.d/${arch}" ]]; then | ||||
|   | ||||
| @@ -6,10 +6,8 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/pkg/diff.sh | ||||
| source "${LIBDIR}"/pkg/diff.sh | ||||
|  | ||||
| load_makepkg_config | ||||
| # shellcheck source=src/lib/pkg/util/diff.sh | ||||
| source "${LIBDIR}"/pkg/util/diff.sh | ||||
|  | ||||
| usage() { | ||||
|     cat <<- _EOF_ | ||||
| @@ -57,7 +55,7 @@ while (( $# )); do | ||||
|             shift | ||||
|             break | ||||
|             ;; | ||||
|         -*|--*) | ||||
|         --*|-*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
|         *) | ||||
| @@ -76,10 +74,10 @@ fi | ||||
|  | ||||
| # Source user-specific makepkg.conf overrides | ||||
| if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then | ||||
|     # shellcheck source=/dev/null | ||||
|     # shellcheck source=config/makepkg/x86_64.conf | ||||
|     source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" | ||||
| elif [[ -r "$HOME/.makepkg.conf" ]]; then | ||||
|     # shellcheck source=/dev/null | ||||
|     # shellcheck source=config/makepkg/x86_64.conf | ||||
|     source "$HOME/.makepkg.conf" | ||||
| fi | ||||
|  | ||||
| @@ -152,7 +150,11 @@ for _pkgname in "${pkgname[@]}"; do | ||||
|     find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname" | ||||
|     if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then | ||||
|         message="Sonames differ in $_pkgname!" | ||||
|         (( WARN )) && warning "$message" || msg "$message" | ||||
|         if (( WARN )); then | ||||
|             warning "$message" | ||||
|         else | ||||
|             msg "$message" | ||||
|         fi | ||||
|         printf "%s\n" "$diff_output" 2>&1 | tee "${pkgfile##*/}-checkpkg.log" | ||||
|         changed=1 | ||||
|     else | ||||
|   | ||||
| @@ -6,19 +6,49 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/pkg/table.sh | ||||
| source "${LIBDIR}"/pkg/table.sh | ||||
| # shellcheck source=src/lib/pkg/db/db.sh | ||||
| source "${LIBDIR}"/pkg/db/db.sh | ||||
|  | ||||
| shopt -s extglob | ||||
|  | ||||
| #{{{ table | ||||
|  | ||||
| msg_table_header(){ | ||||
|     local mesg=$1; shift | ||||
|     # shellcheck disable=2059 | ||||
|     printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" | ||||
| } | ||||
|  | ||||
| msg_row_yellow(){ | ||||
|     local mesg=$1; shift | ||||
|     # shellcheck disable=2059 | ||||
|     printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" | ||||
| } | ||||
|  | ||||
| msg_row_green(){ | ||||
|     local mesg=$1; shift | ||||
|     # shellcheck disable=2059 | ||||
|     printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" | ||||
| } | ||||
|  | ||||
| msg_row(){ | ||||
|     local mesg=$1; shift | ||||
|     # shellcheck disable=2059 | ||||
|     printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" | ||||
| } | ||||
|  | ||||
| msg_row_red(){ | ||||
|     local mesg=$1; shift | ||||
|     # shellcheck disable=2059 | ||||
|     printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|  | ||||
| extract_db() { | ||||
|     local u="$1" cdir="$2" | ||||
|     rm -rf "$cdir" | ||||
| @@ -32,6 +62,7 @@ update_linksdb_cache(){ | ||||
|     local cachedir url | ||||
|     for repo in "${search[@]}"; do | ||||
|         cachedir=${db_cache_dir}/linksdb/$repo | ||||
|         # shellcheck disable=SC2153 | ||||
|         url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext} | ||||
|         extract_db "$url" "$cachedir" | ||||
|     done | ||||
|   | ||||
| @@ -39,7 +39,7 @@ umask 0022 | ||||
| working_dir='' | ||||
| 
 | ||||
| files=() | ||||
| mount_args=("-B:/etc/hosts:/etc/hosts") | ||||
| mount_args="-B:/etc/hosts:/etc/hosts" | ||||
| 
 | ||||
| usage() { | ||||
|     printf "Usage: %s [options] working-dir [run arguments]\n" "${0##*/}" | ||||
| @@ -72,7 +72,7 @@ while getopts ${opts} arg; do | ||||
|         f) files+=("$OPTARG") ;; | ||||
|         s) nosetarch=1 ;; | ||||
|         t) tmpfs_opts="$OPTARG" ;; | ||||
|         b) bindmounts="$OPTARG"; mount_args+=(${bindmounts}) ;; | ||||
|         b) bindmounts="$OPTARG"; mount_args+=" ${bindmounts}" ;; | ||||
|         h|?) usage ;; | ||||
|         *) error "invalid argument '%s'" "$arg"; usage ;; | ||||
|     esac | ||||
| @@ -96,6 +96,7 @@ mapfile -t host_mirrors < <(pacman-conf --repo world Server 2> /dev/null | sed - | ||||
| 
 | ||||
| for host_mirror in "${host_mirrors[@]}"; do | ||||
|     if [[ $host_mirror == *file://* ]]; then | ||||
|         # shellcheck disable=SC2016 | ||||
|         host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g') | ||||
|         for m in "$host_mirror"/pool/*/; do | ||||
|             in_array "$m" "${cache_dirs[@]}" || cache_dirs+=("$m") | ||||
| @@ -114,10 +115,10 @@ while read -r line; do | ||||
|     done | ||||
| done < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" --repo-list) | ||||
| 
 | ||||
| mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}") | ||||
| mount_args+=" -B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}" | ||||
| 
 | ||||
| for cache_dir in "${cache_dirs[@]:1}"; do | ||||
|     mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}") | ||||
|     mount_args+=" -Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}" | ||||
| done | ||||
| 
 | ||||
| # {{{ functions | ||||
| @@ -144,13 +145,13 @@ copy_hostconf () { | ||||
| chroot_extra_mount() { | ||||
|     chroot_add_resolv_conf "${working_dir}" | ||||
| 
 | ||||
|     for arg in "${mount_args[@]}"; do | ||||
|     for arg in ${mount_args}; do | ||||
|         local flag dest src | ||||
|         flag=${arg%%:*} | ||||
|         dest=${arg##*:} | ||||
|         src=${arg%:*} | ||||
|         src=${src#*:} | ||||
|         chroot_mount "${src}" "${working_dir}${dest}" "${flag}" | ||||
|         chroot_add_mount "${src}" "${working_dir}${dest}" "${flag}" | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| @@ -165,7 +166,7 @@ elif [[ $(cat "$working_dir/.artix-chroot") != "${CHROOTVERSION}" ]]; then | ||||
|     die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}" | ||||
| fi | ||||
| 
 | ||||
| chroot_api_mount "${working_dir}" "${tmpfs_opts}" || 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 | ||||
| 
 | ||||
| @@ -180,7 +181,9 @@ else | ||||
|     set_arch="${CARCH}" | ||||
| fi | ||||
| 
 | ||||
| ${CARCH:+setarch "${set_arch}"} chroot "${working_dir}" "$@" | ||||
| chroot_args=(/usr/bin/env PATH=/usr/local/sbin:/usr/local/bin:/usr/bin) | ||||
| 
 | ||||
| ${CARCH:+setarch "${set_arch}"} chroot "${working_dir}" "${chroot_args[@]}" "$@" | ||||
| 
 | ||||
| ret=$? | ||||
| 
 | ||||
| @@ -4,12 +4,12 @@ | ||||
|  | ||||
| LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # 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 | ||||
|  | ||||
| @@ -76,6 +76,7 @@ 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 | ||||
|  | ||||
|   | ||||
| @@ -6,8 +6,8 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/pkg/diff.sh | ||||
| source "${LIBDIR}"/pkg/diff.sh | ||||
| # shellcheck source=src/lib/pkg/util/diff.sh | ||||
| source "${LIBDIR}"/pkg/util/diff.sh | ||||
|  | ||||
| usage() { | ||||
|     cat <<- _EOF_ | ||||
| @@ -127,7 +127,7 @@ while (( $# )); do | ||||
|             shift | ||||
|             break | ||||
|         ;; | ||||
|         -*|--*) | ||||
|         --*|-*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|         ;; | ||||
|         *) | ||||
|   | ||||
| @@ -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 | ||||
| @@ -10,12 +10,12 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # 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 | ||||
|  | ||||
| declare -A buildinfo | ||||
| declare -a buildenv buildopts installed installpkgs | ||||
| @@ -133,7 +133,7 @@ while getopts 'dM:c:l:h' arg; do | ||||
|         c) cache_dirs+=("$OPTARG") ;; | ||||
|         l) chroot="$OPTARG" ;; | ||||
|         h) usage; exit 0 ;; | ||||
|         *|?) usage; exit 1 ;; | ||||
|         ?|*) usage; exit 1 ;; | ||||
|     esac | ||||
| done | ||||
| shift $((OPTIND - 1)) | ||||
| @@ -222,10 +222,12 @@ TEMPDIR=$(mktemp -d --tmpdir makerepropkg.XXXXXXXXXX) | ||||
| makepkg_conf="${TEMPDIR}/makepkg.conf" | ||||
| # anything before buildtool support is pinned to the last none buildtool aware release | ||||
| if [[ -z "${BUILDTOOL}" ]]; then | ||||
|     get_makepkg_conf "artools-pkg-0.28.2-1-any" "${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 | ||||
| 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 | ||||
| elif [[ "${BUILDTOOL}" = artools ]] && get_makepkg_conf "${BUILDTOOL}-${BUILDTOOLVER}" "${makepkg_conf}"; then | ||||
|     true | ||||
|   | ||||
							
								
								
									
										99
									
								
								src/pkg/manage-pkgbuild-keys.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								src/pkg/manage-pkgbuild-keys.in
									
									
									
									
									
										Normal 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 | ||||
| @@ -20,6 +20,7 @@ umode='' | ||||
| 
 | ||||
| files=() | ||||
| chroot_args=() | ||||
| nosetarch=0 | ||||
| 
 | ||||
| usage() { | ||||
|     printf "Usage: %s [options] working-dir package-list...\n" "${0##*/}" | ||||
| @@ -177,7 +177,7 @@ prepare_chroot() { | ||||
|     done | ||||
|  | ||||
|     cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF | ||||
| builduser ALL = NOPASSWD: /usr/bin/pacman | ||||
| builduser ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman | ||||
| EOF | ||||
|     chmod 440 "$copydir/etc/sudoers.d/builduser-pacman" | ||||
|  | ||||
| @@ -205,6 +205,7 @@ _chrootbuild() { | ||||
|     # No coredumps | ||||
|     ulimit -c 0 | ||||
|  | ||||
|     # shellcheck disable=SC1091 | ||||
|     . /etc/locale.conf | ||||
|  | ||||
|     # shellcheck source=/dev/null | ||||
| @@ -263,6 +264,7 @@ move_products() { | ||||
|  | ||||
|         # Fix broken symlink because of temporary chroot PKGDEST /pkgdest | ||||
|         if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then | ||||
|             # shellcheck disable=SC2226 | ||||
|             ln -sf "$PKGDEST/${pkgfile##*/}" | ||||
|         fi | ||||
|     done | ||||
| @@ -275,6 +277,7 @@ move_products() { | ||||
|  | ||||
|         # Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest | ||||
|         if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then | ||||
|             # shellcheck disable=SC2226 | ||||
|             ln -sf "$SRCPKGDEST/${s##*/}" | ||||
|         fi | ||||
|     done | ||||
|   | ||||
							
								
								
									
										55
									
								
								src/pkg/packagersign.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/pkg/packagersign.in
									
									
									
									
									
										Normal 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/util/deploy.sh | ||||
| source "${LIBDIR}"/pkg/util/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" | ||||
| @@ -6,133 +6,198 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/yaml.sh | ||||
| source "${LIBDIR}"/base/yaml.sh | ||||
|  | ||||
| # shellcheck disable=1091 | ||||
| source "${MAKEPKG_LIBRARY}"/util/pkgbuild.sh | ||||
| # shellcheck disable=1091 | ||||
| source "${MAKEPKG_LIBRARY}"/util/schema.sh | ||||
|  | ||||
| # {{{ functions | ||||
|  | ||||
| srcyaml_write_attr(){ | ||||
|     local ident1="$1" ident2="$2" ident3="$3" | ||||
|     local attrname=$4 attrvalues=("${@:5}") | ||||
| yaml_array_str() { | ||||
|     local array | ||||
|  | ||||
|     # normalize whitespace, strip leading and trailing | ||||
|     attrvalues=("${attrvalues[@]//+([[:space:]])/ }") | ||||
|     attrvalues=("${attrvalues[@]#[[:space:]]}") | ||||
|     attrvalues=("${attrvalues[@]%[[:space:]]}") | ||||
|  | ||||
|     case $attrname in | ||||
|         pkgver|pkgrel|epoch|url|install|changelog) | ||||
|             for v in "${attrvalues[@]}"; do | ||||
|                 Yaml+=$(write_yaml_map "$ident3" "$attrname" "$v") | ||||
|     for entry in "$@"; do | ||||
|         array="${array:-}${array:+,} '${entry}'" | ||||
|     done | ||||
|         ;; | ||||
|         pkgdesc) | ||||
|             Yaml+=$(write_yaml_map "$ident1" "$attrname" "${attrvalues[@]}") | ||||
|         ;; | ||||
|         *) | ||||
|             Yaml+=$(write_yaml_map "$ident1" "$attrname") | ||||
|             for v in "${attrvalues[@]}"; do | ||||
|                 Yaml+=$(write_yaml_seq "$ident2" "$v") | ||||
|             done | ||||
|         ;; | ||||
|     esac | ||||
|     printf "%s\n" "[${array}]" | ||||
| } | ||||
|  | ||||
| pkgbuild_extract_to_yaml() { | ||||
|     local pkgname=$1 attrname=$2 isarray=$3 outvalue= | ||||
| pkgbuild_extract_to_srcyaml() { | ||||
|     # $1: pkgname | ||||
|     # $2: index | ||||
|     # $3: attr name | ||||
|     # $4: multivalued | ||||
|  | ||||
|     local pkgname="$1" i="$2" attrname="$3" isarray="$4"  outvalue= | ||||
|  | ||||
|     if get_pkgbuild_attribute "$pkgname" "$attrname" "$isarray" 'outvalue'; then | ||||
|         [[ -z $pkgname ]] && srcyaml_write_attr 2 4 2 "$attrname" "${outvalue[@]}" | ||||
|         [[ -n $pkgname ]] && srcyaml_write_attr 4 6 2 "$attrname" "${outvalue[@]}" | ||||
|         local ov an | ||||
|  | ||||
|         if [[ -n $pkgname ]]; then | ||||
|             an=".pkgname[$i].$attrname" | ||||
|         else | ||||
|             an=".pkgbase.$attrname" | ||||
|         fi | ||||
|  | ||||
|         if (( isarray )); then | ||||
|             ov=$(yaml_array_str "${outvalue[@]}") | ||||
|         else | ||||
|             ov="${outvalue[*]}" | ||||
|             if [[ -z "$ov" ]]; then | ||||
|                 ov="null" | ||||
|             fi | ||||
|         fi | ||||
|  | ||||
|         an="$an" ov="$ov" \ | ||||
|         yq -P 'eval(strenv(an)) = env(ov)' -i "${YAML}" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| srcyaml_write_section_details() { | ||||
| srcyaml_write_node_details() { | ||||
|     local attr package_arch a | ||||
|     local multivalued_arch_attrs=(source provides conflicts depends replaces | ||||
|                                   optdepends makedepends checkdepends | ||||
|                                   "${known_hash_algos[@]/%/sums}") | ||||
|     local multivalued_arch_attrs=( | ||||
|         source | ||||
|         provides | ||||
|         conflicts | ||||
|         depends | ||||
|         replaces | ||||
|         optdepends | ||||
|         makedepends | ||||
|         checkdepends | ||||
|         "${known_hash_algos[@]/%/sums}" | ||||
|     ) | ||||
|  | ||||
|     for attr in "${singlevalued[@]}"; do | ||||
|         pkgbuild_extract_to_yaml "$1" "$attr" 0 | ||||
|         pkgbuild_extract_to_srcyaml "$1" "$2" "$attr" 0 | ||||
|     done | ||||
|  | ||||
|     for attr in "${multivalued[@]}"; do | ||||
|         pkgbuild_extract_to_yaml "$1" "$attr" 1 | ||||
|         pkgbuild_extract_to_srcyaml "$1" "$2" "$attr" 1 | ||||
|     done | ||||
|  | ||||
|     get_pkgbuild_attribute "$1" 'arch' 1 'package_arch' | ||||
|     get_pkgbuild_attribute "$pn" 'arch' 1 'package_arch' | ||||
|     for a in "${package_arch[@]}"; do | ||||
|         # 'any' is special. there's no support for, e.g. depends_any. | ||||
|         [[ $a = any ]] && continue | ||||
|  | ||||
|         for attr in "${multivalued_arch_attrs[@]}"; do | ||||
|             pkgbuild_extract_to_yaml "$1" "${attr}_$a" 1 | ||||
|             pkgbuild_extract_to_srcyaml "$1" "$2" "${attr}_$a" 1 | ||||
|         done | ||||
|     done | ||||
| } | ||||
|  | ||||
| yaml_write_global() { | ||||
|     local singlevalued=(pkgdesc pkgver pkgrel epoch url install changelog) | ||||
|     local multivalued=(arch groups license checkdepends makedepends | ||||
|                         depends optdepends provides conflicts replaces | ||||
|                         noextract options backup | ||||
|                         source validpgpkeys "${known_hash_algos[@]/%/sums}") | ||||
| srcyaml_write_global() { | ||||
|     local singlevalued=( | ||||
|         pkgdesc | ||||
|         pkgver | ||||
|         pkgrel | ||||
|         epoch | ||||
|         url | ||||
|         install | ||||
|         changelog | ||||
|     ) | ||||
|     local multivalued=( | ||||
|         arch | ||||
|         groups | ||||
|         license | ||||
|         checkdepends | ||||
|         makedepends | ||||
|         depends | ||||
|         optdepends | ||||
|         provides | ||||
|         conflicts | ||||
|         replaces | ||||
|         noextract | ||||
|         options | ||||
|         backup | ||||
|         source | ||||
|         validpgpkeys | ||||
|         "${known_hash_algos[@]/%/sums}" | ||||
|     ) | ||||
|  | ||||
|     Yaml+=$(write_yaml_map 0 "pkgbase") | ||||
|     Yaml+=$(write_yaml_map 2 "name" "${pkgbase:-${pkgname}}") | ||||
|  | ||||
|     srcyaml_write_section_details "" | ||||
|     srcyaml_write_node_details '' '' | ||||
| } | ||||
|  | ||||
| yaml_write_package() { | ||||
|     local singlevalued=(pkgdesc url install changelog) | ||||
|     local multivalued=(arch groups license checkdepends depends optdepends | ||||
|                        provides conflicts replaces options backup) | ||||
| srcyaml_write_package() { | ||||
|     local singlevalued=( | ||||
|         pkgdesc | ||||
|         url | ||||
|         install | ||||
|         changelog | ||||
|     ) | ||||
|     local multivalued=( | ||||
|         arch | ||||
|         groups | ||||
|         license | ||||
|         checkdepends | ||||
|         depends | ||||
|         optdepends | ||||
|         provides | ||||
|         conflicts | ||||
|         replaces | ||||
|         options | ||||
|         backup | ||||
|     ) | ||||
|  | ||||
|     Yaml+=$(write_yaml_map 0 "pkgnames") | ||||
|     for pkg in "${pkgname[@]}"; do | ||||
|         Yaml+=$(write_yaml_seq_map 2 "pkgname" "$pkg") | ||||
|         srcyaml_write_section_details "$pkg" | ||||
|     done | ||||
|     srcyaml_write_node_details "$1" "$2" | ||||
| } | ||||
|  | ||||
| write_srcyaml() { | ||||
|     Yaml=$(write_yaml_header) | ||||
|     yaml_write_global | ||||
|     yaml_write_package | ||||
|     yq -n '"---"' > "${YAML}" | ||||
|  | ||||
| #     local version | ||||
| #     version=$(get_full_version) | ||||
| #     Yaml+=$(write_yaml_map 2 "version" "${version}") | ||||
|     local ver | ||||
|     ver=$(get_full_version) \ | ||||
|     yq -P '.version = env(ver)' -i "${YAML}" | ||||
|  | ||||
|     printf '%s\n' "${Yaml}" | ||||
|     # https://github.com/mikefarah/yq/issues/1836 | ||||
|     # yq '. head_comment="generated with artixpkg @buildtoolver@"' -i "${YAML}" | ||||
|  | ||||
|     local name=${pkgbase:-$pkgname} | ||||
|     name="$name" \ | ||||
|     yq -P '.pkgbase.name = env(name)' -i "${YAML}" | ||||
|     srcyaml_write_global | ||||
|  | ||||
|     local pn | ||||
|     local key | ||||
|     for ((i = 0 ; i < "${#pkgname[@]}" ; i++)); do | ||||
|         pn="${pkgname[$i]}" key=".pkgname[$i]" \ | ||||
|         yq -P 'eval(strenv(key)).name = env(pn)' -i "${YAML}" | ||||
|         srcyaml_write_package "${pkgname[$i]}" "$i" | ||||
|     done | ||||
|  | ||||
|     yq '. foot_comment="generated with artixpkg @buildtoolver@"' -i "${YAML}" | ||||
| } | ||||
|  | ||||
| # }}} | ||||
|  | ||||
| usage() { | ||||
|     printf 'Usage: %s [options]\n' "${0##*/}" | ||||
|     printf "    -o <out>      Out file (default: ${YAML})\n" | ||||
|     printf '    -h            This help\n' | ||||
|     printf '\n' | ||||
|     exit "$1" | ||||
| } | ||||
|  | ||||
| YAML=/tmp/srcinfo.yaml | ||||
|  | ||||
| # shellcheck source=config/makepkg/x86_64.conf | ||||
| load_makepkg_config | ||||
|  | ||||
| opts='h' | ||||
| opts='o:h' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         o) YAML="$OPTARG" ;; | ||||
|         h|?) usage 0 ;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| shift $(( OPTIND - 1 )) | ||||
| srcpath=$(readlink -f "$1") | ||||
|  | ||||
| # srcpath=$(readlink -f "$1") | ||||
|  | ||||
| [[ -z "$srcpath" ]] && srcpath="." | ||||
|  | ||||
| [[ -f "$srcpath"/PKGBUILD ]] || die "%s/PKGBUILD does not exist!" "$srcpath" | ||||
|  | ||||
|   | ||||
| @@ -6,14 +6,12 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/pkg/deploy.sh | ||||
| source "${LIBDIR}"/pkg/deploy.sh | ||||
| # shellcheck source=src/lib/pkg/util/deploy.sh | ||||
| source "${LIBDIR}"/pkg/util/deploy.sh | ||||
|  | ||||
| #{{{ deploy | ||||
|  | ||||
| @@ -22,6 +20,7 @@ add() { | ||||
|         msg "Found: %s" "${pkgfile}" | ||||
|         packages+=("${pkgname}") | ||||
|         action='add' | ||||
|         action_args+=(--include-sigs) | ||||
|         ln -sfv "${pkgfile}"{,.sig} "${repo_path}"/ | ||||
|     fi | ||||
| } | ||||
| @@ -32,19 +31,34 @@ remove(){ | ||||
|     # pkg removal will be done by a patched repo-remove honoring -R | ||||
| } | ||||
|  | ||||
| update_dbg() { | ||||
|     local rmp | ||||
|     rmp=${pkgname%"${PKGEXT}"} | ||||
|     rmp=${rmp%-*} | ||||
|     rmp=${rmp%-*} | ||||
|     rm -fv "${PKGDEST_DBG}/${rmp}"* | ||||
|     if pkgfile=$(find_cached_pkgfile "${pkgname}"); then | ||||
|         msg "Found: %s" "${pkgfile}" | ||||
|         ln -sfv "${pkgfile}" "${PKGDEST_DBG}"/ | ||||
|     fi | ||||
| } | ||||
|  | ||||
| repo_action() { | ||||
|     local repo_path | ||||
|     # shellcheck disable=SC2153 | ||||
|     repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH} | ||||
|  | ||||
|     local packages=() action func="$1" | ||||
|     for pkgname in "${passfiles[@]}"; do | ||||
|         "$func" | ||||
|     done | ||||
|     if ! "${dbg_pkg}"; then | ||||
|         ( cd "${repo_path}" || return | ||||
|             if [[ -n "${action}" ]]; then | ||||
|             repo-"${action}" -R "${dest_repo}.${db_ext}" "${packages[@]}" | ||||
|                 repo-"${action}" "${action_args[@]}" "${dest_repo}.${db_ext}" "${packages[@]}" | ||||
|             fi | ||||
|         ) | ||||
|     fi | ||||
| } | ||||
|  | ||||
| #}}} | ||||
| @@ -55,28 +69,32 @@ db_ext="db.tar.${DBEXT}" | ||||
|  | ||||
| add_pkg=false | ||||
| rm_pkg=false | ||||
| dbg_pkg=false | ||||
|  | ||||
| cmd=${0##*/} | ||||
| dest_repo=${cmd#*-} | ||||
| dest_repo=world #${cmd#*-} | ||||
| action_args=(-R) | ||||
|  | ||||
| usage() { | ||||
|     printf "Usage: %s [options]\n" "${cmd}" | ||||
|     printf '    -d <dest>          Destination repository\n' | ||||
|     printf '    -a                 Add package(s) to repository\n' | ||||
|     printf '    -r                 Remove package(s) from repository\n' | ||||
|     printf '    -u                 Update debug repository\n' | ||||
|     printf '    -h                 This help\n' | ||||
|     printf '\n' | ||||
|     printf '\n' | ||||
|     exit "$1" | ||||
| } | ||||
|  | ||||
| opts='arLRhd:' | ||||
| opts='uarhd:' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         d) dest_repo="$OPTARG" ;; | ||||
|         a) add_pkg=true; rm_pkg=false ;; | ||||
|         r) rm_pkg=true; add_pkg=false ;; | ||||
|         u) dbg_pkg=true ;; | ||||
|         h|?) usage 0 ;; | ||||
|     esac | ||||
| done | ||||
| @@ -86,10 +104,14 @@ shift $(( OPTIND - 1 )) | ||||
| passfiles=("$@") | ||||
|  | ||||
| if [[ -n "${passfiles[*]}" ]]; then | ||||
|     if ! "${dbg_pkg}"; then | ||||
|         if ${add_pkg}; then | ||||
|             repo_action add | ||||
|         fi | ||||
|         if ${rm_pkg}; then | ||||
|             repo_action remove | ||||
|         fi | ||||
|     else | ||||
|         repo_action update_dbg | ||||
|     fi | ||||
| fi | ||||
|   | ||||
| @@ -6,9 +6,10 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/pkg/deploy.sh | ||||
| source "${LIBDIR}"/pkg/deploy.sh | ||||
| # shellcheck source=src/lib/pkg/util/deploy.sh | ||||
| source "${LIBDIR}"/pkg/util/deploy.sh | ||||
|  | ||||
| # shellcheck source=config/makepkg/x86_64.conf | ||||
| load_makepkg_config | ||||
|  | ||||
| passfiles=("$@") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user