Compare commits
	
		
			60 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | |||
| 3ed0c310a3 | |||
| b1213d5c2c | |||
| 26dffde972 | |||
| 915eca6c2e | |||
| a52e32d740 | |||
| 34ed4ef723 | |||
| aaa319c67a | |||
| 3304c888a5 | |||
| 095c7ced45 | |||
| f4eef7a3cd | |||
| 6fc1850f1f | |||
| c0a3a7e796 | |||
| 08fff866ed | |||
| 8bef697c44 | |||
| a6eadf1af4 | |||
| 2595cd2a3a | |||
| 1917c252aa | |||
| 4c458bf242 | |||
| 5b00c80698 | |||
| 98c3c8c5b0 | |||
| 0786c46474 | |||
| d22406b308 | |||
| 87ea01db9b | |||
| cb347b511a | |||
| e15d70f732 | |||
| 5ad0d72378 | |||
| f8dccbf59e | |||
| a3bcbd40d2 | |||
| 7a6c7e61de | |||
| b517c7dcf8 | |||
| b5c3decf9b | |||
| de2d4bb4de | |||
| f2eb80f1ab | |||
| 5f2ac0a406 | 
							
								
								
									
										30
									
								
								.github/workflows/lint.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								.github/workflows/lint.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| name: Artools shellcheck | ||||
| run-name: ${{ gitea.actor }} | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - artools/0.33.x | ||||
|       - master | ||||
|     tags: | ||||
|       - 0.* | ||||
|   pull_request: | ||||
|     types: [opened, reopened] | ||||
|  | ||||
| jobs: | ||||
|   lint: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: checkout repo | ||||
|         uses: actions/checkout@main | ||||
|       - name: build | ||||
|         run: make | ||||
|       - name: shellcheck | ||||
|         uses: ludeeus/action-shellcheck@master | ||||
|         env: | ||||
|           SHELLCHECK_OPTS: -x -e SC2034 | ||||
|         with: | ||||
|           scandir: './build/bin' | ||||
|           format: tty | ||||
|           severity: error | ||||
|           additional_files: 'contrib/completion/bash/artools' | ||||
|  | ||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -12,3 +12,5 @@ PKGBUILD | ||||
| contrib/artixlinux | ||||
| build/ | ||||
| tmp/ | ||||
| checks/ | ||||
| check.sh | ||||
|   | ||||
							
								
								
									
										40
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,9 +1,9 @@ | ||||
| SHELL=/bin/bash | ||||
|  | ||||
| V=0.31 | ||||
| V=0.33 | ||||
| BUILDTOOLVER ?= $(V) | ||||
|  | ||||
| CHROOTVER=0.11 | ||||
| CHROOTVER=0.12 | ||||
|  | ||||
| TOOLS = artools | ||||
| SYSCONFDIR = /etc | ||||
| @@ -32,35 +32,19 @@ MAKEPKG_CONFIGS=$(wildcard config/makepkg/*) | ||||
| PACMAN_CONFIGS=$(wildcard config/pacman/*) | ||||
| SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*) | ||||
|  | ||||
| TOOLS_CONFIGS_BASE=$(wildcard config/conf/*base*) | ||||
| TOOLS_CONFIGS_PKG=$(wildcard config/conf/*pkg*) | ||||
| TOOLS_CONFIGS_ISO=$(wildcard config/conf/*iso*) | ||||
|  | ||||
| LN_BUILDPKG = \ | ||||
| 	buildpkg-system \ | ||||
| 	buildpkg-system-gremlins \ | ||||
| 	buildpkg-system-goblins \ | ||||
| 	buildpkg-world \ | ||||
| 	buildpkg-world-gremlins \ | ||||
| 	buildpkg-world-goblins \ | ||||
| 	buildpkg-lib32 \ | ||||
| 	buildpkg-lib32-gremlins \ | ||||
| 	buildpkg-lib32-goblins \ | ||||
| 	buildpkg-galaxy \ | ||||
| 	buildpkg-galaxy-gremlins \ | ||||
| 	buildpkg-galaxy-goblins | ||||
| COMPLETIONS = $(addprefix $(BUILDDIR)/,$(patsubst %.in,%,$(wildcard contrib/completion/*/*))) | ||||
|  | ||||
| LN_BUILDISO = \ | ||||
| 	buildiso-gremlins \ | ||||
| 	buildiso-goblins | ||||
|  | ||||
| all: binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso | ||||
| all: binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso completion | ||||
| binprogs_base: $(BINPROGS_BASE) | ||||
| binprogs_pkg: $(BINPROGS_PKG) | ||||
| binprogs_iso: $(BINPROGS_ISO) | ||||
| library_base: $(LIBRARY_BASE) | ||||
| library_pkg: $(LIBRARY_PKG) | ||||
| library_iso: $(LIBRARY_ISO) | ||||
| completion: $(COMPLETIONS) | ||||
|  | ||||
| edit = sed -e "s|@datadir[@]|$(DATADIR)|g" \ | ||||
| 	-e "s|@libdir[@]|$(LIBDIR)|g" \ | ||||
| @@ -88,10 +72,11 @@ $(eval $(call buildInScript,build/bin,src/pkg/,.in,755)) | ||||
| $(eval $(call buildInScript,build/bin,src/iso/,.in,755)) | ||||
| $(eval $(call buildInScript,build/lib,src/lib/,,644)) | ||||
|  | ||||
| $(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,.in,444))) | ||||
|  | ||||
| conf_base: | ||||
| 	@install -d $(BUILDDIR)/pacman.conf.d $(BUILDDIR)/artools | ||||
| 	@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d | ||||
| 	@cp -a $(TOOLS_CONFIGS_BASE) $(BUILDDIR)/artools | ||||
|  | ||||
| conf_pkg: | ||||
| 	@install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/artools | ||||
| @@ -113,8 +98,6 @@ install_base: binprogs_base | ||||
| 	install -dm0755 $(DESTDIR)$(LIBDIR) | ||||
| 	cp -ra $(BUILDDIR)/lib/base $(DESTDIR)$(LIBDIR) | ||||
|  | ||||
| 	for conf in $(notdir $(TOOLS_CONFIGS_BASE)); do install -Dm0644 $(BUILDDIR)/$(TOOLS)/$$conf $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)/$${conf##*/}; done | ||||
|  | ||||
| 	for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done | ||||
|  | ||||
| install_pkg: binprogs_pkg | ||||
| @@ -130,9 +113,10 @@ install_pkg: binprogs_pkg | ||||
|  | ||||
| 	for conf in $(notdir $(MAKEPKG_CONFIGS)); do install -Dm0644 $(BUILDDIR)/makepkg.conf.d/$$conf $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done | ||||
| 	for a in $(SETARCH_ALIASES); do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done | ||||
| 	for l in $(LN_BUILDPKG); do ln -sf buildpkg $(DESTDIR)$(PREFIX)/bin/$$l; done | ||||
| 	ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides | ||||
|  | ||||
| 	install -Dm0644 $(BUILDDIR)/contrib/completion/bash/$(TOOLS) $(DESTDIR)$(PREFIX)/share/bash-completion/completions/$(TOOLS) | ||||
|  | ||||
| install_iso: binprogs_iso | ||||
| 	install -dm0755 $(DESTDIR)$(SYSCONFDIR)/$(TOOLS) | ||||
| 	install -dm0755 $(DESTDIR)$(PREFIX)/bin | ||||
| @@ -142,8 +126,6 @@ install_iso: binprogs_iso | ||||
|  | ||||
| 	for conf in $(notdir $(TOOLS_CONFIGS_ISO)); do install -Dm0644 $(BUILDDIR)/$(TOOLS)/$$conf $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)/$${conf##*/}; done | ||||
|  | ||||
| 	for l in $(LN_BUILDISO); do ln -sf buildiso $(DESTDIR)$(PREFIX)/bin/$$l; done | ||||
|  | ||||
| install: all install_base install_pkg install_iso | ||||
|  | ||||
| uninstall: | ||||
| @@ -154,8 +136,6 @@ uninstall: | ||||
| 	for conf in $(notdir $(MAKEPKG_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done | ||||
| 	for conf in $(notdir $(PACMAN_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done | ||||
| 	for f in $(notdir $(SETARCH_ALIASES)); do rm -f $(DESTDIR)$(DATADIR)/setarch-aliases.d/$$f; done | ||||
| 	for l in $(LN_BUILDPKG); do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done | ||||
| 	for l in $(LN_BUILDISO); do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done | ||||
| 	rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides | ||||
| 	rmdir --ignore-fail-on-non-empty \ | ||||
| 		$(DESTDIR)$(DATADIR)/setarch-aliases.d \ | ||||
| @@ -171,5 +151,5 @@ dist: | ||||
| check: $(BINPROGS_SRC_BASE) $(BINPROGS_SRC_PKG) $(BINPROGS_SRC_ISO) config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto | ||||
| 	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: | ||||
|   | ||||
							
								
								
									
										17
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								README.md
									
									
									
									
									
								
							| @@ -45,21 +45,22 @@ artools | ||||
|   * libisoburn | ||||
|   * mtools | ||||
|   * squashfs-tools | ||||
|   * go-yq | ||||
|  | ||||
|  | ||||
| #### Configuration | ||||
|  | ||||
| artools-{base,pkg,iso}.conf are the configuration files for artools. | ||||
| artools-{pkg,iso}.conf are the configuration files for artools. | ||||
| By default, the config files are installed in | ||||
|  | ||||
| ```bash | ||||
| /etc/artools/artools-{base,pkg,iso}.conf | ||||
| /etc/artools/artools-{pkg,iso}.conf | ||||
| ``` | ||||
|  | ||||
| A user artools-{base,pkg,iso}.conf can be placed in | ||||
| A user artools-{pkg,iso}.conf can be placed in | ||||
|  | ||||
| ```bash | ||||
| $HOME/.config/artools/artools-{base,pkg,iso}.conf | ||||
| $HOME/.config/artools/artools-{pkg,iso}.conf | ||||
| ``` | ||||
|  | ||||
| If the userconfig is present, artools will load the userconfig values, however, if variables have been set in the systemwide | ||||
| @@ -68,17 +69,17 @@ These values take precedence over the userconfig. | ||||
| Best practise is to leave systemwide file untouched. | ||||
| By default it is commented and shows just initialization values done in code. | ||||
|  | ||||
| Tools configuration is done in artools-{base,pkg,iso}.conf or by args. | ||||
| Specifying args will override artools-{base,pkg,iso}.conf settings. | ||||
| Tools configuration is done in artools-{pkg,iso}.conf or by args. | ||||
| Specifying args will override artools-{pkg,iso}.conf settings. | ||||
|  | ||||
| Both, pacman.conf and makepkg.conf for chroots are loaded from | ||||
|  | ||||
| ```bash | ||||
| usr/share/artools/makepkg.conf.d/makepkg.conf | ||||
| usr/share/artools/makepkg.conf.d/${arch}.conf | ||||
| ``` | ||||
|  | ||||
| ```bash | ||||
| usr/share/artools/pacmanconf.d/${repo}.conf | ||||
| usr/share/artools/pacmanconf.d/${repo}-${arch}.conf | ||||
| ``` | ||||
|  | ||||
| and can be overridden dropping them in | ||||
|   | ||||
| @@ -1,12 +0,0 @@ | ||||
| #!/hint/bash | ||||
| # shellcheck disable=2034 | ||||
|  | ||||
| ############################################# | ||||
| ################ artools-base ############### | ||||
| ############################################# | ||||
|  | ||||
| # build dir where buildpkg or buildiso chroots are created | ||||
| # CHROOTS_DIR=/var/lib/artools | ||||
|  | ||||
| # the workspace directory | ||||
| # WORKSPACE_DIR="${USER_HOME}/artools-workspace" | ||||
| @@ -5,20 +5,33 @@ | ||||
| ################ artools-iso ################ | ||||
| ############################################# | ||||
|  | ||||
| # the iso storage directory | ||||
| # default chroots dir where buildiso chroots are created | ||||
| # CHROOTS_DIR=/var/lib/artools | ||||
|  | ||||
| # default workspace directory | ||||
| # WORKSPACE_DIR="${USER_HOME}/artools-workspace" | ||||
|  | ||||
| # default arch to build | ||||
| # ARCH=$(uname -m) | ||||
|  | ||||
| # default pacman.conf to include | ||||
| # possible values: {stable,gremlins,goblins} | ||||
| # STABILITY="stable" | ||||
|  | ||||
| # default iso storage directory | ||||
| # ISO_POOL="${WORKSPACE_DIR}/iso" | ||||
|  | ||||
| # the dist release; default: auto | ||||
| # default dist release; default: auto | ||||
| # ISO_VERSION=$(date +%Y%m%d) | ||||
|  | ||||
| # possible values: openrc, runit, s6, suite66, dinit | ||||
| # default init system, possible values: openrc, runit, s6, suite66, dinit | ||||
| # INITSYS="openrc" | ||||
|  | ||||
| # gpg key; leave empty or commented to skip img signing | ||||
| # GPG_KEY="" | ||||
|  | ||||
| # possible values: zstd (default), xz | ||||
| # default compression, possible values: zstd (default), xz | ||||
| # COMPRESSION="zstd" | ||||
|  | ||||
| # zstd only: range 1..22 | ||||
| # default compression level, zstd only: range 1..22 | ||||
| # COMPRESSION_LEVEL=15 | ||||
|   | ||||
| @@ -5,9 +5,23 @@ | ||||
| ################ artools-pkg ################ | ||||
| ############################################# | ||||
|  | ||||
| # gitea user access token for buildtree | ||||
| # default chroots dir where buildpkg chroots are created | ||||
| # CHROOTS_DIR=/var/lib/artools | ||||
|  | ||||
| # default workspace directory | ||||
| # WORKSPACE_DIR="${USER_HOME}/artools-workspace" | ||||
|  | ||||
| # default arch to build | ||||
| # ARCH=$(uname -m) | ||||
|  | ||||
| # default pacman.conf repos to include | ||||
| # possible values: {system,world,galaxy,lib32}{-gremlins,-goblins} | ||||
| # REPO="world" | ||||
|  | ||||
| # gitea user access token for gitea api | ||||
| # GIT_TOKEN='' | ||||
|  | ||||
| # default workspace dir for artixpkg | ||||
| # TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux | ||||
|  | ||||
| # default repos root for deploypkg | ||||
|   | ||||
| @@ -25,7 +25,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u' | ||||
|  | ||||
| #-- The package required by makepkg to download VCS sources | ||||
| #  Format: 'protocol::package' | ||||
| VCSCLIENTS=('bzr::bzr' | ||||
| VCSCLIENTS=('bzr::breezy' | ||||
|             'fossil::fossil' | ||||
|             'git::git' | ||||
|             'hg::mercurial' | ||||
| @@ -41,10 +41,11 @@ CHOST="x86_64-pc-linux-gnu" | ||||
| #-- Compiler and Linker Flags | ||||
| #CPPFLAGS="" | ||||
| CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \ | ||||
|         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ | ||||
|         -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \ | ||||
|         -fstack-clash-protection -fcf-protection" | ||||
| CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS" | ||||
| LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" | ||||
| LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now \ | ||||
|          -Wl,-z,pack-relative-relocs" | ||||
| LTOFLAGS="-flto=auto" | ||||
| RUSTFLAGS="" | ||||
| #-- Make Flags: change this for DistCC/SMP systems | ||||
|   | ||||
| @@ -30,12 +30,11 @@ Architecture = auto | ||||
| 
 | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| #Color | ||||
| NoProgressBar | ||||
| # We cannot check disk space from within a chroot environment | ||||
| #CheckSpace | ||||
| Color | ||||
| #NoProgressBar | ||||
| CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
| 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. | ||||
| @@ -100,14 +99,14 @@ 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 | ||||
| # [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. | ||||
							
								
								
									
										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 | ||||
| @@ -70,27 +70,30 @@ LocalFileSigLevel = Optional | ||||
| # 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-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 | ||||
| 
 | ||||
							
								
								
									
										98
									
								
								config/pacman/lib32-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								config/pacman/lib32-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| # | ||||
| # /etc/pacman.conf | ||||
| # | ||||
| # See the pacman.conf(5) manpage for option and repository directives | ||||
|  | ||||
| # | ||||
| # GENERAL OPTIONS | ||||
| # | ||||
| [options] | ||||
| # The following paths are commented out with their default values listed. | ||||
| # If you wish to use different paths, uncomment and update the paths. | ||||
| #RootDir     = / | ||||
| #DBPath      = /var/lib/pacman/ | ||||
| #CacheDir    = /var/cache/pacman/pkg/ | ||||
| #LogFile     = /var/log/pacman.log | ||||
| #GPGDir      = /etc/pacman.d/gnupg/ | ||||
| #HookDir     = /etc/pacman.d/hooks/ | ||||
| HoldPkg     = pacman glibc | ||||
| #XferCommand = /usr/bin/curl -L -C - -f -o %o %u | ||||
| #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u | ||||
| #CleanMethod = KeepInstalled | ||||
| Architecture = auto | ||||
|  | ||||
| # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup | ||||
| #IgnorePkg   = | ||||
| #IgnoreGroup = | ||||
|  | ||||
| #NoUpgrade   = | ||||
| #NoExtract   = | ||||
|  | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| #Color | ||||
| NoProgressBar | ||||
| # We cannot check disk space from within a chroot environment | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
|  | ||||
| # By default, pacman accepts packages signed by keys that its local keyring | ||||
| # trusts (see pacman-key and its man page), as well as unsigned packages. | ||||
| SigLevel    = Required DatabaseOptional | ||||
| LocalFileSigLevel = Optional | ||||
| #RemoteFileSigLevel = Required | ||||
|  | ||||
| # NOTE: You must run `pacman-key --init` before first using pacman; the local | ||||
| # keyring can then be populated with the keys of all official Artix Linux | ||||
| # packagers with `pacman-key --populate artix`. | ||||
|  | ||||
| # | ||||
| # REPOSITORIES | ||||
| #   - can be defined here or included from another file | ||||
| #   - pacman will search repositories in the order defined here | ||||
| #   - local/custom mirrors can be added here or in separate files | ||||
| #   - repositories listed first will take precedence when packages | ||||
| #     have identical names, regardless of version number | ||||
| #   - URLs will have $repo replaced by the name of the current repo | ||||
| #   - URLs will have $arch replaced by the name of the architecture | ||||
| # | ||||
| # Repository entries are of the format: | ||||
| #       [repo-name] | ||||
| #       Server = ServerName | ||||
| #       Include = IncludePath | ||||
| # | ||||
| # The header [repo-name] is crucial - it must be present and | ||||
| # uncommented to enable the repo. | ||||
| # | ||||
|  | ||||
| # The gremlins repositories are disabled by default. To enable, uncomment the | ||||
| # repo name header and Include lines. You can add preferred servers immediately | ||||
| # after the header, and they will be used before the default mirrors. | ||||
|  | ||||
| [system-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # If you want to run 32 bit applications on your x86_64 system, | ||||
| # enable the lib32 repositories as required here. | ||||
|  | ||||
| [lib32-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [lib32] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # An example of a custom package repository.  See the pacman manpage for | ||||
| # tips on creating your own repositories. | ||||
| #[custom] | ||||
| #SigLevel = Optional TrustAll | ||||
| #Server = file:///home/custompkgs | ||||
| @@ -82,12 +82,6 @@ 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. | ||||
| 
 | ||||
							
								
								
									
										95
									
								
								config/pacman/system-goblins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								config/pacman/system-goblins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| # | ||||
| # /etc/pacman.conf | ||||
| # | ||||
| # See the pacman.conf(5) manpage for option and repository directives | ||||
|  | ||||
| # | ||||
| # GENERAL OPTIONS | ||||
| # | ||||
| [options] | ||||
| # The following paths are commented out with their default values listed. | ||||
| # If you wish to use different paths, uncomment and update the paths. | ||||
| #RootDir     = / | ||||
| #DBPath      = /var/lib/pacman/ | ||||
| #CacheDir    = /var/cache/pacman/pkg/ | ||||
| #LogFile     = /var/log/pacman.log | ||||
| #GPGDir      = /etc/pacman.d/gnupg/ | ||||
| #HookDir     = /etc/pacman.d/hooks/ | ||||
| HoldPkg     = pacman glibc | ||||
| #XferCommand = /usr/bin/curl -L -C - -f -o %o %u | ||||
| #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u | ||||
| #CleanMethod = KeepInstalled | ||||
| Architecture = auto | ||||
|  | ||||
| # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup | ||||
| #IgnorePkg   = | ||||
| #IgnoreGroup = | ||||
|  | ||||
| #NoUpgrade   = | ||||
| #NoExtract   = | ||||
|  | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| #Color | ||||
| NoProgressBar | ||||
| # We cannot check disk space from within a chroot environment | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
|  | ||||
| # By default, pacman accepts packages signed by keys that its local keyring | ||||
| # trusts (see pacman-key and its man page), as well as unsigned packages. | ||||
| SigLevel    = Required DatabaseOptional | ||||
| LocalFileSigLevel = Optional | ||||
| #RemoteFileSigLevel = Required | ||||
|  | ||||
| # NOTE: You must run `pacman-key --init` before first using pacman; the local | ||||
| # keyring can then be populated with the keys of all official Artix Linux | ||||
| # packagers with `pacman-key --populate artix`. | ||||
|  | ||||
| # | ||||
| # REPOSITORIES | ||||
| #   - can be defined here or included from another file | ||||
| #   - pacman will search repositories in the order defined here | ||||
| #   - local/custom mirrors can be added here or in separate files | ||||
| #   - repositories listed first will take precedence when packages | ||||
| #     have identical names, regardless of version number | ||||
| #   - URLs will have $repo replaced by the name of the current repo | ||||
| #   - URLs will have $arch replaced by the name of the architecture | ||||
| # | ||||
| # Repository entries are of the format: | ||||
| #       [repo-name] | ||||
| #       Server = ServerName | ||||
| #       Include = IncludePath | ||||
| # | ||||
| # The header [repo-name] is crucial - it must be present and | ||||
| # uncommented to enable the repo. | ||||
| # | ||||
|  | ||||
| # The gremlins repositories are disabled by default. To enable, uncomment the | ||||
| # repo name header and Include lines. You can add preferred servers immediately | ||||
| # after the header, and they will be used before the default mirrors. | ||||
|  | ||||
| [system-goblins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world-goblins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # An example of a custom package repository.  See the pacman manpage for | ||||
| # tips on creating your own repositories. | ||||
| #[custom] | ||||
| #SigLevel = Optional TrustAll | ||||
| #Server = file:///home/custompkgs | ||||
							
								
								
									
										89
									
								
								config/pacman/system-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								config/pacman/system-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| # | ||||
| # /etc/pacman.conf | ||||
| # | ||||
| # See the pacman.conf(5) manpage for option and repository directives | ||||
|  | ||||
| # | ||||
| # GENERAL OPTIONS | ||||
| # | ||||
| [options] | ||||
| # The following paths are commented out with their default values listed. | ||||
| # If you wish to use different paths, uncomment and update the paths. | ||||
| #RootDir     = / | ||||
| #DBPath      = /var/lib/pacman/ | ||||
| #CacheDir    = /var/cache/pacman/pkg/ | ||||
| #LogFile     = /var/log/pacman.log | ||||
| #GPGDir      = /etc/pacman.d/gnupg/ | ||||
| #HookDir     = /etc/pacman.d/hooks/ | ||||
| HoldPkg     = pacman glibc | ||||
| #XferCommand = /usr/bin/curl -L -C - -f -o %o %u | ||||
| #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u | ||||
| #CleanMethod = KeepInstalled | ||||
| Architecture = auto | ||||
|  | ||||
| # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup | ||||
| #IgnorePkg   = | ||||
| #IgnoreGroup = | ||||
|  | ||||
| #NoUpgrade   = | ||||
| #NoExtract   = | ||||
|  | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| #Color | ||||
| NoProgressBar | ||||
| # We cannot check disk space from within a chroot environment | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
|  | ||||
| # By default, pacman accepts packages signed by keys that its local keyring | ||||
| # trusts (see pacman-key and its man page), as well as unsigned packages. | ||||
| SigLevel    = Required DatabaseOptional | ||||
| LocalFileSigLevel = Optional | ||||
| #RemoteFileSigLevel = Required | ||||
|  | ||||
| # NOTE: You must run `pacman-key --init` before first using pacman; the local | ||||
| # keyring can then be populated with the keys of all official Artix Linux | ||||
| # packagers with `pacman-key --populate artix`. | ||||
|  | ||||
| # | ||||
| # REPOSITORIES | ||||
| #   - can be defined here or included from another file | ||||
| #   - pacman will search repositories in the order defined here | ||||
| #   - local/custom mirrors can be added here or in separate files | ||||
| #   - repositories listed first will take precedence when packages | ||||
| #     have identical names, regardless of version number | ||||
| #   - URLs will have $repo replaced by the name of the current repo | ||||
| #   - URLs will have $arch replaced by the name of the architecture | ||||
| # | ||||
| # Repository entries are of the format: | ||||
| #       [repo-name] | ||||
| #       Server = ServerName | ||||
| #       Include = IncludePath | ||||
| # | ||||
| # The header [repo-name] is crucial - it must be present and | ||||
| # uncommented to enable the repo. | ||||
| # | ||||
|  | ||||
| # The gremlins repositories are disabled by default. To enable, uncomment the | ||||
| # repo name header and Include lines. You can add preferred servers immediately | ||||
| # after the header, and they will be used before the default mirrors. | ||||
|  | ||||
| [system-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # An example of a custom package repository.  See the pacman manpage for | ||||
| # tips on creating your own repositories. | ||||
| #[custom] | ||||
| #SigLevel = Optional TrustAll | ||||
| #Server = file:///home/custompkgs | ||||
							
								
								
									
										89
									
								
								config/pacman/system-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								config/pacman/system-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| # | ||||
| # /etc/pacman.conf | ||||
| # | ||||
| # See the pacman.conf(5) manpage for option and repository directives | ||||
|  | ||||
| # | ||||
| # GENERAL OPTIONS | ||||
| # | ||||
| [options] | ||||
| # The following paths are commented out with their default values listed. | ||||
| # If you wish to use different paths, uncomment and update the paths. | ||||
| #RootDir     = / | ||||
| #DBPath      = /var/lib/pacman/ | ||||
| #CacheDir    = /var/cache/pacman/pkg/ | ||||
| #LogFile     = /var/log/pacman.log | ||||
| #GPGDir      = /etc/pacman.d/gnupg/ | ||||
| #HookDir     = /etc/pacman.d/hooks/ | ||||
| HoldPkg     = pacman glibc | ||||
| #XferCommand = /usr/bin/curl -L -C - -f -o %o %u | ||||
| #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u | ||||
| #CleanMethod = KeepInstalled | ||||
| Architecture = auto | ||||
|  | ||||
| # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup | ||||
| #IgnorePkg   = | ||||
| #IgnoreGroup = | ||||
|  | ||||
| #NoUpgrade   = | ||||
| #NoExtract   = | ||||
|  | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| #Color | ||||
| NoProgressBar | ||||
| # We cannot check disk space from within a chroot environment | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
|  | ||||
| # By default, pacman accepts packages signed by keys that its local keyring | ||||
| # trusts (see pacman-key and its man page), as well as unsigned packages. | ||||
| SigLevel    = Required DatabaseOptional | ||||
| LocalFileSigLevel = Optional | ||||
| #RemoteFileSigLevel = Required | ||||
|  | ||||
| # NOTE: You must run `pacman-key --init` before first using pacman; the local | ||||
| # keyring can then be populated with the keys of all official Artix Linux | ||||
| # packagers with `pacman-key --populate artix`. | ||||
|  | ||||
| # | ||||
| # REPOSITORIES | ||||
| #   - can be defined here or included from another file | ||||
| #   - pacman will search repositories in the order defined here | ||||
| #   - local/custom mirrors can be added here or in separate files | ||||
| #   - repositories listed first will take precedence when packages | ||||
| #     have identical names, regardless of version number | ||||
| #   - URLs will have $repo replaced by the name of the current repo | ||||
| #   - URLs will have $arch replaced by the name of the architecture | ||||
| # | ||||
| # Repository entries are of the format: | ||||
| #       [repo-name] | ||||
| #       Server = ServerName | ||||
| #       Include = IncludePath | ||||
| # | ||||
| # The header [repo-name] is crucial - it must be present and | ||||
| # uncommented to enable the repo. | ||||
| # | ||||
|  | ||||
| # The gremlins repositories are disabled by default. To enable, uncomment the | ||||
| # repo name header and Include lines. You can add preferred servers immediately | ||||
| # after the header, and they will be used before the default mirrors. | ||||
|  | ||||
| #[system-gremlins] | ||||
| #Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| #[world-gremlins] | ||||
| #Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # An example of a custom package repository.  See the pacman manpage for | ||||
| # tips on creating your own repositories. | ||||
| #[custom] | ||||
| #SigLevel = Optional TrustAll | ||||
| #Server = file:///home/custompkgs | ||||
							
								
								
									
										95
									
								
								config/pacman/world-goblins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								config/pacman/world-goblins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| # | ||||
| # /etc/pacman.conf | ||||
| # | ||||
| # See the pacman.conf(5) manpage for option and repository directives | ||||
|  | ||||
| # | ||||
| # GENERAL OPTIONS | ||||
| # | ||||
| [options] | ||||
| # The following paths are commented out with their default values listed. | ||||
| # If you wish to use different paths, uncomment and update the paths. | ||||
| #RootDir     = / | ||||
| #DBPath      = /var/lib/pacman/ | ||||
| #CacheDir    = /var/cache/pacman/pkg/ | ||||
| #LogFile     = /var/log/pacman.log | ||||
| #GPGDir      = /etc/pacman.d/gnupg/ | ||||
| #HookDir     = /etc/pacman.d/hooks/ | ||||
| HoldPkg     = pacman glibc | ||||
| #XferCommand = /usr/bin/curl -L -C - -f -o %o %u | ||||
| #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u | ||||
| #CleanMethod = KeepInstalled | ||||
| Architecture = auto | ||||
|  | ||||
| # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup | ||||
| #IgnorePkg   = | ||||
| #IgnoreGroup = | ||||
|  | ||||
| #NoUpgrade   = | ||||
| #NoExtract   = | ||||
|  | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| #Color | ||||
| NoProgressBar | ||||
| # We cannot check disk space from within a chroot environment | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
|  | ||||
| # By default, pacman accepts packages signed by keys that its local keyring | ||||
| # trusts (see pacman-key and its man page), as well as unsigned packages. | ||||
| SigLevel    = Required DatabaseOptional | ||||
| LocalFileSigLevel = Optional | ||||
| #RemoteFileSigLevel = Required | ||||
|  | ||||
| # NOTE: You must run `pacman-key --init` before first using pacman; the local | ||||
| # keyring can then be populated with the keys of all official Artix Linux | ||||
| # packagers with `pacman-key --populate artix`. | ||||
|  | ||||
| # | ||||
| # REPOSITORIES | ||||
| #   - can be defined here or included from another file | ||||
| #   - pacman will search repositories in the order defined here | ||||
| #   - local/custom mirrors can be added here or in separate files | ||||
| #   - repositories listed first will take precedence when packages | ||||
| #     have identical names, regardless of version number | ||||
| #   - URLs will have $repo replaced by the name of the current repo | ||||
| #   - URLs will have $arch replaced by the name of the architecture | ||||
| # | ||||
| # Repository entries are of the format: | ||||
| #       [repo-name] | ||||
| #       Server = ServerName | ||||
| #       Include = IncludePath | ||||
| # | ||||
| # The header [repo-name] is crucial - it must be present and | ||||
| # uncommented to enable the repo. | ||||
| # | ||||
|  | ||||
| # The gremlins repositories are disabled by default. To enable, uncomment the | ||||
| # repo name header and Include lines. You can add preferred servers immediately | ||||
| # after the header, and they will be used before the default mirrors. | ||||
|  | ||||
| [system-goblins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world-goblins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # An example of a custom package repository.  See the pacman manpage for | ||||
| # tips on creating your own repositories. | ||||
| #[custom] | ||||
| #SigLevel = Optional TrustAll | ||||
| #Server = file:///home/custompkgs | ||||
							
								
								
									
										89
									
								
								config/pacman/world-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								config/pacman/world-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| # | ||||
| # /etc/pacman.conf | ||||
| # | ||||
| # See the pacman.conf(5) manpage for option and repository directives | ||||
|  | ||||
| # | ||||
| # GENERAL OPTIONS | ||||
| # | ||||
| [options] | ||||
| # The following paths are commented out with their default values listed. | ||||
| # If you wish to use different paths, uncomment and update the paths. | ||||
| #RootDir     = / | ||||
| #DBPath      = /var/lib/pacman/ | ||||
| #CacheDir    = /var/cache/pacman/pkg/ | ||||
| #LogFile     = /var/log/pacman.log | ||||
| #GPGDir      = /etc/pacman.d/gnupg/ | ||||
| #HookDir     = /etc/pacman.d/hooks/ | ||||
| HoldPkg     = pacman glibc | ||||
| #XferCommand = /usr/bin/curl -L -C - -f -o %o %u | ||||
| #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u | ||||
| #CleanMethod = KeepInstalled | ||||
| Architecture = auto | ||||
|  | ||||
| # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup | ||||
| #IgnorePkg   = | ||||
| #IgnoreGroup = | ||||
|  | ||||
| #NoUpgrade   = | ||||
| #NoExtract   = | ||||
|  | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| #Color | ||||
| NoProgressBar | ||||
| # We cannot check disk space from within a chroot environment | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
|  | ||||
| # By default, pacman accepts packages signed by keys that its local keyring | ||||
| # trusts (see pacman-key and its man page), as well as unsigned packages. | ||||
| SigLevel    = Required DatabaseOptional | ||||
| LocalFileSigLevel = Optional | ||||
| #RemoteFileSigLevel = Required | ||||
|  | ||||
| # NOTE: You must run `pacman-key --init` before first using pacman; the local | ||||
| # keyring can then be populated with the keys of all official Artix Linux | ||||
| # packagers with `pacman-key --populate artix`. | ||||
|  | ||||
| # | ||||
| # REPOSITORIES | ||||
| #   - can be defined here or included from another file | ||||
| #   - pacman will search repositories in the order defined here | ||||
| #   - local/custom mirrors can be added here or in separate files | ||||
| #   - repositories listed first will take precedence when packages | ||||
| #     have identical names, regardless of version number | ||||
| #   - URLs will have $repo replaced by the name of the current repo | ||||
| #   - URLs will have $arch replaced by the name of the architecture | ||||
| # | ||||
| # Repository entries are of the format: | ||||
| #       [repo-name] | ||||
| #       Server = ServerName | ||||
| #       Include = IncludePath | ||||
| # | ||||
| # The header [repo-name] is crucial - it must be present and | ||||
| # uncommented to enable the repo. | ||||
| # | ||||
|  | ||||
| # The gremlins repositories are disabled by default. To enable, uncomment the | ||||
| # repo name header and Include lines. You can add preferred servers immediately | ||||
| # after the header, and they will be used before the default mirrors. | ||||
|  | ||||
| [system-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # An example of a custom package repository.  See the pacman manpage for | ||||
| # tips on creating your own repositories. | ||||
| #[custom] | ||||
| #SigLevel = Optional TrustAll | ||||
| #Server = file:///home/custompkgs | ||||
							
								
								
									
										89
									
								
								config/pacman/world-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								config/pacman/world-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| # | ||||
| # /etc/pacman.conf | ||||
| # | ||||
| # See the pacman.conf(5) manpage for option and repository directives | ||||
|  | ||||
| # | ||||
| # GENERAL OPTIONS | ||||
| # | ||||
| [options] | ||||
| # The following paths are commented out with their default values listed. | ||||
| # If you wish to use different paths, uncomment and update the paths. | ||||
| #RootDir     = / | ||||
| #DBPath      = /var/lib/pacman/ | ||||
| #CacheDir    = /var/cache/pacman/pkg/ | ||||
| #LogFile     = /var/log/pacman.log | ||||
| #GPGDir      = /etc/pacman.d/gnupg/ | ||||
| #HookDir     = /etc/pacman.d/hooks/ | ||||
| HoldPkg     = pacman glibc | ||||
| #XferCommand = /usr/bin/curl -L -C - -f -o %o %u | ||||
| #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u | ||||
| #CleanMethod = KeepInstalled | ||||
| Architecture = auto | ||||
|  | ||||
| # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup | ||||
| #IgnorePkg   = | ||||
| #IgnoreGroup = | ||||
|  | ||||
| #NoUpgrade   = | ||||
| #NoExtract   = | ||||
|  | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| #Color | ||||
| NoProgressBar | ||||
| # We cannot check disk space from within a chroot environment | ||||
| #CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 5 | ||||
|  | ||||
| # By default, pacman accepts packages signed by keys that its local keyring | ||||
| # trusts (see pacman-key and its man page), as well as unsigned packages. | ||||
| SigLevel    = Required DatabaseOptional | ||||
| LocalFileSigLevel = Optional | ||||
| #RemoteFileSigLevel = Required | ||||
|  | ||||
| # NOTE: You must run `pacman-key --init` before first using pacman; the local | ||||
| # keyring can then be populated with the keys of all official Artix Linux | ||||
| # packagers with `pacman-key --populate artix`. | ||||
|  | ||||
| # | ||||
| # REPOSITORIES | ||||
| #   - can be defined here or included from another file | ||||
| #   - pacman will search repositories in the order defined here | ||||
| #   - local/custom mirrors can be added here or in separate files | ||||
| #   - repositories listed first will take precedence when packages | ||||
| #     have identical names, regardless of version number | ||||
| #   - URLs will have $repo replaced by the name of the current repo | ||||
| #   - URLs will have $arch replaced by the name of the architecture | ||||
| # | ||||
| # Repository entries are of the format: | ||||
| #       [repo-name] | ||||
| #       Server = ServerName | ||||
| #       Include = IncludePath | ||||
| # | ||||
| # The header [repo-name] is crucial - it must be present and | ||||
| # uncommented to enable the repo. | ||||
| # | ||||
|  | ||||
| # The gremlins repositories are disabled by default. To enable, uncomment the | ||||
| # repo name header and Include lines. You can add preferred servers immediately | ||||
| # after the header, and they will be used before the default mirrors. | ||||
|  | ||||
| #[system-gremlins] | ||||
| #Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| #[world-gremlins] | ||||
| #Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # An example of a custom package repository.  See the pacman manpage for | ||||
| # tips on creating your own repositories. | ||||
| #[custom] | ||||
| #SigLevel = Optional TrustAll | ||||
| #Server = file:///home/custompkgs | ||||
							
								
								
									
										328
									
								
								contrib/completion/bash/artools.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										328
									
								
								contrib/completion/bash/artools.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,328 @@ | ||||
| #/usr/bin/env bash | ||||
|  | ||||
| _artixpkg_pkgbase() { | ||||
|     local LIBDIR | ||||
|     LIBDIR=${LIBDIR:-'/usr/share/artools/lib'} | ||||
|     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 ARTIX_DB ARTIX_TEAMS AGENTS ARTIX_DB_MAP cwords comp_cword_exflag | ||||
|  | ||||
|     # TODO: get list, from /src/lib/pkg/db/db.sh? | ||||
|     ARTIX_DB=( | ||||
|         system-goblins | ||||
|         system-gremlins | ||||
|         system | ||||
|         world-goblins | ||||
|         world-gremlins | ||||
|         world | ||||
|         lib32-goblins | ||||
|         lib32-gremlins | ||||
|         lib32 | ||||
|         galaxy-goblins | ||||
|         galaxy-gremlins | ||||
|         galaxy | ||||
|     ) | ||||
|  | ||||
|     # TODO: get from db.sh | ||||
|     ARTIX_TEAMS=( | ||||
|         "${ARTIX_DB[2]}" | ||||
|         "${ARTIX_DB[5]}" | ||||
|         "${ARTIX_DB[8]}" | ||||
|         "${ARTIX_DB[11]}" | ||||
|     ) | ||||
|  | ||||
|     # TODO: get from db.sh | ||||
|     AGENTS=( | ||||
|         orion | ||||
|         taurus | ||||
|     ) | ||||
|  | ||||
|     # TODO: get from db.sh | ||||
|     ARTIX_DB_MAP=( | ||||
|         goblins | ||||
|         gremlins | ||||
|         stable | ||||
|     ) | ||||
|  | ||||
|     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"|"-d"|"--del"|"-j"|"--jobs") | ||||
|                             # this flag expects a parameter | ||||
|                             COMPREPLY=() | ||||
|                             ;; | ||||
|                         *) | ||||
|                             COMPREPLY=($(compgen -W "-a --add -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 | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
| # shellcheck source=src/lib/base/mount.sh | ||||
| source "${LIBDIR}"/base/mount.sh | ||||
| # shellcheck source=src/lib/base/unshare-mount.sh | ||||
| source "${LIBDIR}"/base/unshare-mount.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
|  | ||||
|  | ||||
| artix-chroot() { | ||||
|     check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
| #     (( EUID == 0 )) || die 'This script must be run with root privileges' | ||||
|  | ||||
|     [[ -d $chrootdir ]] || die "Can't create chroot on non-directory %s" "$chrootdir" | ||||
|  | ||||
|     "$setup" "$chrootdir" || die "failed to setup chroot %s" "$chrootdir" | ||||
|     if (( ! keepresolvconf )); then | ||||
|         chroot_add_resolv_conf "$chrootdir" || die "failed to setup resolv.conf" | ||||
|     fi | ||||
|  | ||||
|     if ! mountpoint -q "$chrootdir"; then | ||||
|         warning "$chrootdir is not a mountpoint. This may have undesirable side effects." | ||||
|     fi | ||||
|  | ||||
|     chroot_args=() | ||||
|     [[ $userspec ]] && chroot_args+=(--userspec "$userspec") | ||||
|  | ||||
|     SHELL=/bin/bash $pid_unshare chroot "${chroot_args[@]}" -- "$chrootdir" "${args[@]}" | ||||
| } | ||||
|  | ||||
| usage() { | ||||
|     printf 'usage: %s chroot-dir [command]\n' "${0##*/}" | ||||
|     printf '    -h             Print this help message\n' | ||||
|     printf '\n' | ||||
|     printf "    If 'command' is unspecified, %s will launch /bin/sh.\n" "${0##*/}" | ||||
|     printf '\n' | ||||
|     printf '\n' | ||||
|     exit "$1" | ||||
|     cat <<EOF | ||||
| usage: ${0##*/} chroot-dir [command] [arguments...] | ||||
|  | ||||
|     -h                  Print this help message | ||||
|     -N                  Run in unshare mode as a regular user | ||||
|     -u <user>[:group]   Specify non-root user and optional group to use | ||||
|     -r                  Do not change the resolv.conf within the chroot | ||||
|  | ||||
| If 'command' is unspecified, ${0##*/} will launch /bin/bash. | ||||
|  | ||||
| Note that when using artix-chroot, the target chroot directory *should* be a | ||||
| mountpoint. This ensures that tools such as pacman(8) or findmnt(8) have an | ||||
| accurate hierarchy of the mounted filesystems within the chroot. | ||||
|  | ||||
| If your chroot target is not a mountpoint, you can bind mount the directory on | ||||
| itself to make it a mountpoint, i.e. 'mount --bind /your/chroot /your/chroot'. | ||||
|  | ||||
| EOF | ||||
| } | ||||
|  | ||||
| orig_args=("$@") | ||||
|  | ||||
| opts=':h' | ||||
| opts=':hNu:r' | ||||
|  | ||||
| while getopts ${opts} arg; do | ||||
|     case "${arg}" in | ||||
|         h|?) usage 0 ;; | ||||
|         h) usage; exit 0 ;; | ||||
|         N) unshare=1 ;; | ||||
|         u) userspec=$OPTARG ;; | ||||
|         r) keepresolvconf=1 ;; | ||||
|         :) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;; | ||||
|         ?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;; | ||||
|     esac | ||||
| done | ||||
| shift $(( OPTIND - 1 )) | ||||
|  | ||||
| check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
| (( $# )) || die 'No chroot directory specified' | ||||
|  | ||||
| chrootdir=$1 | ||||
| chrootdir="$1" | ||||
| shift | ||||
|  | ||||
| [[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}" | ||||
|  | ||||
| chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}" | ||||
| chroot_add_resolv_conf "${chrootdir}" | ||||
|  | ||||
| SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "$@" | ||||
| args=("$@") | ||||
| if (( unshare )); then | ||||
|     setup=unshare_setup | ||||
|     "$mount_unshare" bash -c "$(declare_all); artix-chroot" | ||||
| else | ||||
|     setup=chroot_setup | ||||
|     artix-chroot | ||||
| fi | ||||
|   | ||||
| @@ -18,26 +18,50 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/mount.sh | ||||
| source "${LIBDIR}"/base/mount.sh | ||||
| # shellcheck source=src/lib/base/unshare-mount.sh | ||||
| source "${LIBDIR}"/base/unshare-mount.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
|  | ||||
|  | ||||
| #{{{ functions | ||||
|  | ||||
| copy_mirrorlist(){ | ||||
|     cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/" | ||||
| } | ||||
| basestrap() { | ||||
|     check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
| #     (( EUID == 0 )) || die 'This script must be run with root privileges' | ||||
|  | ||||
| copy_keyring(){ | ||||
|     if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then | ||||
|         cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/" | ||||
|     # create obligatory directories | ||||
|     msg "Creating install root at %s" "$newroot" | ||||
|     install -d -m755 "$newroot"/var/{cache/pacman/pkg,lib/pacman,log} | ||||
|     install -d -m755 "$newroot"/{dev,run,etc/pacman.d} | ||||
|     install -d -m1777 "$newroot"/tmp | ||||
|     install -d -m555 "$newroot"/{sys,proc} | ||||
|  | ||||
|     # mount API filesystems | ||||
|     "$setup" "$newroot" || die "failed to setup chroot %s" "$newroot" | ||||
|  | ||||
|     if [[ ! -d $newroot/etc/pacman.d/gnupg ]]; then | ||||
|         if (( initkeyring )); then | ||||
|             pacman-key --gpgdir "$newroot"/etc/pacman.d/gnupg --init | ||||
|         elif (( copykeyring )) && [[ -d /etc/pacman.d/gnupg ]]; then | ||||
|             # if there's a keyring on the host, copy it into the new root | ||||
|             cp -a --no-preserve=ownership /etc/pacman.d/gnupg "$newroot/etc/pacman.d/" | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
|  | ||||
| create_min_fs(){ | ||||
|     msg "Creating install root at %s" "$1" | ||||
|     mkdir -m 0755 -p "$1"/var/{cache/pacman/pkg,lib/pacman,log} "$1"/{dev,run,etc/pacman.d} | ||||
|     mkdir -m 1777 -p "$1"/tmp | ||||
|     mkdir -m 0555 -p "$1"/{sys,proc} | ||||
|     msg 'Installing packages to %s' "$newroot" | ||||
|     if ! $pid_unshare pacman -r "$newroot" "${pacman_args[@]}"; then | ||||
|         die 'Failed to install packages to new root' | ||||
|     fi | ||||
|  | ||||
|     if (( copymirrorlist )); then | ||||
|         # install the host's mirrorlist onto the new root | ||||
|         cp -a /etc/pacman.d/mirrorlist "$newroot/etc/pacman.d/" | ||||
|     fi | ||||
|  | ||||
|     if (( copyconf )); then | ||||
|         cp -a "$pacman_config" "$newroot/etc/pacman.conf" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| #}}} | ||||
| @@ -46,77 +70,80 @@ newroot=/mnt | ||||
|  | ||||
| hostcache=0 | ||||
| copykeyring=1 | ||||
| initkeyring=0 | ||||
| copymirrorlist=1 | ||||
| pacmode=-Sy | ||||
| pacman_args=() | ||||
| unshare=0 | ||||
| copyconf=0 | ||||
| pacman_config=/etc/pacman.conf | ||||
|  | ||||
| usage() { | ||||
|     printf "usage: %s [options] root [packages...]\n" "${0##*/}" | ||||
|     printf " -C <config>      Use an alternate config file for pacman\n" | ||||
|     printf " -c               Use the package cache on the host, rather than the target\n" | ||||
|     printf " -G               Avoid copying the host's pacman keyring to the target\n" | ||||
|     printf " -i               Avoid auto-confirmation of package selections\n" | ||||
|     printf " -M               Avoid copying the host's mirrorlist to the target\n" | ||||
|     printf ' -U               Use pacman -U to install packages\n' | ||||
|     printf " -h               Print this help message\n" | ||||
|     printf '\n' | ||||
|     printf ' basestrap installs packages to the specified new root directory.\n' | ||||
|     printf ' If no packages are given, basestrap defaults to the "base" group.\n' | ||||
|     printf '\n' | ||||
|     printf '\n' | ||||
|     exit "$1" | ||||
|   cat <<EOF | ||||
| usage: ${0##*/} [options] root [packages...] | ||||
|  | ||||
|   Options: | ||||
|     -C <config>    Use an alternate config file for pacman | ||||
|     -c             Use the package cache on the host, rather than the target | ||||
|     -D             Skip pacman dependency checks | ||||
|     -G             Avoid copying the host's pacman keyring to the target | ||||
|     -i             Prompt for package confirmation when needed (run interactively) | ||||
|     -K             Initialize an empty pacman keyring in the target (implies '-G') | ||||
|     -M             Avoid copying the host's mirrorlist to the target | ||||
|     -N             Run in unshare mode as a regular user | ||||
|     -P             Copy the host's pacman config to the target | ||||
|     -U             Use pacman -U to install packages | ||||
|  | ||||
|     -h             Print this help message | ||||
|  | ||||
| basestrap installs packages to the specified new root directory. If no packages | ||||
| are given, basestrap defaults to the "base" group. | ||||
|  | ||||
| EOF | ||||
| } | ||||
|  | ||||
| orig_args=("$@") | ||||
|  | ||||
| opts=':C:cGiMU' | ||||
| opts=':C:cDGiKMNPU' | ||||
|  | ||||
| while getopts ${opts} arg; do | ||||
|     case "${arg}" in | ||||
|         C) pacman_conf=$OPTARG ;; | ||||
|         C) pacman_config=$OPTARG ;; | ||||
|         D) pacman_args+=(-dd) ;; | ||||
|         c) hostcache=1 ;; | ||||
|         i) interactive=1 ;; | ||||
|         G) copykeyring=0 ;; | ||||
|         K) initkeyring=1 ;; | ||||
|         M) copymirrorlist=0 ;; | ||||
|         N) unshare=1 ;; | ||||
|         P) copyconf=1 ;; | ||||
|         U) pacmode=-U ;; | ||||
|         h|?) usage 0 ;; | ||||
|         :) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;; | ||||
|         ?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;; | ||||
|     esac | ||||
| done | ||||
| shift $(( OPTIND - 1 )) | ||||
|  | ||||
| check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
|  | ||||
| (( $# )) || die "No root directory specified" | ||||
| newroot=$1; shift | ||||
| pacman_args=("${@:-base}") | ||||
|  | ||||
| if (( ! hostcache ));then | ||||
|     pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg") | ||||
| fi | ||||
|  | ||||
| if (( ! interactive )); then | ||||
|     pacman_args+=(--noconfirm) | ||||
| fi | ||||
|  | ||||
| [[ -n $pacman_conf ]] && pacman_args+=(--config="$pacman_conf") | ||||
|  | ||||
| [[ -d $newroot ]] || die "%s is not a directory" "$newroot" | ||||
|  | ||||
| # create obligatory directories | ||||
| create_min_fs "$newroot" | ||||
| pacman_args+=("$pacmode" "${@:-base}" --config="$pacman_config") | ||||
|  | ||||
| # mount API filesystems | ||||
| chroot_api_mount "$newroot" || die "failed to setup API filesystems in new root" | ||||
|  | ||||
| if (( copykeyring ));then | ||||
|     copy_keyring "$newroot" | ||||
| if (( ! hostcache )); then | ||||
|   pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg") | ||||
| fi | ||||
|  | ||||
| msg2 'Installing packages to %s' "$newroot" | ||||
| if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then | ||||
|     die 'Failed to install packages to new root' | ||||
| if (( ! interactive )); then | ||||
|   pacman_args+=(--noconfirm) | ||||
| fi | ||||
|  | ||||
|  | ||||
| if (( copymirrorlist ));then | ||||
|     copy_mirrorlist "$newroot" | ||||
| if (( unshare )); then | ||||
|     setup=unshare_setup | ||||
|     "$mount_unshare" bash -c "$(declare_all); basestrap" | ||||
| else | ||||
|     setup=chroot_setup | ||||
|     basestrap | ||||
| fi | ||||
|   | ||||
| @@ -12,10 +12,12 @@ source "${LIBDIR}"/base/message.sh | ||||
| #{{{ filesystems | ||||
|  | ||||
| declare -A pseudofs_types=([anon_inodefs]=1 | ||||
|                         [apparmorfs]=1 | ||||
|                         [autofs]=1 | ||||
|                         [bdev]=1 | ||||
|                         [bpf]=1 | ||||
|                         [binder]=1 | ||||
|                         [binfmt_misc]=1 | ||||
|                         [bpf]=1 | ||||
|                         [cgroup]=1 | ||||
|                         [cgroup2]=1 | ||||
|                         [configfs]=1 | ||||
| @@ -25,31 +27,55 @@ declare -A pseudofs_types=([anon_inodefs]=1 | ||||
|                         [devpts]=1 | ||||
|                         [devtmpfs]=1 | ||||
|                         [dlmfs]=1 | ||||
|                         [dmabuf]=1 | ||||
|                         [drm]=1 | ||||
|                         [efivarfs]=1 | ||||
|                         [fuse]=1 | ||||
|                         [fuse.archivemount]=1 | ||||
|                         [fuse.avfsd]=1 | ||||
|                         [fuse.dumpfs]=1 | ||||
|                         [fuse.encfs]=1 | ||||
|                         [fuse.gvfs-fuse-daemon]=1 | ||||
|                         [fuse.gvfsd-fuse]=1 | ||||
|                         [fuse.lxcfs]=1 | ||||
|                         [fuse.rofiles-fuse]=1 | ||||
|                         [fuse.vmware-vmblock]=1 | ||||
|                         [fuse.xwmfs]=1 | ||||
|                         [fusectl]=1 | ||||
|                         [hugetlbfs]=1 | ||||
|                         [ipathfs]=1 | ||||
|                         [mqueue]=1 | ||||
|                         [nfsd]=1 | ||||
|                         [none]=1 | ||||
|                         [nsfs]=1 | ||||
|                         [overlay]=1 | ||||
|                         [pipefs]=1 | ||||
|                         [proc]=1 | ||||
|                         [pstore]=1 | ||||
|                         [ramfs]=1 | ||||
|                         [resctrl]=1 | ||||
|                         [rootfs]=1 | ||||
|                         [rpc_pipefs]=1 | ||||
|                         [securityfs]=1 | ||||
|                         [selinuxfs]=1 | ||||
|                         [smackfs]=1 | ||||
|                         [sockfs]=1 | ||||
|                         [spufs]=1 | ||||
|                         [sysfs]=1 | ||||
|                         [tmpfs]=1) | ||||
|                         [tmpfs]=1 | ||||
|                         [tracefs]=1 | ||||
|                         [vboxsf]=1 | ||||
|                         [virtiofs]=1) | ||||
|  | ||||
| declare -A fsck_types=([cramfs]=1 | ||||
| declare -A fsck_types=([btrfs]=0    # btrfs doesn't need a regular fsck utility | ||||
|                     [cramfs]=1 | ||||
|                     [erofs]=1 | ||||
|                     [exfat]=1 | ||||
|                     [ext2]=1 | ||||
|                     [ext3]=1 | ||||
|                     [ext4]=1 | ||||
|                     [ext4dev]=1 | ||||
|                     [f2fs]=1 | ||||
|                     [fat]=1 | ||||
|                     [jfs]=1 | ||||
|                     [minix]=1 | ||||
|                     [msdos]=1 | ||||
| @@ -69,11 +95,15 @@ fstype_has_fsck() { | ||||
|     (( fsck_types["$1"] )) | ||||
| } | ||||
|  | ||||
| try_cast() ( | ||||
|     _=$(( $1#$2 )) | ||||
| ) 2>/dev/null | ||||
|  | ||||
| valid_number_of_base() { | ||||
|     local base=$1 len=${#2} i | ||||
|     local base="$1" len=${#2} i | ||||
|  | ||||
|     for (( i = 0; i < len; i++ )); do | ||||
|         { _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null | ||||
|         try_cast "$base" "${2:i:1}" || return 1 | ||||
|     done | ||||
|  | ||||
|     return 0 | ||||
| @@ -81,7 +111,6 @@ valid_number_of_base() { | ||||
|  | ||||
| mangle() { | ||||
|     local i chr out | ||||
|  | ||||
|     local {a..f}= {A..F}= | ||||
|  | ||||
|     for (( i = 0; i < ${#1}; i++ )); do | ||||
| @@ -100,7 +129,6 @@ mangle() { | ||||
|  | ||||
| unmangle() { | ||||
|     local i chr out len=$(( ${#1} - 4 )) | ||||
|  | ||||
|     local {a..f}= {A..F}= | ||||
|  | ||||
|     for (( i = 0; i < len; i++ )); do | ||||
| @@ -127,7 +155,6 @@ dm_name_for_devnode() { | ||||
|     else | ||||
|         # don't leave the caller hanging, just print the original name | ||||
|         # along with the failure. | ||||
|         print '%s' "$1" | ||||
|         error 'Failed to resolve device mapper name for: %s' "$1" | ||||
|     fi | ||||
| } | ||||
| @@ -185,19 +212,11 @@ optstring_append_option() { | ||||
|     optstring_normalize "$1" | ||||
| } | ||||
|  | ||||
| optstring_prepend_option() { | ||||
|     if ! optstring_has_option "$1" "$2"; then | ||||
|         declare -g "$1=$2,${!1}" | ||||
|     fi | ||||
|  | ||||
|     optstring_normalize "$1" | ||||
| } | ||||
|  | ||||
| optstring_get_option() { | ||||
|     local opts o | ||||
|     local _opts o | ||||
|  | ||||
|     IFS=, read -ra opts <<<"${!1}" | ||||
|     for o in "${opts[@]}"; do | ||||
|     IFS=, read -ra _opts <<<"${!1}" | ||||
|     for o in "${_opts[@]}"; do | ||||
|         if optstring_match_option "$2" "$o"; then | ||||
|             declare -g "$o" | ||||
|             return 0 | ||||
| @@ -214,7 +233,7 @@ optstring_has_option() { | ||||
| } | ||||
|  | ||||
| write_source() { | ||||
|     local src=$1 spec label uuid comment=() | ||||
|     local src="$1" spec label uuid comment=() | ||||
|  | ||||
|     label=$(lsblk -rno LABEL "$1" 2>/dev/null) | ||||
|     uuid=$(lsblk -rno UUID "$1" 2>/dev/null) | ||||
| @@ -242,7 +261,7 @@ write_source() { | ||||
|         ;; | ||||
|     esac | ||||
|  | ||||
|     [[ -n "${comment[*]}" ]] && printf '# %s\n' "${comment[*]}" | ||||
|     [[ -n ${comment[*]} ]] && printf '# %s\n' "${comment[*]}" | ||||
|  | ||||
|     if [[ $spec ]]; then | ||||
|         printf '%-20s' "$bytag=$(mangle "$spec")" | ||||
| @@ -267,15 +286,27 @@ optstring_apply_quirks() { | ||||
|     fi | ||||
|  | ||||
|     case $fstype in | ||||
|         btrfs) | ||||
|             # Having only one of subvol= and subvolid= is enough for mounting a btrfs subvolume | ||||
|             # And having subvolid= set prevents things like 'snapper rollback' to work, as it | ||||
|             # updates the subvolume in-place, leaving subvol= unchanged with a different subvolid. | ||||
|             if optstring_has_option "$varname" subvol; then | ||||
|                 optstring_remove_option "$varname" subvolid | ||||
|             fi | ||||
|         ;; | ||||
|         f2fs) | ||||
|             # These are Kconfig options for f2fs. Kernels supporting the options will | ||||
|             # only provide the negative versions of these (e.g. noacl), and vice versa | ||||
|             # These are build-time or runtime-unchangeable options for f2fs. | ||||
|             # The former means that kernels supporting the options will only | ||||
|             # provide the negative versions of these (e.g. noacl), and vice versa | ||||
|             # for kernels without support. | ||||
|             optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr | ||||
|             # The latter means that the options can only be specified/changed | ||||
|             # during the initial mount but not remount. | ||||
|             optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr,atgc | ||||
|         ;; | ||||
|         vfat) | ||||
|             # Before Linux v3.8, "cp" is prepended to the value of the codepage. | ||||
|             if optstring_get_option "$varname" codepage && [[ "$codepage" = cp* ]]; then | ||||
|             # shellcheck disable=SC2154 | ||||
|             if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]]; then | ||||
|                 optstring_remove_option "$varname" codepage | ||||
|                 optstring_append_option "$varname" "codepage=${codepage#cp}" | ||||
|             fi | ||||
| @@ -290,11 +321,12 @@ usage() { | ||||
| usage: ${0##*/} [options] root | ||||
|  | ||||
|   Options: | ||||
|     -f FILTER      Restrict output to mountpoints matching the prefix FILTER | ||||
|     -f <filter>    Restrict output to mountpoints matching the prefix FILTER | ||||
|     -L             Use labels for source identifiers (shortcut for -t LABEL) | ||||
|     -p             Exclude pseudofs mounts (default behavior) | ||||
|     -P             Include printing mounts | ||||
|     -t TAG         Use TAG for source identifiers | ||||
|     -P             Include pseudofs mounts | ||||
|     -t <tag>       Use TAG for source identifiers (TAG should be one of: LABEL, | ||||
|                       UUID, PARTLABEL, PARTUUID) | ||||
|     -U             Use UUIDs for source identifiers (shortcut for -t UUID) | ||||
|  | ||||
|     -h             Print this help message | ||||
| @@ -332,7 +364,6 @@ if ! mountpoint -q "$root"; then | ||||
| fi | ||||
|  | ||||
| # handle block devices | ||||
| findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root" | | ||||
| while read -r src target fstype opts fsroot; do | ||||
|     if (( !pseudofs )) && fstype_is_pseudofs "$fstype"; then | ||||
|         continue | ||||
| @@ -360,6 +391,7 @@ while read -r src target fstype opts fsroot; do | ||||
|     if [[ $fsroot != / && $fstype != btrfs ]]; then | ||||
|         # it's a bind mount | ||||
|         src=$(findmnt -funcevo TARGET "$src")$fsroot | ||||
|         src="/${src#"$root"/}" | ||||
|         if [[ $src -ef $target ]]; then | ||||
|             # hrmm, this is weird. we're probably looking at a file or directory | ||||
|             # that was bound into a chroot from the host machine. Ignore it, | ||||
| @@ -375,14 +407,14 @@ while read -r src target fstype opts fsroot; do | ||||
|     # filesystem quirks | ||||
|     case $fstype in | ||||
|         fuseblk) | ||||
|         # well-behaved FUSE filesystems will report themselves as fuse.$fstype. | ||||
|         # this is probably NTFS-3g, but let's just make sure. | ||||
|         if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then | ||||
|             # avoid blanking out fstype, leading to an invalid fstab | ||||
|             error 'Failed to derive real filesystem type for FUSE device on %s' "$target" | ||||
|         else | ||||
|             fstype=$newtype | ||||
|         fi | ||||
|             # well-behaved FUSE filesystems will report themselves as fuse.$fstype. | ||||
|             # this is probably NTFS-3g, but let's just make sure. | ||||
|             if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then | ||||
|                 # avoid blanking out fstype, leading to an invalid fstab | ||||
|                 error 'Failed to derive real filesystem type for FUSE device on %s' "$target" | ||||
|             else | ||||
|                 fstype=$newtype | ||||
|             fi | ||||
|         ;; | ||||
|     esac | ||||
|  | ||||
| @@ -393,7 +425,7 @@ while read -r src target fstype opts fsroot; do | ||||
|     printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts" | ||||
|     printf '\t%s %s' "$dump" "$pass" | ||||
|     printf '\n\n' | ||||
| done | ||||
| done < <(findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root") | ||||
|  | ||||
| # handle swaps devices | ||||
| { | ||||
| @@ -409,6 +441,9 @@ done | ||||
|         # skip files marked deleted by the kernel | ||||
|         [[ $device = *'\040(deleted)' ]] && continue | ||||
|  | ||||
|         # skip devices not part of the prefix | ||||
|         [[ $device = "$prefixfilter"* ]] || continue | ||||
|  | ||||
|         if [[ $type = file ]]; then | ||||
|             printf '%-20s' "${device#"${root%/}"}" | ||||
|         elif [[ $device = /dev/dm-+([0-9]) ]]; then | ||||
|   | ||||
| @@ -6,20 +6,16 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/iso/util.sh | ||||
| source "${LIBDIR}"/iso/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
| # shellcheck source=src/lib/base/mount.sh | ||||
| # shellcheck source=src/lib/iso/mount.sh | ||||
| source "${LIBDIR}"/iso/mount.sh | ||||
| # shellcheck source=src/lib/iso/services.sh | ||||
| source "${LIBDIR}"/iso/services.sh | ||||
| # shellcheck source=src/lib/base/yaml.sh | ||||
| source "${LIBDIR}"/base/yaml.sh | ||||
| # shellcheck source=src/lib/iso/calamares.sh | ||||
| source "${LIBDIR}"/iso/calamares.sh | ||||
| # shellcheck source=src/lib/iso/config.sh | ||||
| @@ -92,9 +88,15 @@ make_rootfs() { | ||||
|         msg "Prepare [Base installation] (rootfs)" | ||||
|         local rootfs="${work_dir}/rootfs" | ||||
|  | ||||
|         load_pkgs "${root_list}" | ||||
|  | ||||
|         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}" | ||||
|  | ||||
| @@ -113,6 +115,8 @@ make_livefs() { | ||||
|         msg "Prepare [Live installation] (livefs)" | ||||
|         local livefs="${work_dir}/livefs" | ||||
|  | ||||
|         load_pkgs "${live_list}" | ||||
|  | ||||
|         prepare_dir "${livefs}" | ||||
|  | ||||
|         mount_overlayfs "${livefs}" "${work_dir}" | ||||
| @@ -137,6 +141,8 @@ make_bootfs() { | ||||
|     if [[ ! -e ${work_dir}/bootfs.lock ]]; then | ||||
|         msg "Prepare [/iso/boot]" | ||||
|  | ||||
|         load_pkgs "${common_dir}/Packages-boot" | ||||
|  | ||||
|         prepare_dir "${iso_root}/boot" | ||||
|  | ||||
|         cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}" | ||||
| @@ -148,6 +154,7 @@ make_bootfs() { | ||||
|         if "${use_dracut}"; then | ||||
|             prepare_initramfs_dracut "${bootfs}" | ||||
|         else | ||||
|             basestrap "${basestrap_args[@]}" "${bootfs}" "${packages[@]}" | ||||
|             prepare_initramfs_mkinitcpio "${bootfs}" | ||||
|         fi | ||||
|  | ||||
| @@ -183,8 +190,8 @@ gen_iso_fn(){ | ||||
|     local vars=("artix") name | ||||
|     vars+=("${profile}") | ||||
|     vars+=("${INITSYS}") | ||||
|     case "${repo}" in | ||||
|         'gremlins'|'goblins') vars+=("${repo}") ;; | ||||
|     case "${STABILITY}" in | ||||
|         gremlins|goblins) vars+=("${STABILITY}") ;; | ||||
|     esac | ||||
|     vars+=("${ISO_VERSION}") | ||||
|     vars+=("${arch}") | ||||
| @@ -194,15 +201,23 @@ gen_iso_fn(){ | ||||
|     printf "%s\n" "$name" | ||||
| } | ||||
|  | ||||
| export_gpg_publickey() { | ||||
|     key_export="${WORKSPACE_DIR}"/pubkey.gpg | ||||
|     gpg --batch  --no-armor --output "${key_export}" --export "${GPG_KEY}" | ||||
| } | ||||
|  | ||||
| prepare_build(){ | ||||
|     load_profile | ||||
|     local pac_conf | ||||
|  | ||||
|     case "${repo}" in | ||||
|         buildiso) repo=default ;; | ||||
|     esac | ||||
|  | ||||
|     pacman_conf="${DATADIR}/pacman.conf.d/${repo}.conf" | ||||
|     [[ -f "${USER_CONF_DIR}/pacman.conf.d/${repo}.conf" ]] && pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${repo}.conf" | ||||
|     pac_conf=iso-${arch}.conf | ||||
|     if [[ "${STABILITY}" != 'stable' ]]; then | ||||
|         pac_conf=iso-${STABILITY}-${arch}.conf | ||||
|     fi | ||||
|     pacman_conf="${DATADIR}/pacman.conf.d/${pac_conf}" | ||||
|     if [[ -f "${USER_CONF_DIR}/pacman.conf.d/${pac_conf}" ]]; then | ||||
|         pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${pac_conf}" | ||||
|     fi | ||||
|  | ||||
|     iso_file=$(gen_iso_fn).iso | ||||
|  | ||||
| @@ -264,10 +279,8 @@ mk_boot(){ | ||||
| } | ||||
|  | ||||
| mk_chroots(){ | ||||
|     load_pkgs "${root_list}" | ||||
|     run_safe "make_rootfs" | ||||
|     if [[ -n ${live_list} ]]; then | ||||
|         load_pkgs "${live_list}" | ||||
|         run_safe "make_livefs" | ||||
|     fi | ||||
| } | ||||
| @@ -324,21 +337,25 @@ persist=false | ||||
| use_dracut=false | ||||
| squash_only=false | ||||
| boot_only=false | ||||
| copy_pacconf=false | ||||
|  | ||||
| basestrap_args=(-GMc) | ||||
| cmd=${0##*/} | ||||
|  | ||||
| repo=${cmd##*-} | ||||
| owner=${SUDO_USER:-$USER} | ||||
| profile='base' | ||||
| chroots_iso="${CHROOTS_DIR}/buildiso" | ||||
| arch=$(uname -m) | ||||
| arch=${ARCH} | ||||
|  | ||||
| usage() { | ||||
|     printf 'Usage: %s [options]\n' "${cmd}" | ||||
|     printf '    -p <profile>       Profile [default: %s]\n' "${profile}" | ||||
|     printf '    -r <dir>           Chroots directory\n' | ||||
|     printf '                       [default: %s]\n' "${chroots_iso}" | ||||
|     printf '    -R <stability>     Build stability\n' | ||||
|     printf '                       [default: %s]\n' "${STABILITY}" | ||||
|     printf '    -a <arch>          Build arch\n' | ||||
|     printf '                       [default: %s]\n' "${arch}" | ||||
|     printf '    -t <dir>           Target directory\n' | ||||
|     printf '                       [default: %s]\n' "${ISO_POOL}" | ||||
|     printf '    -i <name>          Init system to use\n' | ||||
| @@ -353,6 +370,7 @@ usage() { | ||||
|     printf '    -z                 Generate iso only\n' | ||||
|     printf '                       Requires pre built images (-x)\n' | ||||
|     printf '    -d                 Use dracut instead of mkinitcpio for iso initramfs\n' | ||||
|     printf '    -w                 Copy the pacman.conf used to the rootfs\n' | ||||
|     printf '    -q                 Query settings and pretend build\n' | ||||
|     printf '    -h                 This help\n' | ||||
|     printf '\n' | ||||
| @@ -362,11 +380,13 @@ usage() { | ||||
|  | ||||
| orig_args=("$@") | ||||
|  | ||||
| opts='p:r:t:i:g:czsbxmdqh' | ||||
| opts='p:r:R:t:i:g:a:czsbxwmdqh' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         p) profile="$OPTARG" ;; | ||||
|         a) arch="$OPTARG" ;; | ||||
|         R) STABILITY="$OPTARG" ;; | ||||
|         r) chroots_iso="$OPTARG" ;; | ||||
|         t) ISO_POOL="$OPTARG" ;; | ||||
|         i) INITSYS="$OPTARG" ;; | ||||
| @@ -378,6 +398,7 @@ while getopts "${opts}" arg; do | ||||
|         b) boot_only=true ;; | ||||
|         m) persist=true ;; | ||||
|         d) use_dracut=true ;; | ||||
|         w) copy_pacconf=true ;; | ||||
|         q) pretend=true ;; | ||||
|         h|?) usage 0 ;; | ||||
|     esac | ||||
|   | ||||
| @@ -81,7 +81,7 @@ trap_abort() { | ||||
| trap_exit() { | ||||
|     local r=$? | ||||
|     trap - EXIT INT QUIT TERM HUP | ||||
|     cleanup $r | ||||
|     cleanup "$r" | ||||
| } | ||||
|  | ||||
| cleanup() { | ||||
|   | ||||
| @@ -9,72 +9,39 @@ ignore_error() { | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| trap_setup(){ | ||||
|     [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' | ||||
|     trap "$1" EXIT | ||||
| } | ||||
|  | ||||
| chroot_mount() { | ||||
| chroot_add_mount() { | ||||
| #     msg2 "mount: [%s]" "$2" | ||||
|     mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") | ||||
| } | ||||
|  | ||||
| chroot_add_resolv_conf() { | ||||
|     local chrootdir=$1 resolv_conf=$1/etc/resolv.conf | ||||
|  | ||||
|     [[ -e /etc/resolv.conf ]] || return 0 | ||||
|  | ||||
|     # Handle resolv.conf as a symlink to somewhere else. | ||||
|     if [[ -L $chrootdir/etc/resolv.conf ]]; then | ||||
|         # readlink(1) should always give us *something* since we know at this point | ||||
|         # it's a symlink. For simplicity, ignore the case of nested symlinks. | ||||
|         resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") | ||||
|         if [[ $resolv_conf = /* ]]; then | ||||
|             resolv_conf=$chrootdir$resolv_conf | ||||
|         else | ||||
|             resolv_conf=$chrootdir/etc/$resolv_conf | ||||
|         fi | ||||
|  | ||||
|         # ensure file exists to bind mount over | ||||
|         if [[ ! -f $resolv_conf ]]; then | ||||
|             install -Dm644 /dev/null "$resolv_conf" || return 1 | ||||
|         fi | ||||
|     elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then | ||||
|         # The chroot might not have a resolv.conf. | ||||
|         return 0 | ||||
|     fi | ||||
|  | ||||
|     chroot_mount /etc/resolv.conf "$resolv_conf" --bind | ||||
| } | ||||
|  | ||||
| chroot_mount_conditional() { | ||||
| chroot_maybe_add_mount() { | ||||
|     local cond=$1; shift | ||||
|     if eval "$cond"; then | ||||
|         chroot_mount "$@" | ||||
|         chroot_add_mount "$@" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| chroot_setup(){ | ||||
|     local mnt="$1" | ||||
|     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 mode=1777,strictatime,nodev,nosuid | ||||
| } | ||||
|     local tmpfs_opts="${2:-mode=1777,strictatime,nodev,nosuid}" | ||||
|  | ||||
| chroot_api_mount() { | ||||
|     CHROOT_ACTIVE_MOUNTS=() | ||||
|     trap_setup chroot_api_umount | ||||
|     chroot_setup "$1" | ||||
|     [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' | ||||
|     trap 'chroot_teardown' EXIT | ||||
|  | ||||
|     #chroot_maybe_add_mount "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && | ||||
|     chroot_add_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && | ||||
|     chroot_add_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && | ||||
|     ignore_error chroot_maybe_add_mount "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \ | ||||
|         efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && | ||||
|     chroot_add_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && | ||||
|     chroot_add_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && | ||||
|     chroot_add_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && | ||||
|     chroot_add_mount /run "$mnt/run" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_add_mount tmp "$mnt/tmp" -t tmpfs -o "${tmpfs_opts}" | ||||
| } | ||||
|  | ||||
| chroot_api_umount() { | ||||
| chroot_teardown() { | ||||
|     if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then | ||||
| #         msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
|         umount "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
| @@ -82,4 +49,40 @@ chroot_api_umount() { | ||||
|     unset CHROOT_ACTIVE_MOUNTS | ||||
| } | ||||
|  | ||||
| resolve_link() { | ||||
|     local target=$1 | ||||
|     local root=$2 | ||||
|  | ||||
|     # If a root was given, make sure it ends in a slash. | ||||
|     [[ -n $root && $root != */ ]] && root=$root/ | ||||
|  | ||||
|     while [[ -L $target ]]; do | ||||
|         target=$(readlink -m "$target") | ||||
|         # If a root was given, make sure the target is under it. | ||||
|         # Make sure to strip any leading slash from target first. | ||||
|         [[ -n $root && $target != $root* ]] && target=$root${target#/} | ||||
|     done | ||||
|  | ||||
|     printf %s "$target" | ||||
| } | ||||
|  | ||||
| chroot_add_resolv_conf() { | ||||
|     local chrootdir=$1 | ||||
|     local src | ||||
|     local dest="$chrootdir/etc/resolv.conf" | ||||
|  | ||||
|     src=$(resolve_link /etc/resolv.conf) | ||||
|  | ||||
|     # If we don't have a source resolv.conf file, there's nothing useful we can do. | ||||
|     [[ -e $src ]] || return 0 | ||||
|  | ||||
|     if [[ ! -e "$dest" && ! -h "$dest" ]]; then | ||||
|             # There may be no resolv.conf in the chroot. In this case, we'll just exit. | ||||
|             # The chroot environment must not be concerned with DNS resolution. | ||||
|             return 0 | ||||
|     fi | ||||
|  | ||||
|     chroot_add_mount "$src" "$dest" -c --bind | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
							
								
								
									
										78
									
								
								src/lib/base/unshare-mount.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								src/lib/base/unshare-mount.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| #!/hint/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #{{{ mount | ||||
|  | ||||
| chroot_add_mount_lazy() { | ||||
|     mount "$@" && CHROOT_ACTIVE_LAZY=("$2" "${CHROOT_ACTIVE_LAZY[@]}") | ||||
| } | ||||
|  | ||||
| chroot_bind_device() { | ||||
|     touch "$2" && CHROOT_ACTIVE_FILES=("$2" "${CHROOT_ACTIVE_FILES[@]}") | ||||
|     chroot_add_mount "$1" "$2" --bind | ||||
| } | ||||
|  | ||||
| chroot_add_link() { | ||||
|     ln -sf "$1" "$2" && CHROOT_ACTIVE_FILES=("$2" "${CHROOT_ACTIVE_FILES[@]}") | ||||
| } | ||||
|  | ||||
| unshare_setup() { | ||||
|     CHROOT_ACTIVE_MOUNTS=() | ||||
|     CHROOT_ACTIVE_LAZY=() | ||||
|     CHROOT_ACTIVE_FILES=() | ||||
|     [[ $(trap -p EXIT) ]] && die '(BUG): attempting to overwrite existing EXIT trap' | ||||
|     trap 'unshare_teardown' EXIT | ||||
|  | ||||
|     chroot_add_mount_lazy "$1" "$1" --bind && | ||||
|     chroot_add_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev && | ||||
|     chroot_add_mount_lazy /sys "$1/sys" --rbind && | ||||
|     chroot_add_link /proc/self/fd "$1/dev/fd" && | ||||
|     chroot_add_link /proc/self/fd/0 "$1/dev/stdin" && | ||||
|     chroot_add_link /proc/self/fd/1 "$1/dev/stdout" && | ||||
|     chroot_add_link /proc/self/fd/2 "$1/dev/stderr" && | ||||
|     chroot_bind_device /dev/full "$1/dev/full" && | ||||
|     chroot_bind_device /dev/null "$1/dev/null" && | ||||
|     chroot_bind_device /dev/random "$1/dev/random" && | ||||
|     chroot_bind_device /dev/tty "$1/dev/tty" && | ||||
|     chroot_bind_device /dev/urandom "$1/dev/urandom" && | ||||
|     chroot_bind_device /dev/zero "$1/dev/zero" && | ||||
|     chroot_add_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_add_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid | ||||
| } | ||||
|  | ||||
| unshare_teardown() { | ||||
|     chroot_teardown | ||||
|  | ||||
|     if (( ${#CHROOT_ACTIVE_LAZY[@]} )); then | ||||
|         umount --lazy "${CHROOT_ACTIVE_LAZY[@]}" | ||||
|     fi | ||||
|     unset CHROOT_ACTIVE_LAZY | ||||
|  | ||||
|     if (( ${#CHROOT_ACTIVE_FILES[@]} )); then | ||||
|         rm "${CHROOT_ACTIVE_FILES[@]}" | ||||
|     fi | ||||
|     unset CHROOT_ACTIVE_FILES | ||||
| } | ||||
|  | ||||
| pid_unshare="unshare --fork --pid" | ||||
| mount_unshare="$pid_unshare --mount --map-auto --map-root-user --setuid 0 --setgid 0" | ||||
|  | ||||
| # This outputs code for declaring all variables to stdout. For example, if | ||||
| # FOO=BAR, then running | ||||
| #     declare -p FOO | ||||
| # will result in the output | ||||
| #     declare -- FOO="bar" | ||||
| # This function may be used to re-declare all currently used variables and | ||||
| # functions in a new shell. | ||||
| declare_all() { | ||||
|   # Remove read-only variables to avoid warnings. Unfortunately, declare +r -p | ||||
|   # doesn't work like it looks like it should (declaring only read-write | ||||
|   # variables). However, declare -rp will print out read-only variables, which | ||||
|   # we can then use to remove those definitions. | ||||
|   declare -p | grep -Fvf <(declare -rp) | ||||
|   # Then declare functions | ||||
|   declare -pf | ||||
| } | ||||
|  | ||||
| #}}} | ||||
| @@ -1,44 +0,0 @@ | ||||
| #!/hint/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #{{{ base conf | ||||
|  | ||||
| prepare_dir(){ | ||||
|     [[ ! -d $1 ]] && mkdir -p "$1" | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| if [[ -n $SUDO_USER ]]; then | ||||
|     eval "USER_HOME=~$SUDO_USER" | ||||
| else | ||||
|     USER_HOME=$HOME | ||||
| fi | ||||
|  | ||||
| USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" | ||||
|  | ||||
| prepare_dir "${USER_CONF_DIR}" | ||||
|  | ||||
| load_base_config(){ | ||||
|  | ||||
|     local conf="$1/artools-base.conf" | ||||
|  | ||||
|     [[ -f "$conf" ]] || return 1 | ||||
|  | ||||
|     # shellcheck source=config/conf/artools-base.conf | ||||
|     [[ -r "$conf" ]] && source "$conf" | ||||
|  | ||||
|     CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} | ||||
|  | ||||
|     WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} | ||||
|  | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|  | ||||
|  | ||||
| load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" | ||||
|  | ||||
| prepare_dir "${WORKSPACE_DIR}" | ||||
|  | ||||
| @@ -4,53 +4,34 @@ | ||||
|  | ||||
| #{{{ calamares | ||||
|  | ||||
| write_services_conf(){ | ||||
|     local key1="$1" val1="$2" key2="$3" val2="$4" | ||||
|     local yaml | ||||
|     yaml=$(write_yaml_header) | ||||
|     yaml+=$(write_yaml_map 0 "$key1" "$val1") | ||||
|     yaml+=$(write_yaml_map 0 "$key2" "$val2") | ||||
|     yaml+=$(write_yaml_map 0 'services') | ||||
|     for svc in "${SERVICES[@]}"; do | ||||
|         yaml+=$(write_yaml_seq 2 "$svc") | ||||
| yaml_array() { | ||||
|     local array yaml | ||||
|  | ||||
|     for entry in "$@"; do | ||||
|         yaml="{name: ${entry}, action: enable}" | ||||
|         array="${array:-}${array:+,} ${yaml}" | ||||
|     done | ||||
|     yaml+=$(write_empty_line) | ||||
|     printf '%s\n' "${yaml}" | ||||
| } | ||||
|  | ||||
| write_services_openrc_conf(){ | ||||
|     local conf="$1"/services-openrc.conf | ||||
|     write_services_conf 'initdDir' '/etc/init.d' 'runlevelsDir' '/etc/runlevels' > "$conf" | ||||
| } | ||||
|  | ||||
| write_services_runit_conf(){ | ||||
|     local conf="$1"/services-runit.conf | ||||
|     write_services_conf 'svDir' '/etc/runit/sv' 'runsvDir' '/etc/runit/runsvdir' > "$conf" | ||||
| } | ||||
|  | ||||
| write_services_s6_conf(){ | ||||
|     local conf="$1"/services-s6.conf | ||||
|     write_services_conf 'svDir' '/etc/s6/sv' 'dbDir' '/etc/s6/rc/compiled' > "$conf" | ||||
|     printf '%s\n' "defaultBundle: default" >> "$conf" | ||||
| } | ||||
|  | ||||
| write_services_suite66_conf(){ | ||||
|     local conf="$1"/services-suite66.conf | ||||
|     write_services_conf 'svDir' '/etc/66/service' 'runsvDir' '/var/lib/66/system' > "$conf" | ||||
| } | ||||
|  | ||||
| write_services_dinit_conf(){ | ||||
|     local conf="$1"/services-dinit.conf | ||||
|     write_services_conf 'initdDir' '/etc/dinit.d' 'runsvDir' '/etc/dinit.d/boot.d' > "$conf" | ||||
|     printf "%s\n" "[${array}]" | ||||
| } | ||||
|  | ||||
| configure_calamares(){ | ||||
|     local mods="$1/etc/calamares/modules" | ||||
|     if [[ -d "$mods" ]];then | ||||
|         msg2 "Configuring: Calamares" | ||||
|         write_services_"${INITSYS}"_conf "$mods" | ||||
|         sed -e "s|services-openrc|services-${INITSYS}|" \ | ||||
|             -i "$1"/etc/calamares/settings.conf | ||||
|     for config in online offline; do | ||||
|         local mods="$1/etc/calamares-$config/modules" | ||||
|         if [[ -d "$mods" ]];then | ||||
|             msg2 "Configuring: Calamares %s" "$config" | ||||
|  | ||||
|             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 | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,6 @@ prepare_boot_extras(){ | ||||
|     done | ||||
|  | ||||
|     cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest | ||||
|     cp "$src"/usr/share/licenses/common/GPL2/license.txt "$dest"/memtest.COPYING | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
| @@ -4,41 +4,15 @@ | ||||
|  | ||||
| #{{{ initcpio | ||||
|  | ||||
| make_checksum(){ | ||||
|     local file="$1" | ||||
|     msg2 "Creating md5sum ..." | ||||
|     cd "${iso_root}${live_dir}" | ||||
|     md5sum "$file" > "$file".md5 | ||||
|     cd "${OLDPWD}" | ||||
| } | ||||
|  | ||||
| make_sig () { | ||||
|     local file="$1" | ||||
|     msg2 "Creating signature file..." | ||||
|     chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}" | ||||
|     su "${owner}" -c "gpg --detach-sign --output $file.sig --default-key ${GPG_KEY} $file" | ||||
|     chown "root:root" "${iso_root}${live_dir}" | ||||
| } | ||||
|  | ||||
| export_gpg_publickey() { | ||||
|     key_export=${WORKSPACE_DIR}/pubkey.gpg | ||||
|     if [[ ! -e "${key_export}" ]]; then | ||||
|         gpg --batch --output "${key_export}" --export "${GPG_KEY}" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| prepare_initramfs_mkinitcpio() { | ||||
|     local mnt="$1" packages=() mkinitcpio_conf k | ||||
|     local mnt="$1" mkinitcpio_conf k | ||||
|  | ||||
|     mkinitcpio_conf=mkinitcpio-default.conf | ||||
|     [[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf | ||||
|     k=$(<"$mnt"/usr/src/linux/version) | ||||
|  | ||||
|     read_from_list "${common_dir}/Packages-boot" | ||||
|     basestrap "${basestrap_args[@]}" "$mnt" "${packages[@]}" | ||||
|  | ||||
|     if [[ -n "${GPG_KEY}" ]]; then | ||||
|         exec {ARTIX_GNUPG_FD}<>"${key_export}" | ||||
|     if [[ -v key_export ]]; then | ||||
|         exec {ARTIX_GNUPG_FD}<"${key_export}" | ||||
|         export ARTIX_GNUPG_FD | ||||
|     fi | ||||
|  | ||||
| @@ -46,13 +20,11 @@ prepare_initramfs_mkinitcpio() { | ||||
|         -c /etc/"$mkinitcpio_conf" \ | ||||
|         -g /boot/initramfs.img | ||||
|  | ||||
|     if [[ -n "${GPG_KEY}" ]]; then | ||||
|     if [[ -v key_export ]]; then | ||||
|         exec {ARTIX_GNUPG_FD}<&- | ||||
|         unset ARTIX_GNUPG_FD | ||||
|     fi | ||||
|     if [[ -f "${key_export}" ]]; then | ||||
|         rm "${key_export}" | ||||
|     fi | ||||
|     rm -rf -- "${key_export}" | ||||
|     cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img | ||||
|     prepare_boot_extras "$mnt" | ||||
| } | ||||
|   | ||||
| @@ -5,13 +5,13 @@ | ||||
| #{{{ iso | ||||
|  | ||||
| get_disturl(){ | ||||
|     # shellcheck disable=1091 | ||||
|     # shellcheck disable=SC2034 | ||||
|     . /usr/lib/os-release | ||||
|     printf "%s\n" "${HOME_URL}" | ||||
| } | ||||
|  | ||||
| get_osname(){ | ||||
|     # shellcheck disable=1091 | ||||
|     # shellcheck disable=SC2034 | ||||
|     . /usr/lib/os-release | ||||
|     printf "%s\n" "${NAME}" | ||||
| } | ||||
|   | ||||
| @@ -26,7 +26,7 @@ load_profile(){ | ||||
|  | ||||
|     [[ -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 | ||||
|  | ||||
|     AUTOLOGIN=${AUTOLOGIN:-true} | ||||
| @@ -43,31 +43,15 @@ load_profile(){ | ||||
| read_from_list() { | ||||
|     local list="$1" | ||||
|     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 _init="s|@initsys@|${INITSYS}|g" | ||||
|     local pkgs | ||||
|  | ||||
|     mapfile -t pkgs < <(sed "$_com_rm" "$list" \ | ||||
|             | sed "$_space" \ | ||||
|             | sed "$_init" \ | ||||
|             | sed "$_clean") | ||||
|  | ||||
|     printf "%s\n" "${pkgs[@]}" | ||||
| } | ||||
|  | ||||
| read_from_services() { | ||||
|     for svc in "${SERVICES[@]}"; do | ||||
|         case "$svc" in | ||||
|             sddm|gdm|lightdm|mdm|greetd|lxdm|xdm) | ||||
|                 packages+=("$svc-${INITSYS}"); display_manager="$svc" ;; | ||||
|             NetworkManager) packages+=("networkmanager-${INITSYS}") ;; | ||||
|             connmand) packages+=("connman-${INITSYS}") ;; | ||||
|             cupsd) packages+=("cups-${INITSYS}") ;; | ||||
|             bluetoothd) packages+=("bluez-${INITSYS}") ;; | ||||
|             syslog-ng|metalog) packages+=("$svc-${INITSYS}") ;; | ||||
|         esac | ||||
|     done | ||||
|             | sed "$_clean" | sort -u) | ||||
| } | ||||
|  | ||||
| load_pkgs(){ | ||||
| @@ -77,19 +61,33 @@ load_pkgs(){ | ||||
|     if [[ "${pkglist##*/}" == "Packages-Root" ]]; then | ||||
|         for l in base apps "${INITSYS}"; do | ||||
|             msg2 "Loading Packages: [%s] ..." "Packages-${l}" | ||||
|             packages+=($(read_from_list "${common_dir}/Packages-${l}")) | ||||
|             read_from_list "${common_dir}/Packages-${l}" | ||||
|             packages+=("${pkgs[@]}") | ||||
|  | ||||
|         done | ||||
|  | ||||
|         if [[ -n "${live_list}" ]]; then | ||||
|             msg2 "Loading Packages: [%s] ..." "Packages-xorg" | ||||
|             packages+=($(read_from_list "${common_dir}/Packages-xorg")) | ||||
|             msg2 "Loading Packages: [Packages-xorg] ..." | ||||
|             read_from_list "${common_dir}/Packages-xorg" | ||||
|             packages+=("${pkgs[@]}") | ||||
|         fi | ||||
|         msg2 "Loading Packages: [%s] ..." "${pkglist##*/}" | ||||
|         packages+=($(read_from_list "${pkglist}")) | ||||
|         read_from_services | ||||
|     else | ||||
|         msg2 "Loading Packages: [%s] ..." "${pkglist##*/}" | ||||
|         packages+=($(read_from_list "${pkglist}")) | ||||
|  | ||||
|         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 | ||||
|  | ||||
|     fi | ||||
|     msg2 "Loading Packages: [%s] ..." "${pkglist##*/}" | ||||
|     read_from_list "${pkglist}" | ||||
|     packages+=("${pkgs[@]}") | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
| @@ -4,6 +4,24 @@ | ||||
|  | ||||
| #{{{ squash | ||||
|  | ||||
| make_checksum(){ | ||||
|     local file="$1" | ||||
|     msg2 "Creating md5sum ..." | ||||
|     cd "${iso_root}${live_dir}" | ||||
|     md5sum "$file" > "$file".md5 | ||||
|     cd "${OLDPWD}" | ||||
| } | ||||
|  | ||||
| make_sig () { | ||||
|     local file="$1" | ||||
|     msg2 "Creating signature file..." | ||||
|  | ||||
|     chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}" | ||||
|     su "${owner}" -c "gpg --batch --no-armor --no-include-key-block --output $file.sig  --detach-sign \ | ||||
|         --default-key ${GPG_KEY} ${gpg_options[@]} $file" | ||||
|     chown "root:root" "${iso_root}${live_dir}" | ||||
| } | ||||
|  | ||||
| make_ext_img(){ | ||||
|     local src="$1" | ||||
|     local size=32G | ||||
|   | ||||
| @@ -4,6 +4,21 @@ | ||||
|  | ||||
| #{{{ iso conf | ||||
|  | ||||
| prepare_dir(){ | ||||
|     [[ ! -d $1 ]] && mkdir -p "$1" | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| if [[ -n $SUDO_USER ]]; then | ||||
|     eval "USER_HOME=~$SUDO_USER" | ||||
| else | ||||
|     USER_HOME=$HOME | ||||
| fi | ||||
|  | ||||
| USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" | ||||
|  | ||||
| prepare_dir "${USER_CONF_DIR}" | ||||
|  | ||||
| load_iso_config(){ | ||||
|  | ||||
|     local conf="$1/artools-iso.conf" | ||||
| @@ -13,6 +28,14 @@ load_iso_config(){ | ||||
|     # shellcheck source=config/conf/artools-iso.conf | ||||
|     [[ -r "$conf" ]] && source "$conf" | ||||
|  | ||||
|     CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} | ||||
|  | ||||
|     WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} | ||||
|  | ||||
|     ARCH=${ARCH:-"$(uname -m)"} | ||||
|  | ||||
|     STABILITY=${STABILITY:-'stable'} | ||||
|  | ||||
|     ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"} | ||||
|  | ||||
|     ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"} | ||||
|   | ||||
| @@ -5,6 +5,10 @@ | ||||
| [[ -z ${ARTOOLS_INCLUDE_ADMIN_SH:-} ]] || return 0 | ||||
| ARTOOLS_INCLUDE_ADMIN_SH=1 | ||||
|  | ||||
| # shellcheck source=src/lib/pkg/db/db.sh | ||||
| source "${LIBDIR}"/pkg/db/db.sh | ||||
|  | ||||
|  | ||||
| set -e | ||||
|  | ||||
| artixpkg_admin_usage() { | ||||
| @@ -13,13 +17,18 @@ artixpkg_admin_usage() { | ||||
|     Usage: ${COMMAND} [COMMAND] [OPTIONS] | ||||
|  | ||||
|     COMMANDS | ||||
|         transfer          Clone a package repository | ||||
|         query             Query maintainers and topics | ||||
|         team              Manage repo team | ||||
|         topic             Manage topics | ||||
|         transfer          Transfer obsolete repository to landfill | ||||
|  | ||||
|     OPTIONS | ||||
|         -h, --help     Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} transfer libfoo libbar | ||||
|         $ ${COMMAND} query --maintainer tux | ||||
|         $ ${COMMAND} query --topic kf5 | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -36,6 +45,31 @@ artixpkg_admin() { | ||||
|             artixpkg_admin_usage | ||||
|             exit 0 | ||||
|         ;; | ||||
|  | ||||
|         query) | ||||
|             _ARTOOLS_COMMAND+=" $1" | ||||
|             shift | ||||
|             # shellcheck source=src/lib/pkg/admin/query.sh | ||||
|             source "${LIBDIR}"/pkg/admin/query.sh | ||||
|             artixpkg_admin_query "$@" | ||||
|             exit 0 | ||||
|         ;; | ||||
|         team) | ||||
|             _ARTOOLS_COMMAND+=" $1" | ||||
|             shift | ||||
|             # shellcheck source=src/lib/pkg/admin/team.sh | ||||
|             source "${LIBDIR}"/pkg/admin/team.sh | ||||
|             artixpkg_admin_team "$@" | ||||
|             exit 0 | ||||
|         ;; | ||||
|         topic) | ||||
|             _ARTOOLS_COMMAND+=" $1" | ||||
|             shift | ||||
|             # shellcheck source=src/lib/pkg/admin/query.sh | ||||
|             source "${LIBDIR}"/pkg/admin/topic.sh | ||||
|             artixpkg_admin_topic "$@" | ||||
|             exit 0 | ||||
|         ;; | ||||
|         transfer) | ||||
|             _ARTOOLS_COMMAND+=" $1" | ||||
|             shift | ||||
|   | ||||
							
								
								
									
										81
									
								
								src/lib/pkg/admin/query.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								src/lib/pkg/admin/query.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| [[ -z ${ARTOOLS_INCLUDE_ADMIN_QUERY_SH:-} ]] || return 0 | ||||
| ARTOOLS_INCLUDE_ADMIN_QUERY_SH=1 | ||||
|  | ||||
| set -e | ||||
|  | ||||
|  | ||||
| artixpkg_admin_query_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
|     Usage: ${COMMAND} [OPTIONS] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -m, --maintainer NAME      Query for packages of the named maintainer | ||||
|         -t, --topic NAME           Query for packages of the named topic | ||||
|         -h, --help                 Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --topic mytopic | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| artixpkg_admin_query() { | ||||
|     if (( $# < 1 )); then | ||||
|         artixpkg_admin_query_usage | ||||
|         exit 0 | ||||
|     fi | ||||
|  | ||||
|     # options | ||||
|     local MAINTAINER= | ||||
|     local TOPIC= | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
|             -h|--help) | ||||
|                 artixpkg_admin_query_usage | ||||
|                 exit 0 | ||||
|             ;; | ||||
|             -m|--maintainer) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 MAINTAINER="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             -t|--topic) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TOPIC="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --) | ||||
|                 shift | ||||
|                 break | ||||
|             ;; | ||||
|             -*) | ||||
|                 die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
|             *) | ||||
|                 break | ||||
|             ;; | ||||
|         esac | ||||
|     done | ||||
|  | ||||
|     # Query packages of a maintainer | ||||
|     if [[ -n ${MAINTAINER} ]]; then | ||||
|         local maint | ||||
|         maint="maintainer-${MAINTAINER}" | ||||
|         mapfile -t pkgbases < <(search_topic "${maint}" | yq -r '.data | .[].name' | sort) | ||||
|         printf "%s\n" "${pkgbases[@]}" | ||||
|     fi | ||||
|  | ||||
|     if [[ -n ${TOPIC} ]]; then | ||||
|         mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort) | ||||
|         printf "%s\n" "${pkgbases[@]}" | ||||
|     fi | ||||
|  | ||||
| } | ||||
							
								
								
									
										154
									
								
								src/lib/pkg/admin/team.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										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 | ||||
|  | ||||
| } | ||||
							
								
								
									
										125
									
								
								src/lib/pkg/admin/topic.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								src/lib/pkg/admin/topic.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| #!/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 | ||||
|         -d, --del NAME             Delete a topic 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} --del mytopic libbar | ||||
|         $ ${COMMAND} --add mytopic libfoo libbar | ||||
|         $ ${COMMAND} --del mytopic libfoo libbar | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| artixpkg_admin_topic() { | ||||
|     if (( $# < 1 )); then | ||||
|         artixpkg_admin_topic_usage | ||||
|         exit 0 | ||||
|     fi | ||||
|  | ||||
|     # options | ||||
|     local pkgbases=() | ||||
|     local pkgbase | ||||
|  | ||||
|     local ADD_TOPIC | ||||
|     local DEL_TOPIC | ||||
|     local ADD=0 | ||||
|     local DEL=0 | ||||
|     local jobs= | ||||
|     jobs=$(nproc) | ||||
|  | ||||
|     local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
|             -a|--add) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 ADD_TOPIC="$2" | ||||
|                 ADD=1 | ||||
|                 RUNCMD+=" -a ${ADD_TOPIC}" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             -d|--del) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 DEL_TOPIC="$2" | ||||
|                 DEL=1 | ||||
|                 RUNCMD+=" -d ${DEL_TOPIC}" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             -h|--help) | ||||
|                 artixpkg_admin_topic_usage | ||||
|                 exit 0 | ||||
|             ;; | ||||
|             -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 the topic: ${ADD_TOPIC}" | ||||
|                 fi | ||||
|             fi | ||||
|  | ||||
|             if (( DEL )); then | ||||
|                 if ! remove_topic "${gitname}" "${DEL_TOPIC}"; then | ||||
|                     warning "failed to delete the topic: ${DEL_TOPIC}" | ||||
|                 fi | ||||
|             fi | ||||
|  | ||||
|         done | ||||
|  | ||||
|     fi | ||||
| } | ||||
| @@ -60,7 +60,10 @@ artixpkg_admin_transfer() { | ||||
|  | ||||
|     if [[ -n ${GIT_TOKEN} ]]; then | ||||
|         for pkgbase in "${pkgbases[@]}"; do | ||||
|             transfer_repo "${pkgbase}" "${waste_org}" | ||||
|             local gitname | ||||
|             gitname=$(get_compliant_name "${pkgbase}") | ||||
|  | ||||
|             transfer_repo "${gitname}" "${waste_org}" | ||||
|         done | ||||
|     fi | ||||
| } | ||||
|   | ||||
| @@ -37,7 +37,7 @@ add_team_to_repo() { | ||||
|     local pkgbase="$1" | ||||
|     local team="$2" | ||||
|     local url | ||||
|     url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/teams/$team" | ||||
|     url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team" | ||||
|  | ||||
|     stat_busy "Adding team ($team) to package repo [$pkgbase]" | ||||
|     api_put "$url" \ | ||||
| @@ -50,7 +50,7 @@ remove_team_from_repo() { | ||||
|     local pkgbase="$1" | ||||
|     local team="$2" | ||||
|     local url | ||||
|     url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/teams/$team" | ||||
|     url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team" | ||||
|  | ||||
|     stat_busy "Removing team ($team) from package repo [$pkgbase]" | ||||
|     api_delete "$url" \ | ||||
| @@ -62,7 +62,7 @@ remove_team_from_repo() { | ||||
| create_repo() { | ||||
|     local pkgbase="$1" | ||||
|     local url json | ||||
|     url="${GIT_HTTPS}/api/v1/org/${GIT_ORG}/repos" | ||||
|     url="${API_URL}/org/${GIT_ORG}/repos" | ||||
|     json="{ \"auto_init\": true, \"name\": \"$pkgbase\", \"gitignores\": \"ArtixLinuxPackages\", \"readme\": \"Default\" }" | ||||
|  | ||||
|     stat_busy "Create package repo [$pkgbase] in org (${GIT_ORG})" | ||||
| @@ -79,7 +79,7 @@ transfer_repo() { | ||||
|     local new_owner="$2" | ||||
|     local json url | ||||
|     json="{ \"new_owner\": \"$new_owner\",  \"team_ids\": [] }" | ||||
|     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)" | ||||
|     api_post "$url" \ | ||||
| @@ -92,26 +92,19 @@ transfer_repo() { | ||||
|  | ||||
| list_all_repos() { | ||||
|     local url | ||||
|     url="${GIT_HTTPS}/api/v1/orgs/${GIT_ORG}/repos?limit=10000" | ||||
|  | ||||
|     api_get "$url" \ | ||||
|         -H "accept: application/json" | ||||
| } | ||||
|  | ||||
| list_topics() { | ||||
|     local url | ||||
|     local pkgbase="$1" | ||||
|     url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics" | ||||
|     url="${API_URL}/orgs/${GIT_ORG}/repos?limit=10000" | ||||
|  | ||||
|     stat_busy "Query all packages" | ||||
|     api_get "$url" \ | ||||
|         -H "accept: application/json" | ||||
|     stat_done | ||||
| } | ||||
|  | ||||
| add_topic() { | ||||
|     local url | ||||
|     local pkgbase="$1" | ||||
|     local topic="$2" | ||||
|     url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics/$topic" | ||||
|     url="${API_URL}/repos/${GIT_ORG}/$pkgbase/topics/$topic" | ||||
|  | ||||
|     stat_busy "Add topic ($topic) to [$pkgbase]" | ||||
|     api_put "$url" \ | ||||
| @@ -124,7 +117,7 @@ remove_topic() { | ||||
|     local url | ||||
|     local pkgbase="$1" | ||||
|     local topic="$2" | ||||
|     url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics/$topic" | ||||
|     url="${API_URL}/repos/${GIT_ORG}/$pkgbase/topics/$topic" | ||||
|  | ||||
|     stat_busy "Remove topic ($topic) from [$pkgbase]" | ||||
|     api_delete "$url" \ | ||||
| @@ -135,8 +128,10 @@ remove_topic() { | ||||
|  | ||||
| search_topic() { | ||||
|     local search="$1" | ||||
|     local url | ||||
|     url="${GIT_HTTPS}/api/v1/repos/search?q=${search}&topic=true&includeDesc=false&private=false&is_private=false&template=false&archived=false&order=asc&limit=10000" | ||||
|     local url args | ||||
|     args="topic=true&includeDesc=false&private=false&is_private=false" | ||||
|     args+="&template=false&archived=false&order=asc&limit=10000" | ||||
|     url="${API_URL}/repos/search?q=${search}&${args}" | ||||
|  | ||||
|     stat_busy "Query for topic (${search})" | ||||
|     api_get "$url" \ | ||||
| @@ -144,4 +139,29 @@ search_topic() { | ||||
|     stat_done | ||||
| } | ||||
|  | ||||
| list_repo_teams() { | ||||
|     local pkgbase="$1" | ||||
|     local url | ||||
|     url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams" | ||||
|  | ||||
|     stat_busy "List repo teams [$pkgbase]" | ||||
|     api_get "$url" \ | ||||
|         -H 'accept: application/json' \ | ||||
|         -H "Authorization: token ${GIT_TOKEN}" | ||||
|     stat_done | ||||
| } | ||||
|  | ||||
| check_repo_team() { | ||||
|     local pkgbase="$1" | ||||
|     local team="$2" | ||||
|     local url | ||||
|     url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team" | ||||
|  | ||||
|     stat_busy "Check if team ($team) is assigned to [$pkgbase]" | ||||
|     api_get "$url" \ | ||||
|         -H 'accept: application/json' \ | ||||
|         -H "Authorization: token ${GIT_TOKEN}" | ||||
|     stat_done | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
							
								
								
									
										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 | ||||
| ) | ||||
|  | ||||
| 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_CI='.artixlinux/Jenkinsfile' | ||||
| @@ -100,6 +118,8 @@ create_repo_db() { | ||||
|  | ||||
|     yq -n '"---"' > "${REPO_DB}" | ||||
|  | ||||
|     yq -P '.team = null' -i "${REPO_DB}" | ||||
|  | ||||
|     yq -P 'with( | ||||
|         .pkgbase; | ||||
|             .name = null | | ||||
| @@ -132,12 +152,36 @@ create_repo_db() { | ||||
|     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() { | ||||
|     local version | ||||
|     local name | ||||
|     local pkgnames | ||||
|     local arches | ||||
|     local pkgbase | ||||
|  | ||||
|     pkgbase="${pkgbase:-${pkgname}}" | ||||
|     version="$(get_full_version)" | ||||
| @@ -273,11 +317,39 @@ update_yaml_move() { | ||||
|             -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() { | ||||
|     if ! yq -r ${REPO_DB} 1>/dev/null 2>/dev/null; then | ||||
|     show_agent | ||||
|     if ! yq -r "${REPO_DB}" 1>/dev/null 2>/dev/null; then | ||||
|         die "${REPO_DB} invalid!" | ||||
|     fi | ||||
|     yq -rP '. | .repos |= with_entries(select(.value.version))' "${REPO_DB}" | ||||
|     yq -rP 'with_entries(select(.key == "team" or .key == "pkgbase"))' "${REPO_DB}" | ||||
|     yq -rP '. | .repos | with_entries(select(.value.version))' "${REPO_DB}" | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,102 +0,0 @@ | ||||
| #!/hint/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| declare -rA REPO_MAP=( | ||||
|     [core-rebuild]=system-goblins | ||||
|     [core-staging]=system-goblins | ||||
|     [core-testing]=system-gremlins | ||||
|     [core]=system | ||||
|     [extra-rebuild]=world-goblins | ||||
|     [extra-staging]=world-goblins | ||||
|     [extra-testing]=world-gremlins | ||||
|     [extra]=world | ||||
|     [multilib-staging]=lib32-goblins | ||||
|     [multilib-testing]=lib32-gremlins | ||||
|     [multilib]=lib32 | ||||
|     [community-staging]=galaxy-goblins | ||||
|     [community-testing]=galaxy-gremlins | ||||
|     [community]=galaxy | ||||
| ) | ||||
|  | ||||
| update_gitignore() { | ||||
|     { | ||||
|     printf '*.service\n' | ||||
|     printf '*.timer\n' | ||||
|     printf '*.socket\n' | ||||
|     } >> .gitignore | ||||
| } | ||||
|  | ||||
| migrate_to_yaml() { | ||||
|     if [[ -f trunk/PKGBUILD ]]; then | ||||
|  | ||||
|         stat_busy "Migrating ${pkgbase} to new layout" | ||||
|         create_repo_db | ||||
|         stat_done | ||||
|         # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|         source "trunk/PKGBUILD" | ||||
|         update_yaml_base | ||||
|  | ||||
|         if [[ -d x86_64 ]]; then | ||||
|             local repos | ||||
|             mapfile -t repos < <(ls x86_64) | ||||
|             for r in "${repos[@]}"; do | ||||
|                 # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|                 source "x86_64/${r}/PKGBUILD" | ||||
|  | ||||
|                 local repo | ||||
|                 local pkgs | ||||
|                 local version | ||||
|                 local pkgfiles | ||||
|  | ||||
|                 mapfile -t pkgfiles < <(print_package_names) | ||||
|  | ||||
|                 pkgs=$(yaml_array "${pkgfiles[@]}") | ||||
|  | ||||
|                 version=$(get_full_version) | ||||
|  | ||||
|                 repo=".repos.${REPO_MAP[$r]}" | ||||
|  | ||||
|                 version="${version}" pkgs="${pkgs}" repo="${repo}" \ | ||||
|                     yq -P 'with( | ||||
|                             eval(strenv(repo)); | ||||
|                                 .version = env(version) | | ||||
|                                 .packages = env(pkgs) )' \ | ||||
|                         -i "${REPO_DB}" | ||||
|  | ||||
|                 if [[ -n ${GIT_TOKEN} ]]; then | ||||
|                     local topic gitname | ||||
|                     gitname=$(get_compliant_name "${pkgbase}") | ||||
|  | ||||
|                     topic="${REPO_MAP[$r]}" | ||||
|                     if ! add_topic "${gitname}" "${topic}"; then | ||||
|                         warning "failed to add topic: ${topic}" | ||||
|                     fi | ||||
|  | ||||
|                     topic="${r}" | ||||
|                     if ! remove_topic "${gitname}" "${topic}"; then | ||||
|                         warning "failed to remove topic: ${topic}" | ||||
|                     fi | ||||
|                 fi | ||||
|  | ||||
|             done | ||||
|             git rm -r x86_64 | ||||
|         fi | ||||
|         cp -r trunk/* ./ | ||||
|  | ||||
|         git rm -r trunk | ||||
|         if [[ -f .artixlinux/agent.yaml ]]; then | ||||
|             git rm .artixlinux/agent.yaml | ||||
|         fi | ||||
|         if [[ -f .gitignore ]]; then | ||||
|             update_gitignore | ||||
|         fi | ||||
|  | ||||
|         if [[ -f Jenkinsfile ]]; then | ||||
|             git mv Jenkinsfile "${REPO_CI}" | ||||
|         fi | ||||
|  | ||||
|         git add . | ||||
|         git commit -m "migrate to new layout" | ||||
|     fi | ||||
| } | ||||
| @@ -31,13 +31,4 @@ find_cached_pkgfile() { | ||||
|  | ||||
| shopt -u extglob | ||||
|  | ||||
| get_pkgbasename() { | ||||
|     local name="$1" | ||||
|     local rm_pkg=${name%.pkg.tar*} | ||||
|     rm_pkg=${rm_pkg%-*} | ||||
|     rm_pkg=${rm_pkg%-*} | ||||
|     rm_pkg=${rm_pkg%-*} | ||||
|     printf "%s\n" "$rm_pkg" | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
| @@ -16,16 +16,18 @@ artixpkg_git_usage() { | ||||
|         clone          Clone a package repository | ||||
|         config         Configure a clone according to artix specs | ||||
|         create         Create a new Gitea package repository | ||||
|         pull           Pull a package repository | ||||
|         push           Push a package repository | ||||
|  | ||||
|     OPTIONS | ||||
|         -h, --help     Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} clone libfoo linux libbar | ||||
|         $ ${COMMAND} clone --maintainer maintainer-mynickname | ||||
|         $ ${COMMAND} config -t libfoo | ||||
|         $ ${COMMAND} config -u libfoo | ||||
|         $ ${COMMAND} create libfoo | ||||
|         $ ${COMMAND} clone --maintainer tux | ||||
|         $ ${COMMAND} config --topic mytopic | ||||
|         $ ${COMMAND} config --maintainer tux | ||||
|         $ ${COMMAND} create -c libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -74,6 +76,14 @@ artixpkg_git() { | ||||
|             artixpkg_git_pull "$@" | ||||
|             exit 0 | ||||
|         ;; | ||||
|         push) | ||||
|             _ARTOOLS_COMMAND+=" $1" | ||||
|             shift | ||||
|             # shellcheck source=src/lib/pkg/git/push.sh | ||||
|             source "${LIBDIR}"/pkg/git/push.sh | ||||
|             artixpkg_git_push "$@" | ||||
|             exit 0 | ||||
|         ;; | ||||
|         -*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|         ;; | ||||
|   | ||||
| @@ -7,6 +7,10 @@ ARTOOLS_INCLUDE_GIT_CLONE_SH=1 | ||||
|  | ||||
| # shellcheck source=src/lib/pkg/git/config.sh | ||||
| source "${LIBDIR}"/pkg/git/config.sh | ||||
| # shellcheck source=src/lib/pkg/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 | ||||
|  | ||||
| @@ -17,18 +21,23 @@ artixpkg_git_clone_usage() { | ||||
|     Usage: ${COMMAND} [OPTIONS] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -m, --maintainer=NAME      Clone all packages of the named maintainer | ||||
|         --protocol https           Clone the repository over https | ||||
|         -t, --topic=NAME           Clone all packages of the named topic | ||||
|         -m, --maintainer NAME      Clone all packages of the named maintainer | ||||
|         -s, --search TOPIC         Clone all packages of the named topic | ||||
|         -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[@]}) | ||||
|         -j, --jobs N               Run up to N jobs in parallel (default: $(nproc)) | ||||
|         --universe                 Clone all existing packages, useful for cache warming | ||||
|         --protocol https           Clone the repository over https | ||||
|         --all                      Clone all existing packages, useful for cache warming | ||||
|         -h, --help                 Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} libfoo linux libbar | ||||
|         $ ${COMMAND} --maintainer maintainer-mynickname | ||||
|         $ ${COMMAND} --topic myopic | ||||
|         $ ${COMMAND} -j 8 --topic myopic | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --search mytopic | ||||
|         $ ${COMMAND} -j 8 --search mytopic | ||||
|         $ ${COMMAND} --agent ${AGENTS[1]} libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -45,7 +54,9 @@ artixpkg_git_clone() { | ||||
|     local CLONE_ALL=0 | ||||
|     local MAINTAINER= | ||||
|     local TOPIC= | ||||
|     local CONFIGURE_OPTIONS=() | ||||
|     local CONFIG_OPTS=() | ||||
|     local AGENT_OPTS=() | ||||
|     local TEAM_OPTS=() | ||||
|     local jobs= | ||||
|     jobs=$(nproc) | ||||
|  | ||||
| @@ -59,7 +70,7 @@ artixpkg_git_clone() { | ||||
|             ;; | ||||
|             --protocol=https) | ||||
|                 GIT_REPO_BASE_URL="${GIT_HTTPS}/" | ||||
|                 CONFIGURE_OPTIONS+=("$1") | ||||
|                 CONFIG_OPTS+=("$1") | ||||
|                 shift | ||||
|             ;; | ||||
|             --protocol) | ||||
| @@ -69,7 +80,7 @@ artixpkg_git_clone() { | ||||
|                 else | ||||
|                     die "unsupported protocol: %s" "$2" | ||||
|                 fi | ||||
|                 CONFIGURE_OPTIONS+=("$1" "$2") | ||||
|                 CONFIG_OPTS+=("$1" "$2") | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             -m|--maintainer) | ||||
| @@ -77,20 +88,22 @@ artixpkg_git_clone() { | ||||
|                 MAINTAINER="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --maintainer=*) | ||||
|                 MAINTAINER="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -t|--topic) | ||||
|             -s|--search) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TOPIC="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --topic=*) | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             -t|--team) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TEAM_OPTS=("--add" "$2") | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --universe) | ||||
|             -a|--agent) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 AGENT_OPTS=("$1" "$2") | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --all) | ||||
|                 CLONE_ALL=1 | ||||
|                 shift | ||||
|             ;; | ||||
| @@ -115,24 +128,18 @@ artixpkg_git_clone() { | ||||
|  | ||||
|     # Query packages of a maintainer | ||||
|     if [[ -n ${MAINTAINER} ]]; then | ||||
|         stat_busy "Query mantainer packages" | ||||
|             local maint | ||||
|             maint="maintainer-${MAINTAINER}" | ||||
|             mapfile -t pkgbases < <(search_topic "${maint}" | yq -P -r '.data | .[].name' | sort) | ||||
|         stat_done | ||||
|         local maint | ||||
|         maint="maintainer-${MAINTAINER}" | ||||
|         mapfile -t pkgbases < <(search_topic "${maint}" | yq -P -r '.data | .[].name' | sort) | ||||
|     fi | ||||
|  | ||||
|     if [[ -n ${TOPIC} ]]; then | ||||
|         stat_busy "Query topic packages" | ||||
|             mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort) | ||||
|         stat_done | ||||
|         mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort) | ||||
|     fi | ||||
|  | ||||
|     # Query all released packages | ||||
|     if (( CLONE_ALL )); then | ||||
|         stat_busy "Query all packages" | ||||
|             mapfile -t pkgbases < <(list_all_repos | yq -P -r '.[] | .name' | sort) | ||||
|         stat_done | ||||
|         mapfile -t pkgbases < <(list_all_repos | yq -P -r '.[] | .name' | sort) | ||||
|     fi | ||||
|  | ||||
|     # parallelization | ||||
| @@ -161,6 +168,8 @@ artixpkg_git_clone() { | ||||
|             warning "Skip cloning ${pkgbase}: Directory exists" | ||||
|         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 | ||||
| } | ||||
|   | ||||
| @@ -5,40 +5,20 @@ | ||||
| [[ -z ${ARTOOLS_INCLUDE_GIT_CONFIG_SH:-} ]] || return 0 | ||||
| ARTOOLS_INCLUDE_GIT_CONFIG_SH=1 | ||||
|  | ||||
| # shellcheck source=src/lib/pkg/db/db.sh | ||||
| source "${LIBDIR}"/pkg/db/db.sh | ||||
| # shellcheck source=src/lib/pkg/db/migrate.sh | ||||
| source "${LIBDIR}"/pkg/db/migrate.sh | ||||
|  | ||||
| set -e | ||||
|  | ||||
|  | ||||
| commit_ci(){ | ||||
|     printf "@Library('artix-ci') import org.artixlinux.RepoPackage\n" > "${REPO_CI}" | ||||
|     { | ||||
|     printf '\n' | ||||
|     printf 'PackagePipeline(new RepoPackage(this))\n' | ||||
|     } >> "${REPO_CI}" | ||||
|  | ||||
|     git add "${REPO_CI}" | ||||
|     git commit -m "initial ci commit" | ||||
| } | ||||
|  | ||||
| artixpkg_git_config_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
|     Usage: ${COMMAND} [OPTIONS] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -m, --maintainer       Set the maintainer topic via gitea api | ||||
|         -u, --upstream         Add upstream arch remote | ||||
|         --protocol https       Configure remote url to use https | ||||
|         -j, --jobs N           Run up to N jobs in parallel (default: $(nproc)) | ||||
|         -h, --help             Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} -t libfoo | ||||
|         $ ${COMMAND} -u libfoo | ||||
|         $ ${COMMAND} * | ||||
| _EOF_ | ||||
| } | ||||
| @@ -101,11 +81,8 @@ artixpkg_git_config() { | ||||
|     jobs=$(nproc) | ||||
|     local paths=() | ||||
|  | ||||
|     local SET_TOPIC=0 | ||||
|     local UPSTREAM=0 | ||||
|  | ||||
|     # variables | ||||
|     local -r command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     local path realpath pkgbase | ||||
|     local PACKAGER GPGKEY packager_name packager_email | ||||
|  | ||||
| @@ -115,14 +92,6 @@ artixpkg_git_config() { | ||||
|             artixpkg_git_config_usage | ||||
|             exit 0 | ||||
|         ;; | ||||
|         -m|--maintainer) | ||||
|             SET_TOPIC=1 | ||||
|             shift | ||||
|         ;; | ||||
|         -u|--upstream) | ||||
|             UPSTREAM=1 | ||||
|             shift | ||||
|         ;; | ||||
|         --protocol=https) | ||||
|             proto_force=1 | ||||
|             shift | ||||
| @@ -167,7 +136,7 @@ artixpkg_git_config() { | ||||
|  | ||||
|     # Load makepkg.conf variables to be available for packager identity | ||||
|     msg "Collecting packager identity from makepkg.conf" | ||||
|     # shellcheck disable=2119 | ||||
|     # shellcheck source=config/makepkg/x86_64.conf | ||||
|     load_makepkg_config | ||||
|     if [[ -n ${PACKAGER} ]]; then | ||||
|         if ! packager_name=$(get_packager_name "${PACKAGER}") || \ | ||||
| @@ -243,55 +212,6 @@ artixpkg_git_config() { | ||||
|                 git config user.signingKey "${GPGKEY}" | ||||
|             fi | ||||
|  | ||||
|             # topics meta | ||||
|             if (( SET_TOPIC )); then | ||||
|                 if [[ -n ${GIT_TOKEN} ]]; then | ||||
|                     local topic gitname | ||||
|                     topic="maintainer-${packager_name}" | ||||
|                     gitname=$(get_compliant_name "${pkgbase}") | ||||
|                     if ! add_topic "${gitname}" "${topic}"; then | ||||
|                         warning "failed to set the maintainer topic: ${topic}" | ||||
|                     fi | ||||
|                 fi | ||||
|             fi | ||||
|             if (( UPSTREAM )); then | ||||
|                 local remote_url | ||||
|                 remote_url="${GIT_UPSTREAM_URL}/${pkgbase}".git | ||||
|                 if ! git remote add upstream "${remote_url}"; then | ||||
|                     warning "failed to set the upstream: ${remote_url}" | ||||
|                 fi | ||||
|             fi | ||||
|  | ||||
|             migrate_to_yaml | ||||
|  | ||||
|             if [[ -f Jenkinsfile ]]; then | ||||
|                 git mv Jenkinsfile "${REPO_CI}" | ||||
|                 git commit -m "move jenkinsfile" | ||||
|             fi | ||||
|  | ||||
|             if [[ ! -f ${REPO_CI} ]]; then | ||||
|                 msg "Adding ci support ..." | ||||
|                 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 | ||||
| } | ||||
|   | ||||
| @@ -9,6 +9,10 @@ ARTOOLS_INCLUDE_GIT_CREATE_SH=1 | ||||
| source "${LIBDIR}"/pkg/git/clone.sh | ||||
| # shellcheck source=src/lib/pkg/git/config.sh | ||||
| source "${LIBDIR}"/pkg/git/config.sh | ||||
| # shellcheck source=src/lib/pkg/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 | ||||
|  | ||||
| @@ -20,7 +24,10 @@ artixpkg_git_create_usage() { | ||||
|  | ||||
|     OPTIONS | ||||
|         -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 | ||||
|  | ||||
|     EXAMPLES | ||||
| @@ -32,11 +39,12 @@ artixpkg_git_create() { | ||||
|     # options | ||||
|     local pkgbases=() | ||||
|     local pkgbase | ||||
|     local clone=0 | ||||
|     local config=0 | ||||
|     local TEAM='world' | ||||
|     local CLONE=0 | ||||
|     local CONFIG=0 | ||||
|  | ||||
|     local AGENT_OPTS=("--agent" "${AGENTS[0]}") | ||||
|     local TEAM_OPTS=("--team" "${ARTIX_TEAMS[1]}") | ||||
|  | ||||
|     local TEAMS=(system world lib32) | ||||
|     # variables | ||||
|     local path | ||||
|  | ||||
| @@ -46,30 +54,32 @@ artixpkg_git_create() { | ||||
|             artixpkg_git_create_usage | ||||
|             exit 0 | ||||
|         ;; | ||||
|         -a|--agent) | ||||
|             (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|             AGENT_OPTS=("$1" "$2") | ||||
|             shift 2 | ||||
|         ;; | ||||
|         -c|--clone) | ||||
|             clone=1 | ||||
|             CLONE=1 | ||||
|             shift | ||||
|         ;; | ||||
|         -t|--team) | ||||
|             (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|             TEAM="$2" | ||||
|             TEAM_OPTS=("$1" "$2") | ||||
|             shift 2 | ||||
|         ;; | ||||
|         --team=*) | ||||
|             TEAM="${1#*=}" | ||||
|             shift | ||||
|         ;; | ||||
|         -*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|         ;; | ||||
|         *) | ||||
|             pkgbases=("$@") | ||||
|             break | ||||
|         ;; | ||||
|         esac | ||||
|     done | ||||
|  | ||||
|     if ! in_array "${TEAM}" "${TEAMS[@]}"; then | ||||
|     pkgbases=("$@") | ||||
|  | ||||
|     if ! in_array "${TEAM_OPTS[1]}" "${ARTIX_TEAMS[@]}"; then | ||||
|         die "${TEAM} does not exist!" | ||||
|     fi | ||||
|  | ||||
| @@ -79,38 +89,41 @@ artixpkg_git_create() { | ||||
|             if ! path=$(realpath -e .); then | ||||
|                 die "failed to read path from current directory" | ||||
|             fi | ||||
|         pkgbases=("$(basename "${path}")") | ||||
|         clone=0 | ||||
|         config=1 | ||||
|     else | ||||
|         artixpkg_git_create_usage | ||||
|         exit 1 | ||||
|             pkgbases=("$(basename "${path}")") | ||||
|             CLONE=0 | ||||
|             CONFIG=1 | ||||
|         else | ||||
|             artixpkg_git_create_usage | ||||
|             exit 1 | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     # create | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
|  | ||||
|         local gitname | ||||
|         gitname=$(get_compliant_name "${pkgbase}") | ||||
|  | ||||
|         if [[ -n ${GIT_TOKEN} ]]; then | ||||
|             if ! create_repo "${gitname}" >/dev/null; then | ||||
|                 die "failed to create project: ${pkgbase}" | ||||
|                 die "failed to create repository: ${pkgbase}" | ||||
|             else | ||||
|                 msg_success "Successfully created ${pkgbase}" | ||||
|             fi | ||||
|             if ! add_team_to_repo "${gitname}" "${TEAM}" >/dev/null; then | ||||
|                 warning "failed to assign team: ${TEAM}" | ||||
|             fi | ||||
|             msg_success "Successfully created ${pkgbase}" | ||||
|         fi | ||||
|         if (( clone )); then | ||||
|             artixpkg_git_clone "${pkgbase}" | ||||
|         elif (( config )); then | ||||
|             artixpkg_git_config | ||||
|  | ||||
|         if (( CLONE )); then | ||||
|             artixpkg_git_clone "${AGENT_OPTS[@]}" "${TEAM_OPTS[@]}" "${pkgbase}" | ||||
|         elif (( CONFIG )); then | ||||
|             artixpkg_git_config "${pkgbase}" | ||||
|             artixpkg_ci_config "${AGENT_OPTS[@]}" "${pkgbase}" | ||||
|             artixpkg_admin_team "${TEAM_OPTS[@]}" "${pkgbase}" | ||||
|         fi | ||||
|  | ||||
|     done | ||||
|  | ||||
|     # some convenience hints if not in auto clone/config mode | ||||
|     if (( ! clone )) && (( ! config )); then | ||||
|     if (( ! CLONE )) && (( ! CONFIG )); then | ||||
|         cat <<- _EOF_ | ||||
|  | ||||
|         For new clones: | ||||
|   | ||||
| @@ -5,9 +5,6 @@ | ||||
| [[ -z ${ARTOOLS_INCLUDE_GIT_PULL_SH:-} ]] || return 0 | ||||
| ARTOOLS_INCLUDE_GIT_PULL_SH=1 | ||||
|  | ||||
| # shellcheck source=src/lib/pkg/git/config.sh | ||||
| source "${LIBDIR}"/pkg/git/config.sh | ||||
|  | ||||
| set -e | ||||
|  | ||||
|  | ||||
| @@ -17,17 +14,17 @@ artixpkg_git_pull_usage() { | ||||
|     Usage: ${COMMAND} [OPTIONS] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -m, --maintainer=NAME      Pull all packages of the named maintainer | ||||
|         -t, --topic=NAME           Pull all packages of the named topic | ||||
|         -m, --maintainer NAME      Pull all packages of the named maintainer | ||||
|         -t, --topic NAME           Pull all packages of the named topic | ||||
|         -j, --jobs N               Run up to N jobs in parallel (default: $(nproc)) | ||||
|         --universe                 Pull all existing packages | ||||
|         --all                      Pull all existing packages | ||||
|         -h, --help                 Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} libfoo linux libbar | ||||
|         $ ${COMMAND} --maintainer maintainer-mynickname | ||||
|         $ ${COMMAND} --topic myopic | ||||
|         $ ${COMMAND} -j 8 --topic myopic | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --topic mytopic | ||||
|         $ ${COMMAND} -j 8 --topic mytopic | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -60,20 +57,12 @@ artixpkg_git_pull() { | ||||
|                 MAINTAINER="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --maintainer=*) | ||||
|                 MAINTAINER="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -t|--topic) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TOPIC="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --topic=*) | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             --universe) | ||||
|             --all) | ||||
|                 PULL_ALL=1 | ||||
|                 shift | ||||
|             ;; | ||||
| @@ -98,24 +87,18 @@ artixpkg_git_pull() { | ||||
|  | ||||
|     # Query packages of a maintainer | ||||
|     if [[ -n ${MAINTAINER} ]]; then | ||||
|         stat_busy "Query mantainer packages" | ||||
|             local maint | ||||
|             maint="maintainer-${MAINTAINER}" | ||||
|             mapfile -t pkgbases < <(search_topic "${maint}" | yq -P -r '.data | .[].name' | sort) | ||||
|         stat_done | ||||
|         local maint | ||||
|         maint="maintainer-${MAINTAINER}" | ||||
|         mapfile -t pkgbases < <(search_topic "${maint}" | yq -P -r '.data | .[].name' | sort) | ||||
|     fi | ||||
|  | ||||
|     if [[ -n ${TOPIC} ]]; then | ||||
|         stat_busy "Query topic packages" | ||||
|             mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort) | ||||
|         stat_done | ||||
|         mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort) | ||||
|     fi | ||||
|  | ||||
|     # Query all released packages | ||||
|     if (( PULL_ALL )); then | ||||
|         stat_busy "Query all packages" | ||||
|             mapfile -t pkgbases < <(list_all_repos | yq -P -r '.[] | .name' | sort) | ||||
|         stat_done | ||||
|         mapfile -t pkgbases < <(list_all_repos | yq -P -r '.[] | .name' | sort) | ||||
|     fi | ||||
|  | ||||
|     # parallelization | ||||
| @@ -133,7 +116,7 @@ artixpkg_git_pull() { | ||||
|  | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
|         if [[ -d ${pkgbase} ]]; then | ||||
|             ( cd ${pkgbase} || return | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 msg "Pulling ${pkgbase} ..." | ||||
|                 if ! git pull origin master; then | ||||
|   | ||||
							
								
								
									
										120
									
								
								src/lib/pkg/git/push.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								src/lib/pkg/git/push.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,120 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| [[ -z ${ARTOOLS_INCLUDE_GIT_PUSH_SH:-} ]] || return 0 | ||||
| ARTOOLS_INCLUDE_GIT_PUSH_SH=1 | ||||
|  | ||||
| set -e | ||||
|  | ||||
|  | ||||
| artixpkg_git_push_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
|     Usage: ${COMMAND} [OPTIONS] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -m, --maintainer NAME      Push all packages of the named maintainer | ||||
|         -t, --topic NAME           Push all packages of the named topic | ||||
|         -j, --jobs N               Run up to N jobs in parallel (default: $(nproc)) | ||||
|         -h, --help                 Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} libfoo linux libbar | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --topic mytopic | ||||
|         $ ${COMMAND} -j 8 --topic mytopic | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| artixpkg_git_push() { | ||||
|     if (( $# < 1 )); then | ||||
|         artixpkg_git_push_usage | ||||
|         exit 0 | ||||
|     fi | ||||
|  | ||||
|     # options | ||||
|     local MAINTAINER= | ||||
|     local TOPIC= | ||||
|     local CONFIGURE_OPTIONS=() | ||||
|     local jobs= | ||||
|     jobs=$(nproc) | ||||
|  | ||||
|     local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
|             -h|--help) | ||||
|                 artixpkg_git_push_usage | ||||
|                 exit 0 | ||||
|             ;; | ||||
|             -m|--maintainer) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 MAINTAINER="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             -t|--topic) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TOPIC="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             -j|--jobs) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 jobs=$2 | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --) | ||||
|                 shift | ||||
|                 break | ||||
|             ;; | ||||
|             -*) | ||||
|                 die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
|             *) | ||||
|                 pkgbases=("$@") | ||||
|                 break | ||||
|             ;; | ||||
|         esac | ||||
|     done | ||||
|  | ||||
|     # Query packages of a maintainer | ||||
|     if [[ -n ${MAINTAINER} ]]; then | ||||
|         local maint | ||||
|         maint="maintainer-${MAINTAINER}" | ||||
|         mapfile -t pkgbases < <(search_topic "${maint}" | yq -P -r '.data | .[].name' | sort) | ||||
|     fi | ||||
|  | ||||
|     if [[ -n ${TOPIC} ]]; then | ||||
|         mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort) | ||||
|     fi | ||||
|  | ||||
|     # parallelization | ||||
|     if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then | ||||
|         # force colors in parallel if parent process is colorized | ||||
|         if [[ -n ${BOLD} ]]; then | ||||
|             export ARTOOLS_COLOR=always | ||||
|         fi | ||||
|         if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${pkgbases[@]}"; then | ||||
|             die 'Failed to push some packages, please check the output' | ||||
|             exit 1 | ||||
|         fi | ||||
|         exit 0 | ||||
|     fi | ||||
|  | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
|         if [[ -d ${pkgbase} ]]; then | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 msg "Pushing ${pkgbase} ..." | ||||
|                 if ! git push origin master; then | ||||
|                     die 'failed to push %s' "${pkgbase}" | ||||
|                 fi | ||||
|  | ||||
|             ) | ||||
|         else | ||||
|             warning "Skip pushing ${pkgbase}: Directory does not exist" | ||||
|         fi | ||||
|     done | ||||
| } | ||||
| @@ -11,6 +11,20 @@ source "${LIBDIR}"/pkg/db/db.sh | ||||
| set -e | ||||
|  | ||||
|  | ||||
| has_remote_changes() { | ||||
|     local status | ||||
|     msg "Checking for remote changes ..." | ||||
|     git fetch origin &>/dev/null | ||||
|     status=$(git status -sb --porcelain) | ||||
|     if [[ "$status" == *behind* ]]; then | ||||
|         msg2 "changes: yes" | ||||
|         error "Remote changes detected! Please pull (%s)" "${pkgbase}" | ||||
|         return 0 | ||||
|     fi | ||||
|     msg2 "changes: no" | ||||
|     return 1 | ||||
| } | ||||
|  | ||||
| artixpkg_repo_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
|   | ||||
| @@ -8,20 +8,47 @@ ARTOOLS_INCLUDE_REPO_ADD_SH=1 | ||||
| set -e | ||||
|  | ||||
|  | ||||
| check_pkgbuild_validity() { | ||||
|     # skip when there are no sources available | ||||
|     if (( ! ${#source[@]} )); then | ||||
|         return | ||||
|     fi | ||||
|  | ||||
|     # validate sources hash algo is at least > sha1 | ||||
|     local bad_algos=("cksums" "md5sums" "sha1sums") | ||||
|     local good_hash_algo=false | ||||
|  | ||||
|     # from makepkg libmakepkg/util/schema.sh | ||||
|     for integ in "${known_hash_algos[@]}"; do | ||||
|         local sumname="${integ}sums" | ||||
|         if [[ -n ${!sumname} ]] && ! in_array "${sumname}" "${bad_algos[@]}"; then | ||||
|             good_hash_algo=true | ||||
|             break | ||||
|         fi | ||||
|     done | ||||
|  | ||||
|     if ! $good_hash_algo; then | ||||
|         die "PKGBUILD lacks a secure cryptographic checksum, insecure algorithms: ${bad_algos[*]}" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| artixpkg_repo_add_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
|     Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -p, --push             Push pkgbase | ||||
|         -r, --rebuild          Triggers a rebuild | ||||
|         -n, --nocheck          Disable the check function | ||||
|         -h, --help             Show this help text | ||||
|         -m, --manual            Disable auto repo | ||||
|                                 Possible auto values: $(yaml_array ${ARTIX_DB_MAP[@]}) | ||||
|         -p, --push              Push pkgbase | ||||
|         -r, --rebuild           Triggers a rebuild | ||||
|         -n, --nocheck           Disable the check function | ||||
|         -h, --help              Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} world-gremlins libfoo | ||||
|         $ ${COMMAND} -p world-gremlins libfoo | ||||
|         $ ${COMMAND} ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} --push ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} --auto --push ${ARTIX_DB_MAP[2]} libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -40,6 +67,7 @@ artixpkg_repo_add() { | ||||
|     local REBUILD=0 | ||||
|     local NOCHECK=0 | ||||
|     local ADD=1 | ||||
|     local AUTO=1 | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
| @@ -47,6 +75,10 @@ artixpkg_repo_add() { | ||||
|                 artixpkg_repo_add_usage | ||||
|                 exit 0 | ||||
|             ;; | ||||
|             -m|--manual) | ||||
|                 AUTO=0 | ||||
|                 shift | ||||
|             ;; | ||||
|             -p|--push) | ||||
|                 PUSH=1 | ||||
|                 shift | ||||
| @@ -72,8 +104,14 @@ artixpkg_repo_add() { | ||||
|     shift | ||||
|     pkgbases+=("$@") | ||||
|  | ||||
|     if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then | ||||
|         die "${DEST} does not exist!" | ||||
|     if (( AUTO )); then | ||||
|         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 | ||||
|  | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
| @@ -86,45 +124,78 @@ artixpkg_repo_add() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 if [[ ! -f PKGBUILD ]]; then | ||||
|                     die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                 fi | ||||
|                 if ! has_remote_changes; then | ||||
|  | ||||
|                 # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|                 source PKGBUILD | ||||
|  | ||||
|                 update_yaml_base | ||||
|                 update_yaml_add "${REBUILD}" "${ADD}" "${NOCHECK}" "${DEST}" | ||||
|  | ||||
|                 local commit_msg | ||||
|                 commit_msg=$(get_commit_msg 'add' "${DEST}") | ||||
|  | ||||
|                 if [[ -n $(git status --porcelain --untracked-files=no) ]]; then | ||||
|  | ||||
|                     stat_busy 'Staging files' | ||||
|                     for f in $(git ls-files --others); do | ||||
|                         git add "$f" | ||||
|                     done | ||||
|                     for f in $(git ls-files --modified); do | ||||
|                         git add "$f" | ||||
|                     done | ||||
|                     for f in $(git ls-files --deleted); do | ||||
|                         git rm "$f" | ||||
|                     done | ||||
|                     stat_done | ||||
|  | ||||
|                     msg 'Commit' | ||||
|                     git commit -m "${commit_msg}" | ||||
|  | ||||
|                     if (( PUSH )); then | ||||
|                         msg "Push (${pkgbase})" | ||||
|                         git push origin master | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
|  | ||||
|                     msg "Querying ${pkgbase} ..." | ||||
|                     if ! show_db; then | ||||
|                         warning "Could not query ${REPO_DB}" | ||||
|                     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|                     source PKGBUILD | ||||
|  | ||||
|                     check_pkgbuild_validity | ||||
|  | ||||
|                     manage-pkgbuild-keys --export | ||||
|  | ||||
|                     update_yaml_base | ||||
|  | ||||
|                     local auto | ||||
|                     auto=$(auto_detect) | ||||
|  | ||||
|                     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 | ||||
|  | ||||
|                     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 | ||||
|   | ||||
| @@ -10,46 +10,36 @@ set -e | ||||
|  | ||||
| patch_pkgbase(){ | ||||
|     local name="$1" | ||||
|     local pkgbuild | ||||
|     pkgbuild=PKGBUILD | ||||
|  | ||||
|     sed -e 's|arch-meson|artix-meson|' -i "${pkgbuild}" | ||||
|  | ||||
|     case "${name}" in | ||||
|         glibc) | ||||
|             msg "Patching %s" "${name}" | ||||
|             sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \ | ||||
|                 -e '/nscd.service/d' \ | ||||
|                 -i "${pkgbuild}" | ||||
|         ;; | ||||
|         linux|linux-lts|linux-zen|linux-hardened|linux-rt|linux-rt-lts) | ||||
|             msg "Patching %s" "${name}" | ||||
|             sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i "${pkgbuild}" | ||||
|         linux|linux-lts|linux-zen|linux-hardened|linux-rt*) | ||||
|             sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i PKGBUILD | ||||
|             sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \ | ||||
|                 -i config | ||||
|         ;; | ||||
|         gstreamer|gst-plugins-*|licenses) | ||||
|             msg "Patching %s" "${name}" | ||||
|         *) | ||||
|             sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \ | ||||
|                 -e 's|(Arch Linux)|(Artix Linux)|' \ | ||||
|                 -i "${pkgbuild}" | ||||
|                 -e 's|arch-meson|artix-meson|' \ | ||||
|                 -i PKGBUILD | ||||
|         ;; | ||||
|     esac | ||||
|     git --no-pager diff PKGBUILD | ||||
| } | ||||
|  | ||||
|  | ||||
| artixpkg_repo_import_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
|     Usage: ${COMMAND} [OPTIONS] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         --switch TAG       Switch the current workspace to a specified version tag | ||||
|         --tag TAG          Switch the current workspace to a specified version tag | ||||
|         --del              Delete files before rsync import | ||||
|         -h, --help         Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} libfoo | ||||
|         $ ${COMMAND} libfoo --switch TAG | ||||
|         $ ${COMMAND} --tag TAG libfoo | ||||
|         $ ${COMMAND} --tag TAG --del libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -64,25 +54,45 @@ artixpkg_repo_import() { | ||||
|     local pkgbase | ||||
|     local TAG | ||||
|     local rsync_args=() | ||||
|     rsync_args+=(-aWxvci --progress --delete-before --no-R --no-implied-dirs) | ||||
|     rsync_args+=(--exclude '.git' --exclude '.gitignore' --exclude 'README.md') | ||||
|     rsync_args+=( | ||||
|         -axcihW | ||||
|         --no-R | ||||
|         --no-implied-dirs | ||||
|         --exclude '.artixlinux' | ||||
|         --exclude '.git' | ||||
|         --exclude '.gitignore' | ||||
|         --exclude 'README.md' | ||||
|         --exclude '*.service' | ||||
|         --exclude '.SRCINFO' | ||||
|         --exclude '*.socket' | ||||
|         --exclude '*.timer' | ||||
|     ) | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
|         --switch=*) | ||||
|             TAG="${1#*=}" | ||||
|             shift | ||||
|         ;; | ||||
|         -h|--help) | ||||
|             artixpkg_repo_import_usage | ||||
|             exit 0 | ||||
|         ;; | ||||
|         -*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|         ;; | ||||
|         *) | ||||
|             break | ||||
|         ;; | ||||
|             --tag) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TAG="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --tag=*) | ||||
|                 TAG="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             --del) | ||||
|                 rsync_args+=(--delete-before) | ||||
|                 shift | ||||
|             ;; | ||||
|             -h|--help) | ||||
|                 artixpkg_repo_import_usage | ||||
|                 exit 0 | ||||
|             ;; | ||||
|             -*) | ||||
|                 die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
|             *) | ||||
|                 break | ||||
|             ;; | ||||
|         esac | ||||
|     done | ||||
|  | ||||
| @@ -104,9 +114,8 @@ artixpkg_repo_import() { | ||||
|                 fi | ||||
|                 stat_done | ||||
|  | ||||
|                 stat_busy "Fetching upstream tags" | ||||
|                 msg2 "Fetching upstream tags" | ||||
|                 git fetch --tags upstream main | ||||
|                 stat_done | ||||
|  | ||||
|                 local latest version | ||||
|                 latest=$(git describe --tags FETCH_HEAD) | ||||
| @@ -115,21 +124,26 @@ artixpkg_repo_import() { | ||||
|                     version="${TAG}" | ||||
|                 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 | ||||
|                 local temp | ||||
|                 temp=$(mktemp -d --tmpdir "${pkgbase}.XXXXXXXXXX") | ||||
|                     git checkout "${version}" -b "${version}" &>/dev/null | ||||
|                     local temp | ||||
|                     temp=$(mktemp -d --tmpdir "${pkgbase}.XXXXXXXXXX") | ||||
|  | ||||
|                 rsync "${rsync_args[@]}" "$(pwd)"/ "${temp}"/ &>/dev/null | ||||
|                 git checkout master &>/dev/null | ||||
|                 git branch -D "${version}" &>/dev/null | ||||
|                     rsync "${rsync_args[@]}" "$(pwd)"/ "${temp}"/ &>/dev/null | ||||
|                     git checkout master &>/dev/null | ||||
|                     git branch -D "${version}" &>/dev/null | ||||
|  | ||||
|                 rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ &>/dev/null | ||||
|                     msg "Importing upstream changeset for ${version}" | ||||
|                     rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ #&>/dev/null | ||||
|  | ||||
|                 patch_pkgbase "${pkgbase}" | ||||
|  | ||||
|                 stat_done | ||||
|                     msg2 "Patching ${pkgbase} ..." | ||||
|                     patch_pkgbase "${pkgbase}" | ||||
|                 fi | ||||
|             ) | ||||
|         fi | ||||
|  | ||||
|   | ||||
| @@ -14,12 +14,15 @@ artixpkg_repo_move_usage() { | ||||
|     Usage: ${COMMAND} [OPTIONS] [SOURCE_REPO] [DEST_REPO] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -p, --push         Push pkgbase | ||||
|         -h, --help         Show this help text | ||||
|         -m, --manual            Disable auto repo | ||||
|                                 Possible auto values: $(yaml_array ${ARTIX_DB_MAP[@]}) | ||||
|         -p, --push              Push pkgbase | ||||
|         -h, --help              Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} world-gremlins world libfoo | ||||
|         $ ${COMMAND} -p world-gremlins world libfoo | ||||
|         $ ${COMMAND} ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo | ||||
|         $ ${COMMAND} --push ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo | ||||
|         $ ${COMMAND} --auto --push ${ARTIX_DB_MAP[1]} ${ARTIX_DB_MAP[2]} libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -34,6 +37,7 @@ artixpkg_repo_move() { | ||||
|     local pkgbase | ||||
|  | ||||
|     local PUSH=0 | ||||
|     local AUTO=1 | ||||
|  | ||||
|     local DEST | ||||
|     local SRC | ||||
| @@ -44,6 +48,10 @@ artixpkg_repo_move() { | ||||
|                 artixpkg_repo_move_usage | ||||
|                 exit 0 | ||||
|             ;; | ||||
|             -m|--manual) | ||||
|                 AUTO=0 | ||||
|                 shift | ||||
|             ;; | ||||
|             -p|--push) | ||||
|                 PUSH=1 | ||||
|                 shift | ||||
| @@ -61,11 +69,20 @@ artixpkg_repo_move() { | ||||
|     DEST="$2" | ||||
|     shift 2 | ||||
|  | ||||
|     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!" | ||||
|     if (( AUTO )); then | ||||
|         if ! in_array "${SRC}" "${ARTIX_DB_MAP[@]}"; then | ||||
|             die "${SRC} does not exist!" | ||||
|         fi | ||||
|         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 | ||||
|  | ||||
|     pkgbases+=("$@") | ||||
| @@ -80,38 +97,127 @@ artixpkg_repo_move() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 if [[ ! -f PKGBUILD ]]; then | ||||
|                     die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                 fi | ||||
|                 if ! has_remote_changes; then | ||||
|  | ||||
|                 local commit_msg | ||||
|                 commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}") | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         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' | ||||
|                     for f in $(git ls-files --modified); do | ||||
|                         if [[ "$f" == "${REPO_DB}" ]]; then | ||||
|                             git add "$f" | ||||
|                     if (( AUTO )); then | ||||
|                         if [[ "${SRC}" == "${ARTIX_DB_MAP[2]}" ]]; then | ||||
|                             SRC="${auto}" | ||||
|                         else | ||||
|                             SRC="${auto}-${SRC}" | ||||
|                         fi | ||||
|                     done | ||||
|                     stat_done | ||||
|  | ||||
|                     msg 'Commit' | ||||
|                     git commit -m "${commit_msg}" | ||||
|  | ||||
|                     if (( PUSH )); then | ||||
|                         msg "Push (${pkgbase})" | ||||
|                         git push origin master | ||||
|                         if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then | ||||
|                             DEST="${auto}" | ||||
|                         else | ||||
|                             DEST="${auto}-${DEST}" | ||||
|                         fi | ||||
|                     fi | ||||
|  | ||||
|                     msg "Querying ${pkgbase} ..." | ||||
|                     if ! show_db; then | ||||
|                         warning "Could not query ${REPO_DB}" | ||||
|                     local commit_msg src_version | ||||
|                     commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}") | ||||
|  | ||||
|                     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 | ||||
|  | ||||
|   | ||||
| @@ -14,12 +14,15 @@ artixpkg_repo_remove_usage() { | ||||
|     Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -p, --push         Push pkgbase | ||||
|         -h, --help         Show this help text | ||||
|         -m, --manual            Disable auto repo | ||||
|                                 Possible auto values: $(yaml_array ${ARTIX_DB_MAP[@]}) | ||||
|         -p, --push              Push pkgbase | ||||
|         -h, --help              Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} world-gremlins libfoo | ||||
|         $ ${COMMAND} -p world-gremlins libfoo | ||||
|         $ ${COMMAND} ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} --push ${ARTIX_DB[4]} libfoo | ||||
|         $ ${COMMAND} --auto --push ${ARTIX_DB_MAP[2]} libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -34,6 +37,7 @@ artixpkg_repo_remove() { | ||||
|     local pkgbase | ||||
|  | ||||
|     local PUSH=0 | ||||
|     local AUTO=1 | ||||
|     local DEST='' | ||||
|  | ||||
|     while (( $# )); do | ||||
| @@ -42,6 +46,10 @@ artixpkg_repo_remove() { | ||||
|                 artixpkg_repo_remove_usage | ||||
|                 exit 0 | ||||
|             ;; | ||||
|             -m|--manual) | ||||
|                 AUTO=0 | ||||
|                 shift | ||||
|             ;; | ||||
|             -p|--push) | ||||
|                 PUSH=1 | ||||
|                 shift | ||||
| @@ -59,8 +67,14 @@ artixpkg_repo_remove() { | ||||
|     shift | ||||
|     pkgbases=("$@") | ||||
|  | ||||
|     if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then | ||||
|         die "${DEST} does not exist!" | ||||
|     if (( AUTO )); then | ||||
|         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 | ||||
|  | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
| @@ -73,36 +87,57 @@ artixpkg_repo_remove() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 if [[ ! -f PKGBUILD ]]; then | ||||
|                     die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                 fi | ||||
|                 if ! has_remote_changes; then | ||||
|  | ||||
|                 local commit_msg | ||||
|                 commit_msg=$(get_commit_msg 'remove' "${DEST}") | ||||
|  | ||||
|                 update_yaml_remove "${DEST}" | ||||
|  | ||||
|                 if [[ -n $(git status --porcelain --untracked-files=no) ]]; then | ||||
|  | ||||
|                     stat_busy 'Staging files' | ||||
|                     for f in $(git ls-files --modified); do | ||||
|                         if [[ "$f" == "${REPO_DB}" ]]; then | ||||
|                             git add "$f" | ||||
|                         fi | ||||
|                     done | ||||
|                     stat_done | ||||
|  | ||||
|                     msg 'Commit' | ||||
|                     git commit -m "${commit_msg}" | ||||
|  | ||||
|                     if (( PUSH )); then | ||||
|                         msg "Push (${pkgbase})" | ||||
|                         git push origin master | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
|  | ||||
|                     msg "Querying ${pkgbase} ..." | ||||
|                     if ! show_db; then | ||||
|                         warning "Could not query ${REPO_DB}" | ||||
|                     local auto | ||||
|                     auto=$(auto_detect) | ||||
|  | ||||
|                     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 | ||||
|   | ||||
| @@ -8,18 +8,6 @@ ARTOOLS_INCLUDE_REPO_SHOW_SH=1 | ||||
| set -e | ||||
|  | ||||
|  | ||||
| has_changeset(){ | ||||
|     git fetch origin &>/dev/null | ||||
|  | ||||
|     if [[ $(git rev-parse HEAD) != $(git rev-parse @{u}) ]]; then | ||||
|         msg2 "changes: yes" | ||||
|         git status -sb | ||||
|         return 0 | ||||
|     fi | ||||
|     msg2 "changes: no" | ||||
|     return 1 | ||||
| } | ||||
|  | ||||
| artixpkg_repo_show_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
| @@ -84,28 +72,25 @@ artixpkg_repo_show() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 msg "Checking origin for changes" | ||||
|                 if has_changeset; then | ||||
|                     warning "Remote changes detected! Please update (%s)" "${pkgbase}" | ||||
|                 fi | ||||
|                 if ! has_remote_changes; then | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
|  | ||||
|                 if [[ ! -f PKGBUILD ]]; then | ||||
|                     die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                 fi | ||||
|                     msg "Querying ${pkgbase} ..." | ||||
|                     if ! show_db; then | ||||
|                         warning "Could not query ${REPO_DB}" | ||||
|                     fi | ||||
|  | ||||
|                 msg "Querying ${pkgbase} ..." | ||||
|                 if ! show_db; then | ||||
|                     warning "Could not query ${REPO_DB}" | ||||
|                 fi | ||||
|                     if (( SRC_BASE )); then | ||||
|                         msg "Showing srcinfo base ..." | ||||
|                         show_srcinfo_base | ||||
|                     fi | ||||
|  | ||||
|                 if (( SRC_BASE )); then | ||||
|                     msg "Showing srcinfo base ..." | ||||
|                     show_srcinfo_base | ||||
|                 fi | ||||
|  | ||||
|                 if (( SRC_PKGS )); then | ||||
|                     msg "Showing srcinfo pkgs ..." | ||||
|                     show_srcinfo_pkgs | ||||
|                     if (( SRC_PKGS )); then | ||||
|                         msg "Showing srcinfo pkgs ..." | ||||
|                         show_srcinfo_pkgs | ||||
|                     fi | ||||
|                 fi | ||||
|  | ||||
|             ) | ||||
|   | ||||
| @@ -4,6 +4,21 @@ | ||||
|  | ||||
| #{{{ pkg conf | ||||
|  | ||||
| prepare_dir(){ | ||||
|     [[ ! -d $1 ]] && mkdir -p "$1" | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| if [[ -n $SUDO_USER ]]; then | ||||
|     eval "USER_HOME=~$SUDO_USER" | ||||
| else | ||||
|     USER_HOME=$HOME | ||||
| fi | ||||
|  | ||||
| USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" | ||||
|  | ||||
| prepare_dir "${USER_CONF_DIR}" | ||||
|  | ||||
| load_pkg_config(){ | ||||
|  | ||||
|     local conf="$1/artools-pkg.conf" | ||||
| @@ -13,10 +28,20 @@ load_pkg_config(){ | ||||
|     # shellcheck source=config/conf/artools-pkg.conf | ||||
|     [[ -r "$conf" ]] && source "$conf" | ||||
|  | ||||
|     local git_domain="gitea.artixlinux.org" | ||||
|     CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} | ||||
|  | ||||
|     WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} | ||||
|  | ||||
|     ARCH=${ARCH:-"$(uname -m)"} | ||||
|  | ||||
|     REPO=${REPO:-'world'} | ||||
|  | ||||
|     local -r git_domain="gitea.artixlinux.org" | ||||
|  | ||||
|     GIT_HTTPS=${GIT_HTTPS:-"https://${git_domain}"} | ||||
|  | ||||
|     readonly API_URL="${GIT_HTTPS}/api/v1" | ||||
|  | ||||
|     GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} | ||||
|  | ||||
|     GIT_TOKEN=${GIT_TOKEN:-''} | ||||
|   | ||||
| @@ -20,8 +20,10 @@ usage() { | ||||
|     Usage: ${COMMAND} [COMMAND] [OPTIONS] | ||||
|  | ||||
|     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 | ||||
|         agent     Manage CI and build agent | ||||
|         admin     Manage topics, teams and obsolete repos | ||||
|         version   Show artixpkg version information | ||||
|  | ||||
|     OPTIONS | ||||
| @@ -36,8 +38,6 @@ fi | ||||
|  | ||||
| export _ARTOOLS_COMMAND='artixpkg' | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
|  | ||||
| @@ -68,6 +68,14 @@ while (( $# )); do | ||||
|         artixpkg_git "$@" | ||||
|         exit 0 | ||||
|     ;; | ||||
|     ci) | ||||
|         _ARTOOLS_COMMAND+=" $1" | ||||
|         shift | ||||
|         # shellcheck source=src/lib/pkg/ci.sh | ||||
|         source "${LIBDIR}"/pkg/ci.sh | ||||
|         artixpkg_ci "$@" | ||||
|         exit 0 | ||||
|     ;; | ||||
|     admin) | ||||
|         _ARTOOLS_COMMAND+=" $1" | ||||
|         shift | ||||
|   | ||||
| @@ -6,32 +6,39 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
|  | ||||
| create_first=false | ||||
| rebuild=false | ||||
|  | ||||
| mkchrootpkg_args=(-c -n) | ||||
| mkchrootpkg_args=(-c) | ||||
|  | ||||
| cmd=${0##*/} | ||||
| repo=${cmd#*-} | ||||
| base_devel=('base-devel') | ||||
| base_packages=('base-devel') | ||||
| chroots_pkg="${CHROOTS_DIR}/buildpkg" | ||||
| arch=$(uname -m) | ||||
|  | ||||
| arch=${ARCH} | ||||
| repo=${REPO} | ||||
|  | ||||
| usage() { | ||||
|     printf 'Usage: %s [options] -- [mkchrootpkg_args]\n' "${0##*/}" | ||||
|     printf '    -r <dir>           Create chroots in this directory\n' | ||||
|     printf '    -d <dir>           Destination repo chroot\n' | ||||
|     printf '                       [default: %s]\n' "${chroots_pkg}" | ||||
|     printf '    -d <dest>          Destination repo chroot\n' | ||||
|     printf '                       [default: %s]\n' "${repo}" | ||||
|     printf '    -a <arch>          Build arch chroot\n' | ||||
|     printf '                       [default: %s]\n' "${arch}" | ||||
|     printf '    -e <name>          Export PACKAGER\n' | ||||
|     printf "                       format: 'John Doe <john@doe.com>'\n" | ||||
|     printf '    -c                 Recreate the chroot before building\n' | ||||
|     printf '    -m                 Major rebuild\n' | ||||
|     printf '    -N                 Disable check() function\n' | ||||
|     printf '    -C                 Run checkpkg after built\n' | ||||
|     printf '    -C                 Run checkpkg after build\n' | ||||
|     printf '    -n                 Run namcap after build\n' | ||||
|     printf '    -h                 This help\n' | ||||
|     printf '\n' | ||||
|     printf 'Default mkchrootpkg_args args: %s\n' "${mkchrootpkg_args[*]}" | ||||
| @@ -39,35 +46,46 @@ usage() { | ||||
|     exit "$1" | ||||
| } | ||||
|  | ||||
| opts='hcCNmr:d:' | ||||
| opts='hcCNmnr:d:a:e:' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         r) chroots_pkg="$OPTARG" ;; | ||||
|         d) repo="$OPTARG" ;; | ||||
|         a) arch="$OPTARG" ;; | ||||
|         e) packager="$OPTARG" ;; | ||||
|         c) create_first=true ;; | ||||
|         m) rebuild=true ;; | ||||
|         C) mkchrootpkg_args+=(-C) ;; | ||||
|         N) mkchrootpkg_args+=(-N) ;; | ||||
|         n) mkchrootpkg_args+=(-n) ;; | ||||
|         h|?) usage 0 ;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| if ${rebuild};then | ||||
|     repo='default' | ||||
| else | ||||
|     case ${repo} in | ||||
|         system|world|galaxy) repo='default' ;; | ||||
|         lib32*) base_devel+=('multilib-devel') ;; | ||||
|         *-gremlins|*-goblins) repo=${repo#*-} ;; | ||||
|     esac | ||||
| if "${rebuild}"; then | ||||
|     repo=${repo%-*} | ||||
| fi | ||||
|  | ||||
| pacman_conf="${DATADIR}/pacman.conf.d/${repo}.conf" | ||||
| [[ -f "${USER_CONF_DIR}/pacman.conf.d/${repo}.conf" ]] && pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${repo}.conf" | ||||
| if [[ "${repo}" == lib32* ]]; then | ||||
|     base_packages+=('multilib-devel') | ||||
| fi | ||||
|  | ||||
| pacman_conf="${DATADIR}/pacman.conf.d/${repo}-${arch}.conf" | ||||
| if [[ -f ${USER_CONF_DIR}/pacman.conf.d/${repo}-${arch}.conf ]]; then | ||||
|     pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${repo}-${arch}.conf" | ||||
| fi | ||||
|  | ||||
| makepkg_conf="${DATADIR}/makepkg.conf.d/${arch}.conf" | ||||
| [[ -f ${USER_CONF_DIR}/makepkg.conf.d/${arch}.conf ]] && makepkg_conf="${USER_CONF_DIR}/makepkg.conf.d/${arch}.conf" | ||||
| if [[ -f ${USER_CONF_DIR}/makepkg.conf.d/${arch}.conf ]]; then | ||||
|     makepkg_conf="${USER_CONF_DIR}/makepkg.conf.d/${arch}.conf" | ||||
| fi | ||||
| if [[ -f ${DATADIR}/makepkg.conf.d/${repo}-${arch}.conf ]]; then | ||||
|     makepkg_conf="${DATADIR}/makepkg.conf.d/${repo}-${arch}.conf" | ||||
|     if [[ -f ${USER_CONF_DIR}/makepkg.conf.d/${repo}-${arch}.conf ]]; then | ||||
|         makepkg_conf="${USER_CONF_DIR}/makepkg.conf.d/${repo}-${arch}.conf" | ||||
|     fi | ||||
| fi | ||||
|  | ||||
| if [[ -f "${DATADIR}/setarch-aliases.d/${arch}" ]]; then | ||||
|     read -r set_arch < "${DATADIR}/setarch-aliases.d/${arch}" | ||||
| @@ -75,20 +93,24 @@ else | ||||
|     set_arch="${arch}" | ||||
| fi | ||||
|  | ||||
| if [[ -n "${packager}" ]]; then | ||||
|     export PACKAGER=${packager} | ||||
| fi | ||||
|  | ||||
| # Architecture-specific Mount | ||||
| # arch_mounts=() | ||||
| # if [[ -f "${DATADIR}/mount.d/${arch}" ]]; then | ||||
| #     mapfile -t arch_mounts < "${DATADIR}/mount.d/${arch}" | ||||
| # fi | ||||
| # for arch_mount in "${arch_mounts[@]}"; do | ||||
| #     if [[ $arch_mount = rw* ]]; then | ||||
| #         arch_mount=${arch_mount#rw } | ||||
| #         in_array "$arch_mount" "${mkchrootpkg_args[@]}" || mkchrootpkg_args+=("-d" "$arch_mount") | ||||
| #     elif [[ $arch_mount = ro* ]]; then | ||||
| #         arch_mount=${arch_mount#ro } | ||||
| #         in_array "$arch_mount" "${mkchrootpkg_args[@]}" || mkchrootpkg_args+=("-D" "$arch_mount") | ||||
| #     fi | ||||
| # done | ||||
| arch_mounts=() | ||||
| if [[ -f "${DATADIR}/mount.d/${arch}" ]]; then | ||||
|     mapfile -t arch_mounts < "${DATADIR}/mount.d/${arch}" | ||||
| fi | ||||
| for arch_mount in "${arch_mounts[@]}"; do | ||||
|     if [[ $arch_mount = rw* ]]; then | ||||
|         arch_mount=${arch_mount#rw } | ||||
|         in_array "$arch_mount" "${mkchrootpkg_args[@]}" || mkchrootpkg_args+=(-b "-B:$arch_mount") | ||||
|     elif [[ $arch_mount = ro* ]]; then | ||||
|         arch_mount=${arch_mount#ro } | ||||
|         in_array "$arch_mount" "${mkchrootpkg_args[@]}" || mkchrootpkg_args+=(-b "-Br:$arch_mount") | ||||
|     fi | ||||
| done | ||||
|  | ||||
| check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME "${BASH_SOURCE[0]}" "$@" | ||||
|  | ||||
| @@ -114,7 +136,7 @@ if ${create_first} || [[ ! -d "${chroots_pkg}/${repo}-${arch}" ]];then | ||||
|         -C "${pacman_conf}" \ | ||||
|         -M "${makepkg_conf}" \ | ||||
|         "${chroots_pkg}/${repo}-${arch}/root" \ | ||||
|         "${base_devel[@]}" || abort | ||||
|         "${base_packages[@]}" || abort | ||||
| else | ||||
|     lock 9 "${chroots_pkg}/${repo}-${arch}/root.lock" "Locking clean chroot" | ||||
|     chroot-run \ | ||||
|   | ||||
| @@ -23,41 +23,66 @@ usage() { | ||||
|         list for both packages and a library list for both packages. | ||||
|  | ||||
|         OPTIONS | ||||
|             -r, --rmdir     Remove the temporary directory | ||||
|             -w, --warn      Print a warning in case of differences | ||||
|             -h, --help      Show this help text | ||||
|             -r, --rmdir          Remove the temporary directory | ||||
|             -w, --warn           Print a warning in case of differences | ||||
|             -M, --makepkg-config Set an alternate makepkg configuration file | ||||
|             -h, --help           Show this help text | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| RMDIR=0 | ||||
| WARN=0 | ||||
| MAKEPKG_CONF=/etc/makepkg.conf | ||||
|  | ||||
| OPT_SHORT='rwh' | ||||
| OPT_LONG=('rmdir' 'warn' 'help') | ||||
| if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then | ||||
|     exit 1 | ||||
| fi | ||||
| set  -- "${OPTRET[@]}" | ||||
|  | ||||
| while :; do | ||||
| # option checking | ||||
| while (( $# )); do | ||||
|     case $1 in | ||||
|         -r|--rmdir) | ||||
|             RMDIR=1 | ||||
|             ;; | ||||
|         -w|--warn) | ||||
|             WARN=1 | ||||
|             ;; | ||||
|         -h|--help) | ||||
|             usage | ||||
|             exit 0 | ||||
|             ;; | ||||
|         -r|--rmdir) | ||||
|             RMDIR=1 | ||||
|             shift | ||||
|             ;; | ||||
|         -w|--warn) | ||||
|             WARN=1 | ||||
|             shift | ||||
|             ;; | ||||
|         -M|--makepkg-config) | ||||
|             MAKEPKG_CONF="$2" | ||||
|             shift 2 | ||||
|             ;; | ||||
|         --) | ||||
|             shift; break | ||||
|             shift | ||||
|             break | ||||
|             ;; | ||||
|         --*|-*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
|         *) | ||||
|             break | ||||
|             ;; | ||||
|     esac | ||||
|     shift | ||||
| done | ||||
|  | ||||
| # Source makepkg.conf; fail if it is not found | ||||
| if [[ -r "${MAKEPKG_CONF}" ]]; then | ||||
|     # shellcheck source=config/makepkg/x86_64.conf | ||||
|     source "${MAKEPKG_CONF}" | ||||
| else | ||||
|     die "${MAKEPKG_CONF} not found!" | ||||
| fi | ||||
|  | ||||
| # Source user-specific makepkg.conf overrides | ||||
| if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then | ||||
|     # shellcheck source=config/makepkg/x86_64.conf | ||||
|     source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" | ||||
| elif [[ -r "$HOME/.makepkg.conf" ]]; then | ||||
|     # shellcheck source=config/makepkg/x86_64.conf | ||||
|     source "$HOME/.makepkg.conf" | ||||
| fi | ||||
|  | ||||
| if [[ ! -f PKGBUILD ]]; then | ||||
|     die 'This must be run in the directory of a built package.' | ||||
| fi | ||||
| @@ -72,6 +97,8 @@ STARTDIR=$(pwd) | ||||
| (( RMDIR )) && trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT | ||||
| TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX) | ||||
|  | ||||
| changed=0 | ||||
|  | ||||
| for _pkgname in "${pkgname[@]}"; do | ||||
|     comparepkg=$_pkgname | ||||
|     pkgurl= | ||||
| @@ -84,8 +111,10 @@ for _pkgname in "${pkgname[@]}"; do | ||||
|  | ||||
|     if (( $# )); then | ||||
|         case $1 in | ||||
|             *://*) | ||||
|                 pkgurl=$1 ;; | ||||
|             /*|*/*) | ||||
|                 pkgurl=file://$(readlink -m "$1") ;; | ||||
|                 pkgurl=$(readlink -m "$1") ;; | ||||
|             *.pkg.tar*) | ||||
|                 pkgurl=$1 ;; | ||||
|             '') | ||||
| @@ -123,11 +152,21 @@ for _pkgname in "${pkgname[@]}"; do | ||||
|     find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname" | ||||
|     if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then | ||||
|         message="Sonames differ in $_pkgname!" | ||||
|         (( WARN )) && warning "$message" || msg "$message" | ||||
|         printf "%s\n" "$diff_output" | ||||
|         if (( WARN )); then | ||||
|             warning "$message" | ||||
|         else | ||||
|             msg "$message" | ||||
|         fi | ||||
|         printf "%s\n" "$diff_output" 2>&1 | tee "${pkgfile##*/}-checkpkg.log" | ||||
|         changed=1 | ||||
|     else | ||||
|         msg "No soname differences for %s." "$_pkgname" | ||||
|     fi | ||||
| done | ||||
|  | ||||
| (( RMDIR )) || msg "Files saved to %s" "$TEMPDIR" | ||||
| if ! (( RMDIR )); then | ||||
|     msg "Files saved to %s" "$TEMPDIR" | ||||
| fi | ||||
|  | ||||
| exit "$changed" | ||||
|  | ||||
|   | ||||
| @@ -6,8 +6,6 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| @@ -32,6 +30,7 @@ update_linksdb_cache(){ | ||||
|     local cachedir url | ||||
|     for repo in "${search[@]}"; do | ||||
|         cachedir=${db_cache_dir}/linksdb/$repo | ||||
|         # shellcheck disable=SC2153 | ||||
|         url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext} | ||||
|         extract_db "$url" "$cachedir" | ||||
|     done | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
| 
 | ||||
| LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| 
 | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| @@ -36,9 +37,9 @@ kill_chroot_process(){ | ||||
| umask 0022 | ||||
| 
 | ||||
| working_dir='' | ||||
| files=() | ||||
| 
 | ||||
| mount_args=("-B:/etc/hosts:/etc/hosts") | ||||
| files=() | ||||
| mount_args="-B:/etc/hosts:/etc/hosts" | ||||
| 
 | ||||
| usage() { | ||||
|     printf "Usage: %s [options] working-dir [run arguments]\n" "${0##*/}" | ||||
| @@ -50,15 +51,18 @@ usage() { | ||||
|     printf '    -c <dir>      Set pacman cache\n' | ||||
|     printf '    -f <file>     Copy file from the host to the chroot\n' | ||||
|     printf '    -s            Do not run setarch\n' | ||||
|     printf '    -b <list>     Bind mountargs\n' | ||||
|     printf '                  List format [mntarg1:src1:dest1 ... mntargN:srcN:destN]\n' | ||||
|     printf '    -t <opts>     tmpfs mount opts\n' | ||||
|     printf '    -b <args>     Bind mountargs\n' | ||||
|     printf '                  Format:\n' | ||||
|     printf '                  "arg1:src1:dest1 arg2:src2:dest2"\n' | ||||
|     printf '    -h            This message\n' | ||||
|     exit 1 | ||||
| } | ||||
| 
 | ||||
| # save all args for check_root | ||||
| orig_args=("$@") | ||||
| 
 | ||||
| opts='hC:M:c:b:f:s' | ||||
| opts='hC:M:c:b:f:t:s' | ||||
| 
 | ||||
| while getopts ${opts} arg; do | ||||
|     case "${arg}" in | ||||
| @@ -67,14 +71,15 @@ while getopts ${opts} arg; do | ||||
|         c) cache_dirs+=("$OPTARG") ;; | ||||
|         f) files+=("$OPTARG") ;; | ||||
|         s) nosetarch=1 ;; | ||||
|         b) bindmounts="$OPTARG"; mount_args+=(${bindmounts}) ;; | ||||
|         t) tmpfs_opts="$OPTARG" ;; | ||||
|         b) bindmounts="$OPTARG"; mount_args+=" ${bindmounts}" ;; | ||||
|         h|?) usage ;; | ||||
|         *) error "invalid argument '%s'" "$arg"; usage ;; | ||||
|     esac | ||||
| done | ||||
| shift $(( OPTIND - 1 )) | ||||
| shift $((OPTIND - 1)) | ||||
| 
 | ||||
| (( $# < 1 )) && die 'You must specify a directory.' | ||||
| 
 | ||||
| check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
| 
 | ||||
| working_dir=$(readlink -f "$1") | ||||
| @@ -83,7 +88,7 @@ shift 1 | ||||
| [[ -z $working_dir ]] && die 'Please specify a working directory.' | ||||
| 
 | ||||
| if (( ${#cache_dirs[@]} == 0 )); then | ||||
|     mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir) | ||||
|     mapfile -t cache_dirs < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" CacheDir) | ||||
| fi | ||||
| 
 | ||||
| # shellcheck disable=2016 | ||||
| @@ -91,15 +96,16 @@ mapfile -t host_mirrors < <(pacman-conf --repo world Server 2> /dev/null | sed - | ||||
| 
 | ||||
| for host_mirror in "${host_mirrors[@]}"; do | ||||
|     if [[ $host_mirror == *file://* ]]; then | ||||
|         # shellcheck disable=2016 | ||||
|         host_mirror=$(printf "%s\n" "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g') | ||||
|         in_array "$host_mirror" "${cache_dirs[@]}" || cache_dirs+=("$host_mirror") | ||||
|         # shellcheck disable=SC2016 | ||||
|         host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g') | ||||
|         for m in "$host_mirror"/pool/*/; do | ||||
|             in_array "$m" "${cache_dirs[@]}" || cache_dirs+=("$m") | ||||
|         done | ||||
|     fi | ||||
| done | ||||
| 
 | ||||
| while read -r line; do | ||||
|     # shellcheck disable=2016 | ||||
|     mapfile -t lines < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" \ | ||||
|     mapfile -t lines < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" \ | ||||
|         --repo "$line" Server | sed -r 's#(.*/)[^/]+/os/.+#\1#') | ||||
|     for line in "${lines[@]}"; do | ||||
|         if [[ $line = file://* ]]; then | ||||
| @@ -107,7 +113,15 @@ while read -r line; do | ||||
|             in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line") | ||||
|         fi | ||||
|     done | ||||
| done < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list) | ||||
| done < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" --repo-list) | ||||
| 
 | ||||
| mount_args+=" -B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}" | ||||
| 
 | ||||
| for cache_dir in "${cache_dirs[@]:1}"; do | ||||
|     mount_args+=" -Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}" | ||||
| done | ||||
| 
 | ||||
| # {{{ functions | ||||
| 
 | ||||
| copy_hostconf () { | ||||
|     unshare --fork --pid gpg --homedir "$working_dir"/etc/pacman.d/gnupg/ --no-permission-warning --quiet --batch --import --import-options import-local-sigs "$(pacman-conf GpgDir)"/pubring.gpg >/dev/null 2>&1 | ||||
| @@ -115,9 +129,9 @@ copy_hostconf () { | ||||
| 
 | ||||
|     printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist" | ||||
| 
 | ||||
|     [[ -n $pacman_conf ]] && cp "$pacman_conf" "${working_dir}/etc/pacman.conf" | ||||
|     [[ -n $pacman_conf ]] && cp "$pacman_conf" "$working_dir/etc/pacman.conf" | ||||
| 
 | ||||
|     [[ -n $makepkg_conf ]] && cp "$makepkg_conf" "${working_dir}/etc/makepkg.conf" | ||||
|     [[ -n $makepkg_conf ]] && cp "$makepkg_conf" "$working_dir/etc/makepkg.conf" | ||||
| 
 | ||||
|     local file | ||||
|     for file in "${files[@]}"; do | ||||
| @@ -125,49 +139,44 @@ copy_hostconf () { | ||||
|         cp -T "$file" "$working_dir$file" | ||||
|     done | ||||
| 
 | ||||
|     sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "${working_dir}/etc/pacman.conf" | ||||
|     sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "$working_dir/etc/pacman.conf" | ||||
| } | ||||
| 
 | ||||
| mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}") | ||||
| 
 | ||||
| for cache_dir in "${cache_dirs[@]:1}"; do | ||||
|     mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}") | ||||
| done | ||||
| 
 | ||||
| chroot_extra_mount() { | ||||
|     chroot_add_resolv_conf "${working_dir}" | ||||
| 
 | ||||
|     for arg in "${mount_args[@]}"; do | ||||
|     for arg in ${mount_args}; do | ||||
|         local flag dest src | ||||
|         flag=${arg%%:*} | ||||
|         dest=${arg##*:} | ||||
|         src=${arg%:*} | ||||
|         src=${src#*:} | ||||
|         chroot_mount "${src}" "${working_dir}${dest}" "${flag}" | ||||
|         chroot_add_mount "${src}" "${working_dir}${dest}" "${flag}" | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| # }}} | ||||
| 
 | ||||
| umask 0022 | ||||
| 
 | ||||
| # Sanity check | ||||
| if [[ ! -f "$working_dir/.artools" ]]; then | ||||
|     die "'%s' does not appear to be an artix chroot." "$working_dir" | ||||
| elif [[ $(cat "$working_dir/.artools") != "${CHROOTVERSION}" ]]; then | ||||
| if [[ ! -f "$working_dir/.artix-chroot" ]]; then | ||||
|     die "'%s' does not appear to be an Artix chroot." "$working_dir" | ||||
| elif [[ $(cat "$working_dir/.artix-chroot") != "${CHROOTVERSION}" ]]; then | ||||
|     die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}" | ||||
| fi | ||||
| 
 | ||||
| chroot_api_mount "${working_dir}" || 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 | ||||
| 
 | ||||
| copy_hostconf | ||||
| 
 | ||||
| eval "$(grep '^CARCH=' "$working_dir/etc/makepkg.conf")" | ||||
| eval "$(grep -a '^CARCH=' "$working_dir/etc/makepkg.conf")" | ||||
| 
 | ||||
| [[ -z $nosetarch ]] || unset CARCH | ||||
| 
 | ||||
| if [[ -f "/usr/share/artools/artools/setarch-aliases.d/${CARCH}" ]]; then | ||||
|     read -r set_arch < "/usr/share/artools/artools/setarch-aliases.d/${CARCH}" | ||||
| if [[ -f "${DATADIR}/setarch-aliases.d/${CARCH}" ]]; then | ||||
|     read -r set_arch < "${DATADIR}/setarch-aliases.d/${CARCH}" | ||||
| else | ||||
|     set_arch="${CARCH}" | ||||
| fi | ||||
							
								
								
									
										112
									
								
								src/pkg/ckchrootpkg.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								src/pkg/ckchrootpkg.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
|  | ||||
| shopt -s nullglob | ||||
|  | ||||
| chrootdir= | ||||
| makepkg_user= | ||||
| passeddir="${CHROOTS_DIR}/buildpkg" | ||||
|  | ||||
| arch=${ARCH} | ||||
| repo=${REPO} | ||||
|  | ||||
| copy=$USER | ||||
| [[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER | ||||
| [[ -z "$copy" || $copy = root ]] && copy=copy | ||||
|  | ||||
| usage() { | ||||
|     printf 'Usage: %s [options] -r <chrootdir>\n' "${0##*/}" | ||||
|     printf '    -r <dir>           Create chroots in this directory\n' | ||||
|     printf '                       Default: %s\n' "${passeddir}" | ||||
|     printf '    -d <dest>          Destination repo chroot\n' | ||||
|     printf '                       Default: %s\n' "${repo}" | ||||
|     printf '    -a <arch>          Build arch chroot\n' | ||||
|     printf '                       Default: %s\n' "${arch}" | ||||
|     printf '    -l <copy>          The directory to use as the working copy of the chroot\n' | ||||
|     printf '                       Useful for maintaining multiple copies\n' | ||||
|     printf '                       Default: %s\n' "$copy" | ||||
|     printf '    -U                 Run makepkg as a specified user\n' | ||||
|     exit 1 | ||||
| } | ||||
|  | ||||
| opts='hr:l:U:d:a:' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "$arg" in | ||||
|         r) passeddir="$OPTARG" ;; | ||||
|         l) copy="$OPTARG" ;; | ||||
|         U) makepkg_user="$OPTARG" ;; | ||||
|         d) repo="$OPTARG" ;; | ||||
|         a) arch="$OPTARG" ;; | ||||
|         h|*) usage ;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| [[ ! -f PKGBUILD ]] && die 'This must be run in a directory containing a PKGBUILD.' | ||||
| [[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.' | ||||
| makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}} | ||||
|  | ||||
| check_root "" "${BASH_SOURCE[0]}" "$@" | ||||
|  | ||||
| # # Canonicalize chrootdir, getting rid of trailing / | ||||
| chrootdir=$(readlink -e "$passeddir") | ||||
|  | ||||
| chrootdir="$chrootdir"/"${repo}-${arch}" | ||||
|  | ||||
| [[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir" | ||||
| [[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkchroot %s/root base-devel" "$chrootdir" | ||||
|  | ||||
| if [[ ${copy:0:1} = / ]]; then | ||||
|     copydir=$copy | ||||
| else | ||||
|     copydir="$chrootdir/$copy" | ||||
| fi | ||||
|  | ||||
| umask 0022 | ||||
|  | ||||
| ORIG_HOME=$HOME | ||||
| IFS=: read -r _ _ _ _ _ HOME _ < <(getent passwd "${SUDO_USER:-$USER}") | ||||
| # shellcheck source=config/makepkg/x86_64.conf | ||||
| load_makepkg_config | ||||
| HOME=$ORIG_HOME | ||||
|  | ||||
| [[ -d $PKGDEST ]]    || PKGDEST=$PWD | ||||
| [[ -d $SRCDEST ]]    || SRCDEST=$PWD | ||||
| [[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD | ||||
| [[ -d $LOGDEST ]]    || LOGDEST=$PWD | ||||
|  | ||||
| msg "Running checkpkg" | ||||
| mapfile -t pkgnames < <(bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') | ||||
|  | ||||
| mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ | ||||
|     --dbpath "$copydir"/var/lib/pacman \ | ||||
|     -Sddp "${pkgnames[@]}") | ||||
|  | ||||
| if ! wait $!; then | ||||
|     warning "Skipped checkpkg due to missing repo packages" | ||||
|     exit 0 | ||||
| fi | ||||
|  | ||||
| # download package files if any non-local location exists | ||||
| for remotepkg in "${remotepkgs[@]}"; do | ||||
|     if [[ $remotepkg != file://* ]]; then | ||||
|         msg2 "Downloading current versions" | ||||
|         chroot-run "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}" | ||||
|         mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ | ||||
|             --dbpath "$copydir"/var/lib/pacman \ | ||||
|             -Sddp "${pkgnames[@]}") | ||||
|         break | ||||
|     fi | ||||
| done | ||||
|  | ||||
| sudo -u "$makepkg_user" checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}" | ||||
| @@ -127,7 +127,7 @@ while (( $# )); do | ||||
|             shift | ||||
|             break | ||||
|         ;; | ||||
|         -*|--*) | ||||
|         --*|-*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|         ;; | ||||
|         *) | ||||
|   | ||||
| @@ -1,73 +0,0 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
|  | ||||
| usage() { | ||||
|     cat <<- _EOF_ | ||||
|         Usage: ${BASH_SOURCE[0]##*/} | ||||
|  | ||||
|         Export the PGP keys from a PKGBUILDs validpgpkeys array into the keys/pgp/ | ||||
|         subdirectory. Useful for distributing packager validated source signing | ||||
|         keys alongside PKGBUILDs. | ||||
|  | ||||
|         OPTIONS | ||||
|             -h, --help      Show this help text | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| # option checking | ||||
| while (( $# )); do | ||||
|     case $1 in | ||||
|         -h|--help) usage; exit 0 ;; | ||||
|         *) die "invalid argument: %s" "$1" ;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| if [[ ! -f PKGBUILD ]]; then | ||||
|     die "This must be run a directory containing a PKGBUILD." | ||||
| fi | ||||
|  | ||||
| mapfile -t validpgpkeys < <( | ||||
|     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|     . ./PKGBUILD | ||||
|     if (( ${#validpgpkeys[@]} )); then | ||||
|         printf "%s\n" "${validpgpkeys[@]}" | ||||
|     fi | ||||
| ) | ||||
|  | ||||
| msg "Exporting ${#validpgpkeys[@]} PGP keys..." | ||||
| if (( ${#validpgpkeys[@]} == 0 )); then | ||||
|     exit 0 | ||||
| fi | ||||
|  | ||||
| trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT | ||||
| TEMPDIR=$(mktemp -d --tmpdir export-pkgbuild-keys.XXXXXXXXXX) | ||||
|  | ||||
| mkdir -p keys/pgp | ||||
| error=0 | ||||
|  | ||||
| for key in "${validpgpkeys[@]}"; do | ||||
|     gpg --output "$TEMPDIR/$key.asc" --armor --export --export-options export-minimal "$key" 2>/dev/null | ||||
|  | ||||
|     # gpg does not give a non-zero return value if it fails to export... | ||||
|     if [[ -f $TEMPDIR/$key.asc ]]; then | ||||
|         msg2 "Exported $key" | ||||
|         mv "$TEMPDIR/$key.asc" "keys/pgp/$key.asc" | ||||
|     else | ||||
|         if [[ -f keys/pgp/$key.asc ]]; then | ||||
|             warning "Failed to update key: $key" | ||||
|         else | ||||
|             error "Key unavailable: $key" | ||||
|             error=1 | ||||
|         fi | ||||
|     fi | ||||
| done | ||||
|  | ||||
| if (( error )); then | ||||
|     die "Failed to export all \'validpgpkeys\' entries." | ||||
| fi | ||||
| @@ -10,12 +10,12 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
|  | ||||
| declare -A buildinfo | ||||
| declare -a buildenv buildopts installed installpkgs | ||||
| @@ -133,7 +133,7 @@ while getopts 'dM:c:l:h' arg; do | ||||
|         c) cache_dirs+=("$OPTARG") ;; | ||||
|         l) chroot="$OPTARG" ;; | ||||
|         h) usage; exit 0 ;; | ||||
|         *|?) usage; exit 1 ;; | ||||
|         ?|*) usage; exit 1 ;; | ||||
|     esac | ||||
| done | ||||
| shift $((OPTIND - 1)) | ||||
| @@ -222,10 +222,12 @@ TEMPDIR=$(mktemp -d --tmpdir makerepropkg.XXXXXXXXXX) | ||||
| makepkg_conf="${TEMPDIR}/makepkg.conf" | ||||
| # anything before buildtool support is pinned to the last none buildtool aware release | ||||
| if [[ -z "${BUILDTOOL}" ]]; then | ||||
|     get_makepkg_conf "artools-pkg-0.28.2-1-any" "${CARCH}" "${makepkg_conf}" || exit 1 | ||||
|     # shellcheck disable=SC2153 | ||||
|     get_makepkg_conf "artools-pkg-0.31.7-1-any" "${CARCH}" "${makepkg_conf}" || exit 1 | ||||
| # prefere to assume artools-pkg up until matching makepkg version so repository packages remain reproducible | ||||
| elif [[ "${BUILDTOOL}" = makepkg ]] && (( $(vercmp "${BUILDTOOLVER}" 6.0.1) <= 0 )); then | ||||
|     get_makepkg_conf "artools-pkg-0.28.2-1-any" "${CARCH}" "${makepkg_conf}" || exit 1 | ||||
|     # shellcheck disable=SC2153 | ||||
|     get_makepkg_conf "artools-pkg-0.31.7-1-any" "${CARCH}" "${makepkg_conf}" || exit 1 | ||||
| # all artools-pkg builds | ||||
| elif [[ "${BUILDTOOL}" = artools ]] && get_makepkg_conf "${BUILDTOOL}-${BUILDTOOLVER}" "${makepkg_conf}"; then | ||||
|     true | ||||
|   | ||||
							
								
								
									
										99
									
								
								src/pkg/manage-pkgbuild-keys.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								src/pkg/manage-pkgbuild-keys.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
|  | ||||
|  | ||||
| usage() { | ||||
|     cat <<- _EOF_ | ||||
|         Usage: ${BASH_SOURCE[0]##*/} | ||||
|  | ||||
|         Export or import the PGP keys from a PKGBUILDs validpgpkeys array into/from the keys/pgp/ | ||||
|         subdirectory. Useful for distributing packager validated source signing | ||||
|         keys alongside PKGBUILDs. | ||||
|  | ||||
|         OPTIONS | ||||
|             -i, --import    Import keys | ||||
|             -e, --export    Export keys | ||||
|             -h, --help      Show this help text | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| action='' | ||||
| error=0 | ||||
|  | ||||
| # option checking | ||||
| while (( $# )); do | ||||
|     case $1 in | ||||
|         -i|--import) action="import"; shift ;; | ||||
|         -e|--export) action="export"; shift ;; | ||||
|         -h|--help) usage; exit 0 ;; | ||||
|         *) die "invalid argument: %s" "$1" ;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| if [[ ! -f PKGBUILD ]]; then | ||||
|     die "This must be run a directory containing a PKGBUILD." | ||||
| fi | ||||
|  | ||||
| mapfile -t validpgpkeys < <( | ||||
|     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|     . ./PKGBUILD | ||||
|     if (( ${#validpgpkeys[@]} )); then | ||||
|         printf "%s\n" "${validpgpkeys[@]}" | ||||
|     fi | ||||
| ) | ||||
|  | ||||
| if [[ "$action" == 'export' ]]; then | ||||
|     msg "Exporting ${#validpgpkeys[@]} PGP keys..." | ||||
|     if (( ${#validpgpkeys[@]} == 0 )); then | ||||
|         exit 0 | ||||
|     fi | ||||
|  | ||||
|     trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT | ||||
|     TEMPDIR=$(mktemp -d --tmpdir export-pkgbuild-keys.XXXXXXXXXX) | ||||
|  | ||||
|     mkdir -p keys/pgp | ||||
|  | ||||
|     for key in "${validpgpkeys[@]}"; do | ||||
|         gpg --output "$TEMPDIR/$key.asc" --armor --export --export-options export-minimal "$key" 2>/dev/null | ||||
|  | ||||
|         # gpg does not give a non-zero return value if it fails to export... | ||||
|         if [[ -f $TEMPDIR/$key.asc ]]; then | ||||
|             msg2 "Exported $key" | ||||
|             mv "$TEMPDIR/$key.asc" "keys/pgp/$key.asc" | ||||
|         else | ||||
|             if [[ -f keys/pgp/$key.asc ]]; then | ||||
|                 warning "Failed to update key: $key" | ||||
|             else | ||||
|                 error "Key unavailable: $key" | ||||
|                 error=1 | ||||
|             fi | ||||
|         fi | ||||
|     done | ||||
| elif [[ "$action" == 'import' ]]; then | ||||
|  | ||||
|     msg "Ensuring required PGP keys are present..." | ||||
|     for key in "${validpgpkeys[@]}"; do | ||||
|         if ! gpg --list-keys "$key" &>/dev/null; then | ||||
|             msg2 "Checking for $key..." | ||||
|             if ! gpg --recv-keys "$key" || ! gpg --fingerprint "$key"; then | ||||
|                 if [[ -f keys/pgp/$key.asc ]]; then | ||||
|                     msg2 "Importing key from local..." | ||||
|                     gpg --import "keys/pgp/$key.asc" | ||||
|                 else | ||||
|                     error "Key unavailable: $key" | ||||
|                     error=1 | ||||
|                 fi | ||||
|             fi | ||||
|         fi | ||||
|     done | ||||
| fi | ||||
|  | ||||
| if (( error )); then | ||||
|     die "Failed to $action all \'validpgpkeys\' entries." | ||||
| fi | ||||
| @@ -20,6 +20,7 @@ umode='' | ||||
| 
 | ||||
| files=() | ||||
| chroot_args=() | ||||
| nosetarch=0 | ||||
| 
 | ||||
| usage() { | ||||
|     printf "Usage: %s [options] working-dir package-list...\n" "${0##*/}" | ||||
| @@ -97,7 +98,7 @@ unshare --mount basestrap -${umode}Mc ${pacman_conf:+-C "$pacman_conf"} "$workin | ||||
| printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$working_dir/etc/locale.gen" | ||||
| printf 'LANG=C.UTF-8\n' > "$working_dir/etc/locale.conf" | ||||
| # printf 'KEYMAP=en\n' > "$working_dir/etc/vconsole.conf" | ||||
| printf "%s\n" "${CHROOTVERSION}" > "$working_dir/.artools" | ||||
| printf "%s\n" "${CHROOTVERSION}" > "$working_dir/.artix-chroot" | ||||
| 
 | ||||
| dbus-uuidgen --ensure="$working_dir"/etc/machine-id | ||||
| 
 | ||||
| @@ -29,6 +29,7 @@ clean_first=0 | ||||
| run_namcap=0 | ||||
| run_checkpkg=0 | ||||
| temp_chroot=0 | ||||
| tmp_opts="nosuid,nodev,size=50%,nr_inodes=2m" | ||||
|  | ||||
| bindmounts='' | ||||
|  | ||||
| @@ -47,7 +48,7 @@ usage() { | ||||
|     printf ' <chrootdir>/{root, copy} but only "root" is required\n' | ||||
|     printf ' by default. The working copy will be created as needed\n' | ||||
|     printf '\n' | ||||
|     printf "The chroot 'root' directory must be created via the following\n" | ||||
|     printf 'The chroot "root" directory must be created via the following\n' | ||||
|     printf 'command:\n' | ||||
|     printf '    mkchroot <chrootdir>/root base-devel\n' | ||||
|     printf '\n' | ||||
| @@ -60,26 +61,24 @@ usage() { | ||||
|     printf 'Flags:\n' | ||||
|     printf ' -h         This help\n' | ||||
|     printf ' -c         Clean the chroot before building\n' | ||||
|     printf ' -d <dir>   Bind directory into build chroot as read-write\n' | ||||
|     printf ' -D <dir>   Bind directory into build chroot as read-only\n' | ||||
|     printf ' -b <arg>   Bind mount directory/file into build chroot\n' | ||||
|     printf ' -u         Update the working copy of the chroot before building\n' | ||||
|     printf '           This is useful for rebuilds without dirtying the pristine\n' | ||||
|     printf '           chroot\n' | ||||
|     printf '            This is useful for rebuilds without dirtying the pristine\n' | ||||
|     printf '            chroot\n' | ||||
|     printf ' -r <dir>   The chroot dir to use\n' | ||||
|     printf ' -I <pkg>   Install a package into the working copy of the chroot\n' | ||||
|     printf ' -l <copy>  The directory to use as the working copy of the chroot\n' | ||||
|     printf '            Useful for maintaining multiple copies\n' | ||||
|     printf '            Default: %s\n' "$copy" | ||||
|     printf ' -n         Run namcap on the package\n' | ||||
|     printf ' -C         Run checkpkg on the package\n' | ||||
|     printf ' -N         Disable check() function\n' | ||||
|     printf ' -C         Run checkpkg on the package\n' | ||||
|     printf ' -T         Build in a temporary directory\n' | ||||
|     printf ' -U         Run makepkg as a specified user\n' | ||||
|     exit 1 | ||||
| } | ||||
|  | ||||
| # {{{ functions | ||||
|  | ||||
| # Usage: sync_chroot $chrootdir $copydir [$copy] | ||||
| sync_chroot() { | ||||
|     local chrootdir=$1 | ||||
| @@ -142,9 +141,7 @@ install_packages() { | ||||
|     pkgnames=("${install_pkgs[@]##*/}") | ||||
|  | ||||
|     cp -- "${install_pkgs[@]}" "$copydir/root/" | ||||
|     chroot-run \ | ||||
|         -b "${bindmounts}" \ | ||||
|         "$copydir" \ | ||||
|     chroot-run -b "${bindmounts}" "$copydir" \ | ||||
|         bash -c 'yes y | pacman -U -- "$@"' -bash "${pkgnames[@]/#//root/}" | ||||
|     ret=$? | ||||
|     rm -- "${pkgnames[@]/#/$copydir/root/}" | ||||
| @@ -180,7 +177,7 @@ prepare_chroot() { | ||||
|     done | ||||
|  | ||||
|     cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF | ||||
| builduser ALL = NOPASSWD: /usr/bin/pacman | ||||
| builduser ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman | ||||
| EOF | ||||
|     chmod 440 "$copydir/etc/sudoers.d/builduser-pacman" | ||||
|  | ||||
| @@ -208,6 +205,7 @@ _chrootbuild() { | ||||
|     # No coredumps | ||||
|     ulimit -c 0 | ||||
|  | ||||
|     # shellcheck disable=SC1091 | ||||
|     . /etc/locale.conf | ||||
|  | ||||
|     # shellcheck source=/dev/null | ||||
| @@ -266,6 +264,7 @@ move_products() { | ||||
|  | ||||
|         # Fix broken symlink because of temporary chroot PKGDEST /pkgdest | ||||
|         if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then | ||||
|             # shellcheck disable=SC2226 | ||||
|             ln -sf "$PKGDEST/${pkgfile##*/}" | ||||
|         fi | ||||
|     done | ||||
| @@ -278,6 +277,7 @@ move_products() { | ||||
|  | ||||
|         # Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest | ||||
|         if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then | ||||
|             # shellcheck disable=SC2226 | ||||
|             ln -sf "$SRCPKGDEST/${s##*/}" | ||||
|         fi | ||||
|     done | ||||
| @@ -354,13 +354,11 @@ if [[ ! -d $copydir ]] || (( clean_first )); then | ||||
|     sync_chroot "$chrootdir" "$copydir" "$copy" | ||||
| fi | ||||
|  | ||||
|  | ||||
| (( update_first )) && chroot-run \ | ||||
|         -b "${bindmounts}" \ | ||||
|         "$copydir" \ | ||||
|         pacman -Syuu --noconfirm | ||||
|  | ||||
|  | ||||
| if [[ -n ${install_pkgs[*]:-} ]]; then | ||||
|     install_packages | ||||
|     ret=$? | ||||
| @@ -378,6 +376,7 @@ download_sources | ||||
| prepare_chroot | ||||
|  | ||||
| if chroot-run \ | ||||
|     -t "${tmp_opts}" \ | ||||
|     -b "${bindmounts} -B:${PWD}:/startdir -B:${SRCDEST}:/srcdest" \ | ||||
|     "$copydir" \ | ||||
|     /chrootbuild "${makepkg_args[@]}" | ||||
| @@ -409,6 +408,7 @@ else | ||||
|             warning "Skipped checkpkg due to missing repo packages" | ||||
|             exit 0 | ||||
|         fi | ||||
|  | ||||
|         # download package files if any non-local location exists | ||||
|         for remotepkg in "${remotepkgs[@]}"; do | ||||
|             if [[ $remotepkg != file://* ]]; then | ||||
| @@ -420,8 +420,9 @@ else | ||||
|                 break | ||||
|             fi | ||||
|         done | ||||
|  | ||||
|         msg2 "Checking packages" | ||||
|         sudo -u "$makepkg_user" checkpkg --rmdir --warn "${remotepkgs[@]/#file:\/\//}" | ||||
|         sudo -u "$makepkg_user" checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}" | ||||
|     fi | ||||
|     true | ||||
| fi | ||||
|   | ||||
							
								
								
									
										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 | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/yaml.sh | ||||
| source "${LIBDIR}"/base/yaml.sh | ||||
| # shellcheck source=src/lib/pkg/yaml.sh | ||||
| source "${LIBDIR}"/pkg/yaml.sh | ||||
|  | ||||
| # shellcheck disable=1091 | ||||
| source "${MAKEPKG_LIBRARY}"/util/pkgbuild.sh | ||||
| # shellcheck disable=1091 | ||||
| source "${MAKEPKG_LIBRARY}"/util/schema.sh | ||||
|  | ||||
| #{{{ functions | ||||
| @@ -121,6 +123,7 @@ usage() { | ||||
|     exit "$1" | ||||
| } | ||||
|  | ||||
| # shellcheck source=config/makepkg/x86_64.conf | ||||
| load_makepkg_config | ||||
|  | ||||
| opts='h' | ||||
|   | ||||
| @@ -6,8 +6,6 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
| 
 | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| @@ -34,6 +32,7 @@ remove(){ | ||||
| 
 | ||||
| repo_action() { | ||||
|     local repo_path | ||||
|     # shellcheck disable=SC2153 | ||||
|     repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH} | ||||
| 
 | ||||
|     local packages=() action func="$1" | ||||
| @@ -9,6 +9,7 @@ source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/pkg/deploy.sh | ||||
| source "${LIBDIR}"/pkg/deploy.sh | ||||
|  | ||||
| # shellcheck source=config/makepkg/x86_64.conf | ||||
| load_makepkg_config | ||||
|  | ||||
| passfiles=("$@") | ||||
| @@ -36,5 +37,10 @@ for pkg in "${passfiles[@]}"; do | ||||
|         msg2 "Found: %s" "${pkgfile}" | ||||
|         [[ -e "${pkgfile}".sig ]] && rm "${pkgfile}".sig | ||||
|         sign_pkg "${pkgfile}" | ||||
|         ret=0 | ||||
|     else | ||||
|         ret=1 | ||||
|     fi | ||||
| done | ||||
|  | ||||
| exit "$ret" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user