forked from artix/artools
		
	Compare commits
	
		
			37 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | 
							
								
								
									
										25
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								Makefile
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ SHELL=/bin/bash | ||||
| V=0.31 | ||||
| BUILDTOOLVER ?= $(V) | ||||
|  | ||||
| CHROOTVER=0.11 | ||||
| CHROOTVER=0.12 | ||||
|  | ||||
| TOOLS = artools | ||||
| SYSCONFDIR = /etc | ||||
| @@ -36,24 +36,6 @@ 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 | ||||
|  | ||||
| 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 | ||||
| binprogs_base: $(BINPROGS_BASE) | ||||
| binprogs_pkg: $(BINPROGS_PKG) | ||||
| @@ -130,7 +112,6 @@ 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_iso: binprogs_iso | ||||
| @@ -142,8 +123,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 +133,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 \ | ||||
|   | ||||
| @@ -74,11 +74,11 @@ Specifying args will override artools-{base,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 | ||||
|   | ||||
| @@ -10,3 +10,11 @@ | ||||
|  | ||||
| # the workspace directory | ||||
| # WORKSPACE_DIR="${USER_HOME}/artools-workspace" | ||||
|  | ||||
| # the arch to build | ||||
| # ARCH=$(uname -m) | ||||
|  | ||||
| # default pacman.conf repos to include | ||||
| # possible buildpkg values: {system,world,galaxy,lib32}{-gremlins,-goblins} | ||||
| # possible buildiso values: {world,galaxy}{-gremlins,-goblins} | ||||
| # REPO="world" | ||||
|   | ||||
| @@ -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 | ||||
| 
 | ||||
| @@ -70,39 +70,21 @@ 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-goblins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
| 
 | ||||
| [galaxy-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
| 
 | ||||
| [galaxy] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
| 
 | ||||
| # If you want to run 32 bit applications on your x86_64 system, | ||||
| # enable the lib32 repositories as required here. | ||||
| 
 | ||||
| [lib32-goblins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
| 
 | ||||
| [lib32-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
| 
 | ||||
| @@ -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 | ||||
| @@ -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,8 +37,8 @@ kill_chroot_process(){ | ||||
| umask 0022 | ||||
|  | ||||
| working_dir='' | ||||
| files=() | ||||
|  | ||||
| files=() | ||||
| mount_args=("-B:/etc/hosts:/etc/hosts") | ||||
|  | ||||
| usage() { | ||||
| @@ -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 ;; | ||||
|         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,15 @@ 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") | ||||
|         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 +112,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 +128,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,15 +138,9 @@ 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}" | ||||
|  | ||||
| @@ -147,27 +154,28 @@ chroot_extra_mount() { | ||||
|     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_api_mount "${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 | ||||
|   | ||||
| @@ -97,7 +97,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 | ||||
|  | ||||
|   | ||||
| @@ -184,7 +184,7 @@ gen_iso_fn(){ | ||||
|     vars+=("${profile}") | ||||
|     vars+=("${INITSYS}") | ||||
|     case "${repo}" in | ||||
|         'gremlins'|'goblins') vars+=("${repo}") ;; | ||||
|         *-gremlins|*-goblins) vars+=("${repo#*-}") ;; | ||||
|     esac | ||||
|     vars+=("${ISO_VERSION}") | ||||
|     vars+=("${arch}") | ||||
| @@ -197,12 +197,10 @@ gen_iso_fn(){ | ||||
| prepare_build(){ | ||||
|     load_profile | ||||
|  | ||||
|     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" | ||||
|     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 | ||||
|  | ||||
|     iso_file=$(gen_iso_fn).iso | ||||
|  | ||||
| @@ -328,17 +326,21 @@ boot_only=false | ||||
| basestrap_args=(-GMc) | ||||
| cmd=${0##*/} | ||||
|  | ||||
| repo=${cmd##*-} | ||||
| repo=${REPO} | ||||
| 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 <repo>          Build repo\n' | ||||
|     printf '                       [default: %s]\n' "${repo}" | ||||
|     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' | ||||
| @@ -362,11 +364,13 @@ usage() { | ||||
|  | ||||
| orig_args=("$@") | ||||
|  | ||||
| opts='p:r:t:i:g:czsbxmdqh' | ||||
| opts='p:r:R:t:i:g:a:czsbxmdqh' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         p) profile="$OPTARG" ;; | ||||
|         a) arch="$OPTARG" ;; | ||||
|         R) repo="$OPTARG" ;; | ||||
|         r) chroots_iso="$OPTARG" ;; | ||||
|         t) ISO_POOL="$OPTARG" ;; | ||||
|         i) INITSYS="$OPTARG" ;; | ||||
|   | ||||
| @@ -56,6 +56,7 @@ chroot_mount_conditional() { | ||||
|  | ||||
| chroot_setup(){ | ||||
|     local mnt="$1" | ||||
|     local tmpfs_opts="${2:-mode=1777,strictatime,nodev,nosuid}" | ||||
|     chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && | ||||
|     chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && | ||||
|     chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && | ||||
| @@ -65,13 +66,13 @@ chroot_setup(){ | ||||
|     chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && | ||||
|     chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && | ||||
|     chroot_mount /run "$mnt/run" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid | ||||
|     chroot_mount tmp "$mnt/tmp" -t tmpfs -o "${tmpfs_opts}" | ||||
| } | ||||
|  | ||||
| chroot_api_mount() { | ||||
|     CHROOT_ACTIVE_MOUNTS=() | ||||
|     trap_setup chroot_api_umount | ||||
|     chroot_setup "$1" | ||||
|     chroot_setup "$1" "$2" | ||||
| } | ||||
|  | ||||
| chroot_api_umount() { | ||||
|   | ||||
| @@ -32,6 +32,10 @@ load_base_config(){ | ||||
|  | ||||
|     WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} | ||||
|  | ||||
|     ARCH=${ARCH:-"$(uname -m)"} | ||||
|  | ||||
|     REPO=${REPO:-'world'} | ||||
|  | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -34,7 +34,7 @@ prepare_initramfs_mkinitcpio() { | ||||
|     [[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf | ||||
|     k=$(<"$mnt"/usr/src/linux/version) | ||||
|  | ||||
|     read_from_list "${common_dir}/Packages-boot" | ||||
|     packages+=($(read_from_list "${common_dir}/Packages-boot")) | ||||
|     basestrap "${basestrap_args[@]}" "$mnt" "${packages[@]}" | ||||
|  | ||||
|     if [[ -n "${GPG_KEY}" ]]; then | ||||
|   | ||||
| @@ -13,13 +13,16 @@ artixpkg_admin_usage() { | ||||
|     Usage: ${COMMAND} [COMMAND] [OPTIONS] | ||||
|  | ||||
|     COMMANDS | ||||
|         transfer          Clone a package repository | ||||
|         transfer          Transfer obsolete repository to landfill | ||||
|         query             Query maintainers and topics | ||||
|  | ||||
|     OPTIONS | ||||
|         -h, --help     Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} transfer libfoo libbar | ||||
|         $ ${COMMAND} query --maintainer tux | ||||
|         $ ${COMMAND} query --topic kf5 | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -44,6 +47,14 @@ artixpkg_admin() { | ||||
|             artixpkg_admin_transfer "$@" | ||||
|             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 | ||||
|         ;; | ||||
|         -*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|         ;; | ||||
|   | ||||
							
								
								
									
										89
									
								
								src/lib/pkg/admin/query.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								src/lib/pkg/admin/query.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| #!/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 | ||||
|             ;; | ||||
|             --maintainer=*) | ||||
|                 MAINTAINER="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -t|--topic) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TOPIC="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --topic=*) | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             --) | ||||
|                 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 | ||||
|  | ||||
| } | ||||
| @@ -94,17 +94,10 @@ list_all_repos() { | ||||
|     local url | ||||
|     url="${GIT_HTTPS}/api/v1/orgs/${GIT_ORG}/repos?limit=10000" | ||||
|  | ||||
|     stat_busy "Query all packages" | ||||
|     api_get "$url" \ | ||||
|         -H "accept: application/json" | ||||
| } | ||||
|  | ||||
| list_topics() { | ||||
|     local url | ||||
|     local pkgbase="$1" | ||||
|     url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics" | ||||
|  | ||||
|     api_get "$url" \ | ||||
|         -H "accept: application/json" | ||||
|     stat_done | ||||
| } | ||||
|  | ||||
| add_topic() { | ||||
|   | ||||
| @@ -137,7 +137,6 @@ update_yaml_base() { | ||||
|     local name | ||||
|     local pkgnames | ||||
|     local arches | ||||
|     local pkgbase | ||||
|  | ||||
|     pkgbase="${pkgbase:-${pkgname}}" | ||||
|     version="$(get_full_version)" | ||||
| @@ -277,7 +276,8 @@ show_db() { | ||||
|     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(.value.name))' "${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" | ||||
|         ;; | ||||
|   | ||||
| @@ -20,15 +20,18 @@ artixpkg_git_clone_usage() { | ||||
|         -m, --maintainer=NAME      Clone all packages of the named maintainer | ||||
|         --protocol https           Clone the repository over https | ||||
|         -t, --topic=NAME           Clone all packages of the named topic | ||||
|         -a, --agent=NAME           Set the CI agent (default: official) | ||||
|                                    Possible values: [official, galaxy] | ||||
|         -j, --jobs N               Run up to N jobs in parallel (default: $(nproc)) | ||||
|         --universe                 Clone all existing packages, useful for cache warming | ||||
|         --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} --topic mytopic | ||||
|         $ ${COMMAND} -j 8 --topic mytopic | ||||
|         $ ${COMMAND} --agent galaxy libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -90,7 +93,16 @@ artixpkg_git_clone() { | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             --universe) | ||||
|             -a|--agent) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 CONFIGURE_OPTIONS+=("$1" "$2") | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --agent=*) | ||||
|                 CONFIGURE_OPTIONS+=("${1}") | ||||
|                 shift | ||||
|             ;; | ||||
|             --all) | ||||
|                 CLONE_ALL=1 | ||||
|                 shift | ||||
|             ;; | ||||
| @@ -115,24 +127,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 | ||||
|     fi | ||||
|  | ||||
|     if [[ -n ${TOPIC} ]]; then | ||||
|         stat_busy "Query topic packages" | ||||
|         mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort) | ||||
|         stat_done | ||||
|     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 | ||||
|     fi | ||||
|  | ||||
|     # parallelization | ||||
|   | ||||
| @@ -7,14 +7,17 @@ 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(){ | ||||
|     [[ -d .artixlinux ]] || mkdir .artixlinux | ||||
|     if [[ ${AGENT} == ${ARTIX_DB[11]} ]]; then | ||||
|         printf "@Library('artix-ci@${AGENT}') import org.artixlinux.RepoPackage\n" > "${REPO_CI}" | ||||
|     else | ||||
|         printf "@Library('artix-ci') import org.artixlinux.RepoPackage\n" > "${REPO_CI}" | ||||
|     fi | ||||
|     { | ||||
|         printf '\n' | ||||
|         printf 'PackagePipeline(new RepoPackage(this))\n' | ||||
| @@ -31,14 +34,17 @@ artixpkg_git_config_usage() { | ||||
|  | ||||
|     OPTIONS | ||||
|         -m, --maintainer       Set the maintainer topic via gitea api | ||||
|         -u, --upstream         Add upstream arch remote | ||||
|         -d, --drop             Drop the maintainer topic via gitea api | ||||
|         -a, --agent=NAME       Set the CI agent (default: official) | ||||
|                                Possible values: [official, galaxy] | ||||
|         --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} --maintainer libfoo | ||||
|         $ ${COMMAND} --agent galaxy libfoo | ||||
|         $ ${COMMAND} --drop libfoo | ||||
|         $ ${COMMAND} * | ||||
| _EOF_ | ||||
| } | ||||
| @@ -102,10 +108,12 @@ artixpkg_git_config() { | ||||
|     local paths=() | ||||
|  | ||||
|     local SET_TOPIC=0 | ||||
|     local UPSTREAM=0 | ||||
|     local DROP_TOPIC=0 | ||||
|     local AGENT= | ||||
|     local CI_ADDED=0 | ||||
|  | ||||
|     # variables | ||||
|     local -r command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     local path realpath pkgbase | ||||
|     local PACKAGER GPGKEY packager_name packager_email | ||||
|  | ||||
| @@ -117,10 +125,21 @@ artixpkg_git_config() { | ||||
|         ;; | ||||
|         -m|--maintainer) | ||||
|             SET_TOPIC=1 | ||||
|             RUNCMD+=" -m" | ||||
|             shift | ||||
|         ;; | ||||
|         -u|--upstream) | ||||
|             UPSTREAM=1 | ||||
|         -d|--drop) | ||||
|             DROP_TOPIC=1 | ||||
|             RUNCMD+=" -d" | ||||
|             shift | ||||
|         ;; | ||||
|         -a|--agent) | ||||
|             (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|             AGENT="$2" | ||||
|             shift 2 | ||||
|         ;; | ||||
|         --agent=*) | ||||
|             AGENT="${1#*=}" | ||||
|             shift | ||||
|         ;; | ||||
|         --protocol=https) | ||||
| @@ -200,7 +219,7 @@ artixpkg_git_config() { | ||||
|         if [[ -n ${BOLD} ]]; then | ||||
|             export ARTOOLS_COLOR=always | ||||
|         fi | ||||
|         if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${paths[@]}"; then | ||||
|         if ! parallel --bar --jobs "${jobs}" "${RUNCMD}" ::: "${paths[@]}"; then | ||||
|             die 'Failed to configure some packages, please check the output' | ||||
|             exit 1 | ||||
|         fi | ||||
| @@ -254,24 +273,27 @@ artixpkg_git_config() { | ||||
|                     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}" | ||||
|  | ||||
|             if (( DROP_TOPIC )); then | ||||
|                 if [[ -n ${GIT_TOKEN} ]]; then | ||||
|                     local topic gitname | ||||
|                     topic="maintainer-${packager_name}" | ||||
|                     gitname=$(get_compliant_name "${pkgbase}") | ||||
|                     if ! remove_topic "${gitname}" "${topic}"; then | ||||
|                         warning "failed to drop the maintainer topic: ${topic}" | ||||
|                     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 | ||||
|                 CI_ADDED=1 | ||||
|             fi | ||||
|  | ||||
|             if [[ -n ${AGENT} ]] && (( ! CI_ADDED )); then | ||||
|                 msg "Switching ci support for [%s] ..." "${AGENT}" | ||||
|                 commit_ci | ||||
|             fi | ||||
|  | ||||
|             if [[ ! -f ${REPO_DB} ]]; then | ||||
|   | ||||
| @@ -20,7 +20,8 @@ artixpkg_git_create_usage() { | ||||
|  | ||||
|     OPTIONS | ||||
|         -c, --clone           Clone the Git repository after creation | ||||
|         -t, --team=NAME       Assign team name [default: world] | ||||
|         -t, --team=NAME       Assign team name (default: world) | ||||
|                               Possible values: [system, world, lib32, galaxy] | ||||
|         -h, --help            Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
| @@ -34,9 +35,15 @@ artixpkg_git_create() { | ||||
|     local pkgbase | ||||
|     local clone=0 | ||||
|     local config=0 | ||||
|     local TEAM='world' | ||||
|     local TEAM="${ARTIX_DB[5]}" | ||||
|     local AGENT=() | ||||
|  | ||||
|     local TEAMS=(system world lib32) | ||||
|     local TEAMS=( | ||||
|         "${ARTIX_DB[2]}" | ||||
|         "${ARTIX_DB[5]}" | ||||
|         "${ARTIX_DB[8]}" | ||||
|         "${ARTIX_DB[11]}" | ||||
|         ) | ||||
|     # variables | ||||
|     local path | ||||
|  | ||||
| @@ -101,10 +108,13 @@ artixpkg_git_create() { | ||||
|             fi | ||||
|             msg_success "Successfully created ${pkgbase}" | ||||
|         fi | ||||
|         if [[ ${TEAM} == ${ARTIX_DB[11]} ]]; then | ||||
|             AGENT+=(--agent="${TEAM}") | ||||
|         fi | ||||
|         if (( clone )); then | ||||
|             artixpkg_git_clone "${pkgbase}" | ||||
|             artixpkg_git_clone "${AGENT[@]}" "${pkgbase}" | ||||
|         elif (( config )); then | ||||
|             artixpkg_git_config | ||||
|             artixpkg_git_config "${AGENT[@]}" | ||||
|         fi | ||||
|  | ||||
|     done | ||||
|   | ||||
| @@ -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 | ||||
|  | ||||
|  | ||||
| @@ -20,14 +17,14 @@ artixpkg_git_pull_usage() { | ||||
|         -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_ | ||||
| } | ||||
|  | ||||
| @@ -73,7 +70,7 @@ artixpkg_git_pull() { | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             --universe) | ||||
|             --all) | ||||
|                 PULL_ALL=1 | ||||
|                 shift | ||||
|             ;; | ||||
| @@ -98,24 +95,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 | ||||
|     fi | ||||
|  | ||||
|     if [[ -n ${TOPIC} ]]; then | ||||
|         stat_busy "Query topic packages" | ||||
|         mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort) | ||||
|         stat_done | ||||
|     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 | ||||
|     fi | ||||
|  | ||||
|     # parallelization | ||||
|   | ||||
							
								
								
									
										128
									
								
								src/lib/pkg/git/push.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								src/lib/pkg/git/push.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | ||||
| #!/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 | ||||
|             ;; | ||||
|             --maintainer=*) | ||||
|                 MAINTAINER="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -t|--topic) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TOPIC="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --topic=*) | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -j|--jobs) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 jobs=$2 | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --) | ||||
|                 shift | ||||
|                 break | ||||
|             ;; | ||||
|             -*) | ||||
|                 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,45 @@ source "${LIBDIR}"/pkg/db/db.sh | ||||
| set -e | ||||
|  | ||||
|  | ||||
| check_pkgbuild_validity() { | ||||
|     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|     . ./PKGBUILD | ||||
|  | ||||
|     # 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 | ||||
| } | ||||
|  | ||||
| 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_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
|   | ||||
| @@ -10,31 +10,20 @@ 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 diff PKGBUILD | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -44,12 +33,14 @@ artixpkg_repo_import_usage() { | ||||
|     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,15 +55,34 @@ 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 '*.timer' | ||||
|         --exclude '*.socket' | ||||
|     ) | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
|         --switch=*) | ||||
|             --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 | ||||
| @@ -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,7 +124,15 @@ artixpkg_repo_import() { | ||||
|                     version="${TAG}" | ||||
|                 fi | ||||
|  | ||||
|                 stat_busy "Importing upstream changeset for ${version}" | ||||
|                 msg "Checking origin for changes" | ||||
|                 if has_changeset; then | ||||
|                     error "Remote changes detected! Please update (%s)" "${pkgbase}" | ||||
|                 fi | ||||
|  | ||||
|                 msg "Querying ${pkgbase} ..." | ||||
|                 if ! show_db; then | ||||
|                     warning "Could not query ${REPO_DB}" | ||||
|                 fi | ||||
|  | ||||
|                 git checkout "${version}" -b "${version}" &>/dev/null | ||||
|                 local temp | ||||
| @@ -125,11 +142,11 @@ artixpkg_repo_import() { | ||||
|                 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 | ||||
|  | ||||
|                 msg2 "Patching ${pkgbase} ..." | ||||
|                 patch_pkgbase "${pkgbase}" | ||||
|  | ||||
|                 stat_done | ||||
|             ) | ||||
|         fi | ||||
|  | ||||
|   | ||||
| @@ -84,9 +84,19 @@ artixpkg_repo_move() { | ||||
|                     die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                 fi | ||||
|  | ||||
|                 local commit_msg | ||||
|                 local commit_msg src_version dest_version | ||||
|                 commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}") | ||||
|  | ||||
|                 src_version=$(version_from_yaml "${SRC}") | ||||
|                 dest_version=$(version_from_yaml "${DEST}") | ||||
|  | ||||
|                 if [[ "$src_version" != null ]]; then | ||||
|  | ||||
|                     local ret | ||||
|                     ret=$(vercmp "$src_version" "$dest_version") | ||||
|  | ||||
|                     if (( ret > 0 )); then | ||||
|  | ||||
|                         update_yaml_move "${SRC}" "${DEST}" | ||||
|  | ||||
|                         if [[ -n $(git status --porcelain --untracked-files=no) ]]; then | ||||
| @@ -111,7 +121,22 @@ artixpkg_repo_move() { | ||||
|                             if ! show_db; then | ||||
|                                 warning "Could not query ${REPO_DB}" | ||||
|                             fi | ||||
|  | ||||
|                         fi | ||||
|  | ||||
|                     elif (( ret < 0 )); then | ||||
|  | ||||
|                         error "invalid move: version $src_version < $dest_version!" | ||||
|  | ||||
|                     else | ||||
|                         error "invalid move: version $src_version = $dest_version!" | ||||
|  | ||||
|                     fi | ||||
|  | ||||
|                 else | ||||
|                     error "invalid move: version $src_version!" | ||||
|                 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_ | ||||
|   | ||||
| @@ -22,6 +22,7 @@ usage() { | ||||
|     COMMANDS | ||||
|         repo      Pacman database modification for packge update, move etc | ||||
|         git       Manage Git packaging repositories and their configuration | ||||
|         admin     Managegement of topics and obsolete repos | ||||
|         version   Show artixpkg version information | ||||
|  | ||||
|     OPTIONS | ||||
|   | ||||
| @@ -16,22 +16,27 @@ source "${LIBDIR}"/base/chroot.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 '    -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 +44,41 @@ usage() { | ||||
|     exit "$1" | ||||
| } | ||||
|  | ||||
| opts='hcCNmr:d:' | ||||
| opts='hcCNmnr:d:a:' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         r) chroots_pkg="$OPTARG" ;; | ||||
|         d) repo="$OPTARG" ;; | ||||
|         a) arch="$OPTARG" ;; | ||||
|         c) create_first=true ;; | ||||
|         m) rebuild=true ;; | ||||
|         m) rebuild=true; repo=${repo%-*} ;; | ||||
|         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 [[ "${repo}" == lib32* ]]; then | ||||
|     base_packages+=('multilib-devel') | ||||
| 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" | ||||
| 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}" | ||||
| @@ -76,19 +87,19 @@ else | ||||
| 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 +125,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 \ | ||||
|   | ||||
| @@ -25,39 +25,64 @@ usage() { | ||||
|         OPTIONS | ||||
|             -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=/dev/null | ||||
|     source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" | ||||
| elif [[ -r "$HOME/.makepkg.conf" ]]; then | ||||
|     # shellcheck source=/dev/null | ||||
|     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 ;; | ||||
|             '') | ||||
| @@ -124,10 +153,16 @@ for _pkgname in "${pkgname[@]}"; do | ||||
|     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" | ||||
|         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" | ||||
|  | ||||
|   | ||||
							
								
								
									
										111
									
								
								src/pkg/ckchrootpkg.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								src/pkg/ckchrootpkg.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,111 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
|  | ||||
| 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}") | ||||
| 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:\/\//}" | ||||
| @@ -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,8 +61,7 @@ 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' | ||||
| @@ -71,15 +71,14 @@ usage() { | ||||
|     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/}" | ||||
| @@ -354,13 +351,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 +373,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 +405,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 +417,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 | ||||
|   | ||||
| @@ -36,5 +36,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