Compare commits

...

23 Commits

Author SHA1 Message Date
e415aa67b9 artools/0.33.x (#106)
All checks were successful
Artools shellcheck / lint (push) Successful in 51s
artixpkg:

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

buildpkg:

* new -e arg to export PACKAGER

new packagersign script

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

Reviewed-on: #97
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-12-20 19:48:18 +01:00
38284c5c14 artixpkg: improve remote changes checking and properly terminate if pull required 2023-12-03 01:14:43 +01:00
5e7decee42 artixpkg: delete .SRCINFO on add & move 2023-11-28 19:15:39 +01:00
dc606af137 Merge pull request 'artixpkg: don't import .SRCFILE' (#96) from Dudemanguy/artools:exclude-srcinfo into master
Reviewed-on: #96
2023-10-26 20:55:21 +02:00
5253f81f0a artixpkg: don't import .SRCFILE
We make no use of this, and there's no guarentee the .SRCFILE will
actually match the package. For example, systemd could be listed as a
dependency in here and unless the maintainer manually removes that
entry, it will be wrong. Just exclude it.
2023-10-26 13:50:49 -05:00
00ed72f96e topics-admin (#95)
Reviewed-on: #95
Co-authored-by: Artoo <artoo@artixlinux.org>
Co-committed-by: Artoo <artoo@artixlinux.org>
2023-10-02 22:45:33 +02:00
70839d8609 artixpkg: don't use pager with git diff 2023-09-27 22:28:17 +02:00
66 changed files with 2532 additions and 888 deletions

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

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

2
.gitignore vendored
View File

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

View File

@@ -1,6 +1,6 @@
SHELL=/bin/bash
V=0.31
V=0.33
BUILDTOOLVER ?= $(V)
CHROOTVER=0.12
@@ -32,17 +32,19 @@ MAKEPKG_CONFIGS=$(wildcard config/makepkg/*)
PACMAN_CONFIGS=$(wildcard config/pacman/*)
SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*)
TOOLS_CONFIGS_BASE=$(wildcard config/conf/*base*)
TOOLS_CONFIGS_PKG=$(wildcard config/conf/*pkg*)
TOOLS_CONFIGS_ISO=$(wildcard config/conf/*iso*)
all: binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso
COMPLETIONS = $(addprefix $(BUILDDIR)/,$(patsubst %.in,%,$(wildcard contrib/completion/*/*)))
all: binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso completion
binprogs_base: $(BINPROGS_BASE)
binprogs_pkg: $(BINPROGS_PKG)
binprogs_iso: $(BINPROGS_ISO)
library_base: $(LIBRARY_BASE)
library_pkg: $(LIBRARY_PKG)
library_iso: $(LIBRARY_ISO)
completion: $(COMPLETIONS)
edit = sed -e "s|@datadir[@]|$(DATADIR)|g" \
-e "s|@libdir[@]|$(LIBDIR)|g" \
@@ -70,10 +72,11 @@ $(eval $(call buildInScript,build/bin,src/pkg/,.in,755))
$(eval $(call buildInScript,build/bin,src/iso/,.in,755))
$(eval $(call buildInScript,build/lib,src/lib/,,644))
$(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,.in,444)))
conf_base:
@install -d $(BUILDDIR)/pacman.conf.d $(BUILDDIR)/artools
@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d
@cp -a $(TOOLS_CONFIGS_BASE) $(BUILDDIR)/artools
conf_pkg:
@install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/artools
@@ -95,8 +98,6 @@ install_base: binprogs_base
install -dm0755 $(DESTDIR)$(LIBDIR)
cp -ra $(BUILDDIR)/lib/base $(DESTDIR)$(LIBDIR)
for conf in $(notdir $(TOOLS_CONFIGS_BASE)); do install -Dm0644 $(BUILDDIR)/$(TOOLS)/$$conf $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)/$${conf##*/}; done
for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
install_pkg: binprogs_pkg
@@ -114,6 +115,8 @@ install_pkg: binprogs_pkg
for a in $(SETARCH_ALIASES); do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done
ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides
install -Dm0644 $(BUILDDIR)/contrib/completion/bash/$(TOOLS) $(DESTDIR)$(PREFIX)/share/bash-completion/completions/$(TOOLS)
install_iso: binprogs_iso
install -dm0755 $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
install -dm0755 $(DESTDIR)$(PREFIX)/bin
@@ -148,5 +151,5 @@ dist:
check: $(BINPROGS_SRC_BASE) $(BINPROGS_SRC_PKG) $(BINPROGS_SRC_ISO) config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto
shellcheck -x $^
.PHONY: all binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso clean install install_base install_pkg install_iso uninstall dist check
.PHONY: all binprogs_base binprogs_pkg binprogs_iso library_base library_pkg library_iso conf_base conf_pkg conf_iso clean install install_base install_pkg install_iso uninstall dist check contrib
.DELETE_ON_ERROR:

View File

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

View File

@@ -1,20 +0,0 @@
#!/hint/bash
# shellcheck disable=2034
#############################################
################ artools-base ###############
#############################################
# build dir where buildpkg or buildiso chroots are created
# CHROOTS_DIR=/var/lib/artools
# the workspace directory
# WORKSPACE_DIR="${USER_HOME}/artools-workspace"
# the arch to build
# ARCH=$(uname -m)
# default pacman.conf repos to include
# possible buildpkg values: {system,world,galaxy,lib32}{-gremlins,-goblins}
# possible buildiso values: {world,galaxy}{-gremlins,-goblins}
# REPO="world"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,48 +0,0 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
#{{{ base conf
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p "$1"
return 0
}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
prepare_dir "${USER_CONF_DIR}"
load_base_config(){
local conf="$1/artools-base.conf"
[[ -f "$conf" ]] || return 1
# shellcheck source=config/conf/artools-base.conf
[[ -r "$conf" ]] && source "$conf"
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"}
ARCH=${ARCH:-"$(uname -m)"}
REPO=${REPO:-'world'}
return 0
}
#}}}
load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}"
prepare_dir "${WORKSPACE_DIR}"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -4,6 +4,21 @@
#{{{ iso conf
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p "$1"
return 0
}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
prepare_dir "${USER_CONF_DIR}"
load_iso_config(){
local conf="$1/artools-iso.conf"
@@ -13,6 +28,14 @@ load_iso_config(){
# shellcheck source=config/conf/artools-iso.conf
[[ -r "$conf" ]] && source "$conf"
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"}
ARCH=${ARCH:-"$(uname -m)"}
STABILITY=${STABILITY:-'stable'}
ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"}
ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"}

View File

@@ -5,6 +5,10 @@
[[ -z ${ARTOOLS_INCLUDE_ADMIN_SH:-} ]] || return 0
ARTOOLS_INCLUDE_ADMIN_SH=1
# shellcheck source=src/lib/pkg/db/db.sh
source "${LIBDIR}"/pkg/db/db.sh
set -e
artixpkg_admin_usage() {
@@ -13,8 +17,10 @@ artixpkg_admin_usage() {
Usage: ${COMMAND} [COMMAND] [OPTIONS]
COMMANDS
transfer Transfer obsolete repository to landfill
query Query maintainers and topics
team Manage repo team
topic Manage topics
transfer Transfer obsolete repository to landfill
OPTIONS
-h, --help Show this help text
@@ -39,14 +45,7 @@ artixpkg_admin() {
artixpkg_admin_usage
exit 0
;;
transfer)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/transfer.sh
source "${LIBDIR}"/pkg/admin/transfer.sh
artixpkg_admin_transfer "$@"
exit 0
;;
query)
_ARTOOLS_COMMAND+=" $1"
shift
@@ -55,6 +54,30 @@ artixpkg_admin() {
artixpkg_admin_query "$@"
exit 0
;;
team)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/team.sh
source "${LIBDIR}"/pkg/admin/team.sh
artixpkg_admin_team "$@"
exit 0
;;
topic)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/query.sh
source "${LIBDIR}"/pkg/admin/topic.sh
artixpkg_admin_topic "$@"
exit 0
;;
transfer)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/transfer.sh
source "${LIBDIR}"/pkg/admin/transfer.sh
artixpkg_admin_transfer "$@"
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;

View File

@@ -14,8 +14,8 @@ artixpkg_admin_query_usage() {
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-m, --maintainer=NAME Query for packages of the named maintainer
-t, --topic=NAME Query for packages of the named topic
-m, --maintainer NAME Query for packages of the named maintainer
-t, --topic NAME Query for packages of the named topic
-h, --help Show this help text
EXAMPLES
@@ -47,19 +47,11 @@ artixpkg_admin_query() {
MAINTAINER="$2"
shift 2
;;
--maintainer=*)
MAINTAINER="${1#*=}"
shift
;;
-t|--topic)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TOPIC="$2"
shift 2
;;
--topic=*)
TOPIC="${1#*=}"
shift
;;
--)
shift
break

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

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

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

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

View File

@@ -60,7 +60,10 @@ artixpkg_admin_transfer() {
if [[ -n ${GIT_TOKEN} ]]; then
for pkgbase in "${pkgbases[@]}"; do
transfer_repo "${pkgbase}" "${waste_org}"
local gitname
gitname=$(get_compliant_name "${pkgbase}")
transfer_repo "${gitname}" "${waste_org}"
done
fi
}

View File

@@ -37,7 +37,7 @@ add_team_to_repo() {
local pkgbase="$1"
local team="$2"
local url
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/teams/$team"
url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team"
stat_busy "Adding team ($team) to package repo [$pkgbase]"
api_put "$url" \
@@ -50,7 +50,7 @@ remove_team_from_repo() {
local pkgbase="$1"
local team="$2"
local url
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/teams/$team"
url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team"
stat_busy "Removing team ($team) from package repo [$pkgbase]"
api_delete "$url" \
@@ -62,7 +62,7 @@ remove_team_from_repo() {
create_repo() {
local pkgbase="$1"
local url json
url="${GIT_HTTPS}/api/v1/org/${GIT_ORG}/repos"
url="${API_URL}/org/${GIT_ORG}/repos"
json="{ \"auto_init\": true, \"name\": \"$pkgbase\", \"gitignores\": \"ArtixLinuxPackages\", \"readme\": \"Default\" }"
stat_busy "Create package repo [$pkgbase] in org (${GIT_ORG})"
@@ -79,7 +79,7 @@ transfer_repo() {
local new_owner="$2"
local json url
json="{ \"new_owner\": \"$new_owner\", \"team_ids\": [] }"
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/transfer"
url="${API_URL}/repos/${GIT_ORG}/$pkgbase/transfer"
stat_busy "Transfer package repo [$pkgbase] in org ($new_owner)"
api_post "$url" \
@@ -92,7 +92,7 @@ transfer_repo() {
list_all_repos() {
local url
url="${GIT_HTTPS}/api/v1/orgs/${GIT_ORG}/repos?limit=10000"
url="${API_URL}/orgs/${GIT_ORG}/repos?limit=10000"
stat_busy "Query all packages"
api_get "$url" \
@@ -104,7 +104,7 @@ add_topic() {
local url
local pkgbase="$1"
local topic="$2"
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics/$topic"
url="${API_URL}/repos/${GIT_ORG}/$pkgbase/topics/$topic"
stat_busy "Add topic ($topic) to [$pkgbase]"
api_put "$url" \
@@ -117,7 +117,7 @@ remove_topic() {
local url
local pkgbase="$1"
local topic="$2"
url="${GIT_HTTPS}/api/v1/repos/${GIT_ORG}/$pkgbase/topics/$topic"
url="${API_URL}/repos/${GIT_ORG}/$pkgbase/topics/$topic"
stat_busy "Remove topic ($topic) from [$pkgbase]"
api_delete "$url" \
@@ -128,8 +128,10 @@ remove_topic() {
search_topic() {
local search="$1"
local url
url="${GIT_HTTPS}/api/v1/repos/search?q=${search}&topic=true&includeDesc=false&private=false&is_private=false&template=false&archived=false&order=asc&limit=10000"
local url args
args="topic=true&includeDesc=false&private=false&is_private=false"
args+="&template=false&archived=false&order=asc&limit=10000"
url="${API_URL}/repos/search?q=${search}&${args}"
stat_busy "Query for topic (${search})"
api_get "$url" \
@@ -137,4 +139,29 @@ search_topic() {
stat_done
}
list_repo_teams() {
local pkgbase="$1"
local url
url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams"
stat_busy "List repo teams [$pkgbase]"
api_get "$url" \
-H 'accept: application/json' \
-H "Authorization: token ${GIT_TOKEN}"
stat_done
}
check_repo_team() {
local pkgbase="$1"
local team="$2"
local url
url="${API_URL}/repos/${GIT_ORG}/$pkgbase/teams/$team"
stat_busy "Check if team ($team) is assigned to [$pkgbase]"
api_get "$url" \
-H 'accept: application/json' \
-H "Authorization: token ${GIT_TOKEN}"
stat_done
}
#}}}

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

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

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

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

View File

@@ -17,6 +17,24 @@ readonly ARTIX_DB=(
galaxy
)
readonly ARTIX_DB_MAP=(
goblins
gremlins
stable
)
readonly ARTIX_TEAMS=(
"${ARTIX_DB[2]}"
"${ARTIX_DB[5]}"
"${ARTIX_DB[8]}"
"${ARTIX_DB[11]}"
)
readonly AGENTS=(
orion
taurus
)
readonly REPO_DB='.artixlinux/pkgbase.yaml'
readonly REPO_CI='.artixlinux/Jenkinsfile'
@@ -100,6 +118,8 @@ create_repo_db() {
yq -n '"---"' > "${REPO_DB}"
yq -P '.team = null' -i "${REPO_DB}"
yq -P 'with(
.pkgbase;
.name = null |
@@ -132,6 +152,31 @@ create_repo_db() {
done
}
has_repos_map_key() {
local _r="$1"
local r
if ! $(r="$_r" yq -r '.repos | has(strenv(r))' "${REPO_DB}"); then
return 1
fi
return 0
}
delete_obsolete_map_keys() {
local _r
for r in asteroids{-goblins,-gremlins,}; do
if $(_r="$r" yq -r '.repos | has(strenv(_r))' "${REPO_DB}"); then
local repo
repo=".repos.${r}" \
yq 'del(eval(strenv(repo)))' -i "${REPO_DB}"
fi
done
}
update_yaml_team() {
local team="${1:-${ARTIX_DB[5]}}"
team="$team" yq -P '.team = env(team)' -i "${REPO_DB}"
}
update_yaml_base() {
local version
local name
@@ -272,11 +317,38 @@ update_yaml_move() {
-i "${REPO_DB}"
}
show_agent() {
local agent="${AGENTS[0]}"
if grep @${AGENTS[1]} "${REPO_CI}" &>/dev/null; then
agent="${AGENTS[1]}"
fi
msg2 "agent: %s" "$agent"
}
team_from_yaml() {
local team
team=$(yq -rP '.team' "${REPO_DB}")
printf "$team"
}
auto_detect() {
local team
for repo in "${ARTIX_TEAMS[@]}"; do
local _r res
res=$(_r=".$repo" yq -rP '.repos | eval(strenv(_r)) | .version' "${REPO_DB}")
if [[ "${res}" != "null" ]]; then
team=${repo}
fi
done
printf "%s\n" "$team"
}
show_db() {
if ! yq -r ${REPO_DB} 1>/dev/null 2>/dev/null; then
show_agent
if ! yq -r "${REPO_DB}" 1>/dev/null 2>/dev/null; then
die "${REPO_DB} invalid!"
fi
yq -rP '. | with_entries(select(.value.name))' "${REPO_DB}"
yq -rP 'with_entries(select(.key == "team" or .key == "pkgbase"))' "${REPO_DB}"
yq -rP '. | .repos | with_entries(select(.value.version))' "${REPO_DB}"
return 0
}

View File

@@ -7,6 +7,10 @@ ARTOOLS_INCLUDE_GIT_CLONE_SH=1
# shellcheck source=src/lib/pkg/git/config.sh
source "${LIBDIR}"/pkg/git/config.sh
# shellcheck source=src/lib/pkg/ci/config.sh
source "${LIBDIR}"/pkg/ci/config.sh
# shellcheck source=src/lib/pkg/admin/team.sh
source "${LIBDIR}"/pkg/admin/team.sh
set -e
@@ -17,21 +21,23 @@ artixpkg_git_clone_usage() {
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-m, --maintainer=NAME Clone all packages of the named maintainer
--protocol https Clone the repository over https
-t, --topic=NAME Clone all packages of the named topic
-a, --agent=NAME Set the CI agent (default: official)
Possible values: [official, galaxy]
-m, --maintainer NAME Clone all packages of the named maintainer
-s, --search TOPIC Clone all packages of the named topic
-a, --agent NAME Set the CI agent (default: ${AGENTS[0]})
Possible values: $(yaml_array ${AGENTS[@]})
-t, --team NAME Assign team name (default: ${ARTIX_TEAMS[1]})
Possible values: $(yaml_array ${ARTIX_TEAMS[@]})
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
--protocol https Clone the repository over https
--all Clone all existing packages, useful for cache warming
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} libfoo linux libbar
$ ${COMMAND} --maintainer tux
$ ${COMMAND} --topic mytopic
$ ${COMMAND} -j 8 --topic mytopic
$ ${COMMAND} --agent galaxy libfoo
$ ${COMMAND} --search mytopic
$ ${COMMAND} -j 8 --search mytopic
$ ${COMMAND} --agent ${AGENTS[1]} libfoo
_EOF_
}
@@ -48,7 +54,9 @@ artixpkg_git_clone() {
local CLONE_ALL=0
local MAINTAINER=
local TOPIC=
local CONFIGURE_OPTIONS=()
local CONFIG_OPTS=()
local AGENT_OPTS=()
local TEAM_OPTS=()
local jobs=
jobs=$(nproc)
@@ -62,7 +70,7 @@ artixpkg_git_clone() {
;;
--protocol=https)
GIT_REPO_BASE_URL="${GIT_HTTPS}/"
CONFIGURE_OPTIONS+=("$1")
CONFIG_OPTS+=("$1")
shift
;;
--protocol)
@@ -72,7 +80,7 @@ artixpkg_git_clone() {
else
die "unsupported protocol: %s" "$2"
fi
CONFIGURE_OPTIONS+=("$1" "$2")
CONFIG_OPTS+=("$1" "$2")
shift 2
;;
-m|--maintainer)
@@ -80,28 +88,21 @@ artixpkg_git_clone() {
MAINTAINER="$2"
shift 2
;;
--maintainer=*)
MAINTAINER="${1#*=}"
shift
;;
-t|--topic)
-s|--search)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TOPIC="$2"
shift 2
;;
--topic=*)
TOPIC="${1#*=}"
shift
-t|--team)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TEAM_OPTS=("--add" "$2")
shift 2
;;
-a|--agent)
(( $# <= 1 )) && die "missing argument for %s" "$1"
CONFIGURE_OPTIONS+=("$1" "$2")
AGENT_OPTS=("$1" "$2")
shift 2
;;
--agent=*)
CONFIGURE_OPTIONS+=("${1}")
shift
;;
--all)
CLONE_ALL=1
shift
@@ -167,6 +168,8 @@ artixpkg_git_clone() {
warning "Skip cloning ${pkgbase}: Directory exists"
fi
artixpkg_git_config "${CONFIGURE_OPTIONS[@]}" "${pkgbase}"
artixpkg_git_config "${CONFIG_OPTS[@]}" "${pkgbase}"
artixpkg_ci_config "${AGENT_OPTS[@]}" "${pkgbase}"
artixpkg_admin_team "${TEAM_OPTS[@]}" "${pkgbase}"
done
}

View File

@@ -5,46 +5,20 @@
[[ -z ${ARTOOLS_INCLUDE_GIT_CONFIG_SH:-} ]] || return 0
ARTOOLS_INCLUDE_GIT_CONFIG_SH=1
# shellcheck source=src/lib/pkg/db/db.sh
source "${LIBDIR}"/pkg/db/db.sh
set -e
commit_ci(){
[[ -d .artixlinux ]] || mkdir .artixlinux
if [[ ${AGENT} == ${ARTIX_DB[11]} ]]; then
printf "@Library('artix-ci@${AGENT}') import org.artixlinux.RepoPackage\n" > "${REPO_CI}"
else
printf "@Library('artix-ci') import org.artixlinux.RepoPackage\n" > "${REPO_CI}"
fi
{
printf '\n'
printf 'PackagePipeline(new RepoPackage(this))\n'
} >> "${REPO_CI}"
git add "${REPO_CI}"
git commit -m "initial ci commit"
}
artixpkg_git_config_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-m, --maintainer Set the maintainer topic via gitea api
-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} --maintainer libfoo
$ ${COMMAND} --agent galaxy libfoo
$ ${COMMAND} --drop libfoo
$ ${COMMAND} *
_EOF_
}
@@ -107,13 +81,8 @@ artixpkg_git_config() {
jobs=$(nproc)
local paths=()
local SET_TOPIC=0
local DROP_TOPIC=0
local AGENT=
local CI_ADDED=0
# variables
local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local path realpath pkgbase
local PACKAGER GPGKEY packager_name packager_email
@@ -123,25 +92,6 @@ artixpkg_git_config() {
artixpkg_git_config_usage
exit 0
;;
-m|--maintainer)
SET_TOPIC=1
RUNCMD+=" -m"
shift
;;
-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)
proto_force=1
shift
@@ -186,7 +136,7 @@ artixpkg_git_config() {
# Load makepkg.conf variables to be available for packager identity
msg "Collecting packager identity from makepkg.conf"
# shellcheck disable=2119
# shellcheck source=config/makepkg/x86_64.conf
load_makepkg_config
if [[ -n ${PACKAGER} ]]; then
if ! packager_name=$(get_packager_name "${PACKAGER}") || \
@@ -219,7 +169,7 @@ artixpkg_git_config() {
if [[ -n ${BOLD} ]]; then
export ARTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${RUNCMD}" ::: "${paths[@]}"; then
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${paths[@]}"; then
die 'Failed to configure some packages, please check the output'
exit 1
fi
@@ -262,58 +212,6 @@ artixpkg_git_config() {
git config user.signingKey "${GPGKEY}"
fi
# topics meta
if (( SET_TOPIC )); then
if [[ -n ${GIT_TOKEN} ]]; then
local topic gitname
topic="maintainer-${packager_name}"
gitname=$(get_compliant_name "${pkgbase}")
if ! add_topic "${gitname}" "${topic}"; then
warning "failed to set the maintainer topic: ${topic}"
fi
fi
fi
if (( 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
fi
if [[ ! -f ${REPO_CI} ]]; then
msg "Adding ci support ..."
commit_ci
CI_ADDED=1
fi
if [[ -n ${AGENT} ]] && (( ! CI_ADDED )); then
msg "Switching ci support for [%s] ..." "${AGENT}"
commit_ci
fi
if [[ ! -f ${REPO_DB} ]]; then
msg "Creating repo db ..."
create_repo_db
if [[ -f PKGBUILD ]]; then
# shellcheck source=contrib/makepkg/PKGBUILD.proto
source PKGBUILD
update_yaml_base
fi
git add "${REPO_DB}"
git commit -m "Create repo db"
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
)
done
}

View File

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

View File

@@ -14,8 +14,8 @@ artixpkg_git_pull_usage() {
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-m, --maintainer=NAME Pull all packages of the named maintainer
-t, --topic=NAME Pull all packages of the named topic
-m, --maintainer NAME Pull all packages of the named maintainer
-t, --topic NAME Pull all packages of the named topic
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
--all Pull all existing packages
-h, --help Show this help text
@@ -57,19 +57,11 @@ artixpkg_git_pull() {
MAINTAINER="$2"
shift 2
;;
--maintainer=*)
MAINTAINER="${1#*=}"
shift
;;
-t|--topic)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TOPIC="$2"
shift 2
;;
--topic=*)
TOPIC="${1#*=}"
shift
;;
--all)
PULL_ALL=1
shift
@@ -124,7 +116,7 @@ artixpkg_git_pull() {
for pkgbase in "${pkgbases[@]}"; do
if [[ -d ${pkgbase} ]]; then
( cd ${pkgbase} || return
( cd "${pkgbase}" || return
msg "Pulling ${pkgbase} ..."
if ! git pull origin master; then

View File

@@ -14,8 +14,8 @@ artixpkg_git_push_usage() {
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-m, --maintainer=NAME Push all packages of the named maintainer
-t, --topic=NAME Push all packages of the named topic
-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
@@ -55,19 +55,11 @@ artixpkg_git_push() {
MAINTAINER="$2"
shift 2
;;
--maintainer=*)
MAINTAINER="${1#*=}"
shift
;;
-t|--topic)
(( $# <= 1 )) && die "missing argument for %s" "$1"
TOPIC="$2"
shift 2
;;
--topic=*)
TOPIC="${1#*=}"
shift
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
@@ -113,7 +105,7 @@ artixpkg_git_push() {
for pkgbase in "${pkgbases[@]}"; do
if [[ -d ${pkgbase} ]]; then
( cd ${pkgbase} || return
( cd "${pkgbase}" || return
msg "Pushing ${pkgbase} ..."
if ! git push origin master; then

View File

@@ -11,39 +11,14 @@ 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(){
has_remote_changes() {
local status
msg "Checking for remote changes ..."
git fetch origin &>/dev/null
if [[ $(git rev-parse HEAD) != $(git rev-parse @{u}) ]]; then
status=$(git status -sb --porcelain)
if [[ "$status" == *behind* ]]; then
msg2 "changes: yes"
git status -sb
error "Remote changes detected! Please pull (%s)" "${pkgbase}"
return 0
fi
msg2 "changes: no"

View File

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

View File

@@ -23,10 +23,9 @@ patch_pkgbase(){
-i PKGBUILD
;;
esac
git diff PKGBUILD
git --no-pager diff PKGBUILD
}
artixpkg_repo_import_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
@@ -64,8 +63,9 @@ artixpkg_repo_import() {
--exclude '.gitignore'
--exclude 'README.md'
--exclude '*.service'
--exclude '*.timer'
--exclude '.SRCINFO'
--exclude '*.socket'
--exclude '*.timer'
)
while (( $# )); do
@@ -124,29 +124,26 @@ artixpkg_repo_import() {
version="${TAG}"
fi
msg "Checking origin for changes"
if has_changeset; then
error "Remote changes detected! Please update (%s)" "${pkgbase}"
if ! has_remote_changes; then
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
git checkout "${version}" -b "${version}" &>/dev/null
local temp
temp=$(mktemp -d --tmpdir "${pkgbase}.XXXXXXXXXX")
rsync "${rsync_args[@]}" "$(pwd)"/ "${temp}"/ &>/dev/null
git checkout master &>/dev/null
git branch -D "${version}" &>/dev/null
msg "Importing upstream changeset for ${version}"
rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ #&>/dev/null
msg2 "Patching ${pkgbase} ..."
patch_pkgbase "${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
temp=$(mktemp -d --tmpdir "${pkgbase}.XXXXXXXXXX")
rsync "${rsync_args[@]}" "$(pwd)"/ "${temp}"/ &>/dev/null
git checkout master &>/dev/null
git branch -D "${version}" &>/dev/null
msg "Importing upstream changeset for ${version}"
rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ #&>/dev/null
msg2 "Patching ${pkgbase} ..."
patch_pkgbase "${pkgbase}"
)
fi

View File

@@ -14,12 +14,15 @@ artixpkg_repo_move_usage() {
Usage: ${COMMAND} [OPTIONS] [SOURCE_REPO] [DEST_REPO] [PKGBASE]...
OPTIONS
-p, --push Push pkgbase
-h, --help Show this help text
-m, --manual Disable auto repo
Possible auto values: $(yaml_array ${ARTIX_DB_MAP[@]})
-p, --push Push pkgbase
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} world-gremlins world libfoo
$ ${COMMAND} -p world-gremlins world libfoo
$ ${COMMAND} ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo
$ ${COMMAND} --push ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo
$ ${COMMAND} --auto --push ${ARTIX_DB_MAP[1]} ${ARTIX_DB_MAP[2]} libfoo
_EOF_
}
@@ -34,6 +37,7 @@ artixpkg_repo_move() {
local pkgbase
local PUSH=0
local AUTO=1
local DEST
local SRC
@@ -44,6 +48,10 @@ artixpkg_repo_move() {
artixpkg_repo_move_usage
exit 0
;;
-m|--manual)
AUTO=0
shift
;;
-p|--push)
PUSH=1
shift
@@ -61,11 +69,20 @@ artixpkg_repo_move() {
DEST="$2"
shift 2
if ! in_array "${SRC}" "${ARTIX_DB[@]}"; then
die "${SRC} does not exist!"
fi
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!"
if (( AUTO )); then
if ! in_array "${SRC}" "${ARTIX_DB_MAP[@]}"; then
die "${SRC} does not exist!"
fi
if ! in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
die "${DEST} does not exist!"
fi
else
if ! in_array "${SRC}" "${ARTIX_DB[@]}"; then
die "${SRC} does not exist!"
fi
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!"
fi
fi
pkgbases+=("$@")
@@ -80,25 +97,51 @@ artixpkg_repo_move() {
fi
( cd "${pkgbase}" || return
if [[ ! -f PKGBUILD ]]; then
die "No PKGBUILD found in (%s)" "${pkgbase}"
fi
if ! has_remote_changes; then
local commit_msg src_version dest_version
commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}")
if [[ ! -f PKGBUILD ]]; then
die "No PKGBUILD found in (%s)" "${pkgbase}"
fi
src_version=$(version_from_yaml "${SRC}")
dest_version=$(version_from_yaml "${DEST}")
local auto
auto=$(auto_detect)
if [[ "$src_version" != null ]]; then
if [[ -z "${auto}" ]]; then
auto=$(team_from_yaml)
fi
local ret
ret=$(vercmp "$src_version" "$dest_version")
if (( AUTO )); then
if [[ "${SRC}" == "${ARTIX_DB_MAP[2]}" ]]; then
SRC="${auto}"
else
SRC="${auto}-${SRC}"
fi
if (( ret > 0 )); then
if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then
DEST="${auto}"
else
DEST="${auto}-${DEST}"
fi
fi
local commit_msg src_version
commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}")
src_version=$(version_from_yaml "${SRC}")
if [[ "$src_version" != "null" ]]; then
update_yaml_move "${SRC}" "${DEST}"
if [[ -f .SRCINFO ]]; then
rm .SRCINFO
fi
delete_obsolete_map_keys
update_yaml_team "$(auto_detect)"
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
@@ -124,17 +167,55 @@ artixpkg_repo_move() {
fi
elif (( ret < 0 )); then
if (( ! AUTO )); then
error "invalid move: version $src_version < $dest_version!"
local gitname
gitname=$(get_compliant_name "${pkgbase}")
# team change on cross repo move system <-> world
if [[ "${SRC}" == ${ARTIX_DB[2]}* ]] \
&& [[ "${DEST}" == ${ARTIX_DB[5]}* ]]; then
if ! add_team_to_repo "${pkgbase}" "${ARTIX_DB[5]}"; then
warning "failed to add team: ${ARTIX_DB[5]}"
fi
if ! remove_team_from_repo "${pkgbase}" "${ARTIX_DB[2]}"; then
warning "failed to remove team: ${ARTIX_DB[2]}"
fi
elif [[ "${SRC}" == ${ARTIX_DB[5]}* ]] \
&& [[ "${DEST}" == ${ARTIX_DB[2]}* ]]; then
if ! add_team_to_repo "${pkgbase}" "${ARTIX_DB[2]}"; then
warning "failed to add team: ${ARTIX_DB[2]}"
fi
if ! remove_team_from_repo "${pkgbase}" "${ARTIX_DB[5]}"; then
warning "failed to remove team: ${ARTIX_DB[5]}"
fi
fi
# team change on cross repo move world <-> galaxy
if [[ "${SRC}" == ${ARTIX_DB[11]}* ]] \
&& [[ "${DEST}" == ${ARTIX_DB[5]}* ]]; then
if ! add_team_to_repo "${gitname}" "${ARTIX_DB[5]}"; then
warning "failed to add team: ${ARTIX_DB[5]}"
fi
if ! remove_team_from_repo "${gitname}" "${ARTIX_DB[11]}"; then
warning "failed to remove team: ${ARTIX_DB[11]}"
fi
elif [[ "${SRC}" == ${ARTIX_DB[5]}* ]] \
&& [[ "${DEST}" == ${ARTIX_DB[11]}* ]]; then
if ! add_team_to_repo "${gitname}" "${ARTIX_DB[11]}"; then
warning "failed to add team: ${ARTIX_DB[11]}"
fi
if ! remove_team_from_repo "${gitname}" "${ARTIX_DB[5]}"; then
warning "failed to remove team: ${ARTIX_DB[5]}"
fi
fi
fi
else
error "invalid move: version $src_version = $dest_version!"
error "${pkgbase}: invalid move: version $src_version!"
fi
else
error "invalid move: version $src_version!"
fi
)

View File

@@ -14,12 +14,15 @@ artixpkg_repo_remove_usage() {
Usage: ${COMMAND} [OPTIONS] [DEST_REPO] [PKGBASE]...
OPTIONS
-p, --push Push pkgbase
-h, --help Show this help text
-m, --manual Disable auto repo
Possible auto values: $(yaml_array ${ARTIX_DB_MAP[@]})
-p, --push Push pkgbase
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} world-gremlins libfoo
$ ${COMMAND} -p world-gremlins libfoo
$ ${COMMAND} ${ARTIX_DB[4]} libfoo
$ ${COMMAND} --push ${ARTIX_DB[4]} libfoo
$ ${COMMAND} --auto --push ${ARTIX_DB_MAP[2]} libfoo
_EOF_
}
@@ -34,6 +37,7 @@ artixpkg_repo_remove() {
local pkgbase
local PUSH=0
local AUTO=1
local DEST=''
while (( $# )); do
@@ -42,6 +46,10 @@ artixpkg_repo_remove() {
artixpkg_repo_remove_usage
exit 0
;;
-m|--manual)
AUTO=0
shift
;;
-p|--push)
PUSH=1
shift
@@ -59,8 +67,14 @@ artixpkg_repo_remove() {
shift
pkgbases=("$@")
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!"
if (( AUTO )); then
if ! in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
die "${DEST} does not exist!"
fi
else
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!"
fi
fi
for pkgbase in "${pkgbases[@]}"; do
@@ -73,36 +87,57 @@ artixpkg_repo_remove() {
fi
( cd "${pkgbase}" || return
if [[ ! -f PKGBUILD ]]; then
die "No PKGBUILD found in (%s)" "${pkgbase}"
fi
if ! has_remote_changes; then
local commit_msg
commit_msg=$(get_commit_msg 'remove' "${DEST}")
update_yaml_remove "${DEST}"
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
for f in $(git ls-files --modified); do
if [[ "$f" == "${REPO_DB}" ]]; then
git add "$f"
fi
done
stat_done
msg 'Commit'
git commit -m "${commit_msg}"
if (( PUSH )); then
msg "Push (${pkgbase})"
git push origin master
if [[ ! -f PKGBUILD ]]; then
die "No PKGBUILD found in (%s)" "${pkgbase}"
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
local auto
auto=$(auto_detect)
if [[ -z "${auto}" ]]; then
auto=$(team_from_yaml)
fi
if (( AUTO )); then
if [[ "${DEST}" == "${ARTIX_DB_MAP[2]}" ]]; then
DEST="${auto}"
else
DEST="${auto}-${DEST}"
fi
fi
local commit_msg
commit_msg=$(get_commit_msg 'remove' "${DEST}")
update_yaml_remove "${DEST}"
delete_obsolete_map_keys
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
for f in $(git ls-files --modified); do
if [[ "$f" == "${REPO_DB}" ]]; then
git add "$f"
fi
done
stat_done
msg 'Commit'
git commit -m "${commit_msg}"
if (( PUSH )); then
msg "Push (${pkgbase})"
git push origin master
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
fi
fi

View File

@@ -72,28 +72,25 @@ artixpkg_repo_show() {
fi
( cd "${pkgbase}" || return
msg "Checking origin for changes"
if has_changeset; then
warning "Remote changes detected! Please update (%s)" "${pkgbase}"
fi
if ! has_remote_changes; then
if [[ ! -f PKGBUILD ]]; then
die "No PKGBUILD found in (%s)" "${pkgbase}"
fi
if [[ ! -f PKGBUILD ]]; then
die "No PKGBUILD found in (%s)" "${pkgbase}"
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
msg "Querying ${pkgbase} ..."
if ! show_db; then
warning "Could not query ${REPO_DB}"
fi
if (( SRC_BASE )); then
msg "Showing srcinfo base ..."
show_srcinfo_base
fi
if (( SRC_BASE )); then
msg "Showing srcinfo base ..."
show_srcinfo_base
fi
if (( SRC_PKGS )); then
msg "Showing srcinfo pkgs ..."
show_srcinfo_pkgs
if (( SRC_PKGS )); then
msg "Showing srcinfo pkgs ..."
show_srcinfo_pkgs
fi
fi
)

View File

@@ -4,6 +4,21 @@
#{{{ pkg conf
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p "$1"
return 0
}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
prepare_dir "${USER_CONF_DIR}"
load_pkg_config(){
local conf="$1/artools-pkg.conf"
@@ -13,10 +28,20 @@ load_pkg_config(){
# shellcheck source=config/conf/artools-pkg.conf
[[ -r "$conf" ]] && source "$conf"
local git_domain="gitea.artixlinux.org"
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"}
ARCH=${ARCH:-"$(uname -m)"}
REPO=${REPO:-'world'}
local -r git_domain="gitea.artixlinux.org"
GIT_HTTPS=${GIT_HTTPS:-"https://${git_domain}"}
readonly API_URL="${GIT_HTTPS}/api/v1"
GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"}
GIT_TOKEN=${GIT_TOKEN:-''}

View File

@@ -20,9 +20,10 @@ usage() {
Usage: ${COMMAND} [COMMAND] [OPTIONS]
COMMANDS
repo Pacman database modification for packge update, move etc
repo Pacman database modification for package updates, moves, etc.
git Manage Git packaging repositories and their configuration
admin Managegement of topics and obsolete repos
agent Manage CI and build agent
admin Manage topics, teams and obsolete repos
version Show artixpkg version information
OPTIONS
@@ -37,8 +38,6 @@ fi
export _ARTOOLS_COMMAND='artixpkg'
# shellcheck source=src/lib/base/util.sh
source "${LIBDIR}"/base/util.sh
# shellcheck source=src/lib/pkg/util.sh
source "${LIBDIR}"/pkg/util.sh
@@ -69,6 +68,14 @@ while (( $# )); do
artixpkg_git "$@"
exit 0
;;
ci)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/ci.sh
source "${LIBDIR}"/pkg/ci.sh
artixpkg_ci "$@"
exit 0
;;
admin)
_ARTOOLS_COMMAND+=" $1"
shift

View File

@@ -6,12 +6,12 @@ LIBDIR=${LIBDIR:-'@libdir@'}
DATADIR=${DATADIR:-'@datadir@'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
# shellcheck source=src/lib/base/util.sh
source "${LIBDIR}"/base/util.sh
# shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh
# shellcheck source=src/lib/pkg/util.sh
source "${LIBDIR}"/pkg/util.sh
create_first=false
rebuild=false
@@ -32,6 +32,8 @@ usage() {
printf ' [default: %s]\n' "${repo}"
printf ' -a <arch> Build arch chroot\n'
printf ' [default: %s]\n' "${arch}"
printf ' -e <name> Export PACKAGER\n'
printf " format: 'John Doe <john@doe.com>'\n"
printf ' -c Recreate the chroot before building\n'
printf ' -m Major rebuild\n'
printf ' -N Disable check() function\n'
@@ -44,15 +46,16 @@ usage() {
exit "$1"
}
opts='hcCNmnr:d:a:'
opts='hcCNmnr:d:a:e:'
while getopts "${opts}" arg; do
case "${arg}" in
r) chroots_pkg="$OPTARG" ;;
d) repo="$OPTARG" ;;
a) arch="$OPTARG" ;;
e) packager="$OPTARG" ;;
c) create_first=true ;;
m) rebuild=true; repo=${repo%-*} ;;
m) rebuild=true ;;
C) mkchrootpkg_args+=(-C) ;;
N) mkchrootpkg_args+=(-N) ;;
n) mkchrootpkg_args+=(-n) ;;
@@ -60,6 +63,10 @@ while getopts "${opts}" arg; do
esac
done
if "${rebuild}"; then
repo=${repo%-*}
fi
if [[ "${repo}" == lib32* ]]; then
base_packages+=('multilib-devel')
fi
@@ -86,6 +93,10 @@ else
set_arch="${arch}"
fi
if [[ -n "${packager}" ]]; then
export PACKAGER=${packager}
fi
# Architecture-specific Mount
arch_mounts=()
if [[ -f "${DATADIR}/mount.d/${arch}" ]]; then

View File

@@ -57,7 +57,7 @@ while (( $# )); do
shift
break
;;
-*|--*)
--*|-*)
die "invalid argument: %s" "$1"
;;
*)
@@ -76,10 +76,10 @@ fi
# Source user-specific makepkg.conf overrides
if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
# shellcheck source=/dev/null
# shellcheck source=config/makepkg/x86_64.conf
source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
elif [[ -r "$HOME/.makepkg.conf" ]]; then
# shellcheck source=/dev/null
# shellcheck source=config/makepkg/x86_64.conf
source "$HOME/.makepkg.conf"
fi
@@ -152,7 +152,11 @@ for _pkgname in "${pkgname[@]}"; do
find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname"
if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then
message="Sonames differ in $_pkgname!"
(( WARN )) && warning "$message" || msg "$message"
if (( WARN )); then
warning "$message"
else
msg "$message"
fi
printf "%s\n" "$diff_output" 2>&1 | tee "${pkgfile##*/}-checkpkg.log"
changed=1
else

View File

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

View File

@@ -39,7 +39,7 @@ umask 0022
working_dir=''
files=()
mount_args=("-B:/etc/hosts:/etc/hosts")
mount_args="-B:/etc/hosts:/etc/hosts"
usage() {
printf "Usage: %s [options] working-dir [run arguments]\n" "${0##*/}"
@@ -72,7 +72,7 @@ while getopts ${opts} arg; do
f) files+=("$OPTARG") ;;
s) nosetarch=1 ;;
t) tmpfs_opts="$OPTARG" ;;
b) bindmounts="$OPTARG"; mount_args+=(${bindmounts}) ;;
b) bindmounts="$OPTARG"; mount_args+=" ${bindmounts}" ;;
h|?) usage ;;
*) error "invalid argument '%s'" "$arg"; usage ;;
esac
@@ -96,6 +96,7 @@ mapfile -t host_mirrors < <(pacman-conf --repo world Server 2> /dev/null | sed -
for host_mirror in "${host_mirrors[@]}"; do
if [[ $host_mirror == *file://* ]]; then
# shellcheck disable=SC2016
host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g')
for m in "$host_mirror"/pool/*/; do
in_array "$m" "${cache_dirs[@]}" || cache_dirs+=("$m")
@@ -114,10 +115,10 @@ while read -r line; do
done
done < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" --repo-list)
mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}")
mount_args+=" -B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}"
for cache_dir in "${cache_dirs[@]:1}"; do
mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}")
mount_args+=" -Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}"
done
# {{{ functions
@@ -144,13 +145,13 @@ copy_hostconf () {
chroot_extra_mount() {
chroot_add_resolv_conf "${working_dir}"
for arg in "${mount_args[@]}"; do
for arg in ${mount_args}; do
local flag dest src
flag=${arg%%:*}
dest=${arg##*:}
src=${arg%:*}
src=${src#*:}
chroot_mount "${src}" "${working_dir}${dest}" "${flag}"
chroot_add_mount "${src}" "${working_dir}${dest}" "${flag}"
done
}
@@ -165,7 +166,7 @@ elif [[ $(cat "$working_dir/.artix-chroot") != "${CHROOTVERSION}" ]]; then
die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}"
fi
chroot_api_mount "${working_dir}" "${tmpfs_opts}" || die "failed to setup API filesystems in chroot %s" "${working_dir}"
chroot_setup "${working_dir}" "${tmpfs_opts}" || die "failed to setup API filesystems in chroot %s" "${working_dir}"
chroot_extra_mount

View File

@@ -4,12 +4,12 @@
LIBDIR=${LIBDIR:-'@libdir@'}
# shellcheck source=src/lib/base/util.sh
source "${LIBDIR}"/base/util.sh
# shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh
# shellcheck source=src/lib/pkg/util.sh
source "${LIBDIR}"/pkg/util.sh
shopt -s nullglob
@@ -76,6 +76,7 @@ umask 0022
ORIG_HOME=$HOME
IFS=: read -r _ _ _ _ _ HOME _ < <(getent passwd "${SUDO_USER:-$USER}")
# shellcheck source=config/makepkg/x86_64.conf
load_makepkg_config
HOME=$ORIG_HOME

View File

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

View File

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

View File

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

View File

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

View File

@@ -20,6 +20,7 @@ umode=''
files=()
chroot_args=()
nosetarch=0
usage() {
printf "Usage: %s [options] working-dir package-list...\n" "${0##*/}"

View File

@@ -177,7 +177,7 @@ prepare_chroot() {
done
cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF
builduser ALL = NOPASSWD: /usr/bin/pacman
builduser ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman
EOF
chmod 440 "$copydir/etc/sudoers.d/builduser-pacman"
@@ -205,6 +205,7 @@ _chrootbuild() {
# No coredumps
ulimit -c 0
# shellcheck disable=SC1091
. /etc/locale.conf
# shellcheck source=/dev/null
@@ -263,6 +264,7 @@ move_products() {
# Fix broken symlink because of temporary chroot PKGDEST /pkgdest
if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then
# shellcheck disable=SC2226
ln -sf "$PKGDEST/${pkgfile##*/}"
fi
done
@@ -275,6 +277,7 @@ move_products() {
# Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest
if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then
# shellcheck disable=SC2226
ln -sf "$SRCPKGDEST/${s##*/}"
fi
done

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

@@ -0,0 +1,51 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
LIBDIR=${LIBDIR:-'@libdir@'}
# shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh
# shellcheck source=src/lib/pkg/deploy.sh
source "${LIBDIR}"/pkg/deploy.sh
passfiles=("$@")
sign_pkg(){
local file_to_sign="$1"
if [ ! -e "$file_to_sign" ]; then
error "%s does not exist!" "$file_to_sign"
exit 1
fi
if [[ -n "${GPG_KEY}" ]] && [[ -n "${GPG_PASS}" ]]; then
msg "Signing [%s]" "${file_to_sign##*/}"
if ! gpg --homedir /etc/pacman.d/gnupg --no-permission-warning \
--no-default-keyring --default-key "${GPGP_KEY}" --passphrase "${GPGP_PASS}" \
-q --detach-sign "$file_to_sign"; then
return 1
fi
fi
return 0
}
check_root "" "${BASH_SOURCE[0]}" "$@"
for pkg in "${passfiles[@]}"; do
msg "Searching %s ..." "$pkg"
if pkgfile=$(find_cached_pkgfile "$pkg");then
msg2 "Found: %s" "${pkgfile}"
[[ -e "${pkgfile}".sig ]] && rm "${pkgfile}".sig
if ! sign_pkg "${pkgfile}"; then
die "Failed to sign package!"
fi
ret=0
else
ret=1
fi
done
exit "$ret"

View File

@@ -6,10 +6,12 @@ LIBDIR=${LIBDIR:-'@libdir@'}
# shellcheck source=src/lib/base/message.sh
source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/base/yaml.sh
source "${LIBDIR}"/base/yaml.sh
# shellcheck source=src/lib/pkg/yaml.sh
source "${LIBDIR}"/pkg/yaml.sh
# shellcheck disable=1091
source "${MAKEPKG_LIBRARY}"/util/pkgbuild.sh
# shellcheck disable=1091
source "${MAKEPKG_LIBRARY}"/util/schema.sh
#{{{ functions
@@ -121,6 +123,7 @@ usage() {
exit "$1"
}
# shellcheck source=config/makepkg/x86_64.conf
load_makepkg_config
opts='h'

View File

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

View File

@@ -9,6 +9,7 @@ source "${LIBDIR}"/base/message.sh
# shellcheck source=src/lib/pkg/deploy.sh
source "${LIBDIR}"/pkg/deploy.sh
# shellcheck source=config/makepkg/x86_64.conf
load_makepkg_config
passfiles=("$@")