Compare commits
	
		
			31 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 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
 | 
					contrib/artixlinux
 | 
				
			||||||
build/
 | 
					build/
 | 
				
			||||||
tmp/
 | 
					tmp/
 | 
				
			||||||
 | 
					checks/
 | 
				
			||||||
 | 
					check.sh
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								Makefile
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
SHELL=/bin/bash
 | 
					SHELL=/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
V=0.31
 | 
					V=0.33
 | 
				
			||||||
BUILDTOOLVER ?= $(V)
 | 
					BUILDTOOLVER ?= $(V)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHROOTVER=0.12
 | 
					CHROOTVER=0.12
 | 
				
			||||||
@@ -32,17 +32,19 @@ MAKEPKG_CONFIGS=$(wildcard config/makepkg/*)
 | 
				
			|||||||
PACMAN_CONFIGS=$(wildcard config/pacman/*)
 | 
					PACMAN_CONFIGS=$(wildcard config/pacman/*)
 | 
				
			||||||
SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*)
 | 
					SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TOOLS_CONFIGS_BASE=$(wildcard config/conf/*base*)
 | 
					 | 
				
			||||||
TOOLS_CONFIGS_PKG=$(wildcard config/conf/*pkg*)
 | 
					TOOLS_CONFIGS_PKG=$(wildcard config/conf/*pkg*)
 | 
				
			||||||
TOOLS_CONFIGS_ISO=$(wildcard config/conf/*iso*)
 | 
					TOOLS_CONFIGS_ISO=$(wildcard config/conf/*iso*)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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_base: $(BINPROGS_BASE)
 | 
				
			||||||
binprogs_pkg: $(BINPROGS_PKG)
 | 
					binprogs_pkg: $(BINPROGS_PKG)
 | 
				
			||||||
binprogs_iso: $(BINPROGS_ISO)
 | 
					binprogs_iso: $(BINPROGS_ISO)
 | 
				
			||||||
library_base: $(LIBRARY_BASE)
 | 
					library_base: $(LIBRARY_BASE)
 | 
				
			||||||
library_pkg: $(LIBRARY_PKG)
 | 
					library_pkg: $(LIBRARY_PKG)
 | 
				
			||||||
library_iso: $(LIBRARY_ISO)
 | 
					library_iso: $(LIBRARY_ISO)
 | 
				
			||||||
 | 
					completion: $(COMPLETIONS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
edit = sed -e "s|@datadir[@]|$(DATADIR)|g" \
 | 
					edit = sed -e "s|@datadir[@]|$(DATADIR)|g" \
 | 
				
			||||||
	-e "s|@libdir[@]|$(LIBDIR)|g" \
 | 
						-e "s|@libdir[@]|$(LIBDIR)|g" \
 | 
				
			||||||
@@ -70,10 +72,11 @@ $(eval $(call buildInScript,build/bin,src/pkg/,.in,755))
 | 
				
			|||||||
$(eval $(call buildInScript,build/bin,src/iso/,.in,755))
 | 
					$(eval $(call buildInScript,build/bin,src/iso/,.in,755))
 | 
				
			||||||
$(eval $(call buildInScript,build/lib,src/lib/,,644))
 | 
					$(eval $(call buildInScript,build/lib,src/lib/,,644))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,.in,444)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
conf_base:
 | 
					conf_base:
 | 
				
			||||||
	@install -d $(BUILDDIR)/pacman.conf.d $(BUILDDIR)/artools
 | 
						@install -d $(BUILDDIR)/pacman.conf.d $(BUILDDIR)/artools
 | 
				
			||||||
	@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d
 | 
						@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d
 | 
				
			||||||
	@cp -a $(TOOLS_CONFIGS_BASE) $(BUILDDIR)/artools
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
conf_pkg:
 | 
					conf_pkg:
 | 
				
			||||||
	@install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/artools
 | 
						@install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/artools
 | 
				
			||||||
@@ -95,8 +98,6 @@ install_base: binprogs_base
 | 
				
			|||||||
	install -dm0755 $(DESTDIR)$(LIBDIR)
 | 
						install -dm0755 $(DESTDIR)$(LIBDIR)
 | 
				
			||||||
	cp -ra $(BUILDDIR)/lib/base $(DESTDIR)$(LIBDIR)
 | 
						cp -ra $(BUILDDIR)/lib/base $(DESTDIR)$(LIBDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for conf in $(notdir $(TOOLS_CONFIGS_BASE)); do install -Dm0644 $(BUILDDIR)/$(TOOLS)/$$conf $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)/$${conf##*/}; done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
 | 
						for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install_pkg: binprogs_pkg
 | 
					install_pkg: binprogs_pkg
 | 
				
			||||||
@@ -114,6 +115,8 @@ install_pkg: binprogs_pkg
 | 
				
			|||||||
	for a in $(SETARCH_ALIASES); do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done
 | 
						for a in $(SETARCH_ALIASES); do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done
 | 
				
			||||||
	ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides
 | 
						ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						install -Dm0644 $(BUILDDIR)/contrib/completion/bash/artixpkg $(DESTDIR)$(PREFIX)/share/bash-completion/completions/artixpkg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install_iso: binprogs_iso
 | 
					install_iso: binprogs_iso
 | 
				
			||||||
	install -dm0755 $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
 | 
						install -dm0755 $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
 | 
				
			||||||
	install -dm0755 $(DESTDIR)$(PREFIX)/bin
 | 
						install -dm0755 $(DESTDIR)$(PREFIX)/bin
 | 
				
			||||||
@@ -148,5 +151,5 @@ dist:
 | 
				
			|||||||
check: $(BINPROGS_SRC_BASE) $(BINPROGS_SRC_PKG) $(BINPROGS_SRC_ISO) config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto
 | 
					check: $(BINPROGS_SRC_BASE) $(BINPROGS_SRC_PKG) $(BINPROGS_SRC_ISO) config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto
 | 
				
			||||||
	shellcheck -x $^
 | 
						shellcheck -x $^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: all binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso clean install install_base install_pkg install_iso uninstall dist check
 | 
					.PHONY: all binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso clean install install_base install_pkg install_iso uninstall dist check contrib
 | 
				
			||||||
.DELETE_ON_ERROR:
 | 
					.DELETE_ON_ERROR:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								README.md
									
									
									
									
									
								
							@@ -45,21 +45,22 @@ artools
 | 
				
			|||||||
  * libisoburn
 | 
					  * libisoburn
 | 
				
			||||||
  * mtools
 | 
					  * mtools
 | 
				
			||||||
  * squashfs-tools
 | 
					  * squashfs-tools
 | 
				
			||||||
 | 
					  * go-yq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Configuration
 | 
					#### Configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
artools-{base,pkg,iso}.conf are the configuration files for artools.
 | 
					artools-{pkg,iso}.conf are the configuration files for artools.
 | 
				
			||||||
By default, the config files are installed in
 | 
					By default, the config files are installed in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
/etc/artools/artools-{base,pkg,iso}.conf
 | 
					/etc/artools/artools-{pkg,iso}.conf
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
A user artools-{base,pkg,iso}.conf can be placed in
 | 
					A user artools-{pkg,iso}.conf can be placed in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
$HOME/.config/artools/artools-{base,pkg,iso}.conf
 | 
					$HOME/.config/artools/artools-{pkg,iso}.conf
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If the userconfig is present, artools will load the userconfig values, however, if variables have been set in the systemwide
 | 
					If the userconfig is present, artools will load the userconfig values, however, if variables have been set in the systemwide
 | 
				
			||||||
@@ -68,8 +69,8 @@ These values take precedence over the userconfig.
 | 
				
			|||||||
Best practise is to leave systemwide file untouched.
 | 
					Best practise is to leave systemwide file untouched.
 | 
				
			||||||
By default it is commented and shows just initialization values done in code.
 | 
					By default it is commented and shows just initialization values done in code.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tools configuration is done in artools-{base,pkg,iso}.conf or by args.
 | 
					Tools configuration is done in artools-{pkg,iso}.conf or by args.
 | 
				
			||||||
Specifying args will override artools-{base,pkg,iso}.conf settings.
 | 
					Specifying args will override artools-{pkg,iso}.conf settings.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Both, pacman.conf and makepkg.conf for chroots are loaded from
 | 
					Both, pacman.conf and makepkg.conf for chroots are loaded from
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 ################
 | 
					################ artools-iso ################
 | 
				
			||||||
#############################################
 | 
					#############################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# the iso storage directory
 | 
					# default chroots dir where buildiso chroots are created
 | 
				
			||||||
 | 
					# CHROOTS_DIR=/var/lib/artools
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# default workspace directory
 | 
				
			||||||
 | 
					# WORKSPACE_DIR="${USER_HOME}/artools-workspace"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# default arch to build
 | 
				
			||||||
 | 
					# ARCH=$(uname -m)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# default pacman.conf to include
 | 
				
			||||||
 | 
					# possible values: {stable,gremlins,goblins}
 | 
				
			||||||
 | 
					# STABILITY="stable"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# default iso storage directory
 | 
				
			||||||
# ISO_POOL="${WORKSPACE_DIR}/iso"
 | 
					# ISO_POOL="${WORKSPACE_DIR}/iso"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# the dist release; default: auto
 | 
					# default dist release; default: auto
 | 
				
			||||||
# ISO_VERSION=$(date +%Y%m%d)
 | 
					# ISO_VERSION=$(date +%Y%m%d)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# possible values: openrc, runit, s6, suite66, dinit
 | 
					# default init system, possible values: openrc, runit, s6, suite66, dinit
 | 
				
			||||||
# INITSYS="openrc"
 | 
					# INITSYS="openrc"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# gpg key; leave empty or commented to skip img signing
 | 
					# gpg key; leave empty or commented to skip img signing
 | 
				
			||||||
# GPG_KEY=""
 | 
					# GPG_KEY=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# possible values: zstd (default), xz
 | 
					# default compression, possible values: zstd (default), xz
 | 
				
			||||||
# COMPRESSION="zstd"
 | 
					# COMPRESSION="zstd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# zstd only: range 1..22
 | 
					# default compression level, zstd only: range 1..22
 | 
				
			||||||
# COMPRESSION_LEVEL=15
 | 
					# COMPRESSION_LEVEL=15
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,9 +5,23 @@
 | 
				
			|||||||
################ artools-pkg ################
 | 
					################ artools-pkg ################
 | 
				
			||||||
#############################################
 | 
					#############################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# gitea user access token for buildtree
 | 
					# default chroots dir where buildpkg chroots are created
 | 
				
			||||||
 | 
					# CHROOTS_DIR=/var/lib/artools
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# default workspace directory
 | 
				
			||||||
 | 
					# WORKSPACE_DIR="${USER_HOME}/artools-workspace"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# default arch to build
 | 
				
			||||||
 | 
					# ARCH=$(uname -m)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# default pacman.conf repos to include
 | 
				
			||||||
 | 
					# possible values: {system,world,galaxy,lib32}{-gremlins,-goblins}
 | 
				
			||||||
 | 
					# REPO="world"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# gitea user access token for gitea api
 | 
				
			||||||
# GIT_TOKEN=''
 | 
					# GIT_TOKEN=''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# default workspace dir for artixpkg
 | 
				
			||||||
# TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux
 | 
					# TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# default repos root for deploypkg
 | 
					# default repos root for deploypkg
 | 
				
			||||||
@@ -18,3 +32,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# default packaging org
 | 
					# default packaging org
 | 
				
			||||||
# GIT_ORG='packages'
 | 
					# GIT_ORG='packages'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# default archiving org
 | 
				
			||||||
 | 
					# GIT_ORG_ARCHIVE='landfill'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#-- The package required by makepkg to download VCS sources
 | 
					#-- The package required by makepkg to download VCS sources
 | 
				
			||||||
#  Format: 'protocol::package'
 | 
					#  Format: 'protocol::package'
 | 
				
			||||||
VCSCLIENTS=('bzr::bzr'
 | 
					VCSCLIENTS=('bzr::breezy'
 | 
				
			||||||
            'fossil::fossil'
 | 
					            'fossil::fossil'
 | 
				
			||||||
            'git::git'
 | 
					            'git::git'
 | 
				
			||||||
            'hg::mercurial'
 | 
					            'hg::mercurial'
 | 
				
			||||||
@@ -41,10 +41,11 @@ CHOST="x86_64-pc-linux-gnu"
 | 
				
			|||||||
#-- Compiler and Linker Flags
 | 
					#-- Compiler and Linker Flags
 | 
				
			||||||
#CPPFLAGS=""
 | 
					#CPPFLAGS=""
 | 
				
			||||||
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
 | 
					CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
 | 
				
			||||||
        -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
 | 
					        -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \
 | 
				
			||||||
        -fstack-clash-protection -fcf-protection"
 | 
					        -fstack-clash-protection -fcf-protection"
 | 
				
			||||||
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
 | 
					CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
 | 
				
			||||||
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
 | 
					LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now \
 | 
				
			||||||
 | 
					         -Wl,-z,pack-relative-relocs"
 | 
				
			||||||
LTOFLAGS="-flto=auto"
 | 
					LTOFLAGS="-flto=auto"
 | 
				
			||||||
RUSTFLAGS=""
 | 
					RUSTFLAGS=""
 | 
				
			||||||
#-- Make Flags: change this for DistCC/SMP systems
 | 
					#-- Make Flags: change this for DistCC/SMP systems
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										115
									
								
								config/pacman/iso-goblins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								config/pacman/iso-goblins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,115 @@
 | 
				
			|||||||
 | 
					#
 | 
				
			||||||
 | 
					# /etc/pacman.conf
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# See the pacman.conf(5) manpage for option and repository directives
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# GENERAL OPTIONS
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					[options]
 | 
				
			||||||
 | 
					# The following paths are commented out with their default values listed.
 | 
				
			||||||
 | 
					# If you wish to use different paths, uncomment and update the paths.
 | 
				
			||||||
 | 
					#RootDir     = /
 | 
				
			||||||
 | 
					#DBPath      = /var/lib/pacman/
 | 
				
			||||||
 | 
					#CacheDir    = /var/cache/pacman/pkg/
 | 
				
			||||||
 | 
					#LogFile     = /var/log/pacman.log
 | 
				
			||||||
 | 
					#GPGDir      = /etc/pacman.d/gnupg/
 | 
				
			||||||
 | 
					#HookDir     = /etc/pacman.d/hooks/
 | 
				
			||||||
 | 
					HoldPkg     = pacman glibc
 | 
				
			||||||
 | 
					#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
 | 
				
			||||||
 | 
					#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
 | 
				
			||||||
 | 
					#CleanMethod = KeepInstalled
 | 
				
			||||||
 | 
					Architecture = auto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
 | 
				
			||||||
 | 
					#IgnorePkg   =
 | 
				
			||||||
 | 
					#IgnoreGroup =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#NoUpgrade   =
 | 
				
			||||||
 | 
					#NoExtract   =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Misc options
 | 
				
			||||||
 | 
					#UseSyslog
 | 
				
			||||||
 | 
					Color
 | 
				
			||||||
 | 
					#NoProgressBar
 | 
				
			||||||
 | 
					CheckSpace
 | 
				
			||||||
 | 
					VerbosePkgLists
 | 
				
			||||||
 | 
					ParallelDownloads = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# By default, pacman accepts packages signed by keys that its local keyring
 | 
				
			||||||
 | 
					# trusts (see pacman-key and its man page), as well as unsigned packages.
 | 
				
			||||||
 | 
					SigLevel    = Required DatabaseOptional
 | 
				
			||||||
 | 
					LocalFileSigLevel = Optional
 | 
				
			||||||
 | 
					#RemoteFileSigLevel = Required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# NOTE: You must run `pacman-key --init` before first using pacman; the local
 | 
				
			||||||
 | 
					# keyring can then be populated with the keys of all official Artix Linux
 | 
				
			||||||
 | 
					# packagers with `pacman-key --populate artix`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# REPOSITORIES
 | 
				
			||||||
 | 
					#   - can be defined here or included from another file
 | 
				
			||||||
 | 
					#   - pacman will search repositories in the order defined here
 | 
				
			||||||
 | 
					#   - local/custom mirrors can be added here or in separate files
 | 
				
			||||||
 | 
					#   - repositories listed first will take precedence when packages
 | 
				
			||||||
 | 
					#     have identical names, regardless of version number
 | 
				
			||||||
 | 
					#   - URLs will have $repo replaced by the name of the current repo
 | 
				
			||||||
 | 
					#   - URLs will have $arch replaced by the name of the architecture
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Repository entries are of the format:
 | 
				
			||||||
 | 
					#       [repo-name]
 | 
				
			||||||
 | 
					#       Server = ServerName
 | 
				
			||||||
 | 
					#       Include = IncludePath
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# The header [repo-name] is crucial - it must be present and
 | 
				
			||||||
 | 
					# uncommented to enable the repo.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The gremlins repositories are disabled by default. To enable, uncomment the
 | 
				
			||||||
 | 
					# repo name header and Include lines. You can add preferred servers immediately
 | 
				
			||||||
 | 
					# after the header, and they will be used before the default mirrors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[system-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
 | 
				
			||||||
							
								
								
									
										103
									
								
								config/pacman/iso-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								config/pacman/iso-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					#
 | 
				
			||||||
 | 
					# /etc/pacman.conf
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# See the pacman.conf(5) manpage for option and repository directives
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# GENERAL OPTIONS
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					[options]
 | 
				
			||||||
 | 
					# The following paths are commented out with their default values listed.
 | 
				
			||||||
 | 
					# If you wish to use different paths, uncomment and update the paths.
 | 
				
			||||||
 | 
					#RootDir     = /
 | 
				
			||||||
 | 
					#DBPath      = /var/lib/pacman/
 | 
				
			||||||
 | 
					#CacheDir    = /var/cache/pacman/pkg/
 | 
				
			||||||
 | 
					#LogFile     = /var/log/pacman.log
 | 
				
			||||||
 | 
					#GPGDir      = /etc/pacman.d/gnupg/
 | 
				
			||||||
 | 
					#HookDir     = /etc/pacman.d/hooks/
 | 
				
			||||||
 | 
					HoldPkg     = pacman glibc
 | 
				
			||||||
 | 
					#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
 | 
				
			||||||
 | 
					#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
 | 
				
			||||||
 | 
					#CleanMethod = KeepInstalled
 | 
				
			||||||
 | 
					Architecture = auto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
 | 
				
			||||||
 | 
					#IgnorePkg   =
 | 
				
			||||||
 | 
					#IgnoreGroup =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#NoUpgrade   =
 | 
				
			||||||
 | 
					#NoExtract   =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Misc options
 | 
				
			||||||
 | 
					#UseSyslog
 | 
				
			||||||
 | 
					Color
 | 
				
			||||||
 | 
					#NoProgressBar
 | 
				
			||||||
 | 
					CheckSpace
 | 
				
			||||||
 | 
					VerbosePkgLists
 | 
				
			||||||
 | 
					ParallelDownloads = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# By default, pacman accepts packages signed by keys that its local keyring
 | 
				
			||||||
 | 
					# trusts (see pacman-key and its man page), as well as unsigned packages.
 | 
				
			||||||
 | 
					SigLevel    = Required DatabaseOptional
 | 
				
			||||||
 | 
					LocalFileSigLevel = Optional
 | 
				
			||||||
 | 
					#RemoteFileSigLevel = Required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# NOTE: You must run `pacman-key --init` before first using pacman; the local
 | 
				
			||||||
 | 
					# keyring can then be populated with the keys of all official Artix Linux
 | 
				
			||||||
 | 
					# packagers with `pacman-key --populate artix`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# REPOSITORIES
 | 
				
			||||||
 | 
					#   - can be defined here or included from another file
 | 
				
			||||||
 | 
					#   - pacman will search repositories in the order defined here
 | 
				
			||||||
 | 
					#   - local/custom mirrors can be added here or in separate files
 | 
				
			||||||
 | 
					#   - repositories listed first will take precedence when packages
 | 
				
			||||||
 | 
					#     have identical names, regardless of version number
 | 
				
			||||||
 | 
					#   - URLs will have $repo replaced by the name of the current repo
 | 
				
			||||||
 | 
					#   - URLs will have $arch replaced by the name of the architecture
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Repository entries are of the format:
 | 
				
			||||||
 | 
					#       [repo-name]
 | 
				
			||||||
 | 
					#       Server = ServerName
 | 
				
			||||||
 | 
					#       Include = IncludePath
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# The header [repo-name] is crucial - it must be present and
 | 
				
			||||||
 | 
					# uncommented to enable the repo.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The gremlins repositories are disabled by default. To enable, uncomment the
 | 
				
			||||||
 | 
					# repo name header and Include lines. You can add preferred servers immediately
 | 
				
			||||||
 | 
					# after the header, and they will be used before the default mirrors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[system-gremlins]
 | 
				
			||||||
 | 
					Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[system]
 | 
				
			||||||
 | 
					Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[world-gremlins]
 | 
				
			||||||
 | 
					Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[world]
 | 
				
			||||||
 | 
					Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[galaxy-gremlins]
 | 
				
			||||||
 | 
					Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[galaxy]
 | 
				
			||||||
 | 
					Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# If you want to run 32 bit applications on your x86_64 system,
 | 
				
			||||||
 | 
					# enable the lib32 repositories as required here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# [lib32-gremlins]
 | 
				
			||||||
 | 
					# Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# [lib32]
 | 
				
			||||||
 | 
					# Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# An example of a custom package repository.  See the pacman manpage for
 | 
				
			||||||
 | 
					# tips on creating your own repositories.
 | 
				
			||||||
 | 
					#[custom]
 | 
				
			||||||
 | 
					#SigLevel = Optional TrustAll
 | 
				
			||||||
 | 
					#Server = file:///home/custompkgs
 | 
				
			||||||
							
								
								
									
										103
									
								
								config/pacman/iso-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								config/pacman/iso-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					#
 | 
				
			||||||
 | 
					# /etc/pacman.conf
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# See the pacman.conf(5) manpage for option and repository directives
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# GENERAL OPTIONS
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					[options]
 | 
				
			||||||
 | 
					# The following paths are commented out with their default values listed.
 | 
				
			||||||
 | 
					# If you wish to use different paths, uncomment and update the paths.
 | 
				
			||||||
 | 
					#RootDir     = /
 | 
				
			||||||
 | 
					#DBPath      = /var/lib/pacman/
 | 
				
			||||||
 | 
					#CacheDir    = /var/cache/pacman/pkg/
 | 
				
			||||||
 | 
					#LogFile     = /var/log/pacman.log
 | 
				
			||||||
 | 
					#GPGDir      = /etc/pacman.d/gnupg/
 | 
				
			||||||
 | 
					#HookDir     = /etc/pacman.d/hooks/
 | 
				
			||||||
 | 
					HoldPkg     = pacman glibc
 | 
				
			||||||
 | 
					#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
 | 
				
			||||||
 | 
					#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
 | 
				
			||||||
 | 
					#CleanMethod = KeepInstalled
 | 
				
			||||||
 | 
					Architecture = auto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
 | 
				
			||||||
 | 
					#IgnorePkg   =
 | 
				
			||||||
 | 
					#IgnoreGroup =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#NoUpgrade   =
 | 
				
			||||||
 | 
					#NoExtract   =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Misc options
 | 
				
			||||||
 | 
					#UseSyslog
 | 
				
			||||||
 | 
					Color
 | 
				
			||||||
 | 
					#NoProgressBar
 | 
				
			||||||
 | 
					CheckSpace
 | 
				
			||||||
 | 
					VerbosePkgLists
 | 
				
			||||||
 | 
					ParallelDownloads = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# By default, pacman accepts packages signed by keys that its local keyring
 | 
				
			||||||
 | 
					# trusts (see pacman-key and its man page), as well as unsigned packages.
 | 
				
			||||||
 | 
					SigLevel    = Required DatabaseOptional
 | 
				
			||||||
 | 
					LocalFileSigLevel = Optional
 | 
				
			||||||
 | 
					#RemoteFileSigLevel = Required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# NOTE: You must run `pacman-key --init` before first using pacman; the local
 | 
				
			||||||
 | 
					# keyring can then be populated with the keys of all official Artix Linux
 | 
				
			||||||
 | 
					# packagers with `pacman-key --populate artix`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# REPOSITORIES
 | 
				
			||||||
 | 
					#   - can be defined here or included from another file
 | 
				
			||||||
 | 
					#   - pacman will search repositories in the order defined here
 | 
				
			||||||
 | 
					#   - local/custom mirrors can be added here or in separate files
 | 
				
			||||||
 | 
					#   - repositories listed first will take precedence when packages
 | 
				
			||||||
 | 
					#     have identical names, regardless of version number
 | 
				
			||||||
 | 
					#   - URLs will have $repo replaced by the name of the current repo
 | 
				
			||||||
 | 
					#   - URLs will have $arch replaced by the name of the architecture
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Repository entries are of the format:
 | 
				
			||||||
 | 
					#       [repo-name]
 | 
				
			||||||
 | 
					#       Server = ServerName
 | 
				
			||||||
 | 
					#       Include = IncludePath
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# The header [repo-name] is crucial - it must be present and
 | 
				
			||||||
 | 
					# uncommented to enable the repo.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The gremlins repositories are disabled by default. To enable, uncomment the
 | 
				
			||||||
 | 
					# repo name header and Include lines. You can add preferred servers immediately
 | 
				
			||||||
 | 
					# after the header, and they will be used before the default mirrors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# [system-gremlins]
 | 
				
			||||||
 | 
					# Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[system]
 | 
				
			||||||
 | 
					Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# [world-gremlins]
 | 
				
			||||||
 | 
					# Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[world]
 | 
				
			||||||
 | 
					Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# [galaxy-gremlins]
 | 
				
			||||||
 | 
					# Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[galaxy]
 | 
				
			||||||
 | 
					Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# If you want to run 32 bit applications on your x86_64 system,
 | 
				
			||||||
 | 
					# enable the lib32 repositories as required here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# [lib32-gremlins]
 | 
				
			||||||
 | 
					# Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# [lib32]
 | 
				
			||||||
 | 
					# Include = /etc/pacman.d/mirrorlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# An example of a custom package repository.  See the pacman manpage for
 | 
				
			||||||
 | 
					# tips on creating your own repositories.
 | 
				
			||||||
 | 
					#[custom]
 | 
				
			||||||
 | 
					#SigLevel = Optional TrustAll
 | 
				
			||||||
 | 
					#Server = file:///home/custompkgs
 | 
				
			||||||
							
								
								
									
										291
									
								
								contrib/completion/bash/artixpkg.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										291
									
								
								contrib/completion/bash/artixpkg.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,291 @@
 | 
				
			|||||||
 | 
					#/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LIBDIR=${LIBDIR:-'@libdir@'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_artixpkg_pkgbase() {
 | 
				
			||||||
 | 
					    source "${LIBDIR}"/pkg/git/config.sh
 | 
				
			||||||
 | 
					    source "${LIBDIR}"/pkg/util.sh
 | 
				
			||||||
 | 
					    ls -1 "${TREE_DIR_ARTIX}" | tr '\n' ' '
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_artixpkg_completion() {
 | 
				
			||||||
 | 
					    local cur prev comps comps_all repos autorepos teams agents cwords comp_cword_exflag
 | 
				
			||||||
 | 
					    source "${LIBDIR}"/pkg/db/db.sh 2>/dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cur="${COMP_WORDS[COMP_CWORD]}"
 | 
				
			||||||
 | 
					    prev="${COMP_WORDS[COMP_CWORD-1]}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for ((i = COMP_CWORD - 1; i >= 0; i--)); do
 | 
				
			||||||
 | 
					        if [[ ${COMP_WORDS[i]} != -* ]]; then
 | 
				
			||||||
 | 
					            last_non_flag_word="${COMP_WORDS[i]}"
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    comps=""
 | 
				
			||||||
 | 
					    comps_all=""
 | 
				
			||||||
 | 
					    comp_cword_exflag=0
 | 
				
			||||||
 | 
					    for ((i = 0; i < ${#COMP_WORDS[@]} - 1; i++)); do
 | 
				
			||||||
 | 
					        word="${COMP_WORDS[i]}"
 | 
				
			||||||
 | 
					        comps_all+=" $word"
 | 
				
			||||||
 | 
					        if [[ $word != -* ]]; then
 | 
				
			||||||
 | 
					            comps+=" $word"
 | 
				
			||||||
 | 
					            ((comp_cword_exflag++))
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    comps="${comps:1}"
 | 
				
			||||||
 | 
					    comps_all="${comps_all:1}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    repos=""
 | 
				
			||||||
 | 
					    for word in "${ARTIX_DB[@]}"; do
 | 
				
			||||||
 | 
					        if [[ $word != -* ]]; then
 | 
				
			||||||
 | 
					            repos+=" $word"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    repos="${repos:1}"
 | 
				
			||||||
 | 
					    autorepos=""
 | 
				
			||||||
 | 
					    for word in "${ARTIX_DB_MAP[@]}"; do
 | 
				
			||||||
 | 
					        if [[ $word != -* ]]; then
 | 
				
			||||||
 | 
					            autorepos+=" $word"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    autorepos="${autorepos:1}"
 | 
				
			||||||
 | 
					    teams=""
 | 
				
			||||||
 | 
					    for word in "${ARTIX_TEAMS[@]}"; do
 | 
				
			||||||
 | 
					        if [[ $word != -* ]]; then
 | 
				
			||||||
 | 
					            teams+=" $word"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    teams="${teams:1}"
 | 
				
			||||||
 | 
					    agents=""
 | 
				
			||||||
 | 
					    for word in "${AGENTS[@]}"; do
 | 
				
			||||||
 | 
					        if [[ $word != -* ]]; then
 | 
				
			||||||
 | 
					            agents+=" $word"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    agents="${agents:1}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case "${comp_cword_exflag}" in
 | 
				
			||||||
 | 
					        1)
 | 
				
			||||||
 | 
					            COMPREPLY=($(compgen -W "admin ci git repo version -h --help" -- "${cur}"))
 | 
				
			||||||
 | 
					            return 0
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        2)
 | 
				
			||||||
 | 
					            case ${prev} in
 | 
				
			||||||
 | 
					                admin)
 | 
				
			||||||
 | 
					                    COMPREPLY=($(compgen -W "query team topic transfer -h --help" -- ${cur}))
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                ci)
 | 
				
			||||||
 | 
					                    COMPREPLY=($(compgen -W "config -h --help" -- ${cur}))
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                git)
 | 
				
			||||||
 | 
					                    COMPREPLY=($(compgen -W "clone config create pull push -h --help" -- ${cur}))
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                repo)
 | 
				
			||||||
 | 
					                    COMPREPLY=($(compgen -W "add remove move import show -h --help" -- ${cur}))
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                version)
 | 
				
			||||||
 | 
					                    COMPREPLY=($(compgen -W "-h --help" -- ${cur}))
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					            esac
 | 
				
			||||||
 | 
					            ;;  
 | 
				
			||||||
 | 
					        *)
 | 
				
			||||||
 | 
					            case "${comps}" in
 | 
				
			||||||
 | 
					                "artixpkg repo add"*)
 | 
				
			||||||
 | 
					                    local repoAddCommon="-p --push -r --rebuild -n --nocheck -h --help"
 | 
				
			||||||
 | 
					                    case "${comp_cword_exflag}" in
 | 
				
			||||||
 | 
					                        3)
 | 
				
			||||||
 | 
					                            case "${comps_all}" in
 | 
				
			||||||
 | 
					                                *-m*|*--manual*)
 | 
				
			||||||
 | 
					                                    COMPREPLY=($(compgen -W "$repoAddCommon $repos" -- ${cur}))
 | 
				
			||||||
 | 
					                                    ;;
 | 
				
			||||||
 | 
					                                *)
 | 
				
			||||||
 | 
					                                    COMPREPLY=($(compgen -W "-m --manual $repoAddCommon $autorepos" -- ${cur}))
 | 
				
			||||||
 | 
					                                    ;;
 | 
				
			||||||
 | 
					                            esac
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "$repoAddCommon $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg repo remove"*)
 | 
				
			||||||
 | 
					                    case "${comp_cword_exflag}" in
 | 
				
			||||||
 | 
					                        3)
 | 
				
			||||||
 | 
					                            case "${comps_all}" in
 | 
				
			||||||
 | 
					                                *-m*|*--manual*)
 | 
				
			||||||
 | 
					                                    COMPREPLY=($(compgen -W "-p --push -h --help $autorepos" -- ${cur}))
 | 
				
			||||||
 | 
					                                    ;;
 | 
				
			||||||
 | 
					                                *)
 | 
				
			||||||
 | 
					                                    COMPREPLY=($(compgen -W "-m --manual -p --push -h --help $repos" -- ${cur}))
 | 
				
			||||||
 | 
					                                    ;;
 | 
				
			||||||
 | 
					                            esac
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "-p --push -h --help $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg repo move"*)
 | 
				
			||||||
 | 
					                    case "${comp_cword_exflag}" in
 | 
				
			||||||
 | 
					                        3|4)
 | 
				
			||||||
 | 
					                            case "${comps_all}" in
 | 
				
			||||||
 | 
					                                *-m*|*--manual*)
 | 
				
			||||||
 | 
					                                    COMPREPLY=($(compgen -W "-p --push -h --help $autorepos" -- ${cur}))
 | 
				
			||||||
 | 
					                                    ;;
 | 
				
			||||||
 | 
					                                *)
 | 
				
			||||||
 | 
					                                    COMPREPLY=($(compgen -W "-m --manual -p --push -h --help $repos" -- ${cur}))
 | 
				
			||||||
 | 
					                                    ;;
 | 
				
			||||||
 | 
					                            esac
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "-p --push -h --help $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg repo import"*)
 | 
				
			||||||
 | 
					                    case "${prev}" in
 | 
				
			||||||
 | 
					                        "--tag")
 | 
				
			||||||
 | 
					                            # this flag expects a parameter
 | 
				
			||||||
 | 
					                            COMPREPLY=()
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "--del -h --help --tag $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg repo show")
 | 
				
			||||||
 | 
					                    COMPREPLY=($(compgen -W "-b --base -p --pkgs -h --help" -- ${cur}))
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg git clone"*)
 | 
				
			||||||
 | 
					                    case "${prev}" in
 | 
				
			||||||
 | 
					                        "-a"|"--agent")
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "$agents" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        "--protocol")
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "https" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        "-t"|"--team")
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "$teams" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        "-m"|"--maintainer"|"-s"|"--search"|"-t"|"--team"|"-j"|"--jobs")
 | 
				
			||||||
 | 
					                            # these flags expect a parameter
 | 
				
			||||||
 | 
					                            COMPREPLY=()
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "-m --maintainer --protocol -s --search -t --team -a --agent -j --jobs --all -h --help" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg git config"*)
 | 
				
			||||||
 | 
					                    case "${prev}" in
 | 
				
			||||||
 | 
					                        "--protocol")
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "https" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        "-j"|"--jobs")
 | 
				
			||||||
 | 
					                            # these flags expect a parameter
 | 
				
			||||||
 | 
					                            COMPREPLY=()
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "--protocol -j --jobs -h --help $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg git create"*)
 | 
				
			||||||
 | 
					                    case "${prev}" in
 | 
				
			||||||
 | 
					                        "-a"|"--agent")
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "$agents" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        "-t"|"--team")
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "$teams" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "-c --clone -a --agent -t --team -h --help" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg git pull"*)
 | 
				
			||||||
 | 
					                    case "${prev}" in
 | 
				
			||||||
 | 
					                        "-t"|"--topic"|"-m"|"--maintainer"|"-j"|"--jobs")
 | 
				
			||||||
 | 
					                            # these flags expect a parameter
 | 
				
			||||||
 | 
					                            COMPREPLY=()
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            case "${comps_all}" in
 | 
				
			||||||
 | 
					                                *--all*)
 | 
				
			||||||
 | 
					                                    COMPREPLY=($(compgen -W "-m --maintainer -t --topic -j --jobs -h --help" -- ${cur}))
 | 
				
			||||||
 | 
					                                    ;;
 | 
				
			||||||
 | 
					                                *)
 | 
				
			||||||
 | 
					                                    COMPREPLY=($(compgen -W "-m --maintainer -t --topic -j --jobs --all -h --help $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                                    ;;
 | 
				
			||||||
 | 
					                            esac
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg git push"*)
 | 
				
			||||||
 | 
					                    case "${prev}" in
 | 
				
			||||||
 | 
					                        "-m"|"--maintainer"|"-t"|"--topic"|"-j"|"--jobs")
 | 
				
			||||||
 | 
					                            # this flag expects a parameter
 | 
				
			||||||
 | 
					                            COMPREPLY=()
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "-m --maintainer -t --topic -j --jobs -h --help $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg ci config"*)
 | 
				
			||||||
 | 
					                    case "${prev}" in
 | 
				
			||||||
 | 
					                        "-j"|"--jobs")
 | 
				
			||||||
 | 
					                            # this flag expects a parameter
 | 
				
			||||||
 | 
					                            COMPREPLY=()
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        "-a"|"--agent")
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "$agents" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "-a --agent -s --switch -j --jobs -h --help $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg admin query"*)
 | 
				
			||||||
 | 
					                    case "${prev}" in
 | 
				
			||||||
 | 
					                        "-m"|"--maintainer"|"-t"|"--topic")
 | 
				
			||||||
 | 
					                            # this flag expects a parameter
 | 
				
			||||||
 | 
					                            COMPREPLY=()
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "-m --maintainer -t --topic -h --help $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg admin team"*)
 | 
				
			||||||
 | 
					                    case "${prev}" in
 | 
				
			||||||
 | 
					                        "-a"|"--add"|"-r"|"--remove")
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "$teams" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "-a --add -c --check -l --list -r --remove -h --help $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg admin topic"*)
 | 
				
			||||||
 | 
					                    case "${prev}" in
 | 
				
			||||||
 | 
					                        "-a"|"--add"|"-r"|"--remove"|"-j"|"--jobs")
 | 
				
			||||||
 | 
					                            # this flag expects a parameter
 | 
				
			||||||
 | 
					                            COMPREPLY=()
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                        *)
 | 
				
			||||||
 | 
					                            COMPREPLY=($(compgen -W "-a --add -r --remove -d --del -j --jobs -h --help $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                            ;;
 | 
				
			||||||
 | 
					                    esac
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					                "artixpkg admin transfer"*)
 | 
				
			||||||
 | 
					                    COMPREPLY=($(compgen -W "-h --help $(_artixpkg_pkgbase)" -- ${cur}))
 | 
				
			||||||
 | 
					                    ;;
 | 
				
			||||||
 | 
					            esac
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					    esac
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					complete -F _artixpkg_completion artixpkg
 | 
				
			||||||
							
								
								
									
										17
									
								
								contrib/iso/profile.conf.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								contrib/iso/profile.conf.example
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					################ install ################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# start services
 | 
				
			||||||
 | 
					# bluetoothd, cupsd, DM are added to the pkglist dynamicly
 | 
				
			||||||
 | 
					# metalog or syslog-ng is added to the pkglist dynamicly
 | 
				
			||||||
 | 
					# connmand or NetworkManager is added to the pkglist dynamicly
 | 
				
			||||||
 | 
					# only added if in array, these pkgs have no list entry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SERVICES=('acpid' 'bluetoothd' 'cronie' 'cupsd' 'metalog' 'connmand')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					################# live-session #################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# default value
 | 
				
			||||||
 | 
					# PASSWORD="artix"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Set to false to disable autologin in the live session
 | 
				
			||||||
 | 
					AUTOLOGIN="false"
 | 
				
			||||||
@@ -8,40 +8,81 @@ LIBDIR=${LIBDIR:-'@libdir@'}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/base/message.sh
 | 
					# shellcheck source=src/lib/base/message.sh
 | 
				
			||||||
source "${LIBDIR}"/base/message.sh
 | 
					source "${LIBDIR}"/base/message.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/chroot.sh
 | 
					 | 
				
			||||||
source "${LIBDIR}"/base/chroot.sh
 | 
					 | 
				
			||||||
# shellcheck source=src/lib/base/mount.sh
 | 
					# shellcheck source=src/lib/base/mount.sh
 | 
				
			||||||
source "${LIBDIR}"/base/mount.sh
 | 
					source "${LIBDIR}"/base/mount.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/base/unshare-mount.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/base/unshare-mount.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/base/chroot.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/base/chroot.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					artix-chroot() {
 | 
				
			||||||
 | 
					    check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}"
 | 
				
			||||||
 | 
					#     (( EUID == 0 )) || die 'This script must be run with root privileges'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [[ -d $chrootdir ]] || die "Can't create chroot on non-directory %s" "$chrootdir"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "$setup" "$chrootdir" || die "failed to setup chroot %s" "$chrootdir"
 | 
				
			||||||
 | 
					    if (( ! keepresolvconf )); then
 | 
				
			||||||
 | 
					        chroot_add_resolv_conf "$chrootdir" || die "failed to setup resolv.conf"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ! mountpoint -q "$chrootdir"; then
 | 
				
			||||||
 | 
					        warning "$chrootdir is not a mountpoint. This may have undesirable side effects."
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    chroot_args=()
 | 
				
			||||||
 | 
					    [[ $userspec ]] && chroot_args+=(--userspec "$userspec")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SHELL=/bin/bash $pid_unshare chroot "${chroot_args[@]}" -- "$chrootdir" "${args[@]}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
usage() {
 | 
					usage() {
 | 
				
			||||||
    printf 'usage: %s chroot-dir [command]\n' "${0##*/}"
 | 
					    cat <<EOF
 | 
				
			||||||
    printf '    -h             Print this help message\n'
 | 
					usage: ${0##*/} chroot-dir [command] [arguments...]
 | 
				
			||||||
    printf '\n'
 | 
					
 | 
				
			||||||
    printf "    If 'command' is unspecified, %s will launch /bin/sh.\n" "${0##*/}"
 | 
					    -h                  Print this help message
 | 
				
			||||||
    printf '\n'
 | 
					    -N                  Run in unshare mode as a regular user
 | 
				
			||||||
    printf '\n'
 | 
					    -u <user>[:group]   Specify non-root user and optional group to use
 | 
				
			||||||
    exit "$1"
 | 
					    -r                  Do not change the resolv.conf within the chroot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If 'command' is unspecified, ${0##*/} will launch /bin/bash.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that when using artix-chroot, the target chroot directory *should* be a
 | 
				
			||||||
 | 
					mountpoint. This ensures that tools such as pacman(8) or findmnt(8) have an
 | 
				
			||||||
 | 
					accurate hierarchy of the mounted filesystems within the chroot.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If your chroot target is not a mountpoint, you can bind mount the directory on
 | 
				
			||||||
 | 
					itself to make it a mountpoint, i.e. 'mount --bind /your/chroot /your/chroot'.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
orig_args=("$@")
 | 
					orig_args=("$@")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
opts=':h'
 | 
					opts=':hNu:r'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
while getopts ${opts} arg; do
 | 
					while getopts ${opts} arg; do
 | 
				
			||||||
    case "${arg}" in
 | 
					    case "${arg}" in
 | 
				
			||||||
        h|?) usage 0 ;;
 | 
					        h) usage; exit 0 ;;
 | 
				
			||||||
 | 
					        N) unshare=1 ;;
 | 
				
			||||||
 | 
					        u) userspec=$OPTARG ;;
 | 
				
			||||||
 | 
					        r) keepresolvconf=1 ;;
 | 
				
			||||||
 | 
					        :) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
 | 
				
			||||||
 | 
					        ?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
shift $(( OPTIND - 1 ))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}"
 | 
					(( $# )) || die 'No chroot directory specified'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chrootdir=$1
 | 
					chrootdir="$1"
 | 
				
			||||||
shift
 | 
					shift
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}"
 | 
					args=("$@")
 | 
				
			||||||
 | 
					if (( unshare )); then
 | 
				
			||||||
chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}"
 | 
					    setup=unshare_setup
 | 
				
			||||||
chroot_add_resolv_conf "${chrootdir}"
 | 
					    "$mount_unshare" bash -c "$(declare_all); artix-chroot"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "$@"
 | 
					    setup=chroot_setup
 | 
				
			||||||
 | 
					    artix-chroot
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,26 +18,50 @@ LIBDIR=${LIBDIR:-'@libdir@'}
 | 
				
			|||||||
source "${LIBDIR}"/base/message.sh
 | 
					source "${LIBDIR}"/base/message.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/mount.sh
 | 
					# shellcheck source=src/lib/base/mount.sh
 | 
				
			||||||
source "${LIBDIR}"/base/mount.sh
 | 
					source "${LIBDIR}"/base/mount.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/base/unshare-mount.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/base/unshare-mount.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/chroot.sh
 | 
					# shellcheck source=src/lib/base/chroot.sh
 | 
				
			||||||
source "${LIBDIR}"/base/chroot.sh
 | 
					source "${LIBDIR}"/base/chroot.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#{{{ functions
 | 
					#{{{ functions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
copy_mirrorlist(){
 | 
					basestrap() {
 | 
				
			||||||
    cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/"
 | 
					    check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}"
 | 
				
			||||||
}
 | 
					#     (( EUID == 0 )) || die 'This script must be run with root privileges'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
copy_keyring(){
 | 
					    # create obligatory directories
 | 
				
			||||||
    if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then
 | 
					    msg "Creating install root at %s" "$newroot"
 | 
				
			||||||
        cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/"
 | 
					    install -d -m755 "$newroot"/var/{cache/pacman/pkg,lib/pacman,log}
 | 
				
			||||||
 | 
					    install -d -m755 "$newroot"/{dev,run,etc/pacman.d}
 | 
				
			||||||
 | 
					    install -d -m1777 "$newroot"/tmp
 | 
				
			||||||
 | 
					    install -d -m555 "$newroot"/{sys,proc}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # mount API filesystems
 | 
				
			||||||
 | 
					    "$setup" "$newroot" || die "failed to setup chroot %s" "$newroot"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [[ ! -d $newroot/etc/pacman.d/gnupg ]]; then
 | 
				
			||||||
 | 
					        if (( initkeyring )); then
 | 
				
			||||||
 | 
					            pacman-key --gpgdir "$newroot"/etc/pacman.d/gnupg --init
 | 
				
			||||||
 | 
					        elif (( copykeyring )) && [[ -d /etc/pacman.d/gnupg ]]; then
 | 
				
			||||||
 | 
					            # if there's a keyring on the host, copy it into the new root
 | 
				
			||||||
 | 
					            cp -a --no-preserve=ownership /etc/pacman.d/gnupg "$newroot/etc/pacman.d/"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
create_min_fs(){
 | 
					    msg 'Installing packages to %s' "$newroot"
 | 
				
			||||||
    msg "Creating install root at %s" "$1"
 | 
					    if ! $pid_unshare pacman -r "$newroot" "${pacman_args[@]}"; then
 | 
				
			||||||
    mkdir -m 0755 -p "$1"/var/{cache/pacman/pkg,lib/pacman,log} "$1"/{dev,run,etc/pacman.d}
 | 
					        die 'Failed to install packages to new root'
 | 
				
			||||||
    mkdir -m 1777 -p "$1"/tmp
 | 
					    fi
 | 
				
			||||||
    mkdir -m 0555 -p "$1"/{sys,proc}
 | 
					
 | 
				
			||||||
 | 
					    if (( copymirrorlist )); then
 | 
				
			||||||
 | 
					        # install the host's mirrorlist onto the new root
 | 
				
			||||||
 | 
					        cp -a /etc/pacman.d/mirrorlist "$newroot/etc/pacman.d/"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (( copyconf )); then
 | 
				
			||||||
 | 
					        cp -a "$pacman_config" "$newroot/etc/pacman.conf"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#}}}
 | 
					#}}}
 | 
				
			||||||
@@ -46,77 +70,80 @@ newroot=/mnt
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
hostcache=0
 | 
					hostcache=0
 | 
				
			||||||
copykeyring=1
 | 
					copykeyring=1
 | 
				
			||||||
 | 
					initkeyring=0
 | 
				
			||||||
copymirrorlist=1
 | 
					copymirrorlist=1
 | 
				
			||||||
pacmode=-Sy
 | 
					pacmode=-Sy
 | 
				
			||||||
 | 
					pacman_args=()
 | 
				
			||||||
 | 
					unshare=0
 | 
				
			||||||
 | 
					copyconf=0
 | 
				
			||||||
 | 
					pacman_config=/etc/pacman.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
usage() {
 | 
					usage() {
 | 
				
			||||||
    printf "usage: %s [options] root [packages...]\n" "${0##*/}"
 | 
					  cat <<EOF
 | 
				
			||||||
    printf " -C <config>      Use an alternate config file for pacman\n"
 | 
					usage: ${0##*/} [options] root [packages...]
 | 
				
			||||||
    printf " -c               Use the package cache on the host, rather than the target\n"
 | 
					
 | 
				
			||||||
    printf " -G               Avoid copying the host's pacman keyring to the target\n"
 | 
					  Options:
 | 
				
			||||||
    printf " -i               Avoid auto-confirmation of package selections\n"
 | 
					    -C <config>    Use an alternate config file for pacman
 | 
				
			||||||
    printf " -M               Avoid copying the host's mirrorlist to the target\n"
 | 
					    -c             Use the package cache on the host, rather than the target
 | 
				
			||||||
    printf ' -U               Use pacman -U to install packages\n'
 | 
					    -D             Skip pacman dependency checks
 | 
				
			||||||
    printf " -h               Print this help message\n"
 | 
					    -G             Avoid copying the host's pacman keyring to the target
 | 
				
			||||||
    printf '\n'
 | 
					    -i             Prompt for package confirmation when needed (run interactively)
 | 
				
			||||||
    printf ' basestrap installs packages to the specified new root directory.\n'
 | 
					    -K             Initialize an empty pacman keyring in the target (implies '-G')
 | 
				
			||||||
    printf ' If no packages are given, basestrap defaults to the "base" group.\n'
 | 
					    -M             Avoid copying the host's mirrorlist to the target
 | 
				
			||||||
    printf '\n'
 | 
					    -N             Run in unshare mode as a regular user
 | 
				
			||||||
    printf '\n'
 | 
					    -P             Copy the host's pacman config to the target
 | 
				
			||||||
    exit "$1"
 | 
					    -U             Use pacman -U to install packages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    -h             Print this help message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basestrap installs packages to the specified new root directory. If no packages
 | 
				
			||||||
 | 
					are given, basestrap defaults to the "base" group.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
orig_args=("$@")
 | 
					orig_args=("$@")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
opts=':C:cGiMU'
 | 
					opts=':C:cDGiKMNPU'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
while getopts ${opts} arg; do
 | 
					while getopts ${opts} arg; do
 | 
				
			||||||
    case "${arg}" in
 | 
					    case "${arg}" in
 | 
				
			||||||
        C) pacman_conf=$OPTARG ;;
 | 
					        C) pacman_config=$OPTARG ;;
 | 
				
			||||||
 | 
					        D) pacman_args+=(-dd) ;;
 | 
				
			||||||
        c) hostcache=1 ;;
 | 
					        c) hostcache=1 ;;
 | 
				
			||||||
        i) interactive=1 ;;
 | 
					        i) interactive=1 ;;
 | 
				
			||||||
        G) copykeyring=0 ;;
 | 
					        G) copykeyring=0 ;;
 | 
				
			||||||
 | 
					        K) initkeyring=1 ;;
 | 
				
			||||||
        M) copymirrorlist=0 ;;
 | 
					        M) copymirrorlist=0 ;;
 | 
				
			||||||
 | 
					        N) unshare=1 ;;
 | 
				
			||||||
 | 
					        P) copyconf=1 ;;
 | 
				
			||||||
        U) pacmode=-U ;;
 | 
					        U) pacmode=-U ;;
 | 
				
			||||||
        h|?) usage 0 ;;
 | 
					        :) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
 | 
				
			||||||
 | 
					        ?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
shift $(( OPTIND - 1 ))
 | 
					shift $(( OPTIND - 1 ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
(( $# )) || die "No root directory specified"
 | 
					(( $# )) || die "No root directory specified"
 | 
				
			||||||
newroot=$1; shift
 | 
					newroot=$1; shift
 | 
				
			||||||
pacman_args=("${@:-base}")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if (( ! hostcache ));then
 | 
					 | 
				
			||||||
    pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg")
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if (( ! interactive )); then
 | 
					 | 
				
			||||||
    pacman_args+=(--noconfirm)
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[ -n $pacman_conf ]] && pacman_args+=(--config="$pacman_conf")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[ -d $newroot ]] || die "%s is not a directory" "$newroot"
 | 
					[[ -d $newroot ]] || die "%s is not a directory" "$newroot"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# create obligatory directories
 | 
					pacman_args+=("$pacmode" "${@:-base}" --config="$pacman_config")
 | 
				
			||||||
create_min_fs "$newroot"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# mount API filesystems
 | 
					if (( ! hostcache )); then
 | 
				
			||||||
chroot_api_mount "$newroot" || die "failed to setup API filesystems in new root"
 | 
					  pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg")
 | 
				
			||||||
 | 
					 | 
				
			||||||
if (( copykeyring ));then
 | 
					 | 
				
			||||||
    copy_keyring "$newroot"
 | 
					 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg2 'Installing packages to %s' "$newroot"
 | 
					if (( ! interactive )); then
 | 
				
			||||||
if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then
 | 
					  pacman_args+=(--noconfirm)
 | 
				
			||||||
    die 'Failed to install packages to new root'
 | 
					 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (( unshare )); then
 | 
				
			||||||
if (( copymirrorlist ));then
 | 
					    setup=unshare_setup
 | 
				
			||||||
    copy_mirrorlist "$newroot"
 | 
					    "$mount_unshare" bash -c "$(declare_all); basestrap"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    setup=chroot_setup
 | 
				
			||||||
 | 
					    basestrap
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,10 +12,12 @@ source "${LIBDIR}"/base/message.sh
 | 
				
			|||||||
#{{{ filesystems
 | 
					#{{{ filesystems
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare -A pseudofs_types=([anon_inodefs]=1
 | 
					declare -A pseudofs_types=([anon_inodefs]=1
 | 
				
			||||||
 | 
					                        [apparmorfs]=1
 | 
				
			||||||
                        [autofs]=1
 | 
					                        [autofs]=1
 | 
				
			||||||
                        [bdev]=1
 | 
					                        [bdev]=1
 | 
				
			||||||
                        [bpf]=1
 | 
					                        [binder]=1
 | 
				
			||||||
                        [binfmt_misc]=1
 | 
					                        [binfmt_misc]=1
 | 
				
			||||||
 | 
					                        [bpf]=1
 | 
				
			||||||
                        [cgroup]=1
 | 
					                        [cgroup]=1
 | 
				
			||||||
                        [cgroup2]=1
 | 
					                        [cgroup2]=1
 | 
				
			||||||
                        [configfs]=1
 | 
					                        [configfs]=1
 | 
				
			||||||
@@ -25,31 +27,55 @@ declare -A pseudofs_types=([anon_inodefs]=1
 | 
				
			|||||||
                        [devpts]=1
 | 
					                        [devpts]=1
 | 
				
			||||||
                        [devtmpfs]=1
 | 
					                        [devtmpfs]=1
 | 
				
			||||||
                        [dlmfs]=1
 | 
					                        [dlmfs]=1
 | 
				
			||||||
 | 
					                        [dmabuf]=1
 | 
				
			||||||
 | 
					                        [drm]=1
 | 
				
			||||||
                        [efivarfs]=1
 | 
					                        [efivarfs]=1
 | 
				
			||||||
 | 
					                        [fuse]=1
 | 
				
			||||||
 | 
					                        [fuse.archivemount]=1
 | 
				
			||||||
 | 
					                        [fuse.avfsd]=1
 | 
				
			||||||
 | 
					                        [fuse.dumpfs]=1
 | 
				
			||||||
 | 
					                        [fuse.encfs]=1
 | 
				
			||||||
                        [fuse.gvfs-fuse-daemon]=1
 | 
					                        [fuse.gvfs-fuse-daemon]=1
 | 
				
			||||||
 | 
					                        [fuse.gvfsd-fuse]=1
 | 
				
			||||||
 | 
					                        [fuse.lxcfs]=1
 | 
				
			||||||
 | 
					                        [fuse.rofiles-fuse]=1
 | 
				
			||||||
 | 
					                        [fuse.vmware-vmblock]=1
 | 
				
			||||||
 | 
					                        [fuse.xwmfs]=1
 | 
				
			||||||
                        [fusectl]=1
 | 
					                        [fusectl]=1
 | 
				
			||||||
                        [hugetlbfs]=1
 | 
					                        [hugetlbfs]=1
 | 
				
			||||||
 | 
					                        [ipathfs]=1
 | 
				
			||||||
                        [mqueue]=1
 | 
					                        [mqueue]=1
 | 
				
			||||||
                        [nfsd]=1
 | 
					                        [nfsd]=1
 | 
				
			||||||
                        [none]=1
 | 
					                        [none]=1
 | 
				
			||||||
 | 
					                        [nsfs]=1
 | 
				
			||||||
 | 
					                        [overlay]=1
 | 
				
			||||||
                        [pipefs]=1
 | 
					                        [pipefs]=1
 | 
				
			||||||
                        [proc]=1
 | 
					                        [proc]=1
 | 
				
			||||||
                        [pstore]=1
 | 
					                        [pstore]=1
 | 
				
			||||||
                        [ramfs]=1
 | 
					                        [ramfs]=1
 | 
				
			||||||
 | 
					                        [resctrl]=1
 | 
				
			||||||
                        [rootfs]=1
 | 
					                        [rootfs]=1
 | 
				
			||||||
                        [rpc_pipefs]=1
 | 
					                        [rpc_pipefs]=1
 | 
				
			||||||
                        [securityfs]=1
 | 
					                        [securityfs]=1
 | 
				
			||||||
 | 
					                        [selinuxfs]=1
 | 
				
			||||||
 | 
					                        [smackfs]=1
 | 
				
			||||||
                        [sockfs]=1
 | 
					                        [sockfs]=1
 | 
				
			||||||
                        [spufs]=1
 | 
					                        [spufs]=1
 | 
				
			||||||
                        [sysfs]=1
 | 
					                        [sysfs]=1
 | 
				
			||||||
                        [tmpfs]=1)
 | 
					                        [tmpfs]=1
 | 
				
			||||||
 | 
					                        [tracefs]=1
 | 
				
			||||||
 | 
					                        [vboxsf]=1
 | 
				
			||||||
 | 
					                        [virtiofs]=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare -A fsck_types=([cramfs]=1
 | 
					declare -A fsck_types=([btrfs]=0    # btrfs doesn't need a regular fsck utility
 | 
				
			||||||
 | 
					                    [cramfs]=1
 | 
				
			||||||
 | 
					                    [erofs]=1
 | 
				
			||||||
                    [exfat]=1
 | 
					                    [exfat]=1
 | 
				
			||||||
                    [ext2]=1
 | 
					                    [ext2]=1
 | 
				
			||||||
                    [ext3]=1
 | 
					                    [ext3]=1
 | 
				
			||||||
                    [ext4]=1
 | 
					                    [ext4]=1
 | 
				
			||||||
                    [ext4dev]=1
 | 
					                    [f2fs]=1
 | 
				
			||||||
 | 
					                    [fat]=1
 | 
				
			||||||
                    [jfs]=1
 | 
					                    [jfs]=1
 | 
				
			||||||
                    [minix]=1
 | 
					                    [minix]=1
 | 
				
			||||||
                    [msdos]=1
 | 
					                    [msdos]=1
 | 
				
			||||||
@@ -69,11 +95,15 @@ fstype_has_fsck() {
 | 
				
			|||||||
    (( fsck_types["$1"] ))
 | 
					    (( fsck_types["$1"] ))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					try_cast() (
 | 
				
			||||||
 | 
					    _=$(( $1#$2 ))
 | 
				
			||||||
 | 
					) 2>/dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
valid_number_of_base() {
 | 
					valid_number_of_base() {
 | 
				
			||||||
    local base=$1 len=${#2} i
 | 
					    local base="$1" len=${#2} i
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (( i = 0; i < len; i++ )); do
 | 
					    for (( i = 0; i < len; i++ )); do
 | 
				
			||||||
        { _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null
 | 
					        try_cast "$base" "${2:i:1}" || return 1
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0
 | 
					    return 0
 | 
				
			||||||
@@ -81,7 +111,6 @@ valid_number_of_base() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
mangle() {
 | 
					mangle() {
 | 
				
			||||||
    local i chr out
 | 
					    local i chr out
 | 
				
			||||||
 | 
					 | 
				
			||||||
    local {a..f}= {A..F}=
 | 
					    local {a..f}= {A..F}=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (( i = 0; i < ${#1}; i++ )); do
 | 
					    for (( i = 0; i < ${#1}; i++ )); do
 | 
				
			||||||
@@ -100,7 +129,6 @@ mangle() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
unmangle() {
 | 
					unmangle() {
 | 
				
			||||||
    local i chr out len=$(( ${#1} - 4 ))
 | 
					    local i chr out len=$(( ${#1} - 4 ))
 | 
				
			||||||
 | 
					 | 
				
			||||||
    local {a..f}= {A..F}=
 | 
					    local {a..f}= {A..F}=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (( i = 0; i < len; i++ )); do
 | 
					    for (( i = 0; i < len; i++ )); do
 | 
				
			||||||
@@ -127,7 +155,6 @@ dm_name_for_devnode() {
 | 
				
			|||||||
    else
 | 
					    else
 | 
				
			||||||
        # don't leave the caller hanging, just print the original name
 | 
					        # don't leave the caller hanging, just print the original name
 | 
				
			||||||
        # along with the failure.
 | 
					        # along with the failure.
 | 
				
			||||||
        print '%s' "$1"
 | 
					 | 
				
			||||||
        error 'Failed to resolve device mapper name for: %s' "$1"
 | 
					        error 'Failed to resolve device mapper name for: %s' "$1"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -185,19 +212,11 @@ optstring_append_option() {
 | 
				
			|||||||
    optstring_normalize "$1"
 | 
					    optstring_normalize "$1"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
optstring_prepend_option() {
 | 
					 | 
				
			||||||
    if ! optstring_has_option "$1" "$2"; then
 | 
					 | 
				
			||||||
        declare -g "$1=$2,${!1}"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    optstring_normalize "$1"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
optstring_get_option() {
 | 
					optstring_get_option() {
 | 
				
			||||||
    local opts o
 | 
					    local _opts o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    IFS=, read -ra opts <<<"${!1}"
 | 
					    IFS=, read -ra _opts <<<"${!1}"
 | 
				
			||||||
    for o in "${opts[@]}"; do
 | 
					    for o in "${_opts[@]}"; do
 | 
				
			||||||
        if optstring_match_option "$2" "$o"; then
 | 
					        if optstring_match_option "$2" "$o"; then
 | 
				
			||||||
            declare -g "$o"
 | 
					            declare -g "$o"
 | 
				
			||||||
            return 0
 | 
					            return 0
 | 
				
			||||||
@@ -214,7 +233,7 @@ optstring_has_option() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
write_source() {
 | 
					write_source() {
 | 
				
			||||||
    local src=$1 spec label uuid comment=()
 | 
					    local src="$1" spec label uuid comment=()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    label=$(lsblk -rno LABEL "$1" 2>/dev/null)
 | 
					    label=$(lsblk -rno LABEL "$1" 2>/dev/null)
 | 
				
			||||||
    uuid=$(lsblk -rno UUID "$1" 2>/dev/null)
 | 
					    uuid=$(lsblk -rno UUID "$1" 2>/dev/null)
 | 
				
			||||||
@@ -242,7 +261,7 @@ write_source() {
 | 
				
			|||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [[ -n "${comment[*]}" ]] && printf '# %s\n' "${comment[*]}"
 | 
					    [[ -n ${comment[*]} ]] && printf '# %s\n' "${comment[*]}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [[ $spec ]]; then
 | 
					    if [[ $spec ]]; then
 | 
				
			||||||
        printf '%-20s' "$bytag=$(mangle "$spec")"
 | 
					        printf '%-20s' "$bytag=$(mangle "$spec")"
 | 
				
			||||||
@@ -267,15 +286,27 @@ optstring_apply_quirks() {
 | 
				
			|||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case $fstype in
 | 
					    case $fstype in
 | 
				
			||||||
 | 
					        btrfs)
 | 
				
			||||||
 | 
					            # Having only one of subvol= and subvolid= is enough for mounting a btrfs subvolume
 | 
				
			||||||
 | 
					            # And having subvolid= set prevents things like 'snapper rollback' to work, as it
 | 
				
			||||||
 | 
					            # updates the subvolume in-place, leaving subvol= unchanged with a different subvolid.
 | 
				
			||||||
 | 
					            if optstring_has_option "$varname" subvol; then
 | 
				
			||||||
 | 
					                optstring_remove_option "$varname" subvolid
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
        f2fs)
 | 
					        f2fs)
 | 
				
			||||||
            # These are Kconfig options for f2fs. Kernels supporting the options will
 | 
					            # These are build-time or runtime-unchangeable options for f2fs.
 | 
				
			||||||
            # only provide the negative versions of these (e.g. noacl), and vice versa
 | 
					            # The former means that kernels supporting the options will only
 | 
				
			||||||
 | 
					            # provide the negative versions of these (e.g. noacl), and vice versa
 | 
				
			||||||
            # for kernels without support.
 | 
					            # for kernels without support.
 | 
				
			||||||
            optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr
 | 
					            # The latter means that the options can only be specified/changed
 | 
				
			||||||
 | 
					            # during the initial mount but not remount.
 | 
				
			||||||
 | 
					            optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr,atgc
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
        vfat)
 | 
					        vfat)
 | 
				
			||||||
            # Before Linux v3.8, "cp" is prepended to the value of the codepage.
 | 
					            # Before Linux v3.8, "cp" is prepended to the value of the codepage.
 | 
				
			||||||
            if optstring_get_option "$varname" codepage && [[ "$codepage" = cp* ]]; then
 | 
					            # shellcheck disable=SC2154
 | 
				
			||||||
 | 
					            if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]]; then
 | 
				
			||||||
                optstring_remove_option "$varname" codepage
 | 
					                optstring_remove_option "$varname" codepage
 | 
				
			||||||
                optstring_append_option "$varname" "codepage=${codepage#cp}"
 | 
					                optstring_append_option "$varname" "codepage=${codepage#cp}"
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
@@ -290,11 +321,12 @@ usage() {
 | 
				
			|||||||
usage: ${0##*/} [options] root
 | 
					usage: ${0##*/} [options] root
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Options:
 | 
					  Options:
 | 
				
			||||||
    -f FILTER      Restrict output to mountpoints matching the prefix FILTER
 | 
					    -f <filter>    Restrict output to mountpoints matching the prefix FILTER
 | 
				
			||||||
    -L             Use labels for source identifiers (shortcut for -t LABEL)
 | 
					    -L             Use labels for source identifiers (shortcut for -t LABEL)
 | 
				
			||||||
    -p             Exclude pseudofs mounts (default behavior)
 | 
					    -p             Exclude pseudofs mounts (default behavior)
 | 
				
			||||||
    -P             Include printing mounts
 | 
					    -P             Include pseudofs mounts
 | 
				
			||||||
    -t TAG         Use TAG for source identifiers
 | 
					    -t <tag>       Use TAG for source identifiers (TAG should be one of: LABEL,
 | 
				
			||||||
 | 
					                      UUID, PARTLABEL, PARTUUID)
 | 
				
			||||||
    -U             Use UUIDs for source identifiers (shortcut for -t UUID)
 | 
					    -U             Use UUIDs for source identifiers (shortcut for -t UUID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    -h             Print this help message
 | 
					    -h             Print this help message
 | 
				
			||||||
@@ -332,7 +364,6 @@ if ! mountpoint -q "$root"; then
 | 
				
			|||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# handle block devices
 | 
					# handle block devices
 | 
				
			||||||
findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root" |
 | 
					 | 
				
			||||||
while read -r src target fstype opts fsroot; do
 | 
					while read -r src target fstype opts fsroot; do
 | 
				
			||||||
    if (( !pseudofs )) && fstype_is_pseudofs "$fstype"; then
 | 
					    if (( !pseudofs )) && fstype_is_pseudofs "$fstype"; then
 | 
				
			||||||
        continue
 | 
					        continue
 | 
				
			||||||
@@ -360,6 +391,7 @@ while read -r src target fstype opts fsroot; do
 | 
				
			|||||||
    if [[ $fsroot != / && $fstype != btrfs ]]; then
 | 
					    if [[ $fsroot != / && $fstype != btrfs ]]; then
 | 
				
			||||||
        # it's a bind mount
 | 
					        # it's a bind mount
 | 
				
			||||||
        src=$(findmnt -funcevo TARGET "$src")$fsroot
 | 
					        src=$(findmnt -funcevo TARGET "$src")$fsroot
 | 
				
			||||||
 | 
					        src="/${src#"$root"/}"
 | 
				
			||||||
        if [[ $src -ef $target ]]; then
 | 
					        if [[ $src -ef $target ]]; then
 | 
				
			||||||
            # hrmm, this is weird. we're probably looking at a file or directory
 | 
					            # hrmm, this is weird. we're probably looking at a file or directory
 | 
				
			||||||
            # that was bound into a chroot from the host machine. Ignore it,
 | 
					            # that was bound into a chroot from the host machine. Ignore it,
 | 
				
			||||||
@@ -375,14 +407,14 @@ while read -r src target fstype opts fsroot; do
 | 
				
			|||||||
    # filesystem quirks
 | 
					    # filesystem quirks
 | 
				
			||||||
    case $fstype in
 | 
					    case $fstype in
 | 
				
			||||||
        fuseblk)
 | 
					        fuseblk)
 | 
				
			||||||
        # well-behaved FUSE filesystems will report themselves as fuse.$fstype.
 | 
					            # well-behaved FUSE filesystems will report themselves as fuse.$fstype.
 | 
				
			||||||
        # this is probably NTFS-3g, but let's just make sure.
 | 
					            # this is probably NTFS-3g, but let's just make sure.
 | 
				
			||||||
        if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then
 | 
					            if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then
 | 
				
			||||||
            # avoid blanking out fstype, leading to an invalid fstab
 | 
					                # avoid blanking out fstype, leading to an invalid fstab
 | 
				
			||||||
            error 'Failed to derive real filesystem type for FUSE device on %s' "$target"
 | 
					                error 'Failed to derive real filesystem type for FUSE device on %s' "$target"
 | 
				
			||||||
        else
 | 
					            else
 | 
				
			||||||
            fstype=$newtype
 | 
					                fstype=$newtype
 | 
				
			||||||
        fi
 | 
					            fi
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -393,7 +425,7 @@ while read -r src target fstype opts fsroot; do
 | 
				
			|||||||
    printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts"
 | 
					    printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts"
 | 
				
			||||||
    printf '\t%s %s' "$dump" "$pass"
 | 
					    printf '\t%s %s' "$dump" "$pass"
 | 
				
			||||||
    printf '\n\n'
 | 
					    printf '\n\n'
 | 
				
			||||||
done
 | 
					done < <(findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# handle swaps devices
 | 
					# handle swaps devices
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -409,6 +441,9 @@ done
 | 
				
			|||||||
        # skip files marked deleted by the kernel
 | 
					        # skip files marked deleted by the kernel
 | 
				
			||||||
        [[ $device = *'\040(deleted)' ]] && continue
 | 
					        [[ $device = *'\040(deleted)' ]] && continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # skip devices not part of the prefix
 | 
				
			||||||
 | 
					        [[ $device = "$prefixfilter"* ]] || continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if [[ $type = file ]]; then
 | 
					        if [[ $type = file ]]; then
 | 
				
			||||||
            printf '%-20s' "${device#"${root%/}"}"
 | 
					            printf '%-20s' "${device#"${root%/}"}"
 | 
				
			||||||
        elif [[ $device = /dev/dm-+([0-9]) ]]; then
 | 
					        elif [[ $device = /dev/dm-+([0-9]) ]]; then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,20 +6,16 @@ LIBDIR=${LIBDIR:-'@libdir@'}
 | 
				
			|||||||
DATADIR=${DATADIR:-'@datadir@'}
 | 
					DATADIR=${DATADIR:-'@datadir@'}
 | 
				
			||||||
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
 | 
					SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/base/util.sh
 | 
					 | 
				
			||||||
source "${LIBDIR}"/base/util.sh
 | 
					 | 
				
			||||||
# shellcheck source=src/lib/iso/util.sh
 | 
					# shellcheck source=src/lib/iso/util.sh
 | 
				
			||||||
source "${LIBDIR}"/iso/util.sh
 | 
					source "${LIBDIR}"/iso/util.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/message.sh
 | 
					# shellcheck source=src/lib/base/message.sh
 | 
				
			||||||
source "${LIBDIR}"/base/message.sh
 | 
					source "${LIBDIR}"/base/message.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/chroot.sh
 | 
					# shellcheck source=src/lib/base/chroot.sh
 | 
				
			||||||
source "${LIBDIR}"/base/chroot.sh
 | 
					source "${LIBDIR}"/base/chroot.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/mount.sh
 | 
					# shellcheck source=src/lib/iso/mount.sh
 | 
				
			||||||
source "${LIBDIR}"/iso/mount.sh
 | 
					source "${LIBDIR}"/iso/mount.sh
 | 
				
			||||||
# shellcheck source=src/lib/iso/services.sh
 | 
					# shellcheck source=src/lib/iso/services.sh
 | 
				
			||||||
source "${LIBDIR}"/iso/services.sh
 | 
					source "${LIBDIR}"/iso/services.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/yaml.sh
 | 
					 | 
				
			||||||
source "${LIBDIR}"/base/yaml.sh
 | 
					 | 
				
			||||||
# shellcheck source=src/lib/iso/calamares.sh
 | 
					# shellcheck source=src/lib/iso/calamares.sh
 | 
				
			||||||
source "${LIBDIR}"/iso/calamares.sh
 | 
					source "${LIBDIR}"/iso/calamares.sh
 | 
				
			||||||
# shellcheck source=src/lib/iso/config.sh
 | 
					# shellcheck source=src/lib/iso/config.sh
 | 
				
			||||||
@@ -92,9 +88,15 @@ make_rootfs() {
 | 
				
			|||||||
        msg "Prepare [Base installation] (rootfs)"
 | 
					        msg "Prepare [Base installation] (rootfs)"
 | 
				
			||||||
        local rootfs="${work_dir}/rootfs"
 | 
					        local rootfs="${work_dir}/rootfs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        load_pkgs "${root_list}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        prepare_dir "${rootfs}"
 | 
					        prepare_dir "${rootfs}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        basestrap "${basestrap_args[@]}" "${rootfs}" "${packages[@]}"
 | 
					        local args=()
 | 
				
			||||||
 | 
					        if "${copy_pacconf}"; then
 | 
				
			||||||
 | 
					            args+=(-P)
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        basestrap "${basestrap_args[@]}" "${args[@]}" "${rootfs}" "${packages[@]}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        copy_overlay "${root_overlay}" "${rootfs}"
 | 
					        copy_overlay "${root_overlay}" "${rootfs}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -113,6 +115,8 @@ make_livefs() {
 | 
				
			|||||||
        msg "Prepare [Live installation] (livefs)"
 | 
					        msg "Prepare [Live installation] (livefs)"
 | 
				
			||||||
        local livefs="${work_dir}/livefs"
 | 
					        local livefs="${work_dir}/livefs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        load_pkgs "${live_list}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        prepare_dir "${livefs}"
 | 
					        prepare_dir "${livefs}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mount_overlayfs "${livefs}" "${work_dir}"
 | 
					        mount_overlayfs "${livefs}" "${work_dir}"
 | 
				
			||||||
@@ -137,6 +141,8 @@ make_bootfs() {
 | 
				
			|||||||
    if [[ ! -e ${work_dir}/bootfs.lock ]]; then
 | 
					    if [[ ! -e ${work_dir}/bootfs.lock ]]; then
 | 
				
			||||||
        msg "Prepare [/iso/boot]"
 | 
					        msg "Prepare [/iso/boot]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        load_pkgs "${common_dir}/Packages-boot"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        prepare_dir "${iso_root}/boot"
 | 
					        prepare_dir "${iso_root}/boot"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}"
 | 
					        cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}"
 | 
				
			||||||
@@ -148,6 +154,7 @@ make_bootfs() {
 | 
				
			|||||||
        if "${use_dracut}"; then
 | 
					        if "${use_dracut}"; then
 | 
				
			||||||
            prepare_initramfs_dracut "${bootfs}"
 | 
					            prepare_initramfs_dracut "${bootfs}"
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
 | 
					            basestrap "${basestrap_args[@]}" "${bootfs}" "${packages[@]}"
 | 
				
			||||||
            prepare_initramfs_mkinitcpio "${bootfs}"
 | 
					            prepare_initramfs_mkinitcpio "${bootfs}"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -183,8 +190,8 @@ gen_iso_fn(){
 | 
				
			|||||||
    local vars=("artix") name
 | 
					    local vars=("artix") name
 | 
				
			||||||
    vars+=("${profile}")
 | 
					    vars+=("${profile}")
 | 
				
			||||||
    vars+=("${INITSYS}")
 | 
					    vars+=("${INITSYS}")
 | 
				
			||||||
    case "${repo}" in
 | 
					    case "${STABILITY}" in
 | 
				
			||||||
        *-gremlins|*-goblins) vars+=("${repo#*-}") ;;
 | 
					        gremlins|goblins) vars+=("${STABILITY}") ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
    vars+=("${ISO_VERSION}")
 | 
					    vars+=("${ISO_VERSION}")
 | 
				
			||||||
    vars+=("${arch}")
 | 
					    vars+=("${arch}")
 | 
				
			||||||
@@ -194,12 +201,22 @@ gen_iso_fn(){
 | 
				
			|||||||
    printf "%s\n" "$name"
 | 
					    printf "%s\n" "$name"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export_gpg_publickey() {
 | 
				
			||||||
 | 
					    key_export="${WORKSPACE_DIR}"/pubkey.gpg
 | 
				
			||||||
 | 
					    gpg --batch  --no-armor --output "${key_export}" --export "${GPG_KEY}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
prepare_build(){
 | 
					prepare_build(){
 | 
				
			||||||
    load_profile
 | 
					    load_profile
 | 
				
			||||||
 | 
					    local pac_conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pacman_conf="${DATADIR}/pacman.conf.d/${repo}-${arch}.conf"
 | 
					    pac_conf=iso-${arch}.conf
 | 
				
			||||||
    if [[ -f "${USER_CONF_DIR}/pacman.conf.d/${repo}-${arch}.conf" ]]; then
 | 
					    if [[ "${STABILITY}" != 'stable' ]]; then
 | 
				
			||||||
        pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${repo}-${arch}.conf"
 | 
					        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
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    iso_file=$(gen_iso_fn).iso
 | 
					    iso_file=$(gen_iso_fn).iso
 | 
				
			||||||
@@ -262,10 +279,8 @@ mk_boot(){
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mk_chroots(){
 | 
					mk_chroots(){
 | 
				
			||||||
    load_pkgs "${root_list}"
 | 
					 | 
				
			||||||
    run_safe "make_rootfs"
 | 
					    run_safe "make_rootfs"
 | 
				
			||||||
    if [[ -n ${live_list} ]]; then
 | 
					    if [[ -n ${live_list} ]]; then
 | 
				
			||||||
        load_pkgs "${live_list}"
 | 
					 | 
				
			||||||
        run_safe "make_livefs"
 | 
					        run_safe "make_livefs"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -322,11 +337,11 @@ persist=false
 | 
				
			|||||||
use_dracut=false
 | 
					use_dracut=false
 | 
				
			||||||
squash_only=false
 | 
					squash_only=false
 | 
				
			||||||
boot_only=false
 | 
					boot_only=false
 | 
				
			||||||
 | 
					copy_pacconf=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
basestrap_args=(-GMc)
 | 
					basestrap_args=(-GMc)
 | 
				
			||||||
cmd=${0##*/}
 | 
					cmd=${0##*/}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
repo=${REPO}
 | 
					 | 
				
			||||||
owner=${SUDO_USER:-$USER}
 | 
					owner=${SUDO_USER:-$USER}
 | 
				
			||||||
profile='base'
 | 
					profile='base'
 | 
				
			||||||
chroots_iso="${CHROOTS_DIR}/buildiso"
 | 
					chroots_iso="${CHROOTS_DIR}/buildiso"
 | 
				
			||||||
@@ -337,8 +352,8 @@ usage() {
 | 
				
			|||||||
    printf '    -p <profile>       Profile [default: %s]\n' "${profile}"
 | 
					    printf '    -p <profile>       Profile [default: %s]\n' "${profile}"
 | 
				
			||||||
    printf '    -r <dir>           Chroots directory\n'
 | 
					    printf '    -r <dir>           Chroots directory\n'
 | 
				
			||||||
    printf '                       [default: %s]\n' "${chroots_iso}"
 | 
					    printf '                       [default: %s]\n' "${chroots_iso}"
 | 
				
			||||||
    printf '    -R <repo>          Build repo\n'
 | 
					    printf '    -R <stability>     Build stability\n'
 | 
				
			||||||
    printf '                       [default: %s]\n' "${repo}"
 | 
					    printf '                       [default: %s]\n' "${STABILITY}"
 | 
				
			||||||
    printf '    -a <arch>          Build arch\n'
 | 
					    printf '    -a <arch>          Build arch\n'
 | 
				
			||||||
    printf '                       [default: %s]\n' "${arch}"
 | 
					    printf '                       [default: %s]\n' "${arch}"
 | 
				
			||||||
    printf '    -t <dir>           Target directory\n'
 | 
					    printf '    -t <dir>           Target directory\n'
 | 
				
			||||||
@@ -355,6 +370,7 @@ usage() {
 | 
				
			|||||||
    printf '    -z                 Generate iso only\n'
 | 
					    printf '    -z                 Generate iso only\n'
 | 
				
			||||||
    printf '                       Requires pre built images (-x)\n'
 | 
					    printf '                       Requires pre built images (-x)\n'
 | 
				
			||||||
    printf '    -d                 Use dracut instead of mkinitcpio for iso initramfs\n'
 | 
					    printf '    -d                 Use dracut instead of mkinitcpio for iso initramfs\n'
 | 
				
			||||||
 | 
					    printf '    -w                 Copy the pacman.conf used to the rootfs\n'
 | 
				
			||||||
    printf '    -q                 Query settings and pretend build\n'
 | 
					    printf '    -q                 Query settings and pretend build\n'
 | 
				
			||||||
    printf '    -h                 This help\n'
 | 
					    printf '    -h                 This help\n'
 | 
				
			||||||
    printf '\n'
 | 
					    printf '\n'
 | 
				
			||||||
@@ -364,13 +380,13 @@ usage() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
orig_args=("$@")
 | 
					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
 | 
					while getopts "${opts}" arg; do
 | 
				
			||||||
    case "${arg}" in
 | 
					    case "${arg}" in
 | 
				
			||||||
        p) profile="$OPTARG" ;;
 | 
					        p) profile="$OPTARG" ;;
 | 
				
			||||||
        a) arch="$OPTARG" ;;
 | 
					        a) arch="$OPTARG" ;;
 | 
				
			||||||
        R) repo="$OPTARG" ;;
 | 
					        R) STABILITY="$OPTARG" ;;
 | 
				
			||||||
        r) chroots_iso="$OPTARG" ;;
 | 
					        r) chroots_iso="$OPTARG" ;;
 | 
				
			||||||
        t) ISO_POOL="$OPTARG" ;;
 | 
					        t) ISO_POOL="$OPTARG" ;;
 | 
				
			||||||
        i) INITSYS="$OPTARG" ;;
 | 
					        i) INITSYS="$OPTARG" ;;
 | 
				
			||||||
@@ -382,6 +398,7 @@ while getopts "${opts}" arg; do
 | 
				
			|||||||
        b) boot_only=true ;;
 | 
					        b) boot_only=true ;;
 | 
				
			||||||
        m) persist=true ;;
 | 
					        m) persist=true ;;
 | 
				
			||||||
        d) use_dracut=true ;;
 | 
					        d) use_dracut=true ;;
 | 
				
			||||||
 | 
					        w) copy_pacconf=true ;;
 | 
				
			||||||
        q) pretend=true ;;
 | 
					        q) pretend=true ;;
 | 
				
			||||||
        h|?) usage 0 ;;
 | 
					        h|?) usage 0 ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,7 +81,7 @@ trap_abort() {
 | 
				
			|||||||
trap_exit() {
 | 
					trap_exit() {
 | 
				
			||||||
    local r=$?
 | 
					    local r=$?
 | 
				
			||||||
    trap - EXIT INT QUIT TERM HUP
 | 
					    trap - EXIT INT QUIT TERM HUP
 | 
				
			||||||
    cleanup $r
 | 
					    cleanup "$r"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cleanup() {
 | 
					cleanup() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,73 +9,39 @@ ignore_error() {
 | 
				
			|||||||
    return 0
 | 
					    return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
trap_setup(){
 | 
					chroot_add_mount() {
 | 
				
			||||||
    [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
 | 
					 | 
				
			||||||
    trap "$1" EXIT
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chroot_mount() {
 | 
					 | 
				
			||||||
#     msg2 "mount: [%s]" "$2"
 | 
					#     msg2 "mount: [%s]" "$2"
 | 
				
			||||||
    mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
 | 
					    mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chroot_add_resolv_conf() {
 | 
					chroot_maybe_add_mount() {
 | 
				
			||||||
    local chrootdir=$1 resolv_conf=$1/etc/resolv.conf
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    [[ -e /etc/resolv.conf ]] || return 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Handle resolv.conf as a symlink to somewhere else.
 | 
					 | 
				
			||||||
    if [[ -L $chrootdir/etc/resolv.conf ]]; then
 | 
					 | 
				
			||||||
        # readlink(1) should always give us *something* since we know at this point
 | 
					 | 
				
			||||||
        # it's a symlink. For simplicity, ignore the case of nested symlinks.
 | 
					 | 
				
			||||||
        resolv_conf=$(readlink "$chrootdir/etc/resolv.conf")
 | 
					 | 
				
			||||||
        if [[ $resolv_conf = /* ]]; then
 | 
					 | 
				
			||||||
            resolv_conf=$chrootdir$resolv_conf
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            resolv_conf=$chrootdir/etc/$resolv_conf
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # ensure file exists to bind mount over
 | 
					 | 
				
			||||||
        if [[ ! -f $resolv_conf ]]; then
 | 
					 | 
				
			||||||
            install -Dm644 /dev/null "$resolv_conf" || return 1
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then
 | 
					 | 
				
			||||||
        # The chroot might not have a resolv.conf.
 | 
					 | 
				
			||||||
        return 0
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    chroot_mount /etc/resolv.conf "$resolv_conf" --bind
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chroot_mount_conditional() {
 | 
					 | 
				
			||||||
    local cond=$1; shift
 | 
					    local cond=$1; shift
 | 
				
			||||||
    if eval "$cond"; then
 | 
					    if eval "$cond"; then
 | 
				
			||||||
        chroot_mount "$@"
 | 
					        chroot_add_mount "$@"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chroot_setup(){
 | 
					chroot_setup(){
 | 
				
			||||||
    local mnt="$1"
 | 
					    local mnt="$1"
 | 
				
			||||||
    local tmpfs_opts="${2:-mode=1777,strictatime,nodev,nosuid}"
 | 
					    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=()
 | 
					    CHROOT_ACTIVE_MOUNTS=()
 | 
				
			||||||
    trap_setup chroot_api_umount
 | 
					    [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
 | 
				
			||||||
    chroot_setup "$1" "$2"
 | 
					    trap 'chroot_teardown' EXIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #chroot_maybe_add_mount "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind &&
 | 
				
			||||||
 | 
					    chroot_add_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev &&
 | 
				
			||||||
 | 
					    chroot_add_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
 | 
				
			||||||
 | 
					    ignore_error chroot_maybe_add_mount "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \
 | 
				
			||||||
 | 
					        efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
 | 
				
			||||||
 | 
					    chroot_add_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid &&
 | 
				
			||||||
 | 
					    chroot_add_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
 | 
				
			||||||
 | 
					    chroot_add_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
 | 
				
			||||||
 | 
					    chroot_add_mount /run "$mnt/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
 | 
				
			||||||
 | 
					    chroot_add_mount tmp "$mnt/tmp" -t tmpfs -o "${tmpfs_opts}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chroot_api_umount() {
 | 
					chroot_teardown() {
 | 
				
			||||||
    if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then
 | 
					    if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then
 | 
				
			||||||
#         msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
 | 
					#         msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
 | 
				
			||||||
        umount "${CHROOT_ACTIVE_MOUNTS[@]}"
 | 
					        umount "${CHROOT_ACTIVE_MOUNTS[@]}"
 | 
				
			||||||
@@ -83,4 +49,40 @@ chroot_api_umount() {
 | 
				
			|||||||
    unset CHROOT_ACTIVE_MOUNTS
 | 
					    unset CHROOT_ACTIVE_MOUNTS
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					resolve_link() {
 | 
				
			||||||
 | 
					    local target=$1
 | 
				
			||||||
 | 
					    local root=$2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # If a root was given, make sure it ends in a slash.
 | 
				
			||||||
 | 
					    [[ -n $root && $root != */ ]] && root=$root/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while [[ -L $target ]]; do
 | 
				
			||||||
 | 
					        target=$(readlink -m "$target")
 | 
				
			||||||
 | 
					        # If a root was given, make sure the target is under it.
 | 
				
			||||||
 | 
					        # Make sure to strip any leading slash from target first.
 | 
				
			||||||
 | 
					        [[ -n $root && $target != $root* ]] && target=$root${target#/}
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    printf %s "$target"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					chroot_add_resolv_conf() {
 | 
				
			||||||
 | 
					    local chrootdir=$1
 | 
				
			||||||
 | 
					    local src
 | 
				
			||||||
 | 
					    local dest="$chrootdir/etc/resolv.conf"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    src=$(resolve_link /etc/resolv.conf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # If we don't have a source resolv.conf file, there's nothing useful we can do.
 | 
				
			||||||
 | 
					    [[ -e $src ]] || return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [[ ! -e "$dest" && ! -h "$dest" ]]; then
 | 
				
			||||||
 | 
					            # There may be no resolv.conf in the chroot. In this case, we'll just exit.
 | 
				
			||||||
 | 
					            # The chroot environment must not be concerned with DNS resolution.
 | 
				
			||||||
 | 
					            return 0
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    chroot_add_mount "$src" "$dest" -c --bind
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#}}}
 | 
					#}}}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -4,53 +4,34 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#{{{ calamares
 | 
					#{{{ calamares
 | 
				
			||||||
 | 
					
 | 
				
			||||||
write_services_conf(){
 | 
					yaml_array() {
 | 
				
			||||||
    local key1="$1" val1="$2" key2="$3" val2="$4"
 | 
					    local array yaml
 | 
				
			||||||
    local yaml
 | 
					
 | 
				
			||||||
    yaml=$(write_yaml_header)
 | 
					    for entry in "$@"; do
 | 
				
			||||||
    yaml+=$(write_yaml_map 0 "$key1" "$val1")
 | 
					        yaml="{name: ${entry}, action: enable}"
 | 
				
			||||||
    yaml+=$(write_yaml_map 0 "$key2" "$val2")
 | 
					        array="${array:-}${array:+,} ${yaml}"
 | 
				
			||||||
    yaml+=$(write_yaml_map 0 'services')
 | 
					 | 
				
			||||||
    for svc in "${SERVICES[@]}"; do
 | 
					 | 
				
			||||||
        yaml+=$(write_yaml_seq 2 "$svc")
 | 
					 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
    yaml+=$(write_empty_line)
 | 
					    printf "%s\n" "[${array}]"
 | 
				
			||||||
    printf '%s\n' "${yaml}"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
write_services_openrc_conf(){
 | 
					 | 
				
			||||||
    local conf="$1"/services-openrc.conf
 | 
					 | 
				
			||||||
    write_services_conf 'initdDir' '/etc/init.d' 'runlevelsDir' '/etc/runlevels' > "$conf"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
write_services_runit_conf(){
 | 
					 | 
				
			||||||
    local conf="$1"/services-runit.conf
 | 
					 | 
				
			||||||
    write_services_conf 'svDir' '/etc/runit/sv' 'runsvDir' '/etc/runit/runsvdir' > "$conf"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
write_services_s6_conf(){
 | 
					 | 
				
			||||||
    local conf="$1"/services-s6.conf
 | 
					 | 
				
			||||||
    write_services_conf 'svDir' '/etc/s6/sv' 'dbDir' '/etc/s6/rc/compiled' > "$conf"
 | 
					 | 
				
			||||||
    printf '%s\n' "defaultBundle: default" >> "$conf"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
write_services_suite66_conf(){
 | 
					 | 
				
			||||||
    local conf="$1"/services-suite66.conf
 | 
					 | 
				
			||||||
    write_services_conf 'svDir' '/etc/66/service' 'runsvDir' '/var/lib/66/system' > "$conf"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
write_services_dinit_conf(){
 | 
					 | 
				
			||||||
    local conf="$1"/services-dinit.conf
 | 
					 | 
				
			||||||
    write_services_conf 'initdDir' '/etc/dinit.d' 'runsvDir' '/etc/dinit.d/boot.d' > "$conf"
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
configure_calamares(){
 | 
					configure_calamares(){
 | 
				
			||||||
    local mods="$1/etc/calamares/modules"
 | 
					    for config in online offline; do
 | 
				
			||||||
    if [[ -d "$mods" ]];then
 | 
					        local mods="$1/etc/calamares-$config/modules"
 | 
				
			||||||
        msg2 "Configuring: Calamares"
 | 
					        if [[ -d "$mods" ]];then
 | 
				
			||||||
        write_services_"${INITSYS}"_conf "$mods"
 | 
					            msg2 "Configuring: Calamares %s" "$config"
 | 
				
			||||||
        sed -e "s|services-openrc|services-${INITSYS}|" \
 | 
					
 | 
				
			||||||
            -i "$1"/etc/calamares/settings.conf
 | 
					            if [[ -f "$mods"/services-artix.conf ]]; then
 | 
				
			||||||
 | 
					                local svc
 | 
				
			||||||
 | 
					                svc=$(yaml_array "${SERVICES[@]}") \
 | 
				
			||||||
 | 
					                    yq -P 'with(.;
 | 
				
			||||||
 | 
					                            .command = "artix-service" |
 | 
				
			||||||
 | 
					                            .services = env(svc) )' \
 | 
				
			||||||
 | 
					                        -i "$mods"/services-artix.conf
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    if [[ -d "$1"/etc/calamares-offline ]]; then
 | 
				
			||||||
 | 
					        ln -sf calamares-offline "$1"/etc/calamares
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,6 @@ prepare_boot_extras(){
 | 
				
			|||||||
    done
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest
 | 
					    cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest
 | 
				
			||||||
    cp "$src"/usr/share/licenses/common/GPL2/license.txt "$dest"/memtest.COPYING
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#}}}
 | 
					#}}}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,41 +4,15 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#{{{ initcpio
 | 
					#{{{ initcpio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
make_checksum(){
 | 
					 | 
				
			||||||
    local file="$1"
 | 
					 | 
				
			||||||
    msg2 "Creating md5sum ..."
 | 
					 | 
				
			||||||
    cd "${iso_root}${live_dir}"
 | 
					 | 
				
			||||||
    md5sum "$file" > "$file".md5
 | 
					 | 
				
			||||||
    cd "${OLDPWD}"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
make_sig () {
 | 
					 | 
				
			||||||
    local file="$1"
 | 
					 | 
				
			||||||
    msg2 "Creating signature file..."
 | 
					 | 
				
			||||||
    chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}"
 | 
					 | 
				
			||||||
    su "${owner}" -c "gpg --detach-sign --output $file.sig --default-key ${GPG_KEY} $file"
 | 
					 | 
				
			||||||
    chown "root:root" "${iso_root}${live_dir}"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export_gpg_publickey() {
 | 
					 | 
				
			||||||
    key_export=${WORKSPACE_DIR}/pubkey.gpg
 | 
					 | 
				
			||||||
    if [[ ! -e "${key_export}" ]]; then
 | 
					 | 
				
			||||||
        gpg --batch --output "${key_export}" --export "${GPG_KEY}"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
prepare_initramfs_mkinitcpio() {
 | 
					prepare_initramfs_mkinitcpio() {
 | 
				
			||||||
    local mnt="$1" packages=() mkinitcpio_conf k
 | 
					    local mnt="$1" mkinitcpio_conf k
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mkinitcpio_conf=mkinitcpio-default.conf
 | 
					    mkinitcpio_conf=mkinitcpio-default.conf
 | 
				
			||||||
    [[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf
 | 
					    [[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf
 | 
				
			||||||
    k=$(<"$mnt"/usr/src/linux/version)
 | 
					    k=$(<"$mnt"/usr/src/linux/version)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    packages+=($(read_from_list "${common_dir}/Packages-boot"))
 | 
					    if [[ -v key_export ]]; then
 | 
				
			||||||
    basestrap "${basestrap_args[@]}" "$mnt" "${packages[@]}"
 | 
					        exec {ARTIX_GNUPG_FD}<"${key_export}"
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [[ -n "${GPG_KEY}" ]]; then
 | 
					 | 
				
			||||||
        exec {ARTIX_GNUPG_FD}<>"${key_export}"
 | 
					 | 
				
			||||||
        export ARTIX_GNUPG_FD
 | 
					        export ARTIX_GNUPG_FD
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,13 +20,11 @@ prepare_initramfs_mkinitcpio() {
 | 
				
			|||||||
        -c /etc/"$mkinitcpio_conf" \
 | 
					        -c /etc/"$mkinitcpio_conf" \
 | 
				
			||||||
        -g /boot/initramfs.img
 | 
					        -g /boot/initramfs.img
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [[ -n "${GPG_KEY}" ]]; then
 | 
					    if [[ -v key_export ]]; then
 | 
				
			||||||
        exec {ARTIX_GNUPG_FD}<&-
 | 
					        exec {ARTIX_GNUPG_FD}<&-
 | 
				
			||||||
        unset ARTIX_GNUPG_FD
 | 
					        unset ARTIX_GNUPG_FD
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    if [[ -f "${key_export}" ]]; then
 | 
					    rm -rf -- "${key_export}"
 | 
				
			||||||
        rm "${key_export}"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img
 | 
					    cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img
 | 
				
			||||||
    prepare_boot_extras "$mnt"
 | 
					    prepare_boot_extras "$mnt"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,13 +5,13 @@
 | 
				
			|||||||
#{{{ iso
 | 
					#{{{ iso
 | 
				
			||||||
 | 
					
 | 
				
			||||||
get_disturl(){
 | 
					get_disturl(){
 | 
				
			||||||
    # shellcheck disable=1091
 | 
					    # shellcheck disable=SC2034
 | 
				
			||||||
    . /usr/lib/os-release
 | 
					    . /usr/lib/os-release
 | 
				
			||||||
    printf "%s\n" "${HOME_URL}"
 | 
					    printf "%s\n" "${HOME_URL}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
get_osname(){
 | 
					get_osname(){
 | 
				
			||||||
    # shellcheck disable=1091
 | 
					    # shellcheck disable=SC2034
 | 
				
			||||||
    . /usr/lib/os-release
 | 
					    . /usr/lib/os-release
 | 
				
			||||||
    printf "%s\n" "${NAME}"
 | 
					    printf "%s\n" "${NAME}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ load_profile(){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    [[ -f $profile_dir/${profile}/profile.conf ]] || return 1
 | 
					    [[ -f $profile_dir/${profile}/profile.conf ]] || return 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # shellcheck disable=1090
 | 
					    # shellcheck source=contrib/iso/profile.conf.example
 | 
				
			||||||
    [[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf
 | 
					    [[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    AUTOLOGIN=${AUTOLOGIN:-true}
 | 
					    AUTOLOGIN=${AUTOLOGIN:-true}
 | 
				
			||||||
@@ -43,31 +43,15 @@ load_profile(){
 | 
				
			|||||||
read_from_list() {
 | 
					read_from_list() {
 | 
				
			||||||
    local list="$1"
 | 
					    local list="$1"
 | 
				
			||||||
    local _space="s| ||g"
 | 
					    local _space="s| ||g"
 | 
				
			||||||
    local _clean=':a;N;$!ba;s/\n/ /g'
 | 
					    #local _clean=':a;N;$!ba;s/\n/ /g'
 | 
				
			||||||
 | 
					    local _clean='/^$/d'
 | 
				
			||||||
    local _com_rm="s|#.*||g"
 | 
					    local _com_rm="s|#.*||g"
 | 
				
			||||||
    local _init="s|@initsys@|${INITSYS}|g"
 | 
					    local _init="s|@initsys@|${INITSYS}|g"
 | 
				
			||||||
    local pkgs
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mapfile -t pkgs < <(sed "$_com_rm" "$list" \
 | 
					    mapfile -t pkgs < <(sed "$_com_rm" "$list" \
 | 
				
			||||||
            | sed "$_space" \
 | 
					            | sed "$_space" \
 | 
				
			||||||
            | sed "$_init" \
 | 
					            | sed "$_init" \
 | 
				
			||||||
            | sed "$_clean")
 | 
					            | sed "$_clean" | sort -u)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    printf "%s\n" "${pkgs[@]}"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
read_from_services() {
 | 
					 | 
				
			||||||
    for svc in "${SERVICES[@]}"; do
 | 
					 | 
				
			||||||
        case "$svc" in
 | 
					 | 
				
			||||||
            sddm|gdm|lightdm|mdm|greetd|lxdm|xdm)
 | 
					 | 
				
			||||||
                packages+=("$svc-${INITSYS}"); display_manager="$svc" ;;
 | 
					 | 
				
			||||||
            NetworkManager) packages+=("networkmanager-${INITSYS}") ;;
 | 
					 | 
				
			||||||
            connmand) packages+=("connman-${INITSYS}") ;;
 | 
					 | 
				
			||||||
            cupsd) packages+=("cups-${INITSYS}") ;;
 | 
					 | 
				
			||||||
            bluetoothd) packages+=("bluez-${INITSYS}") ;;
 | 
					 | 
				
			||||||
            syslog-ng|metalog) packages+=("$svc-${INITSYS}") ;;
 | 
					 | 
				
			||||||
        esac
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
load_pkgs(){
 | 
					load_pkgs(){
 | 
				
			||||||
@@ -77,19 +61,33 @@ load_pkgs(){
 | 
				
			|||||||
    if [[ "${pkglist##*/}" == "Packages-Root" ]]; then
 | 
					    if [[ "${pkglist##*/}" == "Packages-Root" ]]; then
 | 
				
			||||||
        for l in base apps "${INITSYS}"; do
 | 
					        for l in base apps "${INITSYS}"; do
 | 
				
			||||||
            msg2 "Loading Packages: [%s] ..." "Packages-${l}"
 | 
					            msg2 "Loading Packages: [%s] ..." "Packages-${l}"
 | 
				
			||||||
            packages+=($(read_from_list "${common_dir}/Packages-${l}"))
 | 
					            read_from_list "${common_dir}/Packages-${l}"
 | 
				
			||||||
 | 
					            packages+=("${pkgs[@]}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        done
 | 
					        done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if [[ -n "${live_list}" ]]; then
 | 
					        if [[ -n "${live_list}" ]]; then
 | 
				
			||||||
            msg2 "Loading Packages: [%s] ..." "Packages-xorg"
 | 
					            msg2 "Loading Packages: [Packages-xorg] ..."
 | 
				
			||||||
            packages+=($(read_from_list "${common_dir}/Packages-xorg"))
 | 
					            read_from_list "${common_dir}/Packages-xorg"
 | 
				
			||||||
 | 
					            packages+=("${pkgs[@]}")
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        msg2 "Loading Packages: [%s] ..." "${pkglist##*/}"
 | 
					
 | 
				
			||||||
        packages+=($(read_from_list "${pkglist}"))
 | 
					        for svc in "${SERVICES[@]}"; do
 | 
				
			||||||
        read_from_services
 | 
					            case "$svc" in
 | 
				
			||||||
    else
 | 
					                sddm|gdm|lightdm|mdm|greetd|lxdm|xdm)
 | 
				
			||||||
        msg2 "Loading Packages: [%s] ..." "${pkglist##*/}"
 | 
					                    packages+=("$svc-${INITSYS}"); display_manager="$svc" ;;
 | 
				
			||||||
        packages+=($(read_from_list "${pkglist}"))
 | 
					                NetworkManager) packages+=("networkmanager-${INITSYS}") ;;
 | 
				
			||||||
 | 
					                connmand) packages+=("connman-${INITSYS}") ;;
 | 
				
			||||||
 | 
					                cupsd) packages+=("cups-${INITSYS}") ;;
 | 
				
			||||||
 | 
					                bluetoothd) packages+=("bluez-${INITSYS}") ;;
 | 
				
			||||||
 | 
					                syslog-ng|metalog) packages+=("$svc-${INITSYS}") ;;
 | 
				
			||||||
 | 
					            esac
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					    msg2 "Loading Packages: [%s] ..." "${pkglist##*/}"
 | 
				
			||||||
 | 
					    read_from_list "${pkglist}"
 | 
				
			||||||
 | 
					    packages+=("${pkgs[@]}")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#}}}
 | 
					#}}}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,24 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#{{{ squash
 | 
					#{{{ squash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					make_checksum(){
 | 
				
			||||||
 | 
					    local file="$1"
 | 
				
			||||||
 | 
					    msg2 "Creating md5sum ..."
 | 
				
			||||||
 | 
					    cd "${iso_root}${live_dir}"
 | 
				
			||||||
 | 
					    md5sum "$file" > "$file".md5
 | 
				
			||||||
 | 
					    cd "${OLDPWD}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					make_sig () {
 | 
				
			||||||
 | 
					    local file="$1"
 | 
				
			||||||
 | 
					    msg2 "Creating signature file..."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}"
 | 
				
			||||||
 | 
					    su "${owner}" -c "gpg --batch --no-armor --no-include-key-block --output $file.sig  --detach-sign \
 | 
				
			||||||
 | 
					        --default-key ${GPG_KEY} ${gpg_options[@]} $file"
 | 
				
			||||||
 | 
					    chown "root:root" "${iso_root}${live_dir}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
make_ext_img(){
 | 
					make_ext_img(){
 | 
				
			||||||
    local src="$1"
 | 
					    local src="$1"
 | 
				
			||||||
    local size=32G
 | 
					    local size=32G
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,21 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#{{{ iso conf
 | 
					#{{{ iso conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prepare_dir(){
 | 
				
			||||||
 | 
					    [[ ! -d $1 ]] && mkdir -p "$1"
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ -n $SUDO_USER ]]; then
 | 
				
			||||||
 | 
					    eval "USER_HOME=~$SUDO_USER"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    USER_HOME=$HOME
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prepare_dir "${USER_CONF_DIR}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
load_iso_config(){
 | 
					load_iso_config(){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local conf="$1/artools-iso.conf"
 | 
					    local conf="$1/artools-iso.conf"
 | 
				
			||||||
@@ -13,6 +28,14 @@ load_iso_config(){
 | 
				
			|||||||
    # shellcheck source=config/conf/artools-iso.conf
 | 
					    # shellcheck source=config/conf/artools-iso.conf
 | 
				
			||||||
    [[ -r "$conf" ]] && source "$conf"
 | 
					    [[ -r "$conf" ]] && source "$conf"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ARCH=${ARCH:-"$(uname -m)"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    STABILITY=${STABILITY:-'stable'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"}
 | 
					    ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"}
 | 
					    ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,10 @@
 | 
				
			|||||||
[[ -z ${ARTOOLS_INCLUDE_ADMIN_SH:-} ]] || return 0
 | 
					[[ -z ${ARTOOLS_INCLUDE_ADMIN_SH:-} ]] || return 0
 | 
				
			||||||
ARTOOLS_INCLUDE_ADMIN_SH=1
 | 
					ARTOOLS_INCLUDE_ADMIN_SH=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/pkg/db/db.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/pkg/db/db.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -e
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
artixpkg_admin_usage() {
 | 
					artixpkg_admin_usage() {
 | 
				
			||||||
@@ -13,8 +17,10 @@ artixpkg_admin_usage() {
 | 
				
			|||||||
    Usage: ${COMMAND} [COMMAND] [OPTIONS]
 | 
					    Usage: ${COMMAND} [COMMAND] [OPTIONS]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    COMMANDS
 | 
					    COMMANDS
 | 
				
			||||||
        transfer          Transfer obsolete repository to landfill
 | 
					 | 
				
			||||||
        query             Query maintainers and topics
 | 
					        query             Query maintainers and topics
 | 
				
			||||||
 | 
					        team              Manage repo team
 | 
				
			||||||
 | 
					        topic             Manage topics
 | 
				
			||||||
 | 
					        transfer          Transfer obsolete repository to landfill
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
        -h, --help     Show this help text
 | 
					        -h, --help     Show this help text
 | 
				
			||||||
@@ -39,14 +45,7 @@ artixpkg_admin() {
 | 
				
			|||||||
            artixpkg_admin_usage
 | 
					            artixpkg_admin_usage
 | 
				
			||||||
            exit 0
 | 
					            exit 0
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
        transfer)
 | 
					
 | 
				
			||||||
            _ARTOOLS_COMMAND+=" $1"
 | 
					 | 
				
			||||||
            shift
 | 
					 | 
				
			||||||
            # shellcheck source=src/lib/pkg/admin/transfer.sh
 | 
					 | 
				
			||||||
            source "${LIBDIR}"/pkg/admin/transfer.sh
 | 
					 | 
				
			||||||
            artixpkg_admin_transfer "$@"
 | 
					 | 
				
			||||||
            exit 0
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        query)
 | 
					        query)
 | 
				
			||||||
            _ARTOOLS_COMMAND+=" $1"
 | 
					            _ARTOOLS_COMMAND+=" $1"
 | 
				
			||||||
            shift
 | 
					            shift
 | 
				
			||||||
@@ -55,6 +54,30 @@ artixpkg_admin() {
 | 
				
			|||||||
            artixpkg_admin_query "$@"
 | 
					            artixpkg_admin_query "$@"
 | 
				
			||||||
            exit 0
 | 
					            exit 0
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
 | 
					        team)
 | 
				
			||||||
 | 
					            _ARTOOLS_COMMAND+=" $1"
 | 
				
			||||||
 | 
					            shift
 | 
				
			||||||
 | 
					            # shellcheck source=src/lib/pkg/admin/team.sh
 | 
				
			||||||
 | 
					            source "${LIBDIR}"/pkg/admin/team.sh
 | 
				
			||||||
 | 
					            artixpkg_admin_team "$@"
 | 
				
			||||||
 | 
					            exit 0
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        topic)
 | 
				
			||||||
 | 
					            _ARTOOLS_COMMAND+=" $1"
 | 
				
			||||||
 | 
					            shift
 | 
				
			||||||
 | 
					            # shellcheck source=src/lib/pkg/admin/query.sh
 | 
				
			||||||
 | 
					            source "${LIBDIR}"/pkg/admin/topic.sh
 | 
				
			||||||
 | 
					            artixpkg_admin_topic "$@"
 | 
				
			||||||
 | 
					            exit 0
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        transfer)
 | 
				
			||||||
 | 
					            _ARTOOLS_COMMAND+=" $1"
 | 
				
			||||||
 | 
					            shift
 | 
				
			||||||
 | 
					            # shellcheck source=src/lib/pkg/admin/transfer.sh
 | 
				
			||||||
 | 
					            source "${LIBDIR}"/pkg/admin/transfer.sh
 | 
				
			||||||
 | 
					            artixpkg_admin_transfer "$@"
 | 
				
			||||||
 | 
					            exit 0
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
        -*)
 | 
					        -*)
 | 
				
			||||||
            die "invalid argument: %s" "$1"
 | 
					            die "invalid argument: %s" "$1"
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,13 +14,13 @@ artixpkg_admin_query_usage() {
 | 
				
			|||||||
    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
					    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
        -m, --maintainer=NAME      Query for packages of the named maintainer
 | 
					        -m, --maintainer NAME      Query for packages of the named maintainer
 | 
				
			||||||
        -t, --topic=NAME           Query for packages of the named topic
 | 
					        -t, --topic NAME           Query for packages of the named topic
 | 
				
			||||||
        -h, --help                 Show this help text
 | 
					        -h, --help                 Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EXAMPLES
 | 
					    EXAMPLES
 | 
				
			||||||
        $ ${COMMAND} --maintainer maintainer-mynickname
 | 
					        $ ${COMMAND} --maintainer tux
 | 
				
			||||||
        $ ${COMMAND} --topic myopic
 | 
					        $ ${COMMAND} --topic mytopic
 | 
				
			||||||
_EOF_
 | 
					_EOF_
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,19 +47,11 @@ artixpkg_admin_query() {
 | 
				
			|||||||
                MAINTAINER="$2"
 | 
					                MAINTAINER="$2"
 | 
				
			||||||
                shift 2
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --maintainer=*)
 | 
					 | 
				
			||||||
                MAINTAINER="${1#*=}"
 | 
					 | 
				
			||||||
                shift
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
            -t|--topic)
 | 
					            -t|--topic)
 | 
				
			||||||
                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
					                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
                TOPIC="$2"
 | 
					                TOPIC="$2"
 | 
				
			||||||
                shift 2
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --topic=*)
 | 
					 | 
				
			||||||
                TOPIC="${1#*=}"
 | 
					 | 
				
			||||||
                shift
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
            --)
 | 
					            --)
 | 
				
			||||||
                shift
 | 
					                shift
 | 
				
			||||||
                break
 | 
					                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: $(yaml_array ${ARTIX_TEAMS[@]})
 | 
				
			||||||
 | 
					        -r, --remove NAME           Remove team from repo
 | 
				
			||||||
 | 
					                                    Possible values: $(yaml_array ${ARTIX_TEAMS[@]})
 | 
				
			||||||
 | 
					        -h, --help                  Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EXAMPLES
 | 
				
			||||||
 | 
					        $ ${COMMAND} --check libfoo
 | 
				
			||||||
 | 
					        $ ${COMMAND} --list libfoo
 | 
				
			||||||
 | 
					        $ ${COMMAND} --add ${ARTIX_TEAMS[1]} libfoo
 | 
				
			||||||
 | 
					        $ ${COMMAND} --remove ${ARTIX_TEAMS[3]} libfoo
 | 
				
			||||||
 | 
					_EOF_
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					artixpkg_admin_team() {
 | 
				
			||||||
 | 
					    if (( $# < 1 )); then
 | 
				
			||||||
 | 
					        artixpkg_admin_team_usage
 | 
				
			||||||
 | 
					        exit 0
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # options
 | 
				
			||||||
 | 
					    local CHECK=0
 | 
				
			||||||
 | 
					    local LIST=0
 | 
				
			||||||
 | 
					    local TEAM_ADD
 | 
				
			||||||
 | 
					    local TEAM_RM
 | 
				
			||||||
 | 
					    local pkgbases=()
 | 
				
			||||||
 | 
					    local pkgbase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while (( $# )); do
 | 
				
			||||||
 | 
					        case $1 in
 | 
				
			||||||
 | 
					            -h|--help)
 | 
				
			||||||
 | 
					                artixpkg_admin_team_usage
 | 
				
			||||||
 | 
					                exit 0
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            -a|--add)
 | 
				
			||||||
 | 
					                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
 | 
					                TEAM_ADD="$2"
 | 
				
			||||||
 | 
					                shift 2
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            -r|--remove)
 | 
				
			||||||
 | 
					                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
 | 
					                TEAM_RM="$2"
 | 
				
			||||||
 | 
					                shift 2
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            -c|--check)
 | 
				
			||||||
 | 
					                CHECK=1
 | 
				
			||||||
 | 
					                shift
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            -l|--list)
 | 
				
			||||||
 | 
					                LIST=1
 | 
				
			||||||
 | 
					                shift
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            --)
 | 
				
			||||||
 | 
					                shift
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            -*)
 | 
				
			||||||
 | 
					                die "invalid argument: %s" "$1"
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            *)
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pkgbases+=("$@")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [[ -n ${GIT_TOKEN} ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for pkgbase in "${pkgbases[@]}"; do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if [[ -d "${pkgbase}" ]];then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if [[ ! -d "${pkgbase}/.git" ]]; then
 | 
				
			||||||
 | 
					                    error "Not a Git repository: ${pkgbase}"
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					                ( cd "${pkgbase}" || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    local gitname
 | 
				
			||||||
 | 
					                    gitname=$(get_compliant_name "${pkgbase}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (( CHECK )); then
 | 
				
			||||||
 | 
					                        local team
 | 
				
			||||||
 | 
					                        team=$(team_from_yaml)
 | 
				
			||||||
 | 
					                        res=$(check_repo_team  "${gitname}" "${team}" | yq -rP '.name')
 | 
				
			||||||
 | 
					                        if [[ "$res" == "null" ]]; then
 | 
				
			||||||
 | 
					                            error "[%s] does not have team (%s) assigned" "$pkgbase" "${team}"
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                            msg "[%s] has team (%s) assigned" "$pkgbase" "${team}"
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (( LIST )); then
 | 
				
			||||||
 | 
					                        list_repo_teams "${gitname}" | yq -rP '.[] | .name'
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if [[ -n ${TEAM_ADD} ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if ! add_team_to_repo "${gitname}" "${TEAM_ADD}"; then
 | 
				
			||||||
 | 
					                            warning "failed to add team: ${TEAM_ADD}"
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if [[ "$(team_from_yaml)" != "${TEAM_ADD}" ]] \
 | 
				
			||||||
 | 
					                        || [[ "$(team_from_yaml)" == "null" ]]; then
 | 
				
			||||||
 | 
					                            update_yaml_team "${TEAM_ADD}"
 | 
				
			||||||
 | 
					                            git add "${REPO_DB}"
 | 
				
			||||||
 | 
					                            git commit -m "Set team ${TEAM_ADD}"
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if [[ -n ${TEAM_RM} ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if ! remove_team_from_repo "${gitname}" "${TEAM_RM}"; then
 | 
				
			||||||
 | 
					                            warning "failed to add team: ${TEAM_RM}"
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    msg "Querying ${pkgbase} ..."
 | 
				
			||||||
 | 
					                    if ! show_db; then
 | 
				
			||||||
 | 
					                        warning "Could not query ${REPO_DB}"
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										139
									
								
								src/lib/pkg/admin/topic.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										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
 | 
					    # options
 | 
				
			||||||
    local pkgbases=()
 | 
					    local pkgbases=()
 | 
				
			||||||
    local pkgbase
 | 
					    local pkgbase
 | 
				
			||||||
    local waste_org="landfill"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
					    local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -60,7 +59,12 @@ artixpkg_admin_transfer() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if [[ -n ${GIT_TOKEN} ]]; then
 | 
					    if [[ -n ${GIT_TOKEN} ]]; then
 | 
				
			||||||
        for pkgbase in "${pkgbases[@]}"; do
 | 
					        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
 | 
					        done
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,7 +37,7 @@ add_team_to_repo() {
 | 
				
			|||||||
    local pkgbase="$1"
 | 
					    local pkgbase="$1"
 | 
				
			||||||
    local team="$2"
 | 
					    local team="$2"
 | 
				
			||||||
    local url
 | 
					    local url
 | 
				
			||||||
    url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/teams/$team"
 | 
					    url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    stat_busy "Adding team ($team) to package repo [$pkgbase]"
 | 
					    stat_busy "Adding team ($team) to package repo [$pkgbase]"
 | 
				
			||||||
    api_put "$url" \
 | 
					    api_put "$url" \
 | 
				
			||||||
@@ -50,7 +50,7 @@ remove_team_from_repo() {
 | 
				
			|||||||
    local pkgbase="$1"
 | 
					    local pkgbase="$1"
 | 
				
			||||||
    local team="$2"
 | 
					    local team="$2"
 | 
				
			||||||
    local url
 | 
					    local url
 | 
				
			||||||
    url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/teams/$team"
 | 
					    url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    stat_busy "Removing team ($team) from package repo [$pkgbase]"
 | 
					    stat_busy "Removing team ($team) from package repo [$pkgbase]"
 | 
				
			||||||
    api_delete "$url" \
 | 
					    api_delete "$url" \
 | 
				
			||||||
@@ -62,7 +62,7 @@ remove_team_from_repo() {
 | 
				
			|||||||
create_repo() {
 | 
					create_repo() {
 | 
				
			||||||
    local pkgbase="$1"
 | 
					    local pkgbase="$1"
 | 
				
			||||||
    local url json
 | 
					    local url json
 | 
				
			||||||
    url="${GIT_HTTPS}/api/v1/org/${GIT_ORG}/repos"
 | 
					    url="${API_URL}/org/${GIT_ORG}/repos"
 | 
				
			||||||
    json="{ \"auto_init\": true, \"name\": \"$pkgbase\", \"gitignores\": \"ArtixLinuxPackages\", \"readme\": \"Default\" }"
 | 
					    json="{ \"auto_init\": true, \"name\": \"$pkgbase\", \"gitignores\": \"ArtixLinuxPackages\", \"readme\": \"Default\" }"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    stat_busy "Create package repo [$pkgbase] in org (${GIT_ORG})"
 | 
					    stat_busy "Create package repo [$pkgbase] in org (${GIT_ORG})"
 | 
				
			||||||
@@ -78,8 +78,8 @@ transfer_repo() {
 | 
				
			|||||||
    local pkgbase="$1"
 | 
					    local pkgbase="$1"
 | 
				
			||||||
    local new_owner="$2"
 | 
					    local new_owner="$2"
 | 
				
			||||||
    local json url
 | 
					    local json url
 | 
				
			||||||
    json="{ \"new_owner\": \"$new_owner\",  \"team_ids\": [] }"
 | 
					    json="{ \"new_owner\": \"$new_owner\",  \"team_ids\": [], \"archived\": \"true\" }"
 | 
				
			||||||
    url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/transfer"
 | 
					    url="${API_URL}/repos/${GIT_ORG}/$pkgbase/transfer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    stat_busy "Transfer package repo [$pkgbase] in org ($new_owner)"
 | 
					    stat_busy "Transfer package repo [$pkgbase] in org ($new_owner)"
 | 
				
			||||||
    api_post "$url" \
 | 
					    api_post "$url" \
 | 
				
			||||||
@@ -92,7 +92,7 @@ transfer_repo() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
list_all_repos() {
 | 
					list_all_repos() {
 | 
				
			||||||
    local url
 | 
					    local url
 | 
				
			||||||
    url="${GIT_HTTPS}/api/v1/orgs/${GIT_ORG}/repos?limit=10000"
 | 
					    url="${API_URL}/orgs/${GIT_ORG}/repos?limit=10000"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    stat_busy "Query all packages"
 | 
					    stat_busy "Query all packages"
 | 
				
			||||||
    api_get "$url" \
 | 
					    api_get "$url" \
 | 
				
			||||||
@@ -104,7 +104,7 @@ add_topic() {
 | 
				
			|||||||
    local url
 | 
					    local url
 | 
				
			||||||
    local pkgbase="$1"
 | 
					    local pkgbase="$1"
 | 
				
			||||||
    local topic="$2"
 | 
					    local topic="$2"
 | 
				
			||||||
    url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics/$topic"
 | 
					    url="${API_URL}/repos/${GIT_ORG}/$pkgbase/topics/$topic"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    stat_busy "Add topic ($topic) to [$pkgbase]"
 | 
					    stat_busy "Add topic ($topic) to [$pkgbase]"
 | 
				
			||||||
    api_put "$url" \
 | 
					    api_put "$url" \
 | 
				
			||||||
@@ -117,7 +117,7 @@ remove_topic() {
 | 
				
			|||||||
    local url
 | 
					    local url
 | 
				
			||||||
    local pkgbase="$1"
 | 
					    local pkgbase="$1"
 | 
				
			||||||
    local topic="$2"
 | 
					    local topic="$2"
 | 
				
			||||||
    url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics/$topic"
 | 
					    url="${API_URL}/repos/${GIT_ORG}/$pkgbase/topics/$topic"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    stat_busy "Remove topic ($topic) from [$pkgbase]"
 | 
					    stat_busy "Remove topic ($topic) from [$pkgbase]"
 | 
				
			||||||
    api_delete "$url" \
 | 
					    api_delete "$url" \
 | 
				
			||||||
@@ -128,8 +128,10 @@ remove_topic() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
search_topic() {
 | 
					search_topic() {
 | 
				
			||||||
    local search="$1"
 | 
					    local search="$1"
 | 
				
			||||||
    local url
 | 
					    local url args
 | 
				
			||||||
    url="${GIT_HTTPS}/api/v1/repos/search?q=${search}&topic=true&includeDesc=false&private=false&is_private=false&template=false&archived=false&order=asc&limit=10000"
 | 
					    args="topic=true&includeDesc=false&private=false&is_private=false"
 | 
				
			||||||
 | 
					    args+="&template=false&archived=false&order=asc&limit=10000"
 | 
				
			||||||
 | 
					    url="${API_URL}/repos/search?q=${search}&${args}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    stat_busy "Query for topic (${search})"
 | 
					    stat_busy "Query for topic (${search})"
 | 
				
			||||||
    api_get "$url" \
 | 
					    api_get "$url" \
 | 
				
			||||||
@@ -137,4 +139,64 @@ search_topic() {
 | 
				
			|||||||
    stat_done
 | 
					    stat_done
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					list_repo_teams() {
 | 
				
			||||||
 | 
					    local pkgbase="$1"
 | 
				
			||||||
 | 
					    local url
 | 
				
			||||||
 | 
					    url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    stat_busy "List repo teams [$pkgbase]"
 | 
				
			||||||
 | 
					    api_get "$url" \
 | 
				
			||||||
 | 
					        -H 'accept: application/json' \
 | 
				
			||||||
 | 
					        -H "Authorization: token ${GIT_TOKEN}"
 | 
				
			||||||
 | 
					    stat_done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					check_repo_team() {
 | 
				
			||||||
 | 
					    local pkgbase="$1"
 | 
				
			||||||
 | 
					    local team="$2"
 | 
				
			||||||
 | 
					    local url
 | 
				
			||||||
 | 
					    url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    stat_busy "Check if team ($team) is assigned to [$pkgbase]"
 | 
				
			||||||
 | 
					    api_get "$url" \
 | 
				
			||||||
 | 
					        -H 'accept: application/json' \
 | 
				
			||||||
 | 
					        -H "Authorization: token ${GIT_TOKEN}"
 | 
				
			||||||
 | 
					    stat_done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					archive_repo() {
 | 
				
			||||||
 | 
					    local pkgbase="$1"
 | 
				
			||||||
 | 
					    local org="$2"
 | 
				
			||||||
 | 
					    local url
 | 
				
			||||||
 | 
					    local json
 | 
				
			||||||
 | 
					    url="${API_URL}/repos/$org/$pkgbase"
 | 
				
			||||||
 | 
					    json="{ \"archived\": true }"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    stat_busy "Archive repo [$pkgbase] in org ($org)"
 | 
				
			||||||
 | 
					    api_patch "$url" \
 | 
				
			||||||
 | 
					        -H "accept: application/json" \
 | 
				
			||||||
 | 
					        -H "content-type: application/json" \
 | 
				
			||||||
 | 
					        -H "Authorization: token ${GIT_TOKEN}" \
 | 
				
			||||||
 | 
					        -d "$json"
 | 
				
			||||||
 | 
					    stat_done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					remove_all_topics() {
 | 
				
			||||||
 | 
					    local pkgbase="$1"
 | 
				
			||||||
 | 
					    local org="$2"
 | 
				
			||||||
 | 
					    local url
 | 
				
			||||||
 | 
					    local json
 | 
				
			||||||
 | 
					    url="${API_URL}/repos/$org/$pkgbase/topics"
 | 
				
			||||||
 | 
					    json="{ \"topics\": [] }"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    stat_busy "Delete all topics from [$pkgbase]"
 | 
				
			||||||
 | 
					    api_put "$url" \
 | 
				
			||||||
 | 
					        -H 'accept: application/json' \
 | 
				
			||||||
 | 
					        -H 'Content-Type: application/json' \
 | 
				
			||||||
 | 
					        -H "Authorization: token ${GIT_TOKEN}" \
 | 
				
			||||||
 | 
					        -d "$json"
 | 
				
			||||||
 | 
					    stat_done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#}}}
 | 
					#}}}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										55
									
								
								src/lib/pkg/ci.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/lib/pkg/ci.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					#!/hint/bash
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[ -z ${ARTOOLS_INCLUDE_CI_SH:-} ]] || return 0
 | 
				
			||||||
 | 
					ARTOOLS_INCLUDE_CI_SH=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					artixpkg_ci_usage() {
 | 
				
			||||||
 | 
					    local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
				
			||||||
 | 
					    cat <<- _EOF_
 | 
				
			||||||
 | 
					    Usage: ${COMMAND} [COMMAND] [OPTIONS]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    COMMANDS
 | 
				
			||||||
 | 
					        config         Configure ci and build agent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    OPTIONS
 | 
				
			||||||
 | 
					        -h, --help     Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EXAMPLES
 | 
				
			||||||
 | 
					        $ ${COMMAND} config libfoo
 | 
				
			||||||
 | 
					_EOF_
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					artixpkg_ci() {
 | 
				
			||||||
 | 
					    if (( $# < 1 )); then
 | 
				
			||||||
 | 
					        artixpkg_ci_usage
 | 
				
			||||||
 | 
					        exit 0
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # option checking
 | 
				
			||||||
 | 
					    while (( $# )); do
 | 
				
			||||||
 | 
					        case $1 in
 | 
				
			||||||
 | 
					        -h|--help)
 | 
				
			||||||
 | 
					            artixpkg_ci_usage
 | 
				
			||||||
 | 
					            exit 0
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        config)
 | 
				
			||||||
 | 
					            _ARTOOLS_COMMAND+=" $1"
 | 
				
			||||||
 | 
					            shift
 | 
				
			||||||
 | 
					            # shellcheck source=src/lib/pkg/ci/config.sh
 | 
				
			||||||
 | 
					            source "${LIBDIR}"/pkg/ci/config.sh
 | 
				
			||||||
 | 
					            artixpkg_ci_config "$@"
 | 
				
			||||||
 | 
					            exit 0
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        -*)
 | 
				
			||||||
 | 
					            die "invalid argument: %s" "$1"
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        *)
 | 
				
			||||||
 | 
					            die "invalid command: %s" "$1"
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										162
									
								
								src/lib/pkg/ci/config.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								src/lib/pkg/ci/config.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,162 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[ -z ${ARTOOLS_INCLUDE_CI_CONFIG_SH:-} ]] || return 0
 | 
				
			||||||
 | 
					ARTOOLS_INCLUDE_CI_CONFIG_SH=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/pkg/db/db.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/pkg/db/db.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					write_jenkinsfile() {
 | 
				
			||||||
 | 
					    printf "@Library('artix-ci@%s') import org.artixlinux.RepoPackage\n" "${1}" > "${REPO_CI}"
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf '\n'
 | 
				
			||||||
 | 
					        printf 'PackagePipeline(new RepoPackage(this))\n'
 | 
				
			||||||
 | 
					    } >> "${REPO_CI}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					artixpkg_ci_config_usage() {
 | 
				
			||||||
 | 
					    local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
				
			||||||
 | 
					    cat <<- _EOF_
 | 
				
			||||||
 | 
					    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    OPTIONS
 | 
				
			||||||
 | 
					        -a, --agent NAME       Set the CI agent (default: ${AGENTS[0]})
 | 
				
			||||||
 | 
					                               Possible values: $(yaml_array ${AGENTS[@]})
 | 
				
			||||||
 | 
					        -s, --switch           Switch agent
 | 
				
			||||||
 | 
					        -j, --jobs N           Run up to N jobs in parallel (default: $(nproc))
 | 
				
			||||||
 | 
					        -h, --help             Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EXAMPLES
 | 
				
			||||||
 | 
					        $ ${COMMAND} --agent ${AGENTS[1]} libfoo
 | 
				
			||||||
 | 
					        $ ${COMMAND} --switch --agent ${AGENTS[1]} libfoo
 | 
				
			||||||
 | 
					        $ ${COMMAND} *
 | 
				
			||||||
 | 
					_EOF_
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					artixpkg_ci_config() {
 | 
				
			||||||
 | 
					    # options
 | 
				
			||||||
 | 
					    local jobs=
 | 
				
			||||||
 | 
					    jobs=$(nproc)
 | 
				
			||||||
 | 
					    local paths=()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    local AGENT=${AGENTS[0]}
 | 
				
			||||||
 | 
					    local SWITCH=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # variables
 | 
				
			||||||
 | 
					    local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
				
			||||||
 | 
					    local path realpath pkgbase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while (( $# )); do
 | 
				
			||||||
 | 
					        case $1 in
 | 
				
			||||||
 | 
					        -h|--help)
 | 
				
			||||||
 | 
					            artixpkg_ci_config_usage
 | 
				
			||||||
 | 
					            exit 0
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        -s|--switch)
 | 
				
			||||||
 | 
					            SWITCH=1
 | 
				
			||||||
 | 
					            shift
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        -a|--agent)
 | 
				
			||||||
 | 
					            (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
 | 
					            AGENT="$2"
 | 
				
			||||||
 | 
					            RUNCMD+=" $1 ${AGENT}"
 | 
				
			||||||
 | 
					            shift 2
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        -j|--jobs)
 | 
				
			||||||
 | 
					            (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
 | 
					            jobs=$2
 | 
				
			||||||
 | 
					            shift 2
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        --)
 | 
				
			||||||
 | 
					            shift
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        -*)
 | 
				
			||||||
 | 
					            die "invalid argument: %s" "$1"
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        *)
 | 
				
			||||||
 | 
					            paths=("$@")
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # check if invoked without any path from within a packaging repo
 | 
				
			||||||
 | 
					    if (( ${#paths[@]} == 0 )); then
 | 
				
			||||||
 | 
					        if [[ -f PKGBUILD ]]; then
 | 
				
			||||||
 | 
					            paths=(".")
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            artixpkg_ci_config_usage
 | 
				
			||||||
 | 
					            exit 1
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # parallelization
 | 
				
			||||||
 | 
					    if [[ ${jobs} != 1 ]] && (( ${#paths[@]} > 1 )); then
 | 
				
			||||||
 | 
					        if [[ -n ${BOLD} ]]; then
 | 
				
			||||||
 | 
					            export ARTOOLS_COLOR=always
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        if ! parallel --bar --jobs "${jobs}" "${RUNCMD}" ::: "${paths[@]}"; then
 | 
				
			||||||
 | 
					            die 'Failed to configure some packages, please check the output'
 | 
				
			||||||
 | 
					            exit 1
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        exit 0
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for path in "${paths[@]}"; do
 | 
				
			||||||
 | 
					        if ! realpath=$(realpath -e "${path}"); then
 | 
				
			||||||
 | 
					            error "No such directory: ${path}"
 | 
				
			||||||
 | 
					            continue
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pkgbase=$(basename "${realpath}")
 | 
				
			||||||
 | 
					        pkgbase=${pkgbase%.git}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if [[ ! -d "${path}/.git" ]]; then
 | 
				
			||||||
 | 
					            error "Not a Git repository: ${path}"
 | 
				
			||||||
 | 
					            continue
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        ( cd "${path}" || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if [[ ! -f ${REPO_CI} ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                [[ -d .artixlinux ]] || mkdir .artixlinux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                msg "Adding ci support ..."
 | 
				
			||||||
 | 
					                write_jenkinsfile "${AGENT}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                git add "${REPO_CI}"
 | 
				
			||||||
 | 
					                git commit -m "add ci support"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if [[ ! -f ${REPO_DB} ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                msg "Creating repo db ..."
 | 
				
			||||||
 | 
					                create_repo_db
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if [[ -f PKGBUILD ]]; then
 | 
				
			||||||
 | 
					                    # shellcheck source=contrib/makepkg/PKGBUILD.proto
 | 
				
			||||||
 | 
					                    source PKGBUILD
 | 
				
			||||||
 | 
					                    update_yaml_base
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					                git add "${REPO_DB}"
 | 
				
			||||||
 | 
					                git commit -m "create repo db"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (( SWITCH )); then
 | 
				
			||||||
 | 
					                msg "Switching to agent (${AGENT}) ..."
 | 
				
			||||||
 | 
					                write_jenkinsfile "${AGENT}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                git add "${REPO_CI}"
 | 
				
			||||||
 | 
					                git commit -m "switch agent"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -17,6 +17,24 @@ readonly ARTIX_DB=(
 | 
				
			|||||||
    galaxy
 | 
					    galaxy
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					readonly ARTIX_DB_MAP=(
 | 
				
			||||||
 | 
					    goblins
 | 
				
			||||||
 | 
					    gremlins
 | 
				
			||||||
 | 
					    stable
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					readonly ARTIX_TEAMS=(
 | 
				
			||||||
 | 
					    "${ARTIX_DB[2]}"
 | 
				
			||||||
 | 
					    "${ARTIX_DB[5]}"
 | 
				
			||||||
 | 
					    "${ARTIX_DB[8]}"
 | 
				
			||||||
 | 
					    "${ARTIX_DB[11]}"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					readonly AGENTS=(
 | 
				
			||||||
 | 
					    orion
 | 
				
			||||||
 | 
					    taurus
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
readonly REPO_DB='.artixlinux/pkgbase.yaml'
 | 
					readonly REPO_DB='.artixlinux/pkgbase.yaml'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
readonly REPO_CI='.artixlinux/Jenkinsfile'
 | 
					readonly REPO_CI='.artixlinux/Jenkinsfile'
 | 
				
			||||||
@@ -100,6 +118,8 @@ create_repo_db() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    yq -n '"---"' > "${REPO_DB}"
 | 
					    yq -n '"---"' > "${REPO_DB}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    yq -P '.team = null' -i "${REPO_DB}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    yq -P 'with(
 | 
					    yq -P 'with(
 | 
				
			||||||
        .pkgbase;
 | 
					        .pkgbase;
 | 
				
			||||||
            .name = null |
 | 
					            .name = null |
 | 
				
			||||||
@@ -132,6 +152,31 @@ create_repo_db() {
 | 
				
			|||||||
    done
 | 
					    done
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					has_repos_map_key() {
 | 
				
			||||||
 | 
					    local _r="$1"
 | 
				
			||||||
 | 
					    local r
 | 
				
			||||||
 | 
					    if ! $(r="$_r" yq -r '.repos | has(strenv(r))' "${REPO_DB}"); then
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					delete_obsolete_map_keys() {
 | 
				
			||||||
 | 
					    local _r
 | 
				
			||||||
 | 
					    for r in asteroids{-goblins,-gremlins,}; do
 | 
				
			||||||
 | 
					        if $(_r="$r" yq -r '.repos | has(strenv(_r))' "${REPO_DB}"); then
 | 
				
			||||||
 | 
					            local repo
 | 
				
			||||||
 | 
					            repo=".repos.${r}" \
 | 
				
			||||||
 | 
					                yq 'del(eval(strenv(repo)))' -i "${REPO_DB}"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					update_yaml_team() {
 | 
				
			||||||
 | 
					    local team="${1:-${ARTIX_DB[5]}}"
 | 
				
			||||||
 | 
					    team="$team" yq -P '.team = env(team)' -i "${REPO_DB}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
update_yaml_base() {
 | 
					update_yaml_base() {
 | 
				
			||||||
    local version
 | 
					    local version
 | 
				
			||||||
    local name
 | 
					    local name
 | 
				
			||||||
@@ -272,11 +317,38 @@ update_yaml_move() {
 | 
				
			|||||||
            -i "${REPO_DB}"
 | 
					            -i "${REPO_DB}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					show_agent() {
 | 
				
			||||||
 | 
					    local agent="${AGENTS[0]}"
 | 
				
			||||||
 | 
					    if grep @${AGENTS[1]} "${REPO_CI}" &>/dev/null; then
 | 
				
			||||||
 | 
					        agent="${AGENTS[1]}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    msg2 "agent: %s" "$agent"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					team_from_yaml() {
 | 
				
			||||||
 | 
					    local team
 | 
				
			||||||
 | 
					    team=$(yq -rP '.team' "${REPO_DB}")
 | 
				
			||||||
 | 
					    printf "$team"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					auto_detect() {
 | 
				
			||||||
 | 
					    local team
 | 
				
			||||||
 | 
					    for repo in "${ARTIX_TEAMS[@]}"; do
 | 
				
			||||||
 | 
					        local _r res
 | 
				
			||||||
 | 
					        res=$(_r=".$repo" yq -rP '.repos | eval(strenv(_r)) | .version' "${REPO_DB}")
 | 
				
			||||||
 | 
					        if [[ "${res}" != "null" ]]; then
 | 
				
			||||||
 | 
					            team=${repo}
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    printf "%s\n" "$team"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
show_db() {
 | 
					show_db() {
 | 
				
			||||||
    if ! yq -r ${REPO_DB} 1>/dev/null 2>/dev/null; then
 | 
					    show_agent
 | 
				
			||||||
 | 
					    if ! yq -r "${REPO_DB}" 1>/dev/null 2>/dev/null; then
 | 
				
			||||||
        die "${REPO_DB} invalid!"
 | 
					        die "${REPO_DB} invalid!"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    yq -rP '. | with_entries(select(.value.name))' "${REPO_DB}"
 | 
					    yq -rP 'with_entries(select(.key == "team" or .key == "pkgbase"))' "${REPO_DB}"
 | 
				
			||||||
    yq -rP '. | .repos | with_entries(select(.value.version))' "${REPO_DB}"
 | 
					    yq -rP '. | .repos | with_entries(select(.value.version))' "${REPO_DB}"
 | 
				
			||||||
    return 0
 | 
					    return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,10 @@ ARTOOLS_INCLUDE_GIT_CLONE_SH=1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/pkg/git/config.sh
 | 
					# shellcheck source=src/lib/pkg/git/config.sh
 | 
				
			||||||
source "${LIBDIR}"/pkg/git/config.sh
 | 
					source "${LIBDIR}"/pkg/git/config.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/pkg/ci/config.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/pkg/ci/config.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/pkg/admin/team.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/pkg/admin/team.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -e
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -17,19 +21,23 @@ artixpkg_git_clone_usage() {
 | 
				
			|||||||
    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
					    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
        -m, --maintainer=NAME      Clone all packages of the named maintainer
 | 
					        -m, --maintainer NAME      Clone all packages of the named maintainer
 | 
				
			||||||
        --protocol https           Clone the repository over https
 | 
					        -s, --search TOPIC         Clone all packages of the named topic
 | 
				
			||||||
        -t, --topic=NAME           Clone all packages of the named topic
 | 
					        -a, --agent NAME           Set the CI agent (default: ${AGENTS[0]})
 | 
				
			||||||
        -a, --agent=NAME           Set the CI agent (default: official)
 | 
					                                   Possible values: $(yaml_array ${AGENTS[@]})
 | 
				
			||||||
 | 
					        -t, --team NAME            Assign team name (default: ${ARTIX_TEAMS[1]})
 | 
				
			||||||
 | 
					                                   Possible values: $(yaml_array ${ARTIX_TEAMS[@]})
 | 
				
			||||||
        -j, --jobs N               Run up to N jobs in parallel (default: $(nproc))
 | 
					        -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
 | 
					        --all                      Clone all existing packages, useful for cache warming
 | 
				
			||||||
        -h, --help                 Show this help text
 | 
					        -h, --help                 Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EXAMPLES
 | 
					    EXAMPLES
 | 
				
			||||||
        $ ${COMMAND} libfoo linux libbar
 | 
					        $ ${COMMAND} libfoo linux libbar
 | 
				
			||||||
        $ ${COMMAND} --maintainer tux
 | 
					        $ ${COMMAND} --maintainer tux
 | 
				
			||||||
        $ ${COMMAND} --topic myopic
 | 
					        $ ${COMMAND} --search mytopic
 | 
				
			||||||
        $ ${COMMAND} -j 8 --topic myopic
 | 
					        $ ${COMMAND} -j 8 --search mytopic
 | 
				
			||||||
 | 
					        $ ${COMMAND} --agent ${AGENTS[1]} libfoo
 | 
				
			||||||
_EOF_
 | 
					_EOF_
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,7 +54,9 @@ artixpkg_git_clone() {
 | 
				
			|||||||
    local CLONE_ALL=0
 | 
					    local CLONE_ALL=0
 | 
				
			||||||
    local MAINTAINER=
 | 
					    local MAINTAINER=
 | 
				
			||||||
    local TOPIC=
 | 
					    local TOPIC=
 | 
				
			||||||
    local CONFIGURE_OPTIONS=()
 | 
					    local CONFIG_OPTS=()
 | 
				
			||||||
 | 
					    local AGENT_OPTS=()
 | 
				
			||||||
 | 
					    local TEAM_OPTS=()
 | 
				
			||||||
    local jobs=
 | 
					    local jobs=
 | 
				
			||||||
    jobs=$(nproc)
 | 
					    jobs=$(nproc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -60,7 +70,7 @@ artixpkg_git_clone() {
 | 
				
			|||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --protocol=https)
 | 
					            --protocol=https)
 | 
				
			||||||
                GIT_REPO_BASE_URL="${GIT_HTTPS}/"
 | 
					                GIT_REPO_BASE_URL="${GIT_HTTPS}/"
 | 
				
			||||||
                CONFIGURE_OPTIONS+=("$1")
 | 
					                CONFIG_OPTS+=("$1")
 | 
				
			||||||
                shift
 | 
					                shift
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --protocol)
 | 
					            --protocol)
 | 
				
			||||||
@@ -70,7 +80,7 @@ artixpkg_git_clone() {
 | 
				
			|||||||
                else
 | 
					                else
 | 
				
			||||||
                    die "unsupported protocol: %s" "$2"
 | 
					                    die "unsupported protocol: %s" "$2"
 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
                CONFIGURE_OPTIONS+=("$1" "$2")
 | 
					                CONFIG_OPTS+=("$1" "$2")
 | 
				
			||||||
                shift 2
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            -m|--maintainer)
 | 
					            -m|--maintainer)
 | 
				
			||||||
@@ -78,28 +88,21 @@ artixpkg_git_clone() {
 | 
				
			|||||||
                MAINTAINER="$2"
 | 
					                MAINTAINER="$2"
 | 
				
			||||||
                shift 2
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --maintainer=*)
 | 
					            -s|--search)
 | 
				
			||||||
                MAINTAINER="${1#*=}"
 | 
					 | 
				
			||||||
                shift
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
            -t|--topic)
 | 
					 | 
				
			||||||
                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
					                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
                TOPIC="$2"
 | 
					                TOPIC="$2"
 | 
				
			||||||
                shift 2
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --topic=*)
 | 
					            -t|--team)
 | 
				
			||||||
                TOPIC="${1#*=}"
 | 
					                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
                shift
 | 
					                TEAM_OPTS=("--add" "$2")
 | 
				
			||||||
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            -a|--agent)
 | 
					            -a|--agent)
 | 
				
			||||||
                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
					                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
                CONFIGURE_OPTIONS+=("$1" "$2")
 | 
					                AGENT_OPTS=("$1" "$2")
 | 
				
			||||||
                shift 2
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --agent=*)
 | 
					 | 
				
			||||||
                CONFIGURE_OPTIONS+=("${1#*=}")
 | 
					 | 
				
			||||||
                shift
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
            --all)
 | 
					            --all)
 | 
				
			||||||
                CLONE_ALL=1
 | 
					                CLONE_ALL=1
 | 
				
			||||||
                shift
 | 
					                shift
 | 
				
			||||||
@@ -165,6 +168,8 @@ artixpkg_git_clone() {
 | 
				
			|||||||
            warning "Skip cloning ${pkgbase}: Directory exists"
 | 
					            warning "Skip cloning ${pkgbase}: Directory exists"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        artixpkg_git_config "${CONFIGURE_OPTIONS[@]}" "${pkgbase}"
 | 
					        artixpkg_git_config "${CONFIG_OPTS[@]}" "${pkgbase}"
 | 
				
			||||||
 | 
					        artixpkg_ci_config "${AGENT_OPTS[@]}" "${pkgbase}"
 | 
				
			||||||
 | 
					        artixpkg_admin_team "${TEAM_OPTS[@]}" "${pkgbase}"
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,44 +5,20 @@
 | 
				
			|||||||
[[ -z ${ARTOOLS_INCLUDE_GIT_CONFIG_SH:-} ]] || return 0
 | 
					[[ -z ${ARTOOLS_INCLUDE_GIT_CONFIG_SH:-} ]] || return 0
 | 
				
			||||||
ARTOOLS_INCLUDE_GIT_CONFIG_SH=1
 | 
					ARTOOLS_INCLUDE_GIT_CONFIG_SH=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/pkg/db/db.sh
 | 
					 | 
				
			||||||
source "${LIBDIR}"/pkg/db/db.sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set -e
 | 
					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() {
 | 
					artixpkg_git_config_usage() {
 | 
				
			||||||
    local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
					    local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
				
			||||||
    cat <<- _EOF_
 | 
					    cat <<- _EOF_
 | 
				
			||||||
    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
					    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
        -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
 | 
					        --protocol https       Configure remote url to use https
 | 
				
			||||||
        -j, --jobs N           Run up to N jobs in parallel (default: $(nproc))
 | 
					        -j, --jobs N           Run up to N jobs in parallel (default: $(nproc))
 | 
				
			||||||
        -h, --help             Show this help text
 | 
					        -h, --help             Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EXAMPLES
 | 
					    EXAMPLES
 | 
				
			||||||
        $ ${COMMAND} --maintainer tux
 | 
					 | 
				
			||||||
        $ ${COMMAND} --upstream libfoo
 | 
					 | 
				
			||||||
        $ ${COMMAND} *
 | 
					        $ ${COMMAND} *
 | 
				
			||||||
_EOF_
 | 
					_EOF_
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -105,13 +81,8 @@ artixpkg_git_config() {
 | 
				
			|||||||
    jobs=$(nproc)
 | 
					    jobs=$(nproc)
 | 
				
			||||||
    local paths=()
 | 
					    local paths=()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local SET_TOPIC=0
 | 
					 | 
				
			||||||
    local UPSTREAM=0
 | 
					 | 
				
			||||||
    local AGENT=
 | 
					 | 
				
			||||||
    local CI_ADDED=0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # variables
 | 
					    # variables
 | 
				
			||||||
    local -r command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
					    local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
				
			||||||
    local path realpath pkgbase
 | 
					    local path realpath pkgbase
 | 
				
			||||||
    local PACKAGER GPGKEY packager_name packager_email
 | 
					    local PACKAGER GPGKEY packager_name packager_email
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -121,23 +92,6 @@ artixpkg_git_config() {
 | 
				
			|||||||
            artixpkg_git_config_usage
 | 
					            artixpkg_git_config_usage
 | 
				
			||||||
            exit 0
 | 
					            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)
 | 
					        --protocol=https)
 | 
				
			||||||
            proto_force=1
 | 
					            proto_force=1
 | 
				
			||||||
            shift
 | 
					            shift
 | 
				
			||||||
@@ -182,7 +136,7 @@ artixpkg_git_config() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Load makepkg.conf variables to be available for packager identity
 | 
					    # Load makepkg.conf variables to be available for packager identity
 | 
				
			||||||
    msg "Collecting packager identity from makepkg.conf"
 | 
					    msg "Collecting packager identity from makepkg.conf"
 | 
				
			||||||
    # shellcheck disable=2119
 | 
					    # shellcheck source=config/makepkg/x86_64.conf
 | 
				
			||||||
    load_makepkg_config
 | 
					    load_makepkg_config
 | 
				
			||||||
    if [[ -n ${PACKAGER} ]]; then
 | 
					    if [[ -n ${PACKAGER} ]]; then
 | 
				
			||||||
        if ! packager_name=$(get_packager_name "${PACKAGER}") || \
 | 
					        if ! packager_name=$(get_packager_name "${PACKAGER}") || \
 | 
				
			||||||
@@ -258,54 +212,6 @@ artixpkg_git_config() {
 | 
				
			|||||||
                git config user.signingKey "${GPGKEY}"
 | 
					                git config user.signingKey "${GPGKEY}"
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # topics meta
 | 
					 | 
				
			||||||
            if (( SET_TOPIC )); then
 | 
					 | 
				
			||||||
                if [[ -n ${GIT_TOKEN} ]]; then
 | 
					 | 
				
			||||||
                    local topic gitname
 | 
					 | 
				
			||||||
                    topic="maintainer-${packager_name}"
 | 
					 | 
				
			||||||
                    gitname=$(get_compliant_name "${pkgbase}")
 | 
					 | 
				
			||||||
                    if ! add_topic "${gitname}" "${topic}"; then
 | 
					 | 
				
			||||||
                        warning "failed to set the maintainer topic: ${topic}"
 | 
					 | 
				
			||||||
                    fi
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            if (( UPSTREAM )); then
 | 
					 | 
				
			||||||
                local remote_url
 | 
					 | 
				
			||||||
                remote_url="${GIT_UPSTREAM_URL}/${pkgbase}".git
 | 
					 | 
				
			||||||
                if ! git remote add upstream "${remote_url}"; then
 | 
					 | 
				
			||||||
                    warning "failed to set the upstream: ${remote_url}"
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            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
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if [[ ! -f ${REPO_DB} ]]; then
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                msg "Creating repo db ..."
 | 
					 | 
				
			||||||
                create_repo_db
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if [[ -f PKGBUILD ]]; then
 | 
					 | 
				
			||||||
                    # shellcheck source=contrib/makepkg/PKGBUILD.proto
 | 
					 | 
				
			||||||
                    source PKGBUILD
 | 
					 | 
				
			||||||
                    update_yaml_base
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
                git add "${REPO_DB}"
 | 
					 | 
				
			||||||
                git commit -m "Create repo db"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            msg "Querying ${pkgbase} ..."
 | 
					 | 
				
			||||||
            if ! show_db; then
 | 
					 | 
				
			||||||
                warning "Could not query ${REPO_DB}"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,10 @@ ARTOOLS_INCLUDE_GIT_CREATE_SH=1
 | 
				
			|||||||
source "${LIBDIR}"/pkg/git/clone.sh
 | 
					source "${LIBDIR}"/pkg/git/clone.sh
 | 
				
			||||||
# shellcheck source=src/lib/pkg/git/config.sh
 | 
					# shellcheck source=src/lib/pkg/git/config.sh
 | 
				
			||||||
source "${LIBDIR}"/pkg/git/config.sh
 | 
					source "${LIBDIR}"/pkg/git/config.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/pkg/ci/config.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/pkg/ci/config.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/pkg/admin/team.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/pkg/admin/team.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -e
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -20,7 +24,10 @@ artixpkg_git_create_usage() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
        -c, --clone           Clone the Git repository after creation
 | 
					        -c, --clone           Clone the Git repository after creation
 | 
				
			||||||
        -t, --team=NAME       Assign team name [default: world]
 | 
					        -a, --agent NAME      Set the CI agent (default: ${AGENTS[0]})
 | 
				
			||||||
 | 
					                              Possible values: $(yaml_array ${AGENTS[@]})
 | 
				
			||||||
 | 
					        -t, --team NAME       Assign team name (default: ${ARTIX_TEAMS[1]})
 | 
				
			||||||
 | 
					                              Possible values: $(yaml_array ${ARTIX_TEAMS[@]})
 | 
				
			||||||
        -h, --help            Show this help text
 | 
					        -h, --help            Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EXAMPLES
 | 
					    EXAMPLES
 | 
				
			||||||
@@ -32,17 +39,12 @@ artixpkg_git_create() {
 | 
				
			|||||||
    # options
 | 
					    # options
 | 
				
			||||||
    local pkgbases=()
 | 
					    local pkgbases=()
 | 
				
			||||||
    local pkgbase
 | 
					    local pkgbase
 | 
				
			||||||
    local clone=0
 | 
					    local CLONE=0
 | 
				
			||||||
    local config=0
 | 
					    local CONFIG=0
 | 
				
			||||||
    local TEAM="${ARTIX_DB[5]}"
 | 
					
 | 
				
			||||||
    local OPTIONS=()
 | 
					    local AGENT_OPTS=("--agent" "${AGENTS[0]}")
 | 
				
			||||||
 | 
					    local TEAM_OPTS=("--team" "${ARTIX_TEAMS[1]}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local TEAMS=(
 | 
					 | 
				
			||||||
        "${ARTIX_DB[2]}"
 | 
					 | 
				
			||||||
        "${ARTIX_DB[5]}"
 | 
					 | 
				
			||||||
        "${ARTIX_DB[8]}"
 | 
					 | 
				
			||||||
        "${ARTIX_DB[11]}"
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
    # variables
 | 
					    # variables
 | 
				
			||||||
    local path
 | 
					    local path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,30 +54,32 @@ artixpkg_git_create() {
 | 
				
			|||||||
            artixpkg_git_create_usage
 | 
					            artixpkg_git_create_usage
 | 
				
			||||||
            exit 0
 | 
					            exit 0
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
 | 
					        -a|--agent)
 | 
				
			||||||
 | 
					            (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
 | 
					            AGENT_OPTS=("$1" "$2")
 | 
				
			||||||
 | 
					            shift 2
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
        -c|--clone)
 | 
					        -c|--clone)
 | 
				
			||||||
            clone=1
 | 
					            CLONE=1
 | 
				
			||||||
            shift
 | 
					            shift
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
        -t|--team)
 | 
					        -t|--team)
 | 
				
			||||||
            (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
					            (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
            TEAM="$2"
 | 
					            TEAM_OPTS=("$1" "$2")
 | 
				
			||||||
            shift 2
 | 
					            shift 2
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
        --team=*)
 | 
					 | 
				
			||||||
            TEAM="${1#*=}"
 | 
					 | 
				
			||||||
            shift
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
        -*)
 | 
					        -*)
 | 
				
			||||||
            die "invalid argument: %s" "$1"
 | 
					            die "invalid argument: %s" "$1"
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
        *)
 | 
					        *)
 | 
				
			||||||
            pkgbases=("$@")
 | 
					 | 
				
			||||||
            break
 | 
					            break
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
        esac
 | 
					        esac
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ! in_array "${TEAM}" "${TEAMS[@]}"; then
 | 
					    pkgbases=("$@")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ! in_array "${TEAM_OPTS[1]}" "${ARTIX_TEAMS[@]}"; then
 | 
				
			||||||
        die "${TEAM} does not exist!"
 | 
					        die "${TEAM} does not exist!"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,41 +89,41 @@ artixpkg_git_create() {
 | 
				
			|||||||
            if ! path=$(realpath -e .); then
 | 
					            if ! path=$(realpath -e .); then
 | 
				
			||||||
                die "failed to read path from current directory"
 | 
					                die "failed to read path from current directory"
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
        pkgbases=("$(basename "${path}")")
 | 
					            pkgbases=("$(basename "${path}")")
 | 
				
			||||||
        clone=0
 | 
					            CLONE=0
 | 
				
			||||||
        config=1
 | 
					            CONFIG=1
 | 
				
			||||||
    else
 | 
					        else
 | 
				
			||||||
        artixpkg_git_create_usage
 | 
					            artixpkg_git_create_usage
 | 
				
			||||||
        exit 1
 | 
					            exit 1
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # create
 | 
					    # create
 | 
				
			||||||
    for pkgbase in "${pkgbases[@]}"; do
 | 
					    for pkgbase in "${pkgbases[@]}"; do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        local gitname
 | 
					        local gitname
 | 
				
			||||||
        gitname=$(get_compliant_name "${pkgbase}")
 | 
					        gitname=$(get_compliant_name "${pkgbase}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if [[ -n ${GIT_TOKEN} ]]; then
 | 
					        if [[ -n ${GIT_TOKEN} ]]; then
 | 
				
			||||||
            if ! create_repo "${gitname}" >/dev/null; then
 | 
					            if ! create_repo "${gitname}" >/dev/null; then
 | 
				
			||||||
                die "failed to create project: ${pkgbase}"
 | 
					                die "failed to create repository: ${pkgbase}"
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                msg_success "Successfully created ${pkgbase}"
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
            if ! add_team_to_repo "${gitname}" "${TEAM}" >/dev/null; then
 | 
					 | 
				
			||||||
                warning "failed to assign team: ${TEAM}"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            msg_success "Successfully created ${pkgbase}"
 | 
					 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        if [[ ${TEAM} == ${ARTIX_DB[11]} ]]; then
 | 
					
 | 
				
			||||||
            OPTIONS+=(--agent="${TEAM}")
 | 
					        if (( CLONE )); then
 | 
				
			||||||
        fi
 | 
					            artixpkg_git_clone "${AGENT_OPTS[@]}" "${TEAM_OPTS[@]}" "${pkgbase}"
 | 
				
			||||||
        if (( clone )); then
 | 
					        elif (( CONFIG )); then
 | 
				
			||||||
            artixpkg_git_clone "${OPTIONS[@]}" "${pkgbase}"
 | 
					            artixpkg_git_config "${pkgbase}"
 | 
				
			||||||
        elif (( config )); then
 | 
					            artixpkg_ci_config "${AGENT_OPTS[@]}" "${pkgbase}"
 | 
				
			||||||
            artixpkg_git_config "${OPTIONS[@]}"
 | 
					            artixpkg_admin_team "${TEAM_OPTS[@]}" "${pkgbase}"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # some convenience hints if not in auto clone/config mode
 | 
					    # some convenience hints if not in auto clone/config mode
 | 
				
			||||||
    if (( ! clone )) && (( ! config )); then
 | 
					    if (( ! CLONE )) && (( ! CONFIG )); then
 | 
				
			||||||
        cat <<- _EOF_
 | 
					        cat <<- _EOF_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        For new clones:
 | 
					        For new clones:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,8 +14,8 @@ artixpkg_git_pull_usage() {
 | 
				
			|||||||
    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
					    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
        -m, --maintainer=NAME      Pull all packages of the named maintainer
 | 
					        -m, --maintainer NAME      Pull all packages of the named maintainer
 | 
				
			||||||
        -t, --topic=NAME           Pull all packages of the named topic
 | 
					        -t, --topic NAME           Pull all packages of the named topic
 | 
				
			||||||
        -j, --jobs N               Run up to N jobs in parallel (default: $(nproc))
 | 
					        -j, --jobs N               Run up to N jobs in parallel (default: $(nproc))
 | 
				
			||||||
        --all                      Pull all existing packages
 | 
					        --all                      Pull all existing packages
 | 
				
			||||||
        -h, --help                 Show this help text
 | 
					        -h, --help                 Show this help text
 | 
				
			||||||
@@ -57,19 +57,11 @@ artixpkg_git_pull() {
 | 
				
			|||||||
                MAINTAINER="$2"
 | 
					                MAINTAINER="$2"
 | 
				
			||||||
                shift 2
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --maintainer=*)
 | 
					 | 
				
			||||||
                MAINTAINER="${1#*=}"
 | 
					 | 
				
			||||||
                shift
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
            -t|--topic)
 | 
					            -t|--topic)
 | 
				
			||||||
                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
					                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
                TOPIC="$2"
 | 
					                TOPIC="$2"
 | 
				
			||||||
                shift 2
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --topic=*)
 | 
					 | 
				
			||||||
                TOPIC="${1#*=}"
 | 
					 | 
				
			||||||
                shift
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
            --all)
 | 
					            --all)
 | 
				
			||||||
                PULL_ALL=1
 | 
					                PULL_ALL=1
 | 
				
			||||||
                shift
 | 
					                shift
 | 
				
			||||||
@@ -124,7 +116,7 @@ artixpkg_git_pull() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    for pkgbase in "${pkgbases[@]}"; do
 | 
					    for pkgbase in "${pkgbases[@]}"; do
 | 
				
			||||||
        if [[ -d ${pkgbase} ]]; then
 | 
					        if [[ -d ${pkgbase} ]]; then
 | 
				
			||||||
            ( cd ${pkgbase} || return
 | 
					            ( cd "${pkgbase}" || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                msg "Pulling ${pkgbase} ..."
 | 
					                msg "Pulling ${pkgbase} ..."
 | 
				
			||||||
                if ! git pull origin master; then
 | 
					                if ! git pull origin master; then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,8 +14,8 @@ artixpkg_git_push_usage() {
 | 
				
			|||||||
    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
					    Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
        -m, --maintainer=NAME      Push all packages of the named maintainer
 | 
					        -m, --maintainer NAME      Push all packages of the named maintainer
 | 
				
			||||||
        -t, --topic=NAME           Push all packages of the named topic
 | 
					        -t, --topic NAME           Push all packages of the named topic
 | 
				
			||||||
        -j, --jobs N               Run up to N jobs in parallel (default: $(nproc))
 | 
					        -j, --jobs N               Run up to N jobs in parallel (default: $(nproc))
 | 
				
			||||||
        -h, --help                 Show this help text
 | 
					        -h, --help                 Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -55,19 +55,11 @@ artixpkg_git_push() {
 | 
				
			|||||||
                MAINTAINER="$2"
 | 
					                MAINTAINER="$2"
 | 
				
			||||||
                shift 2
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --maintainer=*)
 | 
					 | 
				
			||||||
                MAINTAINER="${1#*=}"
 | 
					 | 
				
			||||||
                shift
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
            -t|--topic)
 | 
					            -t|--topic)
 | 
				
			||||||
                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
					                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
                TOPIC="$2"
 | 
					                TOPIC="$2"
 | 
				
			||||||
                shift 2
 | 
					                shift 2
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
            --topic=*)
 | 
					 | 
				
			||||||
                TOPIC="${1#*=}"
 | 
					 | 
				
			||||||
                shift
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
            -j|--jobs)
 | 
					            -j|--jobs)
 | 
				
			||||||
                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
					                (( $# <= 1 )) && die "missing argument for %s" "$1"
 | 
				
			||||||
                jobs=$2
 | 
					                jobs=$2
 | 
				
			||||||
@@ -113,7 +105,7 @@ artixpkg_git_push() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    for pkgbase in "${pkgbases[@]}"; do
 | 
					    for pkgbase in "${pkgbases[@]}"; do
 | 
				
			||||||
        if [[ -d ${pkgbase} ]]; then
 | 
					        if [[ -d ${pkgbase} ]]; then
 | 
				
			||||||
            ( cd ${pkgbase} || return
 | 
					            ( cd "${pkgbase}" || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                msg "Pushing ${pkgbase} ..."
 | 
					                msg "Pushing ${pkgbase} ..."
 | 
				
			||||||
                if ! git push origin master; then
 | 
					                if ! git push origin master; then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,31 +11,18 @@ source "${LIBDIR}"/pkg/db/db.sh
 | 
				
			|||||||
set -e
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
check_pkgbuild_validity() {
 | 
					has_remote_changes() {
 | 
				
			||||||
    # shellcheck source=contrib/makepkg/PKGBUILD.proto
 | 
					    local status
 | 
				
			||||||
    . ./PKGBUILD
 | 
					    msg "Checking for remote changes ..."
 | 
				
			||||||
 | 
					    git fetch origin &>/dev/null
 | 
				
			||||||
    # skip when there are no sources available
 | 
					    status=$(git status -sb --porcelain)
 | 
				
			||||||
    if (( ! ${#source[@]} )); then
 | 
					    if [[ "$status" == *behind* ]]; then
 | 
				
			||||||
        return
 | 
					        msg2 "changes: yes"
 | 
				
			||||||
    fi
 | 
					        error "Remote changes detected! Please pull (%s)" "${pkgbase}"
 | 
				
			||||||
 | 
					        return 0
 | 
				
			||||||
    # 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
 | 
					    fi
 | 
				
			||||||
 | 
					    msg2 "changes: no"
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
artixpkg_repo_usage() {
 | 
					artixpkg_repo_usage() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,20 +8,47 @@ ARTOOLS_INCLUDE_REPO_ADD_SH=1
 | 
				
			|||||||
set -e
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					check_pkgbuild_validity() {
 | 
				
			||||||
 | 
					    # skip when there are no sources available
 | 
				
			||||||
 | 
					    if (( ! ${#source[@]} )); then
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # validate sources hash algo is at least > sha1
 | 
				
			||||||
 | 
					    local bad_algos=("cksums" "md5sums" "sha1sums")
 | 
				
			||||||
 | 
					    local good_hash_algo=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # from makepkg libmakepkg/util/schema.sh
 | 
				
			||||||
 | 
					    for integ in "${known_hash_algos[@]}"; do
 | 
				
			||||||
 | 
					        local sumname="${integ}sums"
 | 
				
			||||||
 | 
					        if [[ -n ${!sumname} ]] && ! in_array "${sumname}" "${bad_algos[@]}"; then
 | 
				
			||||||
 | 
					            good_hash_algo=true
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ! $good_hash_algo; then
 | 
				
			||||||
 | 
					        die "PKGBUILD lacks a secure cryptographic checksum, insecure algorithms: ${bad_algos[*]}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
artixpkg_repo_add_usage() {
 | 
					artixpkg_repo_add_usage() {
 | 
				
			||||||
    local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
					    local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
				
			||||||
    cat <<- _EOF_
 | 
					    cat <<- _EOF_
 | 
				
			||||||
    Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]...
 | 
					    Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
        -p, --push             Push pkgbase
 | 
					        -m, --manual            Disable auto repo
 | 
				
			||||||
        -r, --rebuild          Triggers a rebuild
 | 
					                                Possible auto values: $(yaml_array ${ARTIX_DB_MAP[@]})
 | 
				
			||||||
        -n, --nocheck          Disable the check function
 | 
					        -p, --push              Push pkgbase
 | 
				
			||||||
        -h, --help             Show this help text
 | 
					        -r, --rebuild           Triggers a rebuild
 | 
				
			||||||
 | 
					        -n, --nocheck           Disable the check function
 | 
				
			||||||
 | 
					        -h, --help              Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EXAMPLES
 | 
					    EXAMPLES
 | 
				
			||||||
        $ ${COMMAND} world-gremlins libfoo
 | 
					        $ ${COMMAND} ${ARTIX_DB[4]} libfoo
 | 
				
			||||||
        $ ${COMMAND} -p world-gremlins libfoo
 | 
					        $ ${COMMAND} --push ${ARTIX_DB[4]} libfoo
 | 
				
			||||||
 | 
					        $ ${COMMAND} --auto --push ${ARTIX_DB_MAP[2]} libfoo
 | 
				
			||||||
_EOF_
 | 
					_EOF_
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -40,6 +67,7 @@ artixpkg_repo_add() {
 | 
				
			|||||||
    local REBUILD=0
 | 
					    local REBUILD=0
 | 
				
			||||||
    local NOCHECK=0
 | 
					    local NOCHECK=0
 | 
				
			||||||
    local ADD=1
 | 
					    local ADD=1
 | 
				
			||||||
 | 
					    local AUTO=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (( $# )); do
 | 
					    while (( $# )); do
 | 
				
			||||||
        case $1 in
 | 
					        case $1 in
 | 
				
			||||||
@@ -47,6 +75,10 @@ artixpkg_repo_add() {
 | 
				
			|||||||
                artixpkg_repo_add_usage
 | 
					                artixpkg_repo_add_usage
 | 
				
			||||||
                exit 0
 | 
					                exit 0
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
 | 
					            -m|--manual)
 | 
				
			||||||
 | 
					                AUTO=0
 | 
				
			||||||
 | 
					                shift
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
            -p|--push)
 | 
					            -p|--push)
 | 
				
			||||||
                PUSH=1
 | 
					                PUSH=1
 | 
				
			||||||
                shift
 | 
					                shift
 | 
				
			||||||
@@ -72,8 +104,14 @@ artixpkg_repo_add() {
 | 
				
			|||||||
    shift
 | 
					    shift
 | 
				
			||||||
    pkgbases+=("$@")
 | 
					    pkgbases+=("$@")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
 | 
					    if (( AUTO )); then
 | 
				
			||||||
        die "${DEST} does not exist!"
 | 
					        if ! in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
 | 
				
			||||||
 | 
					            die "${DEST} does not exist!"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
 | 
				
			||||||
 | 
					            die "${DEST} does not exist!"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for pkgbase in "${pkgbases[@]}"; do
 | 
					    for pkgbase in "${pkgbases[@]}"; do
 | 
				
			||||||
@@ -86,45 +124,78 @@ artixpkg_repo_add() {
 | 
				
			|||||||
            fi
 | 
					            fi
 | 
				
			||||||
            ( cd "${pkgbase}" || return
 | 
					            ( cd "${pkgbase}" || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if [[ ! -f PKGBUILD ]]; then
 | 
					                if ! has_remote_changes; then
 | 
				
			||||||
                    die "No PKGBUILD found in (%s)" "${pkgbase}"
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # shellcheck source=contrib/makepkg/PKGBUILD.proto
 | 
					                    if [[ ! -f PKGBUILD ]]; then
 | 
				
			||||||
                source PKGBUILD
 | 
					                        die "No PKGBUILD found in (%s)" "${pkgbase}"
 | 
				
			||||||
 | 
					 | 
				
			||||||
                update_yaml_base
 | 
					 | 
				
			||||||
                update_yaml_add "${REBUILD}" "${ADD}" "${NOCHECK}" "${DEST}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                local commit_msg
 | 
					 | 
				
			||||||
                commit_msg=$(get_commit_msg 'add' "${DEST}")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    stat_busy 'Staging files'
 | 
					 | 
				
			||||||
                    for f in $(git ls-files --others); do
 | 
					 | 
				
			||||||
                        git add "$f"
 | 
					 | 
				
			||||||
                    done
 | 
					 | 
				
			||||||
                    for f in $(git ls-files --modified); do
 | 
					 | 
				
			||||||
                        git add "$f"
 | 
					 | 
				
			||||||
                    done
 | 
					 | 
				
			||||||
                    for f in $(git ls-files --deleted); do
 | 
					 | 
				
			||||||
                        git rm "$f"
 | 
					 | 
				
			||||||
                    done
 | 
					 | 
				
			||||||
                    stat_done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    msg 'Commit'
 | 
					 | 
				
			||||||
                    git commit -m "${commit_msg}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (( PUSH )); then
 | 
					 | 
				
			||||||
                        msg "Push (${pkgbase})"
 | 
					 | 
				
			||||||
                        git push origin master
 | 
					 | 
				
			||||||
                    fi
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    msg "Querying ${pkgbase} ..."
 | 
					                    # shellcheck source=contrib/makepkg/PKGBUILD.proto
 | 
				
			||||||
                    if ! show_db; then
 | 
					                    source PKGBUILD
 | 
				
			||||||
                        warning "Could not query ${REPO_DB}"
 | 
					
 | 
				
			||||||
 | 
					                    check_pkgbuild_validity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    manage-pkgbuild-keys --export
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    update_yaml_base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    local auto
 | 
				
			||||||
 | 
					                    auto=$(auto_detect)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if [[ -z "${auto}" ]]; then
 | 
				
			||||||
 | 
					                        auto=$(team_from_yaml)
 | 
				
			||||||
                    fi
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (( AUTO )); then
 | 
				
			||||||
 | 
					                        if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then
 | 
				
			||||||
 | 
					                            DEST="${auto}"
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                            DEST="${auto}-${DEST}"
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    update_yaml_add "${REBUILD}" "${ADD}" "${NOCHECK}" "${DEST}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    update_yaml_team "${auto}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    local commit_msg
 | 
				
			||||||
 | 
					                    commit_msg=$(get_commit_msg 'add' "${DEST}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if [[ -f .SRCINFO ]]; then
 | 
				
			||||||
 | 
					                        rm .SRCINFO
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    delete_obsolete_map_keys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        stat_busy 'Staging files'
 | 
				
			||||||
 | 
					                        for f in $(git ls-files --others); do
 | 
				
			||||||
 | 
					                            git add "$f"
 | 
				
			||||||
 | 
					                        done
 | 
				
			||||||
 | 
					                        for f in $(git ls-files --modified); do
 | 
				
			||||||
 | 
					                            git add "$f"
 | 
				
			||||||
 | 
					                        done
 | 
				
			||||||
 | 
					                        for f in $(git ls-files --deleted); do
 | 
				
			||||||
 | 
					                            git rm "$f"
 | 
				
			||||||
 | 
					                        done
 | 
				
			||||||
 | 
					                        stat_done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        msg 'Commit'
 | 
				
			||||||
 | 
					                        git commit -m "${commit_msg}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (( PUSH )); then
 | 
				
			||||||
 | 
					                            msg "Push (${pkgbase})"
 | 
				
			||||||
 | 
					                            git push origin master
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        msg "Querying ${pkgbase} ..."
 | 
				
			||||||
 | 
					                        if ! show_db; then
 | 
				
			||||||
 | 
					                            warning "Could not query ${REPO_DB}"
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,31 +10,22 @@ set -e
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
patch_pkgbase(){
 | 
					patch_pkgbase(){
 | 
				
			||||||
    local name="$1"
 | 
					    local name="$1"
 | 
				
			||||||
    local pkgbuild
 | 
					 | 
				
			||||||
    pkgbuild=PKGBUILD
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sed -e 's|arch-meson|artix-meson|' -i "${pkgbuild}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    case "${name}" in
 | 
					    case "${name}" in
 | 
				
			||||||
        glibc)
 | 
					        linux|linux-lts|linux-zen|linux-hardened|linux-rt*)
 | 
				
			||||||
            sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \
 | 
					            sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i PKGBUILD
 | 
				
			||||||
                -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"|' \
 | 
					            sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
 | 
				
			||||||
                -i config
 | 
					                -i config
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
        gstreamer|gst-plugins-*|licenses)
 | 
					        *)
 | 
				
			||||||
            sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \
 | 
					            sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \
 | 
				
			||||||
                -e 's|(Arch Linux)|(Artix Linux)|' \
 | 
					                -e 's|(Arch Linux)|(Artix Linux)|' \
 | 
				
			||||||
                -i "${pkgbuild}"
 | 
					                -e 's|arch-meson|artix-meson|' \
 | 
				
			||||||
 | 
					                -i PKGBUILD
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
 | 
					    git --no-pager diff PKGBUILD
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
artixpkg_repo_import_usage() {
 | 
					artixpkg_repo_import_usage() {
 | 
				
			||||||
    local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
					    local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
				
			||||||
    cat <<- _EOF_
 | 
					    cat <<- _EOF_
 | 
				
			||||||
@@ -72,8 +63,9 @@ artixpkg_repo_import() {
 | 
				
			|||||||
        --exclude '.gitignore'
 | 
					        --exclude '.gitignore'
 | 
				
			||||||
        --exclude 'README.md'
 | 
					        --exclude 'README.md'
 | 
				
			||||||
        --exclude '*.service'
 | 
					        --exclude '*.service'
 | 
				
			||||||
        --exclude '*.timer'
 | 
					        --exclude '.SRCINFO'
 | 
				
			||||||
        --exclude '*.socket'
 | 
					        --exclude '*.socket'
 | 
				
			||||||
 | 
					        --exclude '*.timer'
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (( $# )); do
 | 
					    while (( $# )); do
 | 
				
			||||||
@@ -122,9 +114,8 @@ artixpkg_repo_import() {
 | 
				
			|||||||
                fi
 | 
					                fi
 | 
				
			||||||
                stat_done
 | 
					                stat_done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                stat_busy "Fetching upstream tags"
 | 
					                msg2 "Fetching upstream tags"
 | 
				
			||||||
                git fetch --tags upstream main
 | 
					                git fetch --tags upstream main
 | 
				
			||||||
                stat_done
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                local latest version
 | 
					                local latest version
 | 
				
			||||||
                latest=$(git describe --tags FETCH_HEAD)
 | 
					                latest=$(git describe --tags FETCH_HEAD)
 | 
				
			||||||
@@ -133,21 +124,26 @@ artixpkg_repo_import() {
 | 
				
			|||||||
                    version="${TAG}"
 | 
					                    version="${TAG}"
 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                stat_busy "Importing upstream changeset for ${version}"
 | 
					                if ! has_remote_changes; then
 | 
				
			||||||
 | 
					                    msg "Querying ${pkgbase} ..."
 | 
				
			||||||
 | 
					                    if ! show_db; then
 | 
				
			||||||
 | 
					                        warning "Could not query ${REPO_DB}"
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                git checkout "${version}" -b "${version}" &>/dev/null
 | 
					                    git checkout "${version}" -b "${version}" &>/dev/null
 | 
				
			||||||
                local temp
 | 
					                    local temp
 | 
				
			||||||
                temp=$(mktemp -d --tmpdir "${pkgbase}.XXXXXXXXXX")
 | 
					                    temp=$(mktemp -d --tmpdir "${pkgbase}.XXXXXXXXXX")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                rsync "${rsync_args[@]}" "$(pwd)"/ "${temp}"/ &>/dev/null
 | 
					                    rsync "${rsync_args[@]}" "$(pwd)"/ "${temp}"/ &>/dev/null
 | 
				
			||||||
                git checkout master &>/dev/null
 | 
					                    git checkout master &>/dev/null
 | 
				
			||||||
                git branch -D "${version}" &>/dev/null
 | 
					                    git branch -D "${version}" &>/dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                stat_done
 | 
					                    msg "Importing upstream changeset for ${version}"
 | 
				
			||||||
 | 
					                    rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ #&>/dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ #&>/dev/null
 | 
					                    msg2 "Patching ${pkgbase} ..."
 | 
				
			||||||
 | 
					                    patch_pkgbase "${pkgbase}"
 | 
				
			||||||
                patch_pkgbase "${pkgbase}"
 | 
					                fi
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,12 +14,15 @@ artixpkg_repo_move_usage() {
 | 
				
			|||||||
    Usage: ${COMMAND} [OPTIONS] [SOURCE_REPO] [DEST_REPO] [PKGBASE]...
 | 
					    Usage: ${COMMAND} [OPTIONS] [SOURCE_REPO] [DEST_REPO] [PKGBASE]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
        -p, --push         Push pkgbase
 | 
					        -m, --manual            Disable auto repo
 | 
				
			||||||
        -h, --help         Show this help text
 | 
					                                Possible auto values: $(yaml_array ${ARTIX_DB_MAP[@]})
 | 
				
			||||||
 | 
					        -p, --push              Push pkgbase
 | 
				
			||||||
 | 
					        -h, --help              Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EXAMPLES
 | 
					    EXAMPLES
 | 
				
			||||||
        $ ${COMMAND} world-gremlins world libfoo
 | 
					        $ ${COMMAND} ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo
 | 
				
			||||||
        $ ${COMMAND} -p world-gremlins world libfoo
 | 
					        $ ${COMMAND} --push ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo
 | 
				
			||||||
 | 
					        $ ${COMMAND} --auto --push ${ARTIX_DB_MAP[1]} ${ARTIX_DB_MAP[2]} libfoo
 | 
				
			||||||
_EOF_
 | 
					_EOF_
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -34,6 +37,7 @@ artixpkg_repo_move() {
 | 
				
			|||||||
    local pkgbase
 | 
					    local pkgbase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local PUSH=0
 | 
					    local PUSH=0
 | 
				
			||||||
 | 
					    local AUTO=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local DEST
 | 
					    local DEST
 | 
				
			||||||
    local SRC
 | 
					    local SRC
 | 
				
			||||||
@@ -44,6 +48,10 @@ artixpkg_repo_move() {
 | 
				
			|||||||
                artixpkg_repo_move_usage
 | 
					                artixpkg_repo_move_usage
 | 
				
			||||||
                exit 0
 | 
					                exit 0
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
 | 
					            -m|--manual)
 | 
				
			||||||
 | 
					                AUTO=0
 | 
				
			||||||
 | 
					                shift
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
            -p|--push)
 | 
					            -p|--push)
 | 
				
			||||||
                PUSH=1
 | 
					                PUSH=1
 | 
				
			||||||
                shift
 | 
					                shift
 | 
				
			||||||
@@ -61,11 +69,20 @@ artixpkg_repo_move() {
 | 
				
			|||||||
    DEST="$2"
 | 
					    DEST="$2"
 | 
				
			||||||
    shift 2
 | 
					    shift 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ! in_array "${SRC}" "${ARTIX_DB[@]}"; then
 | 
					    if (( AUTO )); then
 | 
				
			||||||
        die "${SRC} does not exist!"
 | 
					        if ! in_array "${SRC}" "${ARTIX_DB_MAP[@]}"; then
 | 
				
			||||||
    fi
 | 
					            die "${SRC} does not exist!"
 | 
				
			||||||
    if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
 | 
					        fi
 | 
				
			||||||
        die "${DEST} does not exist!"
 | 
					        if ! in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
 | 
				
			||||||
 | 
					            die "${DEST} does not exist!"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    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
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pkgbases+=("$@")
 | 
					    pkgbases+=("$@")
 | 
				
			||||||
@@ -80,38 +97,127 @@ artixpkg_repo_move() {
 | 
				
			|||||||
            fi
 | 
					            fi
 | 
				
			||||||
            ( cd "${pkgbase}" || return
 | 
					            ( cd "${pkgbase}" || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if [[ ! -f PKGBUILD ]]; then
 | 
					                if ! has_remote_changes; then
 | 
				
			||||||
                    die "No PKGBUILD found in (%s)" "${pkgbase}"
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                local commit_msg
 | 
					                    if [[ ! -f PKGBUILD ]]; then
 | 
				
			||||||
                commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}")
 | 
					                        die "No PKGBUILD found in (%s)" "${pkgbase}"
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                update_yaml_move "${SRC}" "${DEST}"
 | 
					                    local auto
 | 
				
			||||||
 | 
					                    auto=$(auto_detect)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
 | 
					                    if [[ -z "${auto}" ]]; then
 | 
				
			||||||
 | 
					                        auto=$(team_from_yaml)
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    stat_busy 'Staging files'
 | 
					                    if (( AUTO )); then
 | 
				
			||||||
                    for f in $(git ls-files --modified); do
 | 
					                        if [[ "${SRC}" == "${ARTIX_DB_MAP[2]}" ]]; then
 | 
				
			||||||
                        if [[ "$f" == "${REPO_DB}" ]]; then
 | 
					                            SRC="${auto}"
 | 
				
			||||||
                            git add "$f"
 | 
					                        else
 | 
				
			||||||
 | 
					                            SRC="${auto}-${SRC}"
 | 
				
			||||||
                        fi
 | 
					                        fi
 | 
				
			||||||
                    done
 | 
					 | 
				
			||||||
                    stat_done
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    msg 'Commit'
 | 
					                        if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then
 | 
				
			||||||
                    git commit -m "${commit_msg}"
 | 
					                            DEST="${auto}"
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
                    if (( PUSH )); then
 | 
					                            DEST="${auto}-${DEST}"
 | 
				
			||||||
                        msg "Push (${pkgbase})"
 | 
					                        fi
 | 
				
			||||||
                        git push origin master
 | 
					 | 
				
			||||||
                    fi
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    msg "Querying ${pkgbase} ..."
 | 
					                    local commit_msg src_version
 | 
				
			||||||
                    if ! show_db; then
 | 
					                    commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}")
 | 
				
			||||||
                        warning "Could not query ${REPO_DB}"
 | 
					
 | 
				
			||||||
 | 
					                    src_version=$(version_from_yaml "${SRC}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if [[ "$src_version" != "null" ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        update_yaml_move "${SRC}" "${DEST}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if [[ -f .SRCINFO ]]; then
 | 
				
			||||||
 | 
					                            rm .SRCINFO
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        delete_obsolete_map_keys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        update_yaml_team "$(auto_detect)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            stat_busy 'Staging files'
 | 
				
			||||||
 | 
					                            for f in $(git ls-files --modified); do
 | 
				
			||||||
 | 
					                                if [[ "$f" == "${REPO_DB}" ]]; then
 | 
				
			||||||
 | 
					                                    git add "$f"
 | 
				
			||||||
 | 
					                                fi
 | 
				
			||||||
 | 
					                            done
 | 
				
			||||||
 | 
					                            stat_done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            msg 'Commit'
 | 
				
			||||||
 | 
					                            git commit -m "${commit_msg}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            if (( PUSH )); then
 | 
				
			||||||
 | 
					                                msg "Push (${pkgbase})"
 | 
				
			||||||
 | 
					                                git push origin master
 | 
				
			||||||
 | 
					                            fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            msg "Querying ${pkgbase} ..."
 | 
				
			||||||
 | 
					                            if ! show_db; then
 | 
				
			||||||
 | 
					                                warning "Could not query ${REPO_DB}"
 | 
				
			||||||
 | 
					                            fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (( ! AUTO )); then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            local gitname
 | 
				
			||||||
 | 
					                            gitname=$(get_compliant_name "${pkgbase}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            # team change on cross repo move system <-> world
 | 
				
			||||||
 | 
					                            if [[ "${SRC}" == ${ARTIX_DB[2]}* ]] \
 | 
				
			||||||
 | 
					                            && [[ "${DEST}" == ${ARTIX_DB[5]}* ]]; then
 | 
				
			||||||
 | 
					                                if ! add_team_to_repo "${pkgbase}" "${ARTIX_DB[5]}"; then
 | 
				
			||||||
 | 
					                                    warning "failed to add team: ${ARTIX_DB[5]}"
 | 
				
			||||||
 | 
					                                fi
 | 
				
			||||||
 | 
					                                if ! remove_team_from_repo "${pkgbase}" "${ARTIX_DB[2]}"; then
 | 
				
			||||||
 | 
					                                    warning "failed to remove team: ${ARTIX_DB[2]}"
 | 
				
			||||||
 | 
					                                fi
 | 
				
			||||||
 | 
					                            elif [[ "${SRC}" == ${ARTIX_DB[5]}* ]] \
 | 
				
			||||||
 | 
					                            && [[ "${DEST}" == ${ARTIX_DB[2]}* ]]; then
 | 
				
			||||||
 | 
					                                if ! add_team_to_repo "${pkgbase}" "${ARTIX_DB[2]}"; then
 | 
				
			||||||
 | 
					                                    warning "failed to add team: ${ARTIX_DB[2]}"
 | 
				
			||||||
 | 
					                                fi
 | 
				
			||||||
 | 
					                                if ! remove_team_from_repo "${pkgbase}" "${ARTIX_DB[5]}"; then
 | 
				
			||||||
 | 
					                                    warning "failed to remove team: ${ARTIX_DB[5]}"
 | 
				
			||||||
 | 
					                                fi
 | 
				
			||||||
 | 
					                            fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            # team change on cross repo move world <-> galaxy
 | 
				
			||||||
 | 
					                            if [[ "${SRC}" == ${ARTIX_DB[11]}* ]] \
 | 
				
			||||||
 | 
					                            && [[ "${DEST}" == ${ARTIX_DB[5]}* ]]; then
 | 
				
			||||||
 | 
					                                if ! add_team_to_repo "${gitname}" "${ARTIX_DB[5]}"; then
 | 
				
			||||||
 | 
					                                    warning "failed to add team: ${ARTIX_DB[5]}"
 | 
				
			||||||
 | 
					                                fi
 | 
				
			||||||
 | 
					                                if ! remove_team_from_repo "${gitname}" "${ARTIX_DB[11]}"; then
 | 
				
			||||||
 | 
					                                    warning "failed to remove team: ${ARTIX_DB[11]}"
 | 
				
			||||||
 | 
					                                fi
 | 
				
			||||||
 | 
					                            elif [[ "${SRC}" == ${ARTIX_DB[5]}* ]] \
 | 
				
			||||||
 | 
					                            && [[ "${DEST}" == ${ARTIX_DB[11]}* ]]; then
 | 
				
			||||||
 | 
					                                if ! add_team_to_repo "${gitname}" "${ARTIX_DB[11]}"; then
 | 
				
			||||||
 | 
					                                    warning "failed to add team: ${ARTIX_DB[11]}"
 | 
				
			||||||
 | 
					                                fi
 | 
				
			||||||
 | 
					                                if ! remove_team_from_repo "${gitname}" "${ARTIX_DB[5]}"; then
 | 
				
			||||||
 | 
					                                    warning "failed to remove team: ${ARTIX_DB[5]}"
 | 
				
			||||||
 | 
					                                fi
 | 
				
			||||||
 | 
					                            fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                        error "${pkgbase}: invalid move: version $src_version!"
 | 
				
			||||||
                    fi
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,12 +14,15 @@ artixpkg_repo_remove_usage() {
 | 
				
			|||||||
    Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]...
 | 
					    Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
        -p, --push         Push pkgbase
 | 
					        -m, --manual            Disable auto repo
 | 
				
			||||||
        -h, --help         Show this help text
 | 
					                                Possible auto values: $(yaml_array ${ARTIX_DB_MAP[@]})
 | 
				
			||||||
 | 
					        -p, --push              Push pkgbase
 | 
				
			||||||
 | 
					        -h, --help              Show this help text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EXAMPLES
 | 
					    EXAMPLES
 | 
				
			||||||
        $ ${COMMAND} world-gremlins libfoo
 | 
					        $ ${COMMAND} ${ARTIX_DB[4]} libfoo
 | 
				
			||||||
        $ ${COMMAND} -p world-gremlins libfoo
 | 
					        $ ${COMMAND} --push ${ARTIX_DB[4]} libfoo
 | 
				
			||||||
 | 
					        $ ${COMMAND} --auto --push ${ARTIX_DB_MAP[2]} libfoo
 | 
				
			||||||
_EOF_
 | 
					_EOF_
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -34,6 +37,7 @@ artixpkg_repo_remove() {
 | 
				
			|||||||
    local pkgbase
 | 
					    local pkgbase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local PUSH=0
 | 
					    local PUSH=0
 | 
				
			||||||
 | 
					    local AUTO=1
 | 
				
			||||||
    local DEST=''
 | 
					    local DEST=''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (( $# )); do
 | 
					    while (( $# )); do
 | 
				
			||||||
@@ -42,6 +46,10 @@ artixpkg_repo_remove() {
 | 
				
			|||||||
                artixpkg_repo_remove_usage
 | 
					                artixpkg_repo_remove_usage
 | 
				
			||||||
                exit 0
 | 
					                exit 0
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
 | 
					            -m|--manual)
 | 
				
			||||||
 | 
					                AUTO=0
 | 
				
			||||||
 | 
					                shift
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
            -p|--push)
 | 
					            -p|--push)
 | 
				
			||||||
                PUSH=1
 | 
					                PUSH=1
 | 
				
			||||||
                shift
 | 
					                shift
 | 
				
			||||||
@@ -59,8 +67,14 @@ artixpkg_repo_remove() {
 | 
				
			|||||||
    shift
 | 
					    shift
 | 
				
			||||||
    pkgbases=("$@")
 | 
					    pkgbases=("$@")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
 | 
					    if (( AUTO )); then
 | 
				
			||||||
        die "${DEST} does not exist!"
 | 
					        if ! in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
 | 
				
			||||||
 | 
					            die "${DEST} does not exist!"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
 | 
				
			||||||
 | 
					            die "${DEST} does not exist!"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for pkgbase in "${pkgbases[@]}"; do
 | 
					    for pkgbase in "${pkgbases[@]}"; do
 | 
				
			||||||
@@ -73,36 +87,57 @@ artixpkg_repo_remove() {
 | 
				
			|||||||
            fi
 | 
					            fi
 | 
				
			||||||
            ( cd "${pkgbase}" || return
 | 
					            ( cd "${pkgbase}" || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if [[ ! -f PKGBUILD ]]; then
 | 
					                if ! has_remote_changes; then
 | 
				
			||||||
                    die "No PKGBUILD found in (%s)" "${pkgbase}"
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                local commit_msg
 | 
					                    if [[ ! -f PKGBUILD ]]; then
 | 
				
			||||||
                commit_msg=$(get_commit_msg 'remove' "${DEST}")
 | 
					                        die "No PKGBUILD found in (%s)" "${pkgbase}"
 | 
				
			||||||
 | 
					 | 
				
			||||||
                update_yaml_remove "${DEST}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    stat_busy 'Staging files'
 | 
					 | 
				
			||||||
                    for f in $(git ls-files --modified); do
 | 
					 | 
				
			||||||
                        if [[ "$f" == "${REPO_DB}" ]]; then
 | 
					 | 
				
			||||||
                            git add "$f"
 | 
					 | 
				
			||||||
                        fi
 | 
					 | 
				
			||||||
                    done
 | 
					 | 
				
			||||||
                    stat_done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    msg 'Commit'
 | 
					 | 
				
			||||||
                    git commit -m "${commit_msg}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (( PUSH )); then
 | 
					 | 
				
			||||||
                        msg "Push (${pkgbase})"
 | 
					 | 
				
			||||||
                        git push origin master
 | 
					 | 
				
			||||||
                    fi
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    msg "Querying ${pkgbase} ..."
 | 
					                    local auto
 | 
				
			||||||
                    if ! show_db; then
 | 
					                    auto=$(auto_detect)
 | 
				
			||||||
                        warning "Could not query ${REPO_DB}"
 | 
					
 | 
				
			||||||
 | 
					                    if [[ -z "${auto}" ]]; then
 | 
				
			||||||
 | 
					                        auto=$(team_from_yaml)
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (( AUTO )); then
 | 
				
			||||||
 | 
					                        if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then
 | 
				
			||||||
 | 
					                            DEST="${auto}"
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                            DEST="${auto}-${DEST}"
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    local commit_msg
 | 
				
			||||||
 | 
					                    commit_msg=$(get_commit_msg 'remove' "${DEST}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    update_yaml_remove "${DEST}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    delete_obsolete_map_keys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        stat_busy 'Staging files'
 | 
				
			||||||
 | 
					                        for f in $(git ls-files --modified); do
 | 
				
			||||||
 | 
					                            if [[ "$f" == "${REPO_DB}" ]]; then
 | 
				
			||||||
 | 
					                                git add "$f"
 | 
				
			||||||
 | 
					                            fi
 | 
				
			||||||
 | 
					                        done
 | 
				
			||||||
 | 
					                        stat_done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        msg 'Commit'
 | 
				
			||||||
 | 
					                        git commit -m "${commit_msg}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (( PUSH )); then
 | 
				
			||||||
 | 
					                            msg "Push (${pkgbase})"
 | 
				
			||||||
 | 
					                            git push origin master
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        msg "Querying ${pkgbase} ..."
 | 
				
			||||||
 | 
					                        if ! show_db; then
 | 
				
			||||||
 | 
					                            warning "Could not query ${REPO_DB}"
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    fi
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,18 +8,6 @@ ARTOOLS_INCLUDE_REPO_SHOW_SH=1
 | 
				
			|||||||
set -e
 | 
					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() {
 | 
					artixpkg_repo_show_usage() {
 | 
				
			||||||
    local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
					    local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
 | 
				
			||||||
    cat <<- _EOF_
 | 
					    cat <<- _EOF_
 | 
				
			||||||
@@ -84,28 +72,25 @@ artixpkg_repo_show() {
 | 
				
			|||||||
            fi
 | 
					            fi
 | 
				
			||||||
            ( cd "${pkgbase}" || return
 | 
					            ( cd "${pkgbase}" || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                msg "Checking origin for changes"
 | 
					                if ! has_remote_changes; then
 | 
				
			||||||
                if has_changeset; then
 | 
					                    if [[ ! -f PKGBUILD ]]; then
 | 
				
			||||||
                    warning "Remote changes detected! Please update (%s)" "${pkgbase}"
 | 
					                        die "No PKGBUILD found in (%s)" "${pkgbase}"
 | 
				
			||||||
                fi
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if [[ ! -f PKGBUILD ]]; then
 | 
					                    msg "Querying ${pkgbase} ..."
 | 
				
			||||||
                    die "No PKGBUILD found in (%s)" "${pkgbase}"
 | 
					                    if ! show_db; then
 | 
				
			||||||
                fi
 | 
					                        warning "Could not query ${REPO_DB}"
 | 
				
			||||||
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                msg "Querying ${pkgbase} ..."
 | 
					                    if (( SRC_BASE )); then
 | 
				
			||||||
                if ! show_db; then
 | 
					                        msg "Showing srcinfo base ..."
 | 
				
			||||||
                    warning "Could not query ${REPO_DB}"
 | 
					                        show_srcinfo_base
 | 
				
			||||||
                fi
 | 
					                    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (( SRC_BASE )); then
 | 
					                    if (( SRC_PKGS )); then
 | 
				
			||||||
                    msg "Showing srcinfo base ..."
 | 
					                        msg "Showing srcinfo pkgs ..."
 | 
				
			||||||
                    show_srcinfo_base
 | 
					                        show_srcinfo_pkgs
 | 
				
			||||||
                fi
 | 
					                    fi
 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (( SRC_PKGS )); then
 | 
					 | 
				
			||||||
                    msg "Showing srcinfo pkgs ..."
 | 
					 | 
				
			||||||
                    show_srcinfo_pkgs
 | 
					 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,21 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#{{{ pkg conf
 | 
					#{{{ pkg conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prepare_dir(){
 | 
				
			||||||
 | 
					    [[ ! -d $1 ]] && mkdir -p "$1"
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ -n $SUDO_USER ]]; then
 | 
				
			||||||
 | 
					    eval "USER_HOME=~$SUDO_USER"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    USER_HOME=$HOME
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prepare_dir "${USER_CONF_DIR}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
load_pkg_config(){
 | 
					load_pkg_config(){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local conf="$1/artools-pkg.conf"
 | 
					    local conf="$1/artools-pkg.conf"
 | 
				
			||||||
@@ -13,10 +28,20 @@ load_pkg_config(){
 | 
				
			|||||||
    # shellcheck source=config/conf/artools-pkg.conf
 | 
					    # shellcheck source=config/conf/artools-pkg.conf
 | 
				
			||||||
    [[ -r "$conf" ]] && source "$conf"
 | 
					    [[ -r "$conf" ]] && source "$conf"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local git_domain="gitea.artixlinux.org"
 | 
					    CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ARCH=${ARCH:-"$(uname -m)"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    REPO=${REPO:-'world'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    local -r git_domain="gitea.artixlinux.org"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GIT_HTTPS=${GIT_HTTPS:-"https://${git_domain}"}
 | 
					    GIT_HTTPS=${GIT_HTTPS:-"https://${git_domain}"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    readonly API_URL="${GIT_HTTPS}/api/v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"}
 | 
					    GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GIT_TOKEN=${GIT_TOKEN:-''}
 | 
					    GIT_TOKEN=${GIT_TOKEN:-''}
 | 
				
			||||||
@@ -25,6 +50,8 @@ load_pkg_config(){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    GIT_UPSTREAM_URL=${GIT_UPSTREAM_URL:-"https://gitlab.archlinux.org/archlinux/packaging/packages"}
 | 
					    GIT_UPSTREAM_URL=${GIT_UPSTREAM_URL:-"https://gitlab.archlinux.org/archlinux/packaging/packages"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GIT_ORG_ARCHIVE=${GIT_ORG_ARCHIVE:-'landfill'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"}
 | 
					    TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
 | 
					    REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,9 +20,10 @@ usage() {
 | 
				
			|||||||
    Usage: ${COMMAND} [COMMAND] [OPTIONS]
 | 
					    Usage: ${COMMAND} [COMMAND] [OPTIONS]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    COMMANDS
 | 
					    COMMANDS
 | 
				
			||||||
        repo      Pacman database modification for packge update, move etc
 | 
					        repo      Pacman database modification for package updates, moves, etc.
 | 
				
			||||||
        git       Manage Git packaging repositories and their configuration
 | 
					        git       Manage Git packaging repositories and their configuration
 | 
				
			||||||
        admin     Managegement of topics and obsolete repos
 | 
					        agent     Manage CI and build agent
 | 
				
			||||||
 | 
					        admin     Manage topics, teams and obsolete repos
 | 
				
			||||||
        version   Show artixpkg version information
 | 
					        version   Show artixpkg version information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS
 | 
					    OPTIONS
 | 
				
			||||||
@@ -37,8 +38,6 @@ fi
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export _ARTOOLS_COMMAND='artixpkg'
 | 
					export _ARTOOLS_COMMAND='artixpkg'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/base/util.sh
 | 
					 | 
				
			||||||
source "${LIBDIR}"/base/util.sh
 | 
					 | 
				
			||||||
# shellcheck source=src/lib/pkg/util.sh
 | 
					# shellcheck source=src/lib/pkg/util.sh
 | 
				
			||||||
source "${LIBDIR}"/pkg/util.sh
 | 
					source "${LIBDIR}"/pkg/util.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -69,6 +68,14 @@ while (( $# )); do
 | 
				
			|||||||
        artixpkg_git "$@"
 | 
					        artixpkg_git "$@"
 | 
				
			||||||
        exit 0
 | 
					        exit 0
 | 
				
			||||||
    ;;
 | 
					    ;;
 | 
				
			||||||
 | 
					    ci)
 | 
				
			||||||
 | 
					        _ARTOOLS_COMMAND+=" $1"
 | 
				
			||||||
 | 
					        shift
 | 
				
			||||||
 | 
					        # shellcheck source=src/lib/pkg/ci.sh
 | 
				
			||||||
 | 
					        source "${LIBDIR}"/pkg/ci.sh
 | 
				
			||||||
 | 
					        artixpkg_ci "$@"
 | 
				
			||||||
 | 
					        exit 0
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
    admin)
 | 
					    admin)
 | 
				
			||||||
        _ARTOOLS_COMMAND+=" $1"
 | 
					        _ARTOOLS_COMMAND+=" $1"
 | 
				
			||||||
        shift
 | 
					        shift
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,12 +6,12 @@ LIBDIR=${LIBDIR:-'@libdir@'}
 | 
				
			|||||||
DATADIR=${DATADIR:-'@datadir@'}
 | 
					DATADIR=${DATADIR:-'@datadir@'}
 | 
				
			||||||
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
 | 
					SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/base/util.sh
 | 
					 | 
				
			||||||
source "${LIBDIR}"/base/util.sh
 | 
					 | 
				
			||||||
# shellcheck source=src/lib/base/message.sh
 | 
					# shellcheck source=src/lib/base/message.sh
 | 
				
			||||||
source "${LIBDIR}"/base/message.sh
 | 
					source "${LIBDIR}"/base/message.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/chroot.sh
 | 
					# shellcheck source=src/lib/base/chroot.sh
 | 
				
			||||||
source "${LIBDIR}"/base/chroot.sh
 | 
					source "${LIBDIR}"/base/chroot.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/pkg/util.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/pkg/util.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
create_first=false
 | 
					create_first=false
 | 
				
			||||||
rebuild=false
 | 
					rebuild=false
 | 
				
			||||||
@@ -32,6 +32,8 @@ usage() {
 | 
				
			|||||||
    printf '                       [default: %s]\n' "${repo}"
 | 
					    printf '                       [default: %s]\n' "${repo}"
 | 
				
			||||||
    printf '    -a <arch>          Build arch chroot\n'
 | 
					    printf '    -a <arch>          Build arch chroot\n'
 | 
				
			||||||
    printf '                       [default: %s]\n' "${arch}"
 | 
					    printf '                       [default: %s]\n' "${arch}"
 | 
				
			||||||
 | 
					    printf '    -e <name>          Export PACKAGER\n'
 | 
				
			||||||
 | 
					    printf "                       format: 'John Doe <john@doe.com>'\n"
 | 
				
			||||||
    printf '    -c                 Recreate the chroot before building\n'
 | 
					    printf '    -c                 Recreate the chroot before building\n'
 | 
				
			||||||
    printf '    -m                 Major rebuild\n'
 | 
					    printf '    -m                 Major rebuild\n'
 | 
				
			||||||
    printf '    -N                 Disable check() function\n'
 | 
					    printf '    -N                 Disable check() function\n'
 | 
				
			||||||
@@ -44,15 +46,16 @@ usage() {
 | 
				
			|||||||
    exit "$1"
 | 
					    exit "$1"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
opts='hcCNmnr:d:a:'
 | 
					opts='hcCNmnr:d:a:e:'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
while getopts "${opts}" arg; do
 | 
					while getopts "${opts}" arg; do
 | 
				
			||||||
    case "${arg}" in
 | 
					    case "${arg}" in
 | 
				
			||||||
        r) chroots_pkg="$OPTARG" ;;
 | 
					        r) chroots_pkg="$OPTARG" ;;
 | 
				
			||||||
        d) repo="$OPTARG" ;;
 | 
					        d) repo="$OPTARG" ;;
 | 
				
			||||||
        a) arch="$OPTARG" ;;
 | 
					        a) arch="$OPTARG" ;;
 | 
				
			||||||
 | 
					        e) packager="$OPTARG" ;;
 | 
				
			||||||
        c) create_first=true ;;
 | 
					        c) create_first=true ;;
 | 
				
			||||||
        m) rebuild=true; repo=${repo%-*} ;;
 | 
					        m) rebuild=true ;;
 | 
				
			||||||
        C) mkchrootpkg_args+=(-C) ;;
 | 
					        C) mkchrootpkg_args+=(-C) ;;
 | 
				
			||||||
        N) mkchrootpkg_args+=(-N) ;;
 | 
					        N) mkchrootpkg_args+=(-N) ;;
 | 
				
			||||||
        n) mkchrootpkg_args+=(-n) ;;
 | 
					        n) mkchrootpkg_args+=(-n) ;;
 | 
				
			||||||
@@ -60,6 +63,10 @@ while getopts "${opts}" arg; do
 | 
				
			|||||||
    esac
 | 
					    esac
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if "${rebuild}"; then
 | 
				
			||||||
 | 
					    repo=${repo%-*}
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [[ "${repo}" == lib32* ]]; then
 | 
					if [[ "${repo}" == lib32* ]]; then
 | 
				
			||||||
    base_packages+=('multilib-devel')
 | 
					    base_packages+=('multilib-devel')
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
@@ -86,6 +93,10 @@ else
 | 
				
			|||||||
    set_arch="${arch}"
 | 
					    set_arch="${arch}"
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ -n "${packager}" ]]; then
 | 
				
			||||||
 | 
					    export PACKAGER=${packager}
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Architecture-specific Mount
 | 
					# Architecture-specific Mount
 | 
				
			||||||
arch_mounts=()
 | 
					arch_mounts=()
 | 
				
			||||||
if [[ -f "${DATADIR}/mount.d/${arch}" ]]; then
 | 
					if [[ -f "${DATADIR}/mount.d/${arch}" ]]; then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,7 +57,7 @@ while (( $# )); do
 | 
				
			|||||||
            shift
 | 
					            shift
 | 
				
			||||||
            break
 | 
					            break
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        -*|--*)
 | 
					        --*|-*)
 | 
				
			||||||
            die "invalid argument: %s" "$1"
 | 
					            die "invalid argument: %s" "$1"
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        *)
 | 
					        *)
 | 
				
			||||||
@@ -76,10 +76,10 @@ fi
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Source user-specific makepkg.conf overrides
 | 
					# Source user-specific makepkg.conf overrides
 | 
				
			||||||
if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
 | 
					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"
 | 
					    source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
 | 
				
			||||||
elif [[ -r "$HOME/.makepkg.conf" ]]; then
 | 
					elif [[ -r "$HOME/.makepkg.conf" ]]; then
 | 
				
			||||||
    # shellcheck source=/dev/null
 | 
					    # shellcheck source=config/makepkg/x86_64.conf
 | 
				
			||||||
    source "$HOME/.makepkg.conf"
 | 
					    source "$HOME/.makepkg.conf"
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -152,7 +152,11 @@ for _pkgname in "${pkgname[@]}"; do
 | 
				
			|||||||
    find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname"
 | 
					    find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname"
 | 
				
			||||||
    if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then
 | 
					    if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then
 | 
				
			||||||
        message="Sonames differ in $_pkgname!"
 | 
					        message="Sonames differ in $_pkgname!"
 | 
				
			||||||
        (( WARN )) && warning "$message" || msg "$message"
 | 
					        if (( WARN )); then
 | 
				
			||||||
 | 
					            warning "$message"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            msg "$message"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
        printf "%s\n" "$diff_output" 2>&1 | tee "${pkgfile##*/}-checkpkg.log"
 | 
					        printf "%s\n" "$diff_output" 2>&1 | tee "${pkgfile##*/}-checkpkg.log"
 | 
				
			||||||
        changed=1
 | 
					        changed=1
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,8 +6,6 @@ LIBDIR=${LIBDIR:-'@libdir@'}
 | 
				
			|||||||
DATADIR=${DATADIR:-'@datadir@'}
 | 
					DATADIR=${DATADIR:-'@datadir@'}
 | 
				
			||||||
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
 | 
					SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/base/util.sh
 | 
					 | 
				
			||||||
source "${LIBDIR}"/base/util.sh
 | 
					 | 
				
			||||||
# shellcheck source=src/lib/pkg/util.sh
 | 
					# shellcheck source=src/lib/pkg/util.sh
 | 
				
			||||||
source "${LIBDIR}"/pkg/util.sh
 | 
					source "${LIBDIR}"/pkg/util.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/message.sh
 | 
					# shellcheck source=src/lib/base/message.sh
 | 
				
			||||||
@@ -32,6 +30,7 @@ update_linksdb_cache(){
 | 
				
			|||||||
    local cachedir url
 | 
					    local cachedir url
 | 
				
			||||||
    for repo in "${search[@]}"; do
 | 
					    for repo in "${search[@]}"; do
 | 
				
			||||||
        cachedir=${db_cache_dir}/linksdb/$repo
 | 
					        cachedir=${db_cache_dir}/linksdb/$repo
 | 
				
			||||||
 | 
					        # shellcheck disable=SC2153
 | 
				
			||||||
        url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext}
 | 
					        url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext}
 | 
				
			||||||
        extract_db "$url" "$cachedir"
 | 
					        extract_db "$url" "$cachedir"
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ umask 0022
 | 
				
			|||||||
working_dir=''
 | 
					working_dir=''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
files=()
 | 
					files=()
 | 
				
			||||||
mount_args=("-B:/etc/hosts:/etc/hosts")
 | 
					mount_args="-B:/etc/hosts:/etc/hosts"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
usage() {
 | 
					usage() {
 | 
				
			||||||
    printf "Usage: %s [options] working-dir [run arguments]\n" "${0##*/}"
 | 
					    printf "Usage: %s [options] working-dir [run arguments]\n" "${0##*/}"
 | 
				
			||||||
@@ -72,7 +72,7 @@ while getopts ${opts} arg; do
 | 
				
			|||||||
        f) files+=("$OPTARG") ;;
 | 
					        f) files+=("$OPTARG") ;;
 | 
				
			||||||
        s) nosetarch=1 ;;
 | 
					        s) nosetarch=1 ;;
 | 
				
			||||||
        t) tmpfs_opts="$OPTARG" ;;
 | 
					        t) tmpfs_opts="$OPTARG" ;;
 | 
				
			||||||
        b) bindmounts="$OPTARG"; mount_args+=(${bindmounts}) ;;
 | 
					        b) bindmounts="$OPTARG"; mount_args+=" ${bindmounts}" ;;
 | 
				
			||||||
        h|?) usage ;;
 | 
					        h|?) usage ;;
 | 
				
			||||||
        *) error "invalid argument '%s'" "$arg"; usage ;;
 | 
					        *) error "invalid argument '%s'" "$arg"; usage ;;
 | 
				
			||||||
    esac
 | 
					    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
 | 
					for host_mirror in "${host_mirrors[@]}"; do
 | 
				
			||||||
    if [[ $host_mirror == *file://* ]]; then
 | 
					    if [[ $host_mirror == *file://* ]]; then
 | 
				
			||||||
 | 
					        # shellcheck disable=SC2016
 | 
				
			||||||
        host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g')
 | 
					        host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g')
 | 
				
			||||||
        for m in "$host_mirror"/pool/*/; do
 | 
					        for m in "$host_mirror"/pool/*/; do
 | 
				
			||||||
            in_array "$m" "${cache_dirs[@]}" || cache_dirs+=("$m")
 | 
					            in_array "$m" "${cache_dirs[@]}" || cache_dirs+=("$m")
 | 
				
			||||||
@@ -114,10 +115,10 @@ while read -r line; do
 | 
				
			|||||||
    done
 | 
					    done
 | 
				
			||||||
done < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" --repo-list)
 | 
					done < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" --repo-list)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}")
 | 
					mount_args+=" -B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
for cache_dir in "${cache_dirs[@]:1}"; do
 | 
					for cache_dir in "${cache_dirs[@]:1}"; do
 | 
				
			||||||
    mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}")
 | 
					    mount_args+=" -Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}"
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# {{{ functions
 | 
					# {{{ functions
 | 
				
			||||||
@@ -144,13 +145,13 @@ copy_hostconf () {
 | 
				
			|||||||
chroot_extra_mount() {
 | 
					chroot_extra_mount() {
 | 
				
			||||||
    chroot_add_resolv_conf "${working_dir}"
 | 
					    chroot_add_resolv_conf "${working_dir}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for arg in "${mount_args[@]}"; do
 | 
					    for arg in ${mount_args}; do
 | 
				
			||||||
        local flag dest src
 | 
					        local flag dest src
 | 
				
			||||||
        flag=${arg%%:*}
 | 
					        flag=${arg%%:*}
 | 
				
			||||||
        dest=${arg##*:}
 | 
					        dest=${arg##*:}
 | 
				
			||||||
        src=${arg%:*}
 | 
					        src=${arg%:*}
 | 
				
			||||||
        src=${src#*:}
 | 
					        src=${src#*:}
 | 
				
			||||||
        chroot_mount "${src}" "${working_dir}${dest}" "${flag}"
 | 
					        chroot_add_mount "${src}" "${working_dir}${dest}" "${flag}"
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -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}"
 | 
					    die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}"
 | 
				
			||||||
fi
 | 
					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
 | 
					chroot_extra_mount
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4,12 +4,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
LIBDIR=${LIBDIR:-'@libdir@'}
 | 
					LIBDIR=${LIBDIR:-'@libdir@'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/base/util.sh
 | 
					 | 
				
			||||||
source "${LIBDIR}"/base/util.sh
 | 
					 | 
				
			||||||
# shellcheck source=src/lib/base/message.sh
 | 
					# shellcheck source=src/lib/base/message.sh
 | 
				
			||||||
source "${LIBDIR}"/base/message.sh
 | 
					source "${LIBDIR}"/base/message.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/chroot.sh
 | 
					# shellcheck source=src/lib/base/chroot.sh
 | 
				
			||||||
source "${LIBDIR}"/base/chroot.sh
 | 
					source "${LIBDIR}"/base/chroot.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/pkg/util.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/pkg/util.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
shopt -s nullglob
 | 
					shopt -s nullglob
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -76,6 +76,7 @@ umask 0022
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ORIG_HOME=$HOME
 | 
					ORIG_HOME=$HOME
 | 
				
			||||||
IFS=: read -r _ _ _ _ _ HOME _ < <(getent passwd "${SUDO_USER:-$USER}")
 | 
					IFS=: read -r _ _ _ _ _ HOME _ < <(getent passwd "${SUDO_USER:-$USER}")
 | 
				
			||||||
 | 
					# shellcheck source=config/makepkg/x86_64.conf
 | 
				
			||||||
load_makepkg_config
 | 
					load_makepkg_config
 | 
				
			||||||
HOME=$ORIG_HOME
 | 
					HOME=$ORIG_HOME
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -127,7 +127,7 @@ while (( $# )); do
 | 
				
			|||||||
            shift
 | 
					            shift
 | 
				
			||||||
            break
 | 
					            break
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
        -*|--*)
 | 
					        --*|-*)
 | 
				
			||||||
            die "invalid argument: %s" "$1"
 | 
					            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@'}
 | 
					DATADIR=${DATADIR:-'@datadir@'}
 | 
				
			||||||
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
 | 
					SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/base/util.sh
 | 
					 | 
				
			||||||
source "${LIBDIR}"/base/util.sh
 | 
					 | 
				
			||||||
# shellcheck source=src/lib/base/message.sh
 | 
					# shellcheck source=src/lib/base/message.sh
 | 
				
			||||||
source "${LIBDIR}"/base/message.sh
 | 
					source "${LIBDIR}"/base/message.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/chroot.sh
 | 
					# shellcheck source=src/lib/base/chroot.sh
 | 
				
			||||||
source "${LIBDIR}"/base/chroot.sh
 | 
					source "${LIBDIR}"/base/chroot.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/pkg/util.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/pkg/util.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare -A buildinfo
 | 
					declare -A buildinfo
 | 
				
			||||||
declare -a buildenv buildopts installed installpkgs
 | 
					declare -a buildenv buildopts installed installpkgs
 | 
				
			||||||
@@ -133,7 +133,7 @@ while getopts 'dM:c:l:h' arg; do
 | 
				
			|||||||
        c) cache_dirs+=("$OPTARG") ;;
 | 
					        c) cache_dirs+=("$OPTARG") ;;
 | 
				
			||||||
        l) chroot="$OPTARG" ;;
 | 
					        l) chroot="$OPTARG" ;;
 | 
				
			||||||
        h) usage; exit 0 ;;
 | 
					        h) usage; exit 0 ;;
 | 
				
			||||||
        *|?) usage; exit 1 ;;
 | 
					        ?|*) usage; exit 1 ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
shift $((OPTIND - 1))
 | 
					shift $((OPTIND - 1))
 | 
				
			||||||
@@ -222,10 +222,12 @@ TEMPDIR=$(mktemp -d --tmpdir makerepropkg.XXXXXXXXXX)
 | 
				
			|||||||
makepkg_conf="${TEMPDIR}/makepkg.conf"
 | 
					makepkg_conf="${TEMPDIR}/makepkg.conf"
 | 
				
			||||||
# anything before buildtool support is pinned to the last none buildtool aware release
 | 
					# anything before buildtool support is pinned to the last none buildtool aware release
 | 
				
			||||||
if [[ -z "${BUILDTOOL}" ]]; then
 | 
					if [[ -z "${BUILDTOOL}" ]]; then
 | 
				
			||||||
    get_makepkg_conf "artools-pkg-0.28.2-1-any" "${CARCH}" "${makepkg_conf}" || exit 1
 | 
					    # shellcheck disable=SC2153
 | 
				
			||||||
 | 
					    get_makepkg_conf "artools-pkg-0.31.7-1-any" "${CARCH}" "${makepkg_conf}" || exit 1
 | 
				
			||||||
# prefere to assume artools-pkg up until matching makepkg version so repository packages remain reproducible
 | 
					# prefere to assume artools-pkg up until matching makepkg version so repository packages remain reproducible
 | 
				
			||||||
elif [[ "${BUILDTOOL}" = makepkg ]] && (( $(vercmp "${BUILDTOOLVER}" 6.0.1) <= 0 )); then
 | 
					elif [[ "${BUILDTOOL}" = makepkg ]] && (( $(vercmp "${BUILDTOOLVER}" 6.0.1) <= 0 )); then
 | 
				
			||||||
    get_makepkg_conf "artools-pkg-0.28.2-1-any" "${CARCH}" "${makepkg_conf}" || exit 1
 | 
					    # shellcheck disable=SC2153
 | 
				
			||||||
 | 
					    get_makepkg_conf "artools-pkg-0.31.7-1-any" "${CARCH}" "${makepkg_conf}" || exit 1
 | 
				
			||||||
# all artools-pkg builds
 | 
					# all artools-pkg builds
 | 
				
			||||||
elif [[ "${BUILDTOOL}" = artools ]] && get_makepkg_conf "${BUILDTOOL}-${BUILDTOOLVER}" "${makepkg_conf}"; then
 | 
					elif [[ "${BUILDTOOL}" = artools ]] && get_makepkg_conf "${BUILDTOOL}-${BUILDTOOLVER}" "${makepkg_conf}"; then
 | 
				
			||||||
    true
 | 
					    true
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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=()
 | 
					files=()
 | 
				
			||||||
chroot_args=()
 | 
					chroot_args=()
 | 
				
			||||||
 | 
					nosetarch=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
usage() {
 | 
					usage() {
 | 
				
			||||||
    printf "Usage: %s [options] working-dir package-list...\n" "${0##*/}"
 | 
					    printf "Usage: %s [options] working-dir package-list...\n" "${0##*/}"
 | 
				
			||||||
@@ -177,7 +177,7 @@ prepare_chroot() {
 | 
				
			|||||||
    done
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF
 | 
					    cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF
 | 
				
			||||||
builduser ALL = NOPASSWD: /usr/bin/pacman
 | 
					builduser ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
    chmod 440 "$copydir/etc/sudoers.d/builduser-pacman"
 | 
					    chmod 440 "$copydir/etc/sudoers.d/builduser-pacman"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -205,6 +205,7 @@ _chrootbuild() {
 | 
				
			|||||||
    # No coredumps
 | 
					    # No coredumps
 | 
				
			||||||
    ulimit -c 0
 | 
					    ulimit -c 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # shellcheck disable=SC1091
 | 
				
			||||||
    . /etc/locale.conf
 | 
					    . /etc/locale.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # shellcheck source=/dev/null
 | 
					    # shellcheck source=/dev/null
 | 
				
			||||||
@@ -263,6 +264,7 @@ move_products() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # Fix broken symlink because of temporary chroot PKGDEST /pkgdest
 | 
					        # Fix broken symlink because of temporary chroot PKGDEST /pkgdest
 | 
				
			||||||
        if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then
 | 
					        if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then
 | 
				
			||||||
 | 
					            # shellcheck disable=SC2226
 | 
				
			||||||
            ln -sf "$PKGDEST/${pkgfile##*/}"
 | 
					            ln -sf "$PKGDEST/${pkgfile##*/}"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
@@ -275,6 +277,7 @@ move_products() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest
 | 
					        # Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest
 | 
				
			||||||
        if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then
 | 
					        if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then
 | 
				
			||||||
 | 
					            # shellcheck disable=SC2226
 | 
				
			||||||
            ln -sf "$SRCPKGDEST/${s##*/}"
 | 
					            ln -sf "$SRCPKGDEST/${s##*/}"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										51
									
								
								src/pkg/packagersign.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/pkg/packagersign.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LIBDIR=${LIBDIR:-'@libdir@'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/base/message.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/base/message.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/base/chroot.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/base/chroot.sh
 | 
				
			||||||
 | 
					# shellcheck source=src/lib/pkg/deploy.sh
 | 
				
			||||||
 | 
					source "${LIBDIR}"/pkg/deploy.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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##*/}"
 | 
				
			||||||
 | 
					        if ! gpg --homedir /etc/pacman.d/gnupg --no-permission-warning \
 | 
				
			||||||
 | 
					            --no-default-keyring --default-key "${GPGP_KEY}" --passphrase "${GPGP_PASS}" \
 | 
				
			||||||
 | 
					            -q --detach-sign "$file_to_sign"; then
 | 
				
			||||||
 | 
					           return 1
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					check_root "" "${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,10 +6,12 @@ LIBDIR=${LIBDIR:-'@libdir@'}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/base/message.sh
 | 
					# shellcheck source=src/lib/base/message.sh
 | 
				
			||||||
source "${LIBDIR}"/base/message.sh
 | 
					source "${LIBDIR}"/base/message.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/yaml.sh
 | 
					# shellcheck source=src/lib/pkg/yaml.sh
 | 
				
			||||||
source "${LIBDIR}"/base/yaml.sh
 | 
					source "${LIBDIR}"/pkg/yaml.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# shellcheck disable=1091
 | 
				
			||||||
source "${MAKEPKG_LIBRARY}"/util/pkgbuild.sh
 | 
					source "${MAKEPKG_LIBRARY}"/util/pkgbuild.sh
 | 
				
			||||||
 | 
					# shellcheck disable=1091
 | 
				
			||||||
source "${MAKEPKG_LIBRARY}"/util/schema.sh
 | 
					source "${MAKEPKG_LIBRARY}"/util/schema.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#{{{ functions
 | 
					#{{{ functions
 | 
				
			||||||
@@ -121,6 +123,7 @@ usage() {
 | 
				
			|||||||
    exit "$1"
 | 
					    exit "$1"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# shellcheck source=config/makepkg/x86_64.conf
 | 
				
			||||||
load_makepkg_config
 | 
					load_makepkg_config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
opts='h'
 | 
					opts='h'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,8 +6,6 @@ LIBDIR=${LIBDIR:-'@libdir@'}
 | 
				
			|||||||
DATADIR=${DATADIR:-'@datadir@'}
 | 
					DATADIR=${DATADIR:-'@datadir@'}
 | 
				
			||||||
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
 | 
					SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# shellcheck source=src/lib/base/util.sh
 | 
					 | 
				
			||||||
source "${LIBDIR}"/base/util.sh
 | 
					 | 
				
			||||||
# shellcheck source=src/lib/pkg/util.sh
 | 
					# shellcheck source=src/lib/pkg/util.sh
 | 
				
			||||||
source "${LIBDIR}"/pkg/util.sh
 | 
					source "${LIBDIR}"/pkg/util.sh
 | 
				
			||||||
# shellcheck source=src/lib/base/message.sh
 | 
					# shellcheck source=src/lib/base/message.sh
 | 
				
			||||||
@@ -34,6 +32,7 @@ remove(){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
repo_action() {
 | 
					repo_action() {
 | 
				
			||||||
    local repo_path
 | 
					    local repo_path
 | 
				
			||||||
 | 
					    # shellcheck disable=SC2153
 | 
				
			||||||
    repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH}
 | 
					    repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local packages=() action func="$1"
 | 
					    local packages=() action func="$1"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,7 @@ source "${LIBDIR}"/base/message.sh
 | 
				
			|||||||
# shellcheck source=src/lib/pkg/deploy.sh
 | 
					# shellcheck source=src/lib/pkg/deploy.sh
 | 
				
			||||||
source "${LIBDIR}"/pkg/deploy.sh
 | 
					source "${LIBDIR}"/pkg/deploy.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# shellcheck source=config/makepkg/x86_64.conf
 | 
				
			||||||
load_makepkg_config
 | 
					load_makepkg_config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
passfiles=("$@")
 | 
					passfiles=("$@")
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user