Compare commits

..

20 Commits
0.34.2 ... ci

Author SHA1 Message Date
e8e4aa553f ci: try fix ext
Some checks failed
Artools shellcheck / lint (push) Failing after 23s
2023-12-06 18:20:56 +01:00
d8b1038bd6 try setting file extension 2023-12-06 18:19:08 +01:00
f9a2dc9dbe testing
All checks were successful
Artools shellcheck / lint (push) Successful in 16s
2023-12-06 18:15:10 +01:00
e04adbf5e6 ci: test linters
All checks were successful
Artools shellcheck / lint (push) Successful in 18s
2023-12-06 18:10:56 +01:00
af1514ad5f ci: change job name
All checks were successful
Artools shellcheck / lint (push) Successful in 13s
2023-12-06 18:00:50 +01:00
32925a05c4 ci: fix branch
Some checks failed
Artools shellcheck / build (push) Failing after 27s
2023-12-06 17:47:57 +01:00
77017f8009 ci: add lint.yaml 2023-12-06 17:45:18 +01:00
645563b0c5 artixpkg: export keys on repo add 2023-12-06 17:31:04 +01:00
fb8da6fedd manage-pkgbuild-keys: small refactor 2023-12-06 01:08:19 +01:00
c31acae021 manage-pkgbuild-keys: standardize msgs 2023-12-06 00:21:42 +01:00
ca1082a8e5 pkg: add manage-pkgbuild-keys 2023-12-06 00:16:27 +01:00
6f12273730 artixpkg: show agent on repo import 2023-12-05 21:23:00 +01:00
b9b15f549d artixpkg: add msgs to show_agent() 2023-12-05 21:18:31 +01:00
c81b643fb2 artixpkg: add agent config to repo show cmd 2023-12-05 21:06:56 +01:00
4362707456 makepkg.conf: backport arch diff 2023-12-04 17:55:51 +01:00
5d8cdf19fe artixpkg: refactor pkgbuild sourcing in repo add 2023-12-03 19:40:56 +01:00
7084a086fa artixpkg: move check_pkgbuild_validity() in add 2023-12-03 19:38:09 +01:00
8744bb5355 artixpkg: check pkgbuild validity on add 2023-12-03 16:42:38 +01:00
75747a7d9d artixpkg: add remote changes check for add, move, remove 2023-12-03 16:39:05 +01:00
75d1e7ce2a start 0.32 2023-12-03 16:04:34 +01:00
68 changed files with 873 additions and 2625 deletions

View File

@@ -3,12 +3,9 @@ run-name: ${{ gitea.actor }}
on: on:
push: push:
branches: branches:
- artools/0.33.x - ci
- master
tags: tags:
- 0.* - 0.*
pull_request:
types: [opened, reopened]
jobs: jobs:
lint: lint:
@@ -16,15 +13,16 @@ jobs:
steps: steps:
- name: checkout repo - name: checkout repo
uses: actions/checkout@main uses: actions/checkout@main
- name: build - name: Run ShellCheck shell-linter
run: make uses: azohra/shell-linter@latest
- name: shellcheck with:
path: "src/base/*.in,src/pkg/*.in,src/iso/*.in"
severity: "error"
- name: Run ShellCheck action-shellcheck
uses: ludeeus/action-shellcheck@master uses: ludeeus/action-shellcheck@master
env: env:
SHELLCHECK_OPTS: -x -e SC2034 SHELLCHECK_OPTS: -x -s bash
with: with:
scandir: './build/bin' additional_files: "src/base/*.in*"
format: tty #scandir: 'src/base'
severity: error
additional_files: 'contrib/completion/bash/artools'

2
.gitignore vendored
View File

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

View File

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

View File

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

View File

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

View File

@@ -5,23 +5,9 @@
################ artools-pkg ################ ################ artools-pkg ################
############################################# #############################################
# default chroots dir where buildpkg chroots are created # gitea user access token for buildtree
# CHROOTS_DIR=/var/lib/artools
# default workspace directory
# WORKSPACE_DIR="${USER_HOME}/artools-workspace"
# default arch to build
# ARCH=$(uname -m)
# default pacman.conf repos to include
# possible values: {system,world,galaxy,lib32}{-gremlins,-goblins}
# REPO="world"
# gitea user access token for gitea api
# GIT_TOKEN='' # GIT_TOKEN=''
# default workspace dir for artixpkg
# TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux # TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux
# default repos root for deploypkg # default repos root for deploypkg
@@ -32,15 +18,3 @@
# default packaging org # default packaging org
# GIT_ORG='packages' # GIT_ORG='packages'
# default archiving org
# GIT_ORG_ARCHIVE='landfill'
# default jenkins agents
# AGENTS=(orion taurus)
# whether to include custom maintainer line when importing from arch
# PATCH_MAINTAINER=false
# override the default git url for patches repo
# PATCH_URL=${GIT_SSH}:artix/artix-patches.git

View File

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

View File

@@ -1,115 +0,0 @@
#
# /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

@@ -1,103 +0,0 @@
#
# /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

@@ -1,103 +0,0 @@
#
# /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

@@ -1,295 +0,0 @@
#/usr/bin/env bash
LIBDIR=${LIBDIR:-'@libdir@'}
_artixpkg_pkgbase() {
source "${LIBDIR}"/pkg/git/config.sh
source "${LIBDIR}"/pkg/util.sh
ls -1 "${TREE_DIR_ARTIX}" | tr '\n' ' '
}
_artixpkg_remotepkgbase() {
curl -s "https://checkupdates.artixlinux.org/api/1.0/packages?startswith=$1"
}
_artixpkg_maintainers() {
curl -s "https://checkupdates.artixlinux.org/api/1.0/maintainers"
}
_artixpkg_completion() {
local cur prev comps comps_all repos autorepos teams agents cwords comp_cword_exflag
source "${LIBDIR}"/pkg/db/db.sh 2>/dev/null
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
for ((i = COMP_CWORD - 1; i >= 0; i--)); do
if [[ ${COMP_WORDS[i]} != -* ]]; then
last_non_flag_word="${COMP_WORDS[i]}"
break
fi
done
comps=""
comps_all=""
comp_cword_exflag=0
comp_cword_all=0
for ((i = 0; i < ${#COMP_WORDS[@]} - 1; i++)); do
word="${COMP_WORDS[i]}"
comps_all+=" $word"
((comp_cword_all++))
if [[ $word != -* ]]; then
comps+=" $word"
((comp_cword_exflag++))
fi
done
comps="${comps:1}"
comps_all="${comps_all:1}"
repos=""
for word in "${ARTIX_DB[@]}"; do
if [[ $word != -* ]]; then
repos+=" $word"
fi
done
repos="${repos:1}"
autorepos=""
for word in "${ARTIX_DB_MAP[@]}"; do
if [[ $word != -* ]]; then
autorepos+=" $word"
fi
done
autorepos="${autorepos:1}"
teams=""
for word in "${ARTIX_TEAMS[@]}"; do
if [[ $word != -* ]]; then
teams+=" $word"
fi
done
teams="${teams:1}"
agents=""
for word in "${AGENTS[@]}"; do
if [[ $word != -* ]]; then
agents+=" $word"
fi
done
agents="${agents:1}"
case "${comp_cword_exflag}" in
1)
COMPREPLY=($(compgen -W "admin git repo version -h --help" -- "${cur}"))
return 0
;;
2)
case ${prev} in
admin)
COMPREPLY=($(compgen -W "maintainer query team topic transfer -h --help" -- ${cur}))
;;
git)
COMPREPLY=($(compgen -W "ci 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)
COMPREPLY=($(compgen -W "$repoAddCommon $autorepos $repos" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "$repoAddCommon $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg repo remove"*)
case "${comp_cword_exflag}" in
3)
COMPREPLY=($(compgen -W "-p --push -h --help $autorepos $repos" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-p --push -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg repo move"*)
case "${comp_cword_exflag}" in
3|4)
COMPREPLY=($(compgen -W "-p --push -h --help $autorepos $repos" -- ${cur}))
;;
*)
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")
COMPREPLY=($(compgen -W "$(_artixpkg_maintainers)" -- ${cur}))
;;
"-s"|"--search"|"-j"|"--jobs")
# these flags expect a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "-m --maintainer --protocol -s --search -t --team -a --agent -j --jobs --all -h --help $(_artixpkg_remotepkgbase ${cur})" -- ${cur}))
;;
esac
;;
"artixpkg git config"*)
case "${prev}" in
"--protocol")
COMPREPLY=($(compgen -W "https" -- ${cur}))
;;
"-j"|"--jobs")
# these flags expect a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "--protocol -j --jobs -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg git create"*)
case "${prev}" in
"-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
"-m"|"--maintainer")
COMPREPLY=($(compgen -W "$(_artixpkg_maintainers)" -- ${cur}))
;;
"-t"|"--topic"|"-j"|"--jobs")
# these flags expect a parameter
COMPREPLY=()
;;
*)
case "${comps_all}" in
*--all*)
COMPREPLY=($(compgen -W "-m --maintainer -t --topic -j --jobs -h --help" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-m --maintainer -t --topic -j --jobs --all -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
esac
;;
"artixpkg git push"*)
case "${prev}" in
"-m"|"--maintainer")
COMPREPLY=($(compgen -W "$(_artixpkg_maintainers)" -- ${cur}))
;;
"-t"|"--topic"|"-j"|"--jobs")
# this flag expects a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "-m --maintainer -t --topic -j --jobs -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg git ci"*)
case "${prev}" in
"-a"|"--agent")
COMPREPLY=($(compgen -W "$agents" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-a --agent -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg admin maintainer"*)
case "${comp_cword_all}" in
3)
COMPREPLY=($(compgen -W "-a --adopt --o --orphan -h --help" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg admin query"*)
case "${prev}" in
"-m"|"--maintainer")
COMPREPLY=($(compgen -W "$(_artixpkg_maintainers)" -- ${cur}))
;;
"-t"|"--topic")
# this flag expects a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "-m --maintainer -t --topic -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg admin team"*)
case "${prev}" in
"-a"|"--add"|"-r"|"--remove")
COMPREPLY=($(compgen -W "$teams" -- ${cur}))
;;
*)
COMPREPLY=($(compgen -W "-a --add -c --check -l --list -r --remove -h --help $(_artixpkg_pkgbase)" -- ${cur}))
;;
esac
;;
"artixpkg admin topic"*)
case "${prev}" in
"-a"|"--add"|"-r"|"--remove"|"-j"|"--jobs")
# this flag expects a parameter
COMPREPLY=()
;;
*)
COMPREPLY=($(compgen -W "-a --add -r --remove -d --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

@@ -1,205 +0,0 @@
#compdef artixpkg
local -a addcmd admincmd cicmd clonecmd configcmd createcmd gitcmd importcmd \
initialcmd maintainercmd movecmd querycmd pullcmd pushcmd removecmd \
repocmd showcmd teamcmd topiccmd transfercmd versioncmd
_regex_words maintainer '' \
'-a' \
'--adopt' \
'-h' \
'--help' \
'-o' \
'--orphan'
maintainercmd=("$reply[@]")
_regex_words query '' \
'-h' \
'--help' \
'-m' \
'-t'
querycmd=("$reply[@]")
_regex_words team '' \
'-a' \
'--add' \
'-c' \
'--check' \
'-h' \
'--help' \
'-r' \
'--remove'
teamcmd=("$reply[@]")
_regex_words topic '' \
'-a' \
'--add' \
'-d' \
'--delete' \
'-h' \
'--help' \
'-j' \
'--jobs' \
'-r' \
'--remove'
topiccmd=("$reply[@]")
_regex_words transfer '' \
'-h' \
'--help'
transfercmd=("$reply[@]")
_regex_words admin '' \
'-h:Help text' \
'--help:Help text' \
'maintainer:Manage repo maintainer:$maintainercmd' \
'query:Query maintainers and topics:$querycmd' \
'team:Manage repo team:$teamcmd' \
'topic:Manage topics:$topiccmd' \
'transfer:Transfer obsolete repositories to landfill:$transfercmd'
admincmd=("$reply[@]")
_regex_words ci '' \
'-a' \
'--agent' \
'-h' \
'--help'
cicmd=("$reply[@]")
_regex_words clone '' \
'-a' \
'--agent' \
'--all' \
'-h' \
'--help' \
'-j' \
'--jobs' \
'-m' \
'--maintainer' \
'--protocol' \
'-s' \
'--search' \
'-t' \
'--team'
clonecmd=("$reply[@]")
_regex_words config '' \
'-h' \
'--help' \
'-j' \
'--jobs' \
'--protocol'
configcmd=("$reply[@]")
_regex_words create '' \
'-a' \
'--agent' \
'-c' \
'--create' \
'-h' \
'--help' \
'-t' \
'--team'
createcmd=("$reply[@]")
_regex_words pull '' \
'--all' \
'-h' \
'--help' \
'-j' \
'--jobs' \
'-m' \
'--maintainer' \
'-t' \
'--topic'
pullcmd=("$reply[@]")
_regex_words push '' \
'-h' \
'--help' \
'-j' \
'--jobs' \
'-m' \
'--maintainer' \
'-t' \
'--topic'
pushcmd=("$reply[@]")
_regex_words git '' \
'ci:Configure CI agent:$cicmd' \
'clone:Clone a package:$clonecmd' \
'config:Configure a clone:$configcmd' \
'create:Create a new gitea package repository:$createcmd' \
'-h:Help text' \
'--help:Help text' \
'pull:Pull a package repository:$pullcmd' \
'push:Push a package repository:$pushcmd'
gitcmd=("$reply[@]")
_regex_words add '' \
'-h' \
'--help' \
'-n' \
'--nocheck' \
'-p' \
'--push' \
'-r' \
'--rebuild'
addcmd=("$reply[@]")
_regex_words import '' \
'--del' \
'-h' \
'--help' \
'--tag'
importcmd=("$reply[@]")
_regex_words move '' \
'-h' \
'--help' \
'-p' \
'--push'
movecmd=("$reply[@]")
_regex_words remove '' \
'-h' \
'--help' \
'-p' \
'--push'
removecmd=("$reply[@]")
_regex_words show '' \
'-b' \
'--base' \
'-h' \
'--help' \
'-p' \
'--pkgs'
showcmd=("$reply[@]")
_regex_words repo '' \
'add:Add pkgbase to repo:$addcmd' \
'-h:Help text' \
'--help:Help text' \
'import:Import latest tag from arch upstream:$importcmd' \
'move:Move pkgbase between repos:$movecmd' \
'remove:Remove pkgbase from repo:$removecmd' \
'show:Show pkgbase repo db:$showcmd'
repocmd=("$reply[@]")
_regex_words version '' \
'-h' \
'--help'
versioncmd=("$reply[@]")
_regex_words initial '' \
'admin:Manage topics:$admincmd' \
'git:Manage git:$gitcmd' \
'-h:Help text' \
'--help:Help text' \
'repo:Pacman database modification:$repocmd' \
'version:Show artixpkg version:$versioncmd'
initialcmd=("$reply[@]")
_regex_arguments _artixpkg /$'[^\0]##\0'/ "${initialcmd[@]}"
_artixpkg "$@"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -9,39 +9,73 @@ ignore_error() {
return 0 return 0
} }
chroot_add_mount() { trap_setup(){
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap "$1" EXIT
}
chroot_mount() {
# msg2 "mount: [%s]" "$2" # msg2 "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
} }
chroot_maybe_add_mount() { 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() {
local cond=$1; shift local cond=$1; shift
if eval "$cond"; then if eval "$cond"; then
chroot_add_mount "$@" chroot_mount "$@"
fi fi
} }
chroot_setup(){ chroot_setup(){
local mnt="$1" local mnt="$1"
local tmpfs_opts="${2:-mode=1777,strictatime,nodev,nosuid}" local tmpfs_opts="${2:-mode=1777,strictatime,nodev,nosuid}"
chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind &&
CHROOT_ACTIVE_MOUNTS=() chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev &&
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
trap 'chroot_teardown' EXIT ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \
#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 && 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_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_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_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_mount /run "$mnt/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
chroot_add_mount tmp "$mnt/tmp" -t tmpfs -o "${tmpfs_opts}" chroot_mount tmp "$mnt/tmp" -t tmpfs -o "${tmpfs_opts}"
} }
chroot_teardown() { chroot_api_mount() {
CHROOT_ACTIVE_MOUNTS=()
trap_setup chroot_api_umount
chroot_setup "$1" "$2"
}
chroot_api_umount() {
if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then
# msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" # msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_MOUNTS[@]}" umount "${CHROOT_ACTIVE_MOUNTS[@]}"
@@ -49,40 +83,4 @@ chroot_teardown() {
unset CHROOT_ACTIVE_MOUNTS unset CHROOT_ACTIVE_MOUNTS
} }
resolve_link() {
local target=$1
local root=$2
# If a root was given, make sure it ends in a slash.
[[ -n $root && $root != */ ]] && root=$root/
while [[ -L $target ]]; do
target=$(readlink -m "$target")
# If a root was given, make sure the target is under it.
# Make sure to strip any leading slash from target first.
[[ -n $root && $target != $root* ]] && target=$root${target#/}
done
printf %s "$target"
}
chroot_add_resolv_conf() {
local chrootdir=$1
local src
local dest="$chrootdir/etc/resolv.conf"
src=$(resolve_link /etc/resolv.conf)
# If we don't have a source resolv.conf file, there's nothing useful we can do.
[[ -e $src ]] || return 0
if [[ ! -e "$dest" && ! -h "$dest" ]]; then
# There may be no resolv.conf in the chroot. In this case, we'll just exit.
# The chroot environment must not be concerned with DNS resolution.
return 0
fi
chroot_add_mount "$src" "$dest" -c --bind
}
#}}} #}}}

View File

@@ -1,78 +0,0 @@
#!/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
}
#}}}

48
src/lib/base/util.sh Normal file
View File

@@ -0,0 +1,48 @@
#!/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,34 +4,53 @@
#{{{ calamares #{{{ calamares
yaml_array() { write_services_conf(){
local array yaml local key1="$1" val1="$2" key2="$3" val2="$4"
local yaml
for entry in "$@"; do yaml=$(write_yaml_header)
yaml="{name: ${entry}, action: enable}" yaml+=$(write_yaml_map 0 "$key1" "$val1")
array="${array:-}${array:+,} ${yaml}" yaml+=$(write_yaml_map 0 "$key2" "$val2")
yaml+=$(write_yaml_map 0 'services')
for svc in "${SERVICES[@]}"; do
yaml+=$(write_yaml_seq 2 "$svc")
done done
printf "%s\n" "[${array}]" 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"
} }
configure_calamares(){ configure_calamares(){
for config in online offline; do local mods="$1/etc/calamares/modules"
local mods="$1/etc/calamares-$config/modules"
if [[ -d "$mods" ]];then if [[ -d "$mods" ]];then
msg2 "Configuring: Calamares %s" "$config" msg2 "Configuring: Calamares"
write_services_"${INITSYS}"_conf "$mods"
if [[ -f "$mods"/services-artix.conf ]]; then sed -e "s|services-openrc|services-${INITSYS}|" \
local svc -i "$1"/etc/calamares/settings.conf
svc=$(yaml_array "${SERVICES[@]}") \
yq -P 'with(.;
.command = "artix-service" |
.services = env(svc) )' \
-i "$mods"/services-artix.conf
fi
fi
done
if [[ -d "$1"/etc/calamares-offline ]]; then
ln -sf calamares-offline "$1"/etc/calamares
fi fi
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,10 +5,6 @@
[[ -z ${ARTOOLS_INCLUDE_ADMIN_SH:-} ]] || return 0 [[ -z ${ARTOOLS_INCLUDE_ADMIN_SH:-} ]] || return 0
ARTOOLS_INCLUDE_ADMIN_SH=1 ARTOOLS_INCLUDE_ADMIN_SH=1
# shellcheck source=src/lib/pkg/db/db.sh
source "${LIBDIR}"/pkg/db/db.sh
set -e set -e
artixpkg_admin_usage() { artixpkg_admin_usage() {
@@ -17,21 +13,17 @@ artixpkg_admin_usage() {
Usage: ${COMMAND} [COMMAND] [OPTIONS] Usage: ${COMMAND} [COMMAND] [OPTIONS]
COMMANDS COMMANDS
maintainer Manage repo maintainer
query Query maintainers and topics
team Manage repo team
topic Manage topics
transfer Transfer obsolete repository to landfill transfer Transfer obsolete repository to landfill
query Query maintainers and topics
topic Manage topics
OPTIONS OPTIONS
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} transfer libfoo libbar $ ${COMMAND} transfer libfoo libbar
$ ${COMMAND} query --topic mytopic $ ${COMMAND} query --maintainer tux
$ ${COMMAND} topic --add mytopic libfoo $ ${COMMAND} query --topic kf5
$ ${COMMAND} team --add ${ARTIX_TEAMS[3]} libfoo
$ ${COMMAND} maintainer --adopt libfoo libbar
_EOF_ _EOF_
} }
@@ -48,31 +40,6 @@ artixpkg_admin() {
artixpkg_admin_usage artixpkg_admin_usage
exit 0 exit 0
;; ;;
query)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/query.sh
source "${LIBDIR}"/pkg/admin/query.sh
artixpkg_admin_query "$@"
exit 0
;;
team)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/team.sh
source "${LIBDIR}"/pkg/admin/team.sh
artixpkg_admin_team "$@"
exit 0
;;
topic)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/admin/query.sh
source "${LIBDIR}"/pkg/admin/topic.sh
artixpkg_admin_topic "$@"
exit 0
;;
transfer) transfer)
_ARTOOLS_COMMAND+=" $1" _ARTOOLS_COMMAND+=" $1"
shift shift
@@ -81,12 +48,20 @@ artixpkg_admin() {
artixpkg_admin_transfer "$@" artixpkg_admin_transfer "$@"
exit 0 exit 0
;; ;;
maintainer) query)
_ARTOOLS_COMMAND+=" $1" _ARTOOLS_COMMAND+=" $1"
shift shift
# shellcheck source=src/lib/pkg/admin/maintainer.sh # shellcheck source=src/lib/pkg/admin/query.sh
source "${LIBDIR}"/pkg/admin/maintainer.sh source "${LIBDIR}"/pkg/admin/query.sh
artixpkg_admin_maintainer "$@" artixpkg_admin_query "$@"
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 exit 0
;; ;;
-*) -*)

View File

@@ -1,137 +0,0 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_ADMIN_MAINTAINER_SH:-} ]] || return 0
ARTOOLS_INCLUDE_ADMIN_MAINTAINER_SH=1
# shellcheck source=src/lib/pkg/packager.sh
source "${LIBDIR}"/pkg/packager.sh
set -e
artixpkg_admin_maintainer_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS
-a, --adopt Adopt repo
-o, --orphan Orphan repo
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} --adopt libfoo
$ ${COMMAND} --orphan libfoo libbar
_EOF_
}
artixpkg_admin_maintainer() {
if (( $# < 1 )); then
artixpkg_admin_maintainer_usage
exit 0
fi
# options
local pkgbases=()
local pkgbase
local ADOPT=0
local ORPHAN=0
local packager_name
local maintainer
local -r orphan="orphan"
local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
while (( $# )); do
case $1 in
-h|--help)
artixpkg_admin_maintainer_usage
exit 0
;;
-a|--adopt)
ADOPT=1
RUNCMD+=" $1"
shift
;;
-o|--orphan)
ORPHAN=1
RUNCMD+=" $1"
shift
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
pkgbases+=("$@")
load_makepkg_config
if [[ -n ${PACKAGER} ]]; then
if ! packager_name=$(get_packager_name "${PACKAGER}") || \
! packager_email=$(get_packager_email "${PACKAGER}"); then
die "invalid PACKAGER format '${PACKAGER}' in makepkg.conf"
fi
if ! is_packager_name_valid "${packager_name}"; then
die "invalid PACKAGER '${PACKAGER}' in makepkg.conf"
fi
fi
maintainer="maintainer-${packager_name}"
if [[ -n ${GIT_TOKEN} ]]; then
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then
# force colors in parallel if parent process is colorized
if [[ -n ${BOLD} ]]; then
export ARTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${RUNCMD}" ::: "${pkgbases[@]}"; then
die 'Failed to manange some packages, please check the output'
exit 1
fi
exit 0
fi
for pkgbase in "${pkgbases[@]}"; do
local gitname
gitname=$(get_compliant_name "${pkgbase}")
if (( ADOPT )); then
if ! add_topic "${gitname}" "$maintainer"; then
warning "failed to add topic: $maintainer"
fi
if ! remove_topic "${gitname}" "$orphan"; then
warning "failed to remove topic: $orphan"
fi
fi
if (( ORPHAN )); then
if ! add_topic "${gitname}" "$orphan"; then
warning "failed to add topic: $orphan"
fi
if ! remove_topic "${gitname}" "$maintainer"; then
warning "failed to remove topic: $maintainer"
fi
fi
done
fi
}

View File

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

View File

@@ -1,154 +0,0 @@
#!/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
}

View File

@@ -14,18 +14,16 @@ artixpkg_admin_topic_usage() {
Usage: ${COMMAND} [OPTIONS] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS OPTIONS
-a, --add NAME Add a topic to repo -a, --add Add a topic
-r, --remove NAME Remove a topic from repo -d, --del Delete a topic
-d, --delete Delete all topics from repo
-j, --jobs N Run up to N jobs in parallel (default: $(nproc)) -j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} --add mytopic libfoo $ ${COMMAND} --add mytopic libfoo
$ ${COMMAND} --remove mytopic libbar $ ${COMMAND} --del mytopic libbar
$ ${COMMAND} --add mytopic libfoo libbar $ ${COMMAND} --add mytopic libfoo libbar
$ ${COMMAND} --remove mytopic libfoo libbar $ ${COMMAND} --del mytopic libfoo libbar
$ ${COMMAND} --delete libfoo
_EOF_ _EOF_
} }
@@ -42,9 +40,8 @@ artixpkg_admin_topic() {
local pkgbase local pkgbase
local ADD_TOPIC local ADD_TOPIC
local RM_TOPIC local DEL_TOPIC
local ADD=0 local ADD=0
local RM=0
local DEL=0 local DEL=0
local jobs= local jobs=
jobs=$(nproc) jobs=$(nproc)
@@ -53,29 +50,36 @@ artixpkg_admin_topic() {
while (( $# )); do while (( $# )); do
case $1 in case $1 in
-h|--help)
artixpkg_admin_topic_usage
exit 0
;;
-a|--add) -a|--add)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
ADD_TOPIC="$2" ADD_TOPIC="$2"
ADD=1 ADD=1
RUNCMD+=" $1 ${ADD_TOPIC}" RUNCMD+=" -a ${ADD_TOPIC}"
shift 2 shift 2
;; ;;
-r|--remove) --add=*)
(( $# <= 1 )) && die "missing argument for %s" "$1" ADD_TOPIC="${1#*=}"
RM_TOPIC="$2" ADD=1
RM=1 RUNCMD+=" --add=${ADD_TOPIC}"
RUNCMD+=" $1 ${RM_TOPIC}"
shift 2
;;
-d|--delete)
DEL=1
RUNCMD+=" $1"
shift shift
;; ;;
-d|--del)
(( $# <= 1 )) && die "missing argument for %s" "$1"
DEL_TOPIC="$2"
DEL=1
RUNCMD+=" -d ${DEL_TOPIC}"
shift 2
;;
--del=*)
DEL_TOPIC="${1#*=}"
DEL=1
RUNCMD+=" --del=${DEL_TOPIC}"
shift
;;
-h|--help)
artixpkg_admin_topic_usage
exit 0
;;
-j|--jobs) -j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2 jobs=$2
@@ -111,25 +115,21 @@ artixpkg_admin_topic() {
fi fi
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
local gitname
gitname=$(get_compliant_name "${pkgbase}")
# topics meta # topics meta
if (( ADD )); then if (( ADD )); then
local gitname
gitname=$(get_compliant_name "${pkgbase}")
if ! add_topic "${gitname}" "${ADD_TOPIC}"; then if ! add_topic "${gitname}" "${ADD_TOPIC}"; then
warning "failed to add topic: ${ADD_TOPIC}" warning "failed to add the topic: ${ADD_TOPIC}"
fi
fi
if (( RM )); then
if ! remove_topic "${gitname}" "${RM_TOPIC}"; then
warning "failed to remove topic: ${RM_TOPIC}"
fi fi
fi fi
if (( DEL )); then if (( DEL )); then
if ! remove_all_topics "${gitname}" "${GIT_ORG}"; then local gitname
warning "failed to delete all topics: ${gitname}" gitname=$(get_compliant_name "${pkgbase}")
if ! remove_topic "${gitname}" "${DEL_TOPIC}"; then
warning "failed to delete the topic: ${DEL_TOPIC}"
fi fi
fi fi

View File

@@ -33,6 +33,7 @@ artixpkg_admin_transfer() {
# options # options
local pkgbases=() local pkgbases=()
local pkgbase local pkgbase
local waste_org="landfill"
local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
@@ -59,12 +60,7 @@ artixpkg_admin_transfer() {
if [[ -n ${GIT_TOKEN} ]]; then if [[ -n ${GIT_TOKEN} ]]; then
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
local gitname transfer_repo "${pkgbase}" "${waste_org}"
gitname=$(get_compliant_name "${pkgbase}")
transfer_repo "${gitname}" "${GIT_ORG_ARCHIVE}"
archive_repo "${gitname}" "${GIT_ORG_ARCHIVE}"
remove_all_topics "${gitname}" "${GIT_ORG_ARCHIVE}"
done done
fi fi
} }

View File

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

View File

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

View File

@@ -18,7 +18,6 @@ artixpkg_git_usage() {
create Create a new Gitea package repository create Create a new Gitea package repository
pull Pull a package repository pull Pull a package repository
push Push a package repository push Push a package repository
ci Configure CI agent
OPTIONS OPTIONS
-h, --help Show this help text -h, --help Show this help text
@@ -26,10 +25,9 @@ artixpkg_git_usage() {
EXAMPLES EXAMPLES
$ ${COMMAND} clone libfoo linux libbar $ ${COMMAND} clone libfoo linux libbar
$ ${COMMAND} clone --maintainer tux $ ${COMMAND} clone --maintainer tux
$ ${COMMAND} clone --search mytopic $ ${COMMAND} config --topic mytopic
$ ${COMMAND} config libfoo $ ${COMMAND} config --maintainer tux
$ ${COMMAND} create -c libfoo $ ${COMMAND} create -c libfoo
$ ${COMMAND} ci -a ${AGENTS[1]} libfoo
_EOF_ _EOF_
} }
@@ -62,14 +60,6 @@ artixpkg_git() {
artixpkg_git_config "$@" artixpkg_git_config "$@"
exit 0 exit 0
;; ;;
ci)
_ARTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/pkg/git/ci.sh
source "${LIBDIR}"/pkg/git/ci.sh
artixpkg_git_ci "$@"
exit 0
;;
create) create)
_ARTOOLS_COMMAND+=" $1" _ARTOOLS_COMMAND+=" $1"
shift shift

View File

@@ -1,132 +0,0 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${ARTOOLS_INCLUDE_GIT_CI_SH:-} ]] || return 0
ARTOOLS_INCLUDE_GIT_CI_SH=1
# shellcheck source=src/lib/pkg/db/db.sh
source "${LIBDIR}"/pkg/db/db.sh
set -e
artixpkg_git_ci_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[@]})
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} --agent ${AGENTS[1]} libfoo
_EOF_
}
artixpkg_git_ci() {
# options
local paths=()
local AGENT=${AGENTS[0]}
local SWITCH=0
local CREATED=0
# variables
local path realpath pkgbase
while (( $# )); do
case $1 in
-h|--help)
artixpkg_git_ci_usage
exit 0
;;
-a|--agent)
(( $# <= 1 )) && die "missing argument for %s" "$1"
AGENT="$2"
SWITCH=1
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_git_ci_usage
exit 1
fi
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"
CREATED=1
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}"
if (( ! CREATED )); then
git add "${REPO_CI}"
git commit -m "switch agent"
fi
fi
)
done
}

View File

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

View File

@@ -5,27 +5,99 @@
[[ -z ${ARTOOLS_INCLUDE_GIT_CONFIG_SH:-} ]] || return 0 [[ -z ${ARTOOLS_INCLUDE_GIT_CONFIG_SH:-} ]] || return 0
ARTOOLS_INCLUDE_GIT_CONFIG_SH=1 ARTOOLS_INCLUDE_GIT_CONFIG_SH=1
# shellcheck source=src/lib/pkg/packager.sh # shellcheck source=src/lib/pkg/db/db.sh
source "${LIBDIR}"/pkg/packager.sh source "${LIBDIR}"/pkg/db/db.sh
set -e set -e
commit_ci(){
[[ -d .artixlinux ]] || mkdir .artixlinux
if [[ ${AGENT} == ${ARTIX_DB[11]} ]]; then
printf "@Library('artix-ci@${AGENT}') import org.artixlinux.RepoPackage\n" > "${REPO_CI}"
else
printf "@Library('artix-ci') import org.artixlinux.RepoPackage\n" > "${REPO_CI}"
fi
{
printf '\n'
printf 'PackagePipeline(new RepoPackage(this))\n'
} >> "${REPO_CI}"
git add "${REPO_CI}"
git commit -m "initial ci commit"
}
artixpkg_git_config_usage() { artixpkg_git_config_usage() {
local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_ cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS OPTIONS
-m, --maintainer Set the maintainer topic via gitea api
-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 --protocol https Configure remote url to use https
-j, --jobs N Run up to N jobs in parallel (default: $(nproc)) -j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} --maintainer libfoo
$ ${COMMAND} --agent=galaxy libfoo
$ ${COMMAND} -a galaxy libfoo
$ ${COMMAND} --drop libfoo
$ ${COMMAND} * $ ${COMMAND} *
_EOF_ _EOF_
} }
get_packager_name() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local name
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
name=$(echo "${packager}"|sed -E "s/${packager_pattern}/\1/")
printf "%s" "${name}"
}
get_packager_email() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local email
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
email=$(echo "${packager}"|sed -E "s/${packager_pattern}/\2/")
printf "%s" "${email}"
}
is_packager_name_valid() {
local packager_name=$1
if [[ -z ${packager_name} ]]; then
return 1
elif [[ ${packager_name} == "John Tux" ]]; then
return 1
elif [[ ${packager_name} == "Unknown Packager" ]]; then
return 1
fi
return 0
}
is_packager_email_official() {
local packager_email=$1
if [[ -z ${packager_email} ]]; then
return 1
elif [[ $packager_email =~ .+@artixlinux.org ]]; then
return 0
fi
return 1
}
artixpkg_git_config() { artixpkg_git_config() {
# options # options
local GIT_REPO_BASE_URL=${GIT_HTTPS} local GIT_REPO_BASE_URL=${GIT_HTTPS}
@@ -36,8 +108,13 @@ artixpkg_git_config() {
jobs=$(nproc) jobs=$(nproc)
local paths=() local paths=()
local SET_TOPIC=0
local DROP_TOPIC=0
local AGENT=
local CI_ADDED=0
# variables # variables
local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local path realpath pkgbase local path realpath pkgbase
local PACKAGER GPGKEY packager_name packager_email local PACKAGER GPGKEY packager_name packager_email
@@ -47,6 +124,25 @@ artixpkg_git_config() {
artixpkg_git_config_usage artixpkg_git_config_usage
exit 0 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) --protocol=https)
proto_force=1 proto_force=1
shift shift
@@ -91,7 +187,7 @@ artixpkg_git_config() {
# Load makepkg.conf variables to be available for packager identity # Load makepkg.conf variables to be available for packager identity
msg "Collecting packager identity from makepkg.conf" msg "Collecting packager identity from makepkg.conf"
# shellcheck source=config/makepkg/x86_64.conf # shellcheck disable=2119
load_makepkg_config load_makepkg_config
if [[ -n ${PACKAGER} ]]; then if [[ -n ${PACKAGER} ]]; then
if ! packager_name=$(get_packager_name "${PACKAGER}") || \ if ! packager_name=$(get_packager_name "${PACKAGER}") || \
@@ -124,7 +220,7 @@ artixpkg_git_config() {
if [[ -n ${BOLD} ]]; then if [[ -n ${BOLD} ]]; then
export ARTOOLS_COLOR=always export ARTOOLS_COLOR=always
fi fi
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${paths[@]}"; then if ! parallel --bar --jobs "${jobs}" "${RUNCMD}" ::: "${paths[@]}"; then
die 'Failed to configure some packages, please check the output' die 'Failed to configure some packages, please check the output'
exit 1 exit 1
fi fi
@@ -167,6 +263,58 @@ artixpkg_git_config() {
git config user.signingKey "${GPGKEY}" git config user.signingKey "${GPGKEY}"
fi fi
# topics meta
if (( SET_TOPIC )); then
if [[ -n ${GIT_TOKEN} ]]; then
local topic gitname
topic="maintainer-${packager_name}"
gitname=$(get_compliant_name "${pkgbase}")
if ! add_topic "${gitname}" "${topic}"; then
warning "failed to set the maintainer topic: ${topic}"
fi
fi
fi
if (( 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 done
} }

View File

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

View File

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

View File

@@ -14,14 +14,16 @@ artixpkg_git_push_usage() {
Usage: ${COMMAND} [OPTIONS] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
OPTIONS OPTIONS
-m, --maintainer NAME Push all packages of the named maintainer -m, --maintainer=NAME Push all packages of the named maintainer
-t, --topic NAME Push all packages of the named topic -t, --topic=NAME Push all packages of the named topic
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} libfoo linux libbar $ ${COMMAND} libfoo linux libbar
$ ${COMMAND} --maintainer tux $ ${COMMAND} --maintainer tux
$ ${COMMAND} --topic mytopic $ ${COMMAND} --topic mytopic
$ ${COMMAND} -j 8 --topic mytopic
_EOF_ _EOF_
} }
@@ -36,6 +38,11 @@ artixpkg_git_push() {
# options # options
local MAINTAINER= local MAINTAINER=
local TOPIC= local TOPIC=
local CONFIGURE_OPTIONS=()
local jobs=
jobs=$(nproc)
local command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
while (( $# )); do while (( $# )); do
case $1 in case $1 in
@@ -48,11 +55,24 @@ artixpkg_git_push() {
MAINTAINER="$2" MAINTAINER="$2"
shift 2 shift 2
;; ;;
--maintainer=*)
MAINTAINER="${1#*=}"
shift
;;
-t|--topic) -t|--topic)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
TOPIC="$2" TOPIC="$2"
shift 2 shift 2
;; ;;
--topic=*)
TOPIC="${1#*=}"
shift
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--) --)
shift shift
break break
@@ -78,9 +98,22 @@ artixpkg_git_push() {
mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort) mapfile -t pkgbases < <(search_topic "${TOPIC}" | yq -P -r '.data | .[].name' | sort)
fi fi
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then
# force colors in parallel if parent process is colorized
if [[ -n ${BOLD} ]]; then
export ARTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${pkgbases[@]}"; then
die 'Failed to push some packages, please check the output'
exit 1
fi
exit 0
fi
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
if [[ -d ${pkgbase} ]]; then if [[ -d ${pkgbase} ]]; then
( cd "${pkgbase}" || return ( cd ${pkgbase} || return
msg "Pushing ${pkgbase} ..." msg "Pushing ${pkgbase} ..."
if ! git push origin master; then if ! git push origin master; then

View File

@@ -1,51 +0,0 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
get_packager_name() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local name
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
name=$(echo "${packager}"|sed -E "s/${packager_pattern}/\1/")
printf "%s" "${name}"
}
get_packager_email() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local email
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
email=$(echo "${packager}"|sed -E "s/${packager_pattern}/\2/")
printf "%s" "${email}"
}
is_packager_name_valid() {
local packager_name=$1
if [[ -z ${packager_name} ]]; then
return 1
elif [[ ${packager_name} == "John Tux" ]]; then
return 1
elif [[ ${packager_name} == "Unknown Packager" ]]; then
return 1
fi
return 0
}
is_packager_email_official() {
local packager_email=$1
if [[ -z ${packager_email} ]]; then
return 1
elif [[ $packager_email =~ .+@artixlinux.org ]]; then
return 0
fi
return 1
}

View File

@@ -11,6 +11,15 @@ source "${LIBDIR}"/pkg/db/db.sh
set -e set -e
show_agent() {
local agent="orion"
msg "Checking agent ..."
if grep @galaxy "${REPO_CI}" &>/dev/null; then
agent="taurus"
fi
msg2 "agent: %s" "$agent"
}
has_remote_changes() { has_remote_changes() {
local status local status
msg "Checking for remote changes ..." msg "Checking for remote changes ..."
@@ -41,12 +50,9 @@ artixpkg_repo_usage() {
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} add ${ARTIX_DB_MAP[2]} libfoo $ ${COMMAND} add world libfoo
$ ${COMMAND} remove ${ARTIX_DB_MAP[2]} libfoo $ ${COMMAND} remove world libfoo
$ ${COMMAND} move ${ARTIX_DB_MAP[1]} ${ARTIX_DB_MAP[2]} libfoo $ ${COMMAND} move world-gremlins world libfoo
$ ${COMMAND} add ${ARTIX_DB[4]} libfoo
$ ${COMMAND} remove ${ARTIX_DB[4]} libfoo
$ ${COMMAND} move ${ARTIX_DB[3]} ${ARTIX_DB[4]} libfoo
$ ${COMMAND} import libfoo $ ${COMMAND} import libfoo
$ ${COMMAND} show libfoo $ ${COMMAND} show libfoo
_EOF_ _EOF_

View File

@@ -44,9 +44,8 @@ artixpkg_repo_add_usage() {
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} ${ARTIX_DB[4]} libfoo $ ${COMMAND} world-gremlins libfoo
$ ${COMMAND} --push ${ARTIX_DB[4]} libfoo $ ${COMMAND} -p world-gremlins libfoo
$ ${COMMAND} --push ${ARTIX_DB_MAP[2]} libfoo
_EOF_ _EOF_
} }
@@ -65,7 +64,6 @@ artixpkg_repo_add() {
local REBUILD=0 local REBUILD=0
local NOCHECK=0 local NOCHECK=0
local ADD=1 local ADD=1
local AUTO=0
while (( $# )); do while (( $# )); do
case $1 in case $1 in
@@ -98,13 +96,9 @@ artixpkg_repo_add() {
shift shift
pkgbases+=("$@") pkgbases+=("$@")
if in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
AUTO=1
else
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!" die "${DEST} does not exist!"
fi fi
fi
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
@@ -130,27 +124,8 @@ artixpkg_repo_add() {
manage-pkgbuild-keys --export manage-pkgbuild-keys --export
update_yaml_base 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_add "${REBUILD}" "${ADD}" "${NOCHECK}" "${DEST}"
update_yaml_team "${auto}"
local commit_msg local commit_msg
commit_msg=$(get_commit_msg 'add' "${DEST}") commit_msg=$(get_commit_msg 'add' "${DEST}")
@@ -158,10 +133,6 @@ artixpkg_repo_add() {
rm .SRCINFO rm .SRCINFO
fi fi
delete_obsolete_map_keys
migrate_agent_branch
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files' stat_busy 'Staging files'

View File

@@ -7,61 +7,22 @@ ARTOOLS_INCLUDE_REPO_IMPORT_SH=1
set -e set -e
PATCHDIR=${PATCHDIR:-"${WORKSPACE_DIR}/artix-patches"}
declare -A arch_map=(
["archlinux-mirrorlist"]="pacman-mirrorlist"
["artix-rebuild-order"]="arch-rebuild-order"
["virtualbox-host-modules-artix"]="virtualbox-host-modules-arch"
)
update_patches(){
if [[ ! -d "${PATCHDIR}" ]]; then
# ${GIT_ORG}
if ! git clone "${PATCH_URL}" "${PATCHDIR}"; then
error "failed to clone %s" "${PATCHDIR}"
fi
else
if ! git -C "${PATCHDIR}" pull; then
error "Failed to pull artix-patches"
fi
fi
}
patch_pkgbase(){ patch_pkgbase(){
local name="$1" local name="$1"
local patches="${PATCHDIR}/patches/${name}" case "${name}" in
sed -e 's|arch-meson|artix-meson|' -i PKGBUILD linux|linux-lts|linux-zen|linux-hardened|linux-rt*)
sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i PKGBUILD
if "${PATCH_MAINTAINER}" && [ -n "${PACKAGER}" ]; then sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
sed -e 's|# Maintainer:|# Contributor:|' -i PKGBUILD -i config
printf '%s\n%s\n' "# Maintainer: ${PACKAGER}" "$(cat "PKGBUILD")" >"PKGBUILD" ;;
fi *)
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \
if [ -d "${patches}" ]; then -e 's|(Arch Linux)|(Artix Linux)|' \
if [ -f "${patches}/env.txt" ]; then -e 's|arch-meson|artix-meson|' \
while read -r line; do -i PKGBUILD
IFS="=" read -r key value <<< "$line" ;;
if [[ -z "${key}" ]] || [[ -z "${value}" ]]; then esac
die "Invalid key value pair in env.txt"
fi
if declare -p "${key}" &> /dev/null; then
die "Environment variable %s already exists." "${key}"
fi
export "${key}=${value}"
done < "${patches}/env.txt"
fi
for file in "${patches}"/*; do
if [ -x "${file}" ]; then
echo "$> ${name}/$(basename "${file}")"
"${file}" "${TREE_DIR_ARTIX}/${name}"
elif [[ "${file}" == *.diff ]]; then
echo "$> git apply ${name}/$(basename "${file}")"
git -C "${TREE_DIR_ARTIX}/${name}" apply "${file}"
fi
done
fi
git --no-pager diff PKGBUILD git --no-pager diff PKGBUILD
} }
@@ -135,8 +96,6 @@ artixpkg_repo_import() {
esac esac
done done
update_patches
pkgbases+=("$@") pkgbases+=("$@")
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
@@ -149,11 +108,9 @@ artixpkg_repo_import() {
fi fi
( cd "${pkgbase}" || return ( cd "${pkgbase}" || return
upstream="${arch_map["$pkgbase"]:-$pkgbase}"
stat_busy "Checking for upstream url" stat_busy "Checking for upstream url"
if ! git config --local --get remote.upstream.url &>/dev/null; then if ! git config --local --get remote.upstream.url &>/dev/null; then
git remote add upstream "${GIT_UPSTREAM_URL}/${upstream}".git git remote add upstream "${GIT_UPSTREAM_URL}/${pkgbase}".git
fi fi
stat_done stat_done
@@ -168,6 +125,7 @@ artixpkg_repo_import() {
fi fi
if ! has_remote_changes; then if ! has_remote_changes; then
show_agent
msg "Querying ${pkgbase} ..." msg "Querying ${pkgbase} ..."
if ! show_db; then if ! show_db; then
warning "Could not query ${REPO_DB}" warning "Could not query ${REPO_DB}"

View File

@@ -18,9 +18,8 @@ artixpkg_repo_move_usage() {
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo $ ${COMMAND} world-gremlins world libfoo
$ ${COMMAND} --push ${ARTIX_DB[4]} ${ARTIX_DB[5]} libfoo $ ${COMMAND} -p world-gremlins world libfoo
$ ${COMMAND} --push ${ARTIX_DB_MAP[1]} ${ARTIX_DB_MAP[2]} libfoo
_EOF_ _EOF_
} }
@@ -35,7 +34,6 @@ artixpkg_repo_move() {
local pkgbase local pkgbase
local PUSH=0 local PUSH=0
local AUTO=0
local DEST local DEST
local SRC local SRC
@@ -63,16 +61,12 @@ artixpkg_repo_move() {
DEST="$2" DEST="$2"
shift 2 shift 2
if in_array "${SRC}" "${ARTIX_DB_MAP[@]}" && in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
AUTO=1
else
if ! in_array "${SRC}" "${ARTIX_DB[@]}"; then if ! in_array "${SRC}" "${ARTIX_DB[@]}"; then
die "${SRC} does not exist!" die "${SRC} does not exist!"
fi fi
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!" die "${DEST} does not exist!"
fi fi
fi
pkgbases+=("$@") pkgbases+=("$@")
@@ -92,47 +86,25 @@ artixpkg_repo_move() {
die "No PKGBUILD found in (%s)" "${pkgbase}" die "No PKGBUILD found in (%s)" "${pkgbase}"
fi fi
local auto local commit_msg src_version dest_version
auto=$(auto_detect)
if [[ -z "${auto}" ]]; then
auto=$(team_from_yaml)
fi
if (( AUTO )); then
if [[ "${SRC}" == "${ARTIX_DB_MAP[2]}" ]]; then
SRC="${auto}"
else
SRC="${auto}-${SRC}"
fi
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}") commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}")
src_version=$(version_from_yaml "${SRC}") src_version=$(version_from_yaml "${SRC}")
dest_version=$(version_from_yaml "${DEST}")
if [[ "$src_version" != "null" ]]; then if [[ "$src_version" != null ]]; then
local ret
ret=$(vercmp "$src_version" "$dest_version")
if (( ret > 0 )); then
update_yaml_move "${SRC}" "${DEST}" update_yaml_move "${SRC}" "${DEST}"
if [[ -f .SRCINFO ]]; then if [[ -f .SRCINFO ]]; then
rm .SRCINFO rm .SRCINFO
fi fi
delete_obsolete_map_keys
migrate_agent_branch
update_yaml_team "$(auto_detect)"
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files' stat_busy 'Staging files'
@@ -158,48 +130,12 @@ artixpkg_repo_move() {
fi fi
if (( ! AUTO )); then elif (( ret < 0 )); then
local gitname error "${pkgbase}: invalid move: version $src_version < $dest_version!"
gitname=$(get_compliant_name "${pkgbase}")
# team change on cross repo move system <-> world else
if [[ "${SRC}" == ${ARTIX_DB[2]}* ]] \ error "${pkgbase}: invalid move: version $src_version = $dest_version!"
&& [[ "${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 fi

View File

@@ -18,9 +18,8 @@ artixpkg_repo_remove_usage() {
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} ${ARTIX_DB[4]} libfoo $ ${COMMAND} world-gremlins libfoo
$ ${COMMAND} --push ${ARTIX_DB[4]} libfoo $ ${COMMAND} -p world-gremlins libfoo
$ ${COMMAND} --push ${ARTIX_DB_MAP[2]} libfoo
_EOF_ _EOF_
} }
@@ -35,7 +34,6 @@ artixpkg_repo_remove() {
local pkgbase local pkgbase
local PUSH=0 local PUSH=0
local AUTO=0
local DEST='' local DEST=''
while (( $# )); do while (( $# )); do
@@ -61,13 +59,9 @@ artixpkg_repo_remove() {
shift shift
pkgbases=("$@") pkgbases=("$@")
if in_array "${DEST}" "${ARTIX_DB_MAP[@]}"; then
AUTO=1
else
if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then if ! in_array "${DEST}" "${ARTIX_DB[@]}"; then
die "${DEST} does not exist!" die "${DEST} does not exist!"
fi fi
fi
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
@@ -85,30 +79,11 @@ artixpkg_repo_remove() {
die "No PKGBUILD found in (%s)" "${pkgbase}" die "No PKGBUILD found in (%s)" "${pkgbase}"
fi fi
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 local commit_msg
commit_msg=$(get_commit_msg 'remove' "${DEST}") commit_msg=$(get_commit_msg 'remove' "${DEST}")
update_yaml_remove "${DEST}" update_yaml_remove "${DEST}"
delete_obsolete_map_keys
migrate_agent_branch
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files' stat_busy 'Staging files'

View File

@@ -77,6 +77,8 @@ artixpkg_repo_show() {
die "No PKGBUILD found in (%s)" "${pkgbase}" die "No PKGBUILD found in (%s)" "${pkgbase}"
fi fi
show_agent
msg "Querying ${pkgbase} ..." msg "Querying ${pkgbase} ..."
if ! show_db; then if ! show_db; then
warning "Could not query ${REPO_DB}" warning "Could not query ${REPO_DB}"

View File

@@ -4,21 +4,6 @@
#{{{ pkg conf #{{{ pkg conf
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p "$1"
return 0
}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
prepare_dir "${USER_CONF_DIR}"
load_pkg_config(){ load_pkg_config(){
local conf="$1/artools-pkg.conf" local conf="$1/artools-pkg.conf"
@@ -28,20 +13,10 @@ load_pkg_config(){
# shellcheck source=config/conf/artools-pkg.conf # shellcheck source=config/conf/artools-pkg.conf
[[ -r "$conf" ]] && source "$conf" [[ -r "$conf" ]] && source "$conf"
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} local git_domain="gitea.artixlinux.org"
WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"}
ARCH=${ARCH:-"$(uname -m)"}
REPO=${REPO:-'world'}
local -r git_domain="gitea.artixlinux.org"
GIT_HTTPS=${GIT_HTTPS:-"https://${git_domain}"} GIT_HTTPS=${GIT_HTTPS:-"https://${git_domain}"}
readonly API_URL="${GIT_HTTPS}/api/v1"
GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"} GIT_SSH=${GIT_SSH:-"gitea@${git_domain}"}
GIT_TOKEN=${GIT_TOKEN:-''} GIT_TOKEN=${GIT_TOKEN:-''}
@@ -50,8 +25,6 @@ load_pkg_config(){
GIT_UPSTREAM_URL=${GIT_UPSTREAM_URL:-"https://gitlab.archlinux.org/archlinux/packaging/packages"} GIT_UPSTREAM_URL=${GIT_UPSTREAM_URL:-"https://gitlab.archlinux.org/archlinux/packaging/packages"}
GIT_ORG_ARCHIVE=${GIT_ORG_ARCHIVE:-'landfill'}
TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"} TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"}
REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"} REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
@@ -60,14 +33,6 @@ load_pkg_config(){
DBEXT=${DBEXT:-'gz'} DBEXT=${DBEXT:-'gz'}
PATCH_MAINTAINER=${PATCH_MAINTAINER:-false}
PATCH_URL=${PATCH_URL:-"${GIT_SSH}:artix/artix-patches.git"}
if [[ -z "${AGENTS[*]}" ]]; then
AGENTS=(orion taurus)
fi
return 0 return 0
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -23,8 +23,7 @@ usage() {
_EOF_ _EOF_
} }
action='' action=
error=0
# option checking # option checking
while (( $# )); do while (( $# )); do
@@ -58,6 +57,8 @@ if [[ "$action" == 'export' ]]; then
TEMPDIR=$(mktemp -d --tmpdir export-pkgbuild-keys.XXXXXXXXXX) TEMPDIR=$(mktemp -d --tmpdir export-pkgbuild-keys.XXXXXXXXXX)
mkdir -p keys/pgp mkdir -p keys/pgp
error=0
for key in "${validpgpkeys[@]}"; do for key in "${validpgpkeys[@]}"; do
gpg --output "$TEMPDIR/$key.asc" --armor --export --export-options export-minimal "$key" 2>/dev/null gpg --output "$TEMPDIR/$key.asc" --armor --export --export-options export-minimal "$key" 2>/dev/null
@@ -76,21 +77,18 @@ if [[ "$action" == 'export' ]]; then
fi fi
done done
elif [[ "$action" == 'import' ]]; then elif [[ "$action" == 'import' ]]; then
msg "Ensuring required PGP keys are present..." msg "Ensuring required PGP keys are present..."
for key in "${validpgpkeys[@]}"; do for key in "${validpgpkeys[@]}"; do
if ! gpg --list-keys "$key" &>/dev/null; then
msg2 "Checking for $key..." msg2 "Checking for $key..."
if ! gpg --recv-keys "$key" || ! gpg --fingerprint "$key"; then if ! gpg --recv-keys $key || gpg --fingerprint $key; then
if [[ -f keys/pgp/$key.asc ]]; then if [[ -f keys/pgp/$key.asc ]]; then
msg2 "Importing key from local..." msg2 "Importing key from local..."
gpg --import "keys/pgp/$key.asc" gpg --import keys/pgp/$key.asc
else else
error "Key unavailable: $key" error "Key unavailable: $key"
error=1 error=1
fi fi
fi fi
fi
done done
fi fi

View File

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

View File

@@ -1,55 +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
# shellcheck source=src/lib/base/chroot.sh
source "${LIBDIR}"/base/chroot.sh
# shellcheck source=src/lib/pkg/deploy.sh
source "${LIBDIR}"/pkg/deploy.sh
# shellcheck source=config/makepkg/x86_64.conf
load_makepkg_config
export PKGDEST
export GPG_KEY
export GPG_PASS
passfiles=("$@")
sign_pkg(){
local file_to_sign="$1"
if [ ! -e "$file_to_sign" ]; then
error "%s does not exist!" "$file_to_sign"
exit 1
fi
if [[ -n "${GPG_KEY}" ]] && [[ -n "${GPG_PASS}" ]]; then
msg "Signing [%s]" "${file_to_sign##*/}"
gpg --homedir /etc/pacman.d/gnupg --no-permission-warning \
--no-default-keyring --default-key "${GPG_KEY}" --passphrase "${GPG_PASS}" \
-q --detach-sign "$file_to_sign"
fi
}
check_root PKGDEST,GPG_KEY,GPG_PASS "${BASH_SOURCE[0]}" "$@"
for pkg in "${passfiles[@]}"; do
msg "Searching %s ..." "$pkg"
if pkgfile=$(find_cached_pkgfile "$pkg");then
msg2 "Found: %s" "${pkgfile}"
[[ -e "${pkgfile}".sig ]] && rm "${pkgfile}".sig
if ! sign_pkg "${pkgfile}"; then
die "Failed to sign package!"
fi
ret=0
else
ret=1
fi
done
exit "$ret"

View File

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

View File

@@ -6,6 +6,8 @@ LIBDIR=${LIBDIR:-'@libdir@'}
DATADIR=${DATADIR:-'@datadir@'} DATADIR=${DATADIR:-'@datadir@'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
# shellcheck source=src/lib/base/util.sh
source "${LIBDIR}"/base/util.sh
# shellcheck source=src/lib/pkg/util.sh # shellcheck source=src/lib/pkg/util.sh
source "${LIBDIR}"/pkg/util.sh source "${LIBDIR}"/pkg/util.sh
# shellcheck source=src/lib/base/message.sh # shellcheck source=src/lib/base/message.sh
@@ -20,7 +22,6 @@ add() {
msg "Found: %s" "${pkgfile}" msg "Found: %s" "${pkgfile}"
packages+=("${pkgname}") packages+=("${pkgname}")
action='add' action='add'
action_args+=(--include-sigs)
ln -sfv "${pkgfile}"{,.sig} "${repo_path}"/ ln -sfv "${pkgfile}"{,.sig} "${repo_path}"/
fi fi
} }
@@ -33,7 +34,6 @@ remove(){
repo_action() { repo_action() {
local repo_path local repo_path
# shellcheck disable=SC2153
repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH} repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH}
local packages=() action func="$1" local packages=() action func="$1"
@@ -42,7 +42,7 @@ repo_action() {
done done
( cd "${repo_path}" || return ( cd "${repo_path}" || return
if [[ -n "${action}" ]]; then if [[ -n "${action}" ]]; then
repo-"${action}" "${action_args[@]}" "${dest_repo}.${db_ext}" "${packages[@]}" repo-"${action}" -R "${dest_repo}.${db_ext}" "${packages[@]}"
fi fi
) )
} }
@@ -58,7 +58,6 @@ rm_pkg=false
cmd=${0##*/} cmd=${0##*/}
dest_repo=${cmd#*-} dest_repo=${cmd#*-}
action_args=(-R)
usage() { usage() {
printf "Usage: %s [options]\n" "${cmd}" printf "Usage: %s [options]\n" "${cmd}"

View File

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