From 77954b988b6cef7dc25932ecb56cbbec3a22499f Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Tue, 10 Jan 2023 19:42:03 +0200 Subject: [PATCH] subcommand review Some commands have been moved to another group and thus having another default name (old subcommands are still available...for now): * daemon -> repo-daemon * key-import -> service-key-import * repo-clean -> service-clean * repo-config -> service-config * repo-config-validate -> service-config-validate * repo-setup -> service-setup * repo-shell -> service-shell * version -> help-version --- .github/workflows/setup.sh | 4 +- docker/entrypoint.sh | 4 +- docs/ahriman.1 | 310 +++++++++--------- docs/architecture.rst | 16 + docs/completions/bash/_ahriman | 243 ++++++++------ docs/completions/zsh/_ahriman | 74 +++++ docs/configuration.rst | 4 +- docs/faq.rst | 10 +- docs/setup.rst | 4 +- .../lib/systemd/system/ahriman-web@.service | 2 +- src/ahriman/application/ahriman.py | 310 +++++++++--------- src/ahriman/core/spawn.py | 2 +- .../handlers/test_handler_unsafe_commands.py | 4 +- tests/ahriman/application/test_ahriman.py | 262 +++++++-------- tests/ahriman/core/test_spawn.py | 4 +- 15 files changed, 699 insertions(+), 554 deletions(-) diff --git a/.github/workflows/setup.sh b/.github/workflows/setup.sh index c8d064ba..42d17b97 100755 --- a/.github/workflows/setup.sh +++ b/.github/workflows/setup.sh @@ -38,9 +38,9 @@ systemd-machine-id-setup sed -i "s/handlers = syslog_handler/handlers = console_handler/g" /etc/ahriman.ini.d/logging.ini # initial setup command as root [[ -z $MINIMAL_INSTALL ]] && WEB_ARGS=("--web-port" "8080") -ahriman -a x86_64 repo-setup --packager "ahriman bot " --repository "github" "${WEB_ARGS[@]}" +ahriman -a x86_64 service-setup --packager "ahriman bot " --repository "github" "${WEB_ARGS[@]}" # validate configuration -ahriman -a x86_64 repo-config-validate --exit-code +ahriman -a x86_64 service-config-validate --exit-code # enable services systemctl enable ahriman-web@x86_64 systemctl enable ahriman@x86_64.timer diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 1bfec206..9d297a09 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -45,10 +45,10 @@ fi if [ -n "$AHRIMAN_UNIX_SOCKET" ]; then AHRIMAN_SETUP_ARGS+=("--web-unix-socket" "$AHRIMAN_UNIX_SOCKET") fi -ahriman "${AHRIMAN_DEFAULT_ARGS[@]}" repo-setup "${AHRIMAN_SETUP_ARGS[@]}" +ahriman "${AHRIMAN_DEFAULT_ARGS[@]}" service-setup "${AHRIMAN_SETUP_ARGS[@]}" # validate configuration if set -[ -n "$AHRIMAN_VALIDATE_CONFIGURATION" ] && ahriman "${AHRIMAN_DEFAULT_ARGS[@]}" repo-config-validate --exit-code +[ -n "$AHRIMAN_VALIDATE_CONFIGURATION" ] && ahriman "${AHRIMAN_DEFAULT_ARGS[@]}" service-config-validate --exit-code # create machine-id which is required by build tools systemd-machine-id-setup &> /dev/null diff --git a/docs/ahriman.1 b/docs/ahriman.1 index baae1399..fe53b379 100644 --- a/docs/ahriman.1 +++ b/docs/ahriman.1 @@ -1,9 +1,9 @@ -.TH AHRIMAN "1" "2023\-01\-09" "ahriman" "Generated Python Manual" +.TH AHRIMAN "1" "2023\-01\-11" "ahriman" "Generated Python Manual" .SH NAME ahriman .SH SYNOPSIS .B ahriman -[-h] [-a ARCHITECTURE] [-c CONFIGURATION] [--force] [-l LOCK] [--report | --no-report] [-q] [--unsafe] [-V] {aur-search,search,daemon,help,help-commands-unsafe,key-import,package-add,add,package-update,package-remove,remove,package-status,status,package-status-remove,package-status-update,status-update,patch-add,patch-list,patch-remove,patch-set-add,repo-backup,repo-check,check,repo-clean,clean,repo-config,config,repo-config-validate,config-validate,repo-rebuild,rebuild,repo-remove-unknown,remove-unknown,repo-report,report,repo-restore,repo-setup,init,repo-init,setup,repo-sign,sign,repo-status-update,repo-sync,sync,repo-tree,repo-triggers,repo-update,update,shell,user-add,user-list,user-remove,version,web} ... +[-h] [-a ARCHITECTURE] [-c CONFIGURATION] [--force] [-l LOCK] [--report | --no-report] [-q] [--unsafe] [-V] {aur-search,search,help,help-commands-unsafe,help-version,version,package-add,add,package-update,package-remove,remove,package-status,status,package-status-remove,package-status-update,status-update,patch-add,patch-list,patch-remove,patch-set-add,repo-backup,repo-check,check,repo-daemon,daemon,repo-rebuild,rebuild,repo-remove-unknown,remove-unknown,repo-report,report,repo-restore,repo-sign,sign,repo-status-update,repo-sync,sync,repo-tree,repo-triggers,repo-update,update,service-clean,clean,repo-clean,service-config,config,repo-config,service-config-validate,config-validate,repo-config-validate,service-key-import,key-import,service-setup,init,repo-init,repo-setup,setup,service-shell,shell,user-add,user-list,user-remove,web} ... .SH DESCRIPTION ArcH linux ReposItory MANager @@ -46,17 +46,14 @@ COMMAND \fBahriman\fR \fI\,aur\-search\/\fR search for package .TP -\fBahriman\fR \fI\,daemon\/\fR -run application as daemon -.TP \fBahriman\fR \fI\,help\/\fR show help message .TP \fBahriman\fR \fI\,help\-commands\-unsafe\/\fR list unsafe commands .TP -\fBahriman\fR \fI\,key\-import\/\fR -import PGP key +\fBahriman\fR \fI\,help\-version\/\fR +application version .TP \fBahriman\fR \fI\,package\-add\/\fR add package @@ -91,14 +88,8 @@ backup repository data \fBahriman\fR \fI\,repo\-check\/\fR check for updates .TP -\fBahriman\fR \fI\,repo\-clean\/\fR -clean local caches -.TP -\fBahriman\fR \fI\,repo\-config\/\fR -dump configuration -.TP -\fBahriman\fR \fI\,repo\-config\-validate\/\fR -validate system configuration +\fBahriman\fR \fI\,repo\-daemon\/\fR +run application as daemon .TP \fBahriman\fR \fI\,repo\-rebuild\/\fR rebuild repository @@ -112,9 +103,6 @@ generate report \fBahriman\fR \fI\,repo\-restore\/\fR restore repository data .TP -\fBahriman\fR \fI\,repo\-setup\/\fR -initial service configuration -.TP \fBahriman\fR \fI\,repo\-sign\/\fR sign packages .TP @@ -133,7 +121,22 @@ run triggers \fBahriman\fR \fI\,repo\-update\/\fR update packages .TP -\fBahriman\fR \fI\,shell\/\fR +\fBahriman\fR \fI\,service\-clean\/\fR +clean local caches +.TP +\fBahriman\fR \fI\,service\-config\/\fR +dump configuration +.TP +\fBahriman\fR \fI\,service\-config\-validate\/\fR +validate system configuration +.TP +\fBahriman\fR \fI\,service\-key\-import\/\fR +import PGP key +.TP +\fBahriman\fR \fI\,service\-setup\/\fR +initial service configuration +.TP +\fBahriman\fR \fI\,service\-shell\/\fR invoke python shell .TP \fBahriman\fR \fI\,user\-add\/\fR @@ -145,9 +148,6 @@ user known users and their access \fBahriman\fR \fI\,user\-remove\/\fR remove user .TP -\fBahriman\fR \fI\,version\/\fR -application version -.TP \fBahriman\fR \fI\,web\/\fR web server @@ -176,37 +176,6 @@ show additional package information (default: False) sort field by this field. In case if two packages have the same value of the specified field, they will be always sorted by name -.SH COMMAND \fI\,'ahriman daemon'\/\fR -usage: ahriman daemon [\-h] [\-i INTERVAL] [\-\-aur | \-\-no\-aur] [\-\-local | \-\-no\-local] [\-\-manual | \-\-no\-manual] - [\-\-vcs | \-\-no\-vcs] [\-y] - -start process which periodically will run update process - -.SH OPTIONS \fI\,'ahriman daemon'\/\fR -.TP -\fB\-i\fR \fI\,INTERVAL\/\fR, \fB\-\-interval\fR \fI\,INTERVAL\/\fR -interval between runs in seconds - -.TP -\fB\-\-aur\fR, \fB\-\-no\-aur\fR -enable or disable checking for AUR updates. Implies \-\-no\-vcs (default: True) - -.TP -\fB\-\-local\fR, \fB\-\-no\-local\fR -enable or disable checking of local packages for updates (default: True) - -.TP -\fB\-\-manual\fR, \fB\-\-no\-manual\fR -include or exclude manual updates (default: True) - -.TP -\fB\-\-vcs\fR, \fB\-\-no\-vcs\fR -enable or disable checking of VCS packages (default: True) - -.TP -\fB\-y\fR, \fB\-\-refresh\fR -download fresh package databases from the mirror before actions, \-yy to force refresh even if up to date - .SH COMMAND \fI\,'ahriman help'\/\fR usage: ahriman help [\-h] [command] @@ -227,19 +196,10 @@ list unsafe commands as defined in default args instead of showing commands, just test command line for unsafe subcommand and return 0 in case if command is safe and 1 otherwise -.SH COMMAND \fI\,'ahriman key\-import'\/\fR -usage: ahriman key\-import [\-h] [\-\-key\-server KEY_SERVER] key +.SH COMMAND \fI\,'ahriman help\-version'\/\fR +usage: ahriman help\-version [\-h] -import PGP key from public sources to the repository user - -.TP -\fBkey\fR -PGP key to import from public server - -.SH OPTIONS \fI\,'ahriman key\-import'\/\fR -.TP -\fB\-\-key\-server\fR \fI\,KEY_SERVER\/\fR -key server for key import +print application and its dependencies versions .SH COMMAND \fI\,'ahriman package\-add'\/\fR usage: ahriman package\-add [\-h] [\-e] [\-n] [\-y] [\-s {auto,archive,aur,directory,local,remote,repository}] @@ -427,47 +387,36 @@ enable or disable checking of VCS packages (default: True) \fB\-y\fR, \fB\-\-refresh\fR download fresh package databases from the mirror before actions, \-yy to force refresh even if up to date -.SH COMMAND \fI\,'ahriman repo\-clean'\/\fR -usage: ahriman repo\-clean [\-h] [\-\-cache | \-\-no\-cache] [\-\-chroot | \-\-no\-chroot] [\-\-manual | \-\-no\-manual] - [\-\-packages | \-\-no\-packages] [\-\-pacman | \-\-no\-pacman] +.SH COMMAND \fI\,'ahriman repo\-daemon'\/\fR +usage: ahriman repo\-daemon [\-h] [\-i INTERVAL] [\-\-aur | \-\-no\-aur] [\-\-local | \-\-no\-local] [\-\-manual | \-\-no\-manual] + [\-\-vcs | \-\-no\-vcs] [\-y] -remove local caches +start process which periodically will run update process -.SH OPTIONS \fI\,'ahriman repo\-clean'\/\fR +.SH OPTIONS \fI\,'ahriman repo\-daemon'\/\fR .TP -\fB\-\-cache\fR, \fB\-\-no\-cache\fR -clear directory with package caches (default: False) +\fB\-i\fR \fI\,INTERVAL\/\fR, \fB\-\-interval\fR \fI\,INTERVAL\/\fR +interval between runs in seconds .TP -\fB\-\-chroot\fR, \fB\-\-no\-chroot\fR -clear build chroot (default: False) +\fB\-\-aur\fR, \fB\-\-no\-aur\fR +enable or disable checking for AUR updates. Implies \-\-no\-vcs (default: True) + +.TP +\fB\-\-local\fR, \fB\-\-no\-local\fR +enable or disable checking of local packages for updates (default: True) .TP \fB\-\-manual\fR, \fB\-\-no\-manual\fR -clear manually added packages queue (default: False) +include or exclude manual updates (default: True) .TP -\fB\-\-packages\fR, \fB\-\-no\-packages\fR -clear directory with built packages (default: False) +\fB\-\-vcs\fR, \fB\-\-no\-vcs\fR +enable or disable checking of VCS packages (default: True) .TP -\fB\-\-pacman\fR, \fB\-\-no\-pacman\fR -clear directory with pacman local database cache (default: False) - -.SH COMMAND \fI\,'ahriman repo\-config'\/\fR -usage: ahriman repo\-config [\-h] - -dump configuration for the specified architecture - -.SH COMMAND \fI\,'ahriman repo\-config\-validate'\/\fR -usage: ahriman repo\-config\-validate [\-h] [\-e] - -validate configuration and print found errors - -.SH OPTIONS \fI\,'ahriman repo\-config\-validate'\/\fR -.TP -\fB\-e\fR, \fB\-\-exit\-code\fR -return non\-zero exit status if configuration is invalid +\fB\-y\fR, \fB\-\-refresh\fR +download fresh package databases from the mirror before actions, \-yy to force refresh even if up to date .SH COMMAND \fI\,'ahriman repo\-rebuild'\/\fR usage: ahriman repo\-rebuild [\-h] [\-\-depends\-on DEPENDS_ON] [\-\-dry\-run] [\-\-from\-database] [\-e] @@ -522,60 +471,6 @@ path of the input archive \fB\-o\fR \fI\,OUTPUT\/\fR, \fB\-\-output\fR \fI\,OUTPUT\/\fR root path of the extracted files -.SH COMMAND \fI\,'ahriman repo\-setup'\/\fR -usage: ahriman repo\-setup [\-h] [\-\-build\-as\-user BUILD_AS_USER] [\-\-build\-command BUILD_COMMAND] - [\-\-from\-configuration FROM_CONFIGURATION] [\-\-makeflags\-jobs | \-\-no\-makeflags\-jobs] - [\-\-multilib | \-\-no\-multilib] \-\-packager PACKAGER \-\-repository REPOSITORY [\-\-sign\-key SIGN_KEY] - [\-\-sign\-target {disabled,packages,repository}] [\-\-web\-port WEB_PORT] - [\-\-web\-unix\-socket WEB_UNIX_SOCKET] - -create initial service configuration, requires root - -.SH OPTIONS \fI\,'ahriman repo\-setup'\/\fR -.TP -\fB\-\-build\-as\-user\fR \fI\,BUILD_AS_USER\/\fR -force makepkg user to the specific one - -.TP -\fB\-\-build\-command\fR \fI\,BUILD_COMMAND\/\fR -build command prefix - -.TP -\fB\-\-from\-configuration\fR \fI\,FROM_CONFIGURATION\/\fR -path to default devtools pacman configuration - -.TP -\fB\-\-makeflags\-jobs\fR, \fB\-\-no\-makeflags\-jobs\fR -append MAKEFLAGS variable with parallelism set to number of cores (default: True) - -.TP -\fB\-\-multilib\fR, \fB\-\-no\-multilib\fR -add or do not multilib repository (default: True) - -.TP -\fB\-\-packager\fR \fI\,PACKAGER\/\fR -packager name and email - -.TP -\fB\-\-repository\fR \fI\,REPOSITORY\/\fR -repository name - -.TP -\fB\-\-sign\-key\fR \fI\,SIGN_KEY\/\fR -sign key id - -.TP -\fB\-\-sign\-target\fR \fI\,{disabled,packages,repository}\/\fR -sign options - -.TP -\fB\-\-web\-port\fR \fI\,WEB_PORT\/\fR -port of the web service - -.TP -\fB\-\-web\-unix\-socket\fR \fI\,WEB_UNIX_SOCKET\/\fR -path to unix socket used for interprocess communications - .SH COMMAND \fI\,'ahriman repo\-sign'\/\fR usage: ahriman repo\-sign [\-h] [package ...] @@ -654,8 +549,118 @@ enable or disable checking of VCS packages (default: True) \fB\-y\fR, \fB\-\-refresh\fR download fresh package databases from the mirror before actions, \-yy to force refresh even if up to date -.SH COMMAND \fI\,'ahriman shell'\/\fR -usage: ahriman shell [\-h] [code] +.SH COMMAND \fI\,'ahriman service\-clean'\/\fR +usage: ahriman service\-clean [\-h] [\-\-cache | \-\-no\-cache] [\-\-chroot | \-\-no\-chroot] [\-\-manual | \-\-no\-manual] + [\-\-packages | \-\-no\-packages] [\-\-pacman | \-\-no\-pacman] + +remove local caches + +.SH OPTIONS \fI\,'ahriman service\-clean'\/\fR +.TP +\fB\-\-cache\fR, \fB\-\-no\-cache\fR +clear directory with package caches (default: False) + +.TP +\fB\-\-chroot\fR, \fB\-\-no\-chroot\fR +clear build chroot (default: False) + +.TP +\fB\-\-manual\fR, \fB\-\-no\-manual\fR +clear manually added packages queue (default: False) + +.TP +\fB\-\-packages\fR, \fB\-\-no\-packages\fR +clear directory with built packages (default: False) + +.TP +\fB\-\-pacman\fR, \fB\-\-no\-pacman\fR +clear directory with pacman local database cache (default: False) + +.SH COMMAND \fI\,'ahriman service\-config'\/\fR +usage: ahriman service\-config [\-h] + +dump configuration for the specified architecture + +.SH COMMAND \fI\,'ahriman service\-config\-validate'\/\fR +usage: ahriman service\-config\-validate [\-h] [\-e] + +validate configuration and print found errors + +.SH OPTIONS \fI\,'ahriman service\-config\-validate'\/\fR +.TP +\fB\-e\fR, \fB\-\-exit\-code\fR +return non\-zero exit status if configuration is invalid + +.SH COMMAND \fI\,'ahriman service\-key\-import'\/\fR +usage: ahriman service\-key\-import [\-h] [\-\-key\-server KEY_SERVER] key + +import PGP key from public sources to the repository user + +.TP +\fBkey\fR +PGP key to import from public server + +.SH OPTIONS \fI\,'ahriman service\-key\-import'\/\fR +.TP +\fB\-\-key\-server\fR \fI\,KEY_SERVER\/\fR +key server for key import + +.SH COMMAND \fI\,'ahriman service\-setup'\/\fR +usage: ahriman service\-setup [\-h] [\-\-build\-as\-user BUILD_AS_USER] [\-\-build\-command BUILD_COMMAND] + [\-\-from\-configuration FROM_CONFIGURATION] [\-\-makeflags\-jobs | \-\-no\-makeflags\-jobs] + [\-\-multilib | \-\-no\-multilib] \-\-packager PACKAGER \-\-repository REPOSITORY + [\-\-sign\-key SIGN_KEY] [\-\-sign\-target {disabled,packages,repository}] [\-\-web\-port WEB_PORT] + [\-\-web\-unix\-socket WEB_UNIX_SOCKET] + +create initial service configuration, requires root + +.SH OPTIONS \fI\,'ahriman service\-setup'\/\fR +.TP +\fB\-\-build\-as\-user\fR \fI\,BUILD_AS_USER\/\fR +force makepkg user to the specific one + +.TP +\fB\-\-build\-command\fR \fI\,BUILD_COMMAND\/\fR +build command prefix + +.TP +\fB\-\-from\-configuration\fR \fI\,FROM_CONFIGURATION\/\fR +path to default devtools pacman configuration + +.TP +\fB\-\-makeflags\-jobs\fR, \fB\-\-no\-makeflags\-jobs\fR +append MAKEFLAGS variable with parallelism set to number of cores (default: True) + +.TP +\fB\-\-multilib\fR, \fB\-\-no\-multilib\fR +add or do not multilib repository (default: True) + +.TP +\fB\-\-packager\fR \fI\,PACKAGER\/\fR +packager name and email + +.TP +\fB\-\-repository\fR \fI\,REPOSITORY\/\fR +repository name + +.TP +\fB\-\-sign\-key\fR \fI\,SIGN_KEY\/\fR +sign key id + +.TP +\fB\-\-sign\-target\fR \fI\,{disabled,packages,repository}\/\fR +sign options + +.TP +\fB\-\-web\-port\fR \fI\,WEB_PORT\/\fR +port of the web service + +.TP +\fB\-\-web\-unix\-socket\fR \fI\,WEB_UNIX_SOCKET\/\fR +path to unix socket used for interprocess communications + +.SH COMMAND \fI\,'ahriman service\-shell'\/\fR +usage: ahriman service\-shell [\-h] [code] drop into python shell while having created application @@ -713,11 +718,6 @@ remove user from the user mapping and update the configuration \fBusername\fR username for web service -.SH COMMAND \fI\,'ahriman version'\/\fR -usage: ahriman version [\-h] - -print application and its dependencies versions - .SH COMMAND \fI\,'ahriman web'\/\fR usage: ahriman web [\-h] diff --git a/docs/architecture.rst b/docs/architecture.rst index 9b4c3f47..33cfc6d0 100644 --- a/docs/architecture.rst +++ b/docs/architecture.rst @@ -81,6 +81,22 @@ In the most cases handlers spawn god class ``ahriman.application.application.App Application is designed to run from ``systemd`` services and provides parametrized by architecture timer and service file for that. +Subcommand design +^^^^^^^^^^^^^^^^^ + +All subcommands are divided into several groups depending on the role they are doing: + +* ``aur`` (``aur-search``) group is for AUR operations. +* ``help`` (e.g. ``help``) are system commands. +* ``package`` subcommands (e.g. ``package-add``) allow to perform single package actions. +* ``patch`` subcommands (e.g. ``pacth-list``) are the special case of ``package`` subcommands introduced in order to control patches for packages. +* ``repo`` subcommands (e.g. ``repo-check``) usually perform actions on whole repository. +* ``service`` subcommands (e.g. ``service-setup``) perform actions which are related to whole service managing: create repository, show configuration. +* ``user`` subcommands (``user-add``) are intended for user management. +* ``web`` subcommands are related to web service management. + +For historical reasons and in order to keep backward compatibility some subcommands have aliases to their shorter forms or even other groups, but the service doesn't guarantee that they will remain unchanged. + Database -------- diff --git a/docs/completions/bash/_ahriman b/docs/completions/bash/_ahriman index ef5eb435..39ddad34 100644 --- a/docs/completions/bash/_ahriman +++ b/docs/completions/bash/_ahriman @@ -1,14 +1,14 @@ # AUTOMATICALLY GENERATED by `shtab` -_shtab_ahriman_subparsers=('aur-search' 'search' 'daemon' 'help' 'help-commands-unsafe' 'key-import' 'package-add' 'add' 'package-update' 'package-remove' 'remove' 'package-status' 'status' 'package-status-remove' 'package-status-update' 'status-update' 'patch-add' 'patch-list' 'patch-remove' 'patch-set-add' 'repo-backup' 'repo-check' 'check' 'repo-clean' 'clean' 'repo-config' 'config' 'repo-config-validate' 'config-validate' 'repo-rebuild' 'rebuild' 'repo-remove-unknown' 'remove-unknown' 'repo-report' 'report' 'repo-restore' 'repo-setup' 'init' 'repo-init' 'setup' 'repo-sign' 'sign' 'repo-status-update' 'repo-sync' 'sync' 'repo-tree' 'repo-triggers' 'repo-update' 'update' 'shell' 'user-add' 'user-list' 'user-remove' 'version' 'web') +_shtab_ahriman_subparsers=('aur-search' 'search' 'help' 'help-commands-unsafe' 'help-version' 'version' 'package-add' 'add' 'package-update' 'package-remove' 'remove' 'package-status' 'status' 'package-status-remove' 'package-status-update' 'status-update' 'patch-add' 'patch-list' 'patch-remove' 'patch-set-add' 'repo-backup' 'repo-check' 'check' 'repo-daemon' 'daemon' 'repo-rebuild' 'rebuild' 'repo-remove-unknown' 'remove-unknown' 'repo-report' 'report' 'repo-restore' 'repo-sign' 'sign' 'repo-status-update' 'repo-sync' 'sync' 'repo-tree' 'repo-triggers' 'repo-update' 'update' 'service-clean' 'clean' 'repo-clean' 'service-config' 'config' 'repo-config' 'service-config-validate' 'config-validate' 'repo-config-validate' 'service-key-import' 'key-import' 'service-setup' 'init' 'repo-init' 'repo-setup' 'setup' 'service-shell' 'shell' 'user-add' 'user-list' 'user-remove' 'web') _shtab_ahriman_option_strings=('-h' '--help' '-a' '--architecture' '-c' '--configuration' '--force' '-l' '--lock' '--report' '--no-report' '-q' '--quiet' '--unsafe' '-V' '--version') _shtab_ahriman_aur_search_option_strings=('-h' '--help' '-e' '--exit-code' '--info' '--no-info' '--sort-by') _shtab_ahriman_search_option_strings=('-h' '--help' '-e' '--exit-code' '--info' '--no-info' '--sort-by') -_shtab_ahriman_daemon_option_strings=('-h' '--help' '-i' '--interval' '--aur' '--no-aur' '--local' '--no-local' '--manual' '--no-manual' '--vcs' '--no-vcs' '-y' '--refresh') _shtab_ahriman_help_option_strings=('-h' '--help') _shtab_ahriman_help_commands_unsafe_option_strings=('-h' '--help' '--command') -_shtab_ahriman_key_import_option_strings=('-h' '--help' '--key-server') +_shtab_ahriman_help_version_option_strings=('-h' '--help') +_shtab_ahriman_version_option_strings=('-h' '--help') _shtab_ahriman_package_add_option_strings=('-h' '--help' '-e' '--exit-code' '-n' '--now' '-y' '--refresh' '-s' '--source' '--without-dependencies') _shtab_ahriman_add_option_strings=('-h' '--help' '-e' '--exit-code' '-n' '--now' '-y' '--refresh' '-s' '--source' '--without-dependencies') _shtab_ahriman_package_update_option_strings=('-h' '--help' '-e' '--exit-code' '-n' '--now' '-y' '--refresh' '-s' '--source' '--without-dependencies') @@ -26,12 +26,8 @@ _shtab_ahriman_patch_set_add_option_strings=('-h' '--help' '-t' '--track') _shtab_ahriman_repo_backup_option_strings=('-h' '--help') _shtab_ahriman_repo_check_option_strings=('-h' '--help' '-e' '--exit-code' '--vcs' '--no-vcs' '-y' '--refresh') _shtab_ahriman_check_option_strings=('-h' '--help' '-e' '--exit-code' '--vcs' '--no-vcs' '-y' '--refresh') -_shtab_ahriman_repo_clean_option_strings=('-h' '--help' '--cache' '--no-cache' '--chroot' '--no-chroot' '--manual' '--no-manual' '--packages' '--no-packages' '--pacman' '--no-pacman') -_shtab_ahriman_clean_option_strings=('-h' '--help' '--cache' '--no-cache' '--chroot' '--no-chroot' '--manual' '--no-manual' '--packages' '--no-packages' '--pacman' '--no-pacman') -_shtab_ahriman_repo_config_option_strings=('-h' '--help') -_shtab_ahriman_config_option_strings=('-h' '--help') -_shtab_ahriman_repo_config_validate_option_strings=('-h' '--help' '-e' '--exit-code') -_shtab_ahriman_config_validate_option_strings=('-h' '--help' '-e' '--exit-code') +_shtab_ahriman_repo_daemon_option_strings=('-h' '--help' '-i' '--interval' '--aur' '--no-aur' '--local' '--no-local' '--manual' '--no-manual' '--vcs' '--no-vcs' '-y' '--refresh') +_shtab_ahriman_daemon_option_strings=('-h' '--help' '-i' '--interval' '--aur' '--no-aur' '--local' '--no-local' '--manual' '--no-manual' '--vcs' '--no-vcs' '-y' '--refresh') _shtab_ahriman_repo_rebuild_option_strings=('-h' '--help' '--depends-on' '--dry-run' '--from-database' '-e' '--exit-code') _shtab_ahriman_rebuild_option_strings=('-h' '--help' '--depends-on' '--dry-run' '--from-database' '-e' '--exit-code') _shtab_ahriman_repo_remove_unknown_option_strings=('-h' '--help' '--dry-run') @@ -39,10 +35,6 @@ _shtab_ahriman_remove_unknown_option_strings=('-h' '--help' '--dry-run') _shtab_ahriman_repo_report_option_strings=('-h' '--help') _shtab_ahriman_report_option_strings=('-h' '--help') _shtab_ahriman_repo_restore_option_strings=('-h' '--help' '-o' '--output') -_shtab_ahriman_repo_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_init_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_repo_init_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') _shtab_ahriman_repo_sign_option_strings=('-h' '--help') _shtab_ahriman_sign_option_strings=('-h' '--help') _shtab_ahriman_repo_status_update_option_strings=('-h' '--help' '-s' '--status') @@ -52,16 +44,32 @@ _shtab_ahriman_repo_tree_option_strings=('-h' '--help') _shtab_ahriman_repo_triggers_option_strings=('-h' '--help') _shtab_ahriman_repo_update_option_strings=('-h' '--help' '--dry-run' '-e' '--exit-code' '--aur' '--no-aur' '--local' '--no-local' '--manual' '--no-manual' '--vcs' '--no-vcs' '-y' '--refresh') _shtab_ahriman_update_option_strings=('-h' '--help' '--dry-run' '-e' '--exit-code' '--aur' '--no-aur' '--local' '--no-local' '--manual' '--no-manual' '--vcs' '--no-vcs' '-y' '--refresh') +_shtab_ahriman_service_clean_option_strings=('-h' '--help' '--cache' '--no-cache' '--chroot' '--no-chroot' '--manual' '--no-manual' '--packages' '--no-packages' '--pacman' '--no-pacman') +_shtab_ahriman_clean_option_strings=('-h' '--help' '--cache' '--no-cache' '--chroot' '--no-chroot' '--manual' '--no-manual' '--packages' '--no-packages' '--pacman' '--no-pacman') +_shtab_ahriman_repo_clean_option_strings=('-h' '--help' '--cache' '--no-cache' '--chroot' '--no-chroot' '--manual' '--no-manual' '--packages' '--no-packages' '--pacman' '--no-pacman') +_shtab_ahriman_service_config_option_strings=('-h' '--help') +_shtab_ahriman_config_option_strings=('-h' '--help') +_shtab_ahriman_repo_config_option_strings=('-h' '--help') +_shtab_ahriman_service_config_validate_option_strings=('-h' '--help' '-e' '--exit-code') +_shtab_ahriman_config_validate_option_strings=('-h' '--help' '-e' '--exit-code') +_shtab_ahriman_repo_config_validate_option_strings=('-h' '--help' '-e' '--exit-code') +_shtab_ahriman_service_key_import_option_strings=('-h' '--help' '--key-server') +_shtab_ahriman_key_import_option_strings=('-h' '--help' '--key-server') +_shtab_ahriman_service_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_init_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_repo_init_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_repo_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_service_shell_option_strings=('-h' '--help') _shtab_ahriman_shell_option_strings=('-h' '--help') _shtab_ahriman_user_add_option_strings=('-h' '--help' '-p' '--password' '-r' '--role' '-s' '--secure') _shtab_ahriman_user_list_option_strings=('-h' '--help' '-e' '--exit-code' '-r' '--role') _shtab_ahriman_user_remove_option_strings=('-h' '--help') -_shtab_ahriman_version_option_strings=('-h' '--help') _shtab_ahriman_web_option_strings=('-h' '--help') -_shtab_ahriman_pos_0_choices=('aur-search' 'search' 'daemon' 'help' 'help-commands-unsafe' 'key-import' 'package-add' 'add' 'package-update' 'package-remove' 'remove' 'package-status' 'status' 'package-status-remove' 'package-status-update' 'status-update' 'patch-add' 'patch-list' 'patch-remove' 'patch-set-add' 'repo-backup' 'repo-check' 'check' 'repo-clean' 'clean' 'repo-config' 'config' 'repo-config-validate' 'config-validate' 'repo-rebuild' 'rebuild' 'repo-remove-unknown' 'remove-unknown' 'repo-report' 'report' 'repo-restore' 'repo-setup' 'init' 'repo-init' 'setup' 'repo-sign' 'sign' 'repo-status-update' 'repo-sync' 'sync' 'repo-tree' 'repo-triggers' 'repo-update' 'update' 'shell' 'user-add' 'user-list' 'user-remove' 'version' 'web') +_shtab_ahriman_pos_0_choices=('aur-search' 'search' 'help' 'help-commands-unsafe' 'help-version' 'version' 'package-add' 'add' 'package-update' 'package-remove' 'remove' 'package-status' 'status' 'package-status-remove' 'package-status-update' 'status-update' 'patch-add' 'patch-list' 'patch-remove' 'patch-set-add' 'repo-backup' 'repo-check' 'check' 'repo-daemon' 'daemon' 'repo-rebuild' 'rebuild' 'repo-remove-unknown' 'remove-unknown' 'repo-report' 'report' 'repo-restore' 'repo-sign' 'sign' 'repo-status-update' 'repo-sync' 'sync' 'repo-tree' 'repo-triggers' 'repo-update' 'update' 'service-clean' 'clean' 'repo-clean' 'service-config' 'config' 'repo-config' 'service-config-validate' 'config-validate' 'repo-config-validate' 'service-key-import' 'key-import' 'service-setup' 'init' 'repo-init' 'repo-setup' 'setup' 'service-shell' 'shell' 'user-add' 'user-list' 'user-remove' 'web') _shtab_ahriman_aur_search___sort_by_choices=('description' 'first_submitted' 'id' 'last_modified' 'maintainer' 'name' 'num_votes' 'out_of_date' 'package_base' 'package_base_id' 'popularity' 'repository' 'url' 'url_path' 'version') _shtab_ahriman_search___sort_by_choices=('description' 'first_submitted' 'id' 'last_modified' 'maintainer' 'name' 'num_votes' 'out_of_date' 'package_base' 'package_base_id' 'popularity' 'repository' 'url' 'url_path' 'version') _shtab_ahriman_package_add__s_choices=('auto' 'archive' 'aur' 'directory' 'local' 'remote' 'repository') @@ -78,12 +86,13 @@ _shtab_ahriman_package_status_update__s_choices=('unknown' 'pending' 'building' _shtab_ahriman_package_status_update___status_choices=('unknown' 'pending' 'building' 'failed' 'success') _shtab_ahriman_status_update__s_choices=('unknown' 'pending' 'building' 'failed' 'success') _shtab_ahriman_status_update___status_choices=('unknown' 'pending' 'building' 'failed' 'success') -_shtab_ahriman_repo_setup___sign_target_choices=('disabled' 'packages' 'repository') -_shtab_ahriman_init___sign_target_choices=('disabled' 'packages' 'repository') -_shtab_ahriman_repo_init___sign_target_choices=('disabled' 'packages' 'repository') -_shtab_ahriman_setup___sign_target_choices=('disabled' 'packages' 'repository') _shtab_ahriman_repo_status_update__s_choices=('unknown' 'pending' 'building' 'failed' 'success') _shtab_ahriman_repo_status_update___status_choices=('unknown' 'pending' 'building' 'failed' 'success') +_shtab_ahriman_service_setup___sign_target_choices=('disabled' 'packages' 'repository') +_shtab_ahriman_init___sign_target_choices=('disabled' 'packages' 'repository') +_shtab_ahriman_repo_init___sign_target_choices=('disabled' 'packages' 'repository') +_shtab_ahriman_repo_setup___sign_target_choices=('disabled' 'packages' 'repository') +_shtab_ahriman_setup___sign_target_choices=('disabled' 'packages' 'repository') _shtab_ahriman_user_add__r_choices=('unauthorized' 'read' 'reporter' 'full') _shtab_ahriman_user_add___role_choices=('unauthorized' 'read' 'reporter' 'full') _shtab_ahriman_user_list__r_choices=('unauthorized' 'read' 'reporter' 'full') @@ -114,24 +123,14 @@ _shtab_ahriman_search__e_nargs=0 _shtab_ahriman_search___exit_code_nargs=0 _shtab_ahriman_search___info_nargs=0 _shtab_ahriman_search___no_info_nargs=0 -_shtab_ahriman_daemon__h_nargs=0 -_shtab_ahriman_daemon___help_nargs=0 -_shtab_ahriman_daemon___aur_nargs=0 -_shtab_ahriman_daemon___no_aur_nargs=0 -_shtab_ahriman_daemon___local_nargs=0 -_shtab_ahriman_daemon___no_local_nargs=0 -_shtab_ahriman_daemon___manual_nargs=0 -_shtab_ahriman_daemon___no_manual_nargs=0 -_shtab_ahriman_daemon___vcs_nargs=0 -_shtab_ahriman_daemon___no_vcs_nargs=0 -_shtab_ahriman_daemon__y_nargs=0 -_shtab_ahriman_daemon___refresh_nargs=0 _shtab_ahriman_help__h_nargs=0 _shtab_ahriman_help___help_nargs=0 _shtab_ahriman_help_commands_unsafe__h_nargs=0 _shtab_ahriman_help_commands_unsafe___help_nargs=0 -_shtab_ahriman_key_import__h_nargs=0 -_shtab_ahriman_key_import___help_nargs=0 +_shtab_ahriman_help_version__h_nargs=0 +_shtab_ahriman_help_version___help_nargs=0 +_shtab_ahriman_version__h_nargs=0 +_shtab_ahriman_version___help_nargs=0 _shtab_ahriman_package_add_pos_0_nargs=+ _shtab_ahriman_package_add__h_nargs=0 _shtab_ahriman_package_add___help_nargs=0 @@ -223,42 +222,30 @@ _shtab_ahriman_check___vcs_nargs=0 _shtab_ahriman_check___no_vcs_nargs=0 _shtab_ahriman_check__y_nargs=0 _shtab_ahriman_check___refresh_nargs=0 -_shtab_ahriman_repo_clean__h_nargs=0 -_shtab_ahriman_repo_clean___help_nargs=0 -_shtab_ahriman_repo_clean___cache_nargs=0 -_shtab_ahriman_repo_clean___no_cache_nargs=0 -_shtab_ahriman_repo_clean___chroot_nargs=0 -_shtab_ahriman_repo_clean___no_chroot_nargs=0 -_shtab_ahriman_repo_clean___manual_nargs=0 -_shtab_ahriman_repo_clean___no_manual_nargs=0 -_shtab_ahriman_repo_clean___packages_nargs=0 -_shtab_ahriman_repo_clean___no_packages_nargs=0 -_shtab_ahriman_repo_clean___pacman_nargs=0 -_shtab_ahriman_repo_clean___no_pacman_nargs=0 -_shtab_ahriman_clean__h_nargs=0 -_shtab_ahriman_clean___help_nargs=0 -_shtab_ahriman_clean___cache_nargs=0 -_shtab_ahriman_clean___no_cache_nargs=0 -_shtab_ahriman_clean___chroot_nargs=0 -_shtab_ahriman_clean___no_chroot_nargs=0 -_shtab_ahriman_clean___manual_nargs=0 -_shtab_ahriman_clean___no_manual_nargs=0 -_shtab_ahriman_clean___packages_nargs=0 -_shtab_ahriman_clean___no_packages_nargs=0 -_shtab_ahriman_clean___pacman_nargs=0 -_shtab_ahriman_clean___no_pacman_nargs=0 -_shtab_ahriman_repo_config__h_nargs=0 -_shtab_ahriman_repo_config___help_nargs=0 -_shtab_ahriman_config__h_nargs=0 -_shtab_ahriman_config___help_nargs=0 -_shtab_ahriman_repo_config_validate__h_nargs=0 -_shtab_ahriman_repo_config_validate___help_nargs=0 -_shtab_ahriman_repo_config_validate__e_nargs=0 -_shtab_ahriman_repo_config_validate___exit_code_nargs=0 -_shtab_ahriman_config_validate__h_nargs=0 -_shtab_ahriman_config_validate___help_nargs=0 -_shtab_ahriman_config_validate__e_nargs=0 -_shtab_ahriman_config_validate___exit_code_nargs=0 +_shtab_ahriman_repo_daemon__h_nargs=0 +_shtab_ahriman_repo_daemon___help_nargs=0 +_shtab_ahriman_repo_daemon___aur_nargs=0 +_shtab_ahriman_repo_daemon___no_aur_nargs=0 +_shtab_ahriman_repo_daemon___local_nargs=0 +_shtab_ahriman_repo_daemon___no_local_nargs=0 +_shtab_ahriman_repo_daemon___manual_nargs=0 +_shtab_ahriman_repo_daemon___no_manual_nargs=0 +_shtab_ahriman_repo_daemon___vcs_nargs=0 +_shtab_ahriman_repo_daemon___no_vcs_nargs=0 +_shtab_ahriman_repo_daemon__y_nargs=0 +_shtab_ahriman_repo_daemon___refresh_nargs=0 +_shtab_ahriman_daemon__h_nargs=0 +_shtab_ahriman_daemon___help_nargs=0 +_shtab_ahriman_daemon___aur_nargs=0 +_shtab_ahriman_daemon___no_aur_nargs=0 +_shtab_ahriman_daemon___local_nargs=0 +_shtab_ahriman_daemon___no_local_nargs=0 +_shtab_ahriman_daemon___manual_nargs=0 +_shtab_ahriman_daemon___no_manual_nargs=0 +_shtab_ahriman_daemon___vcs_nargs=0 +_shtab_ahriman_daemon___no_vcs_nargs=0 +_shtab_ahriman_daemon__y_nargs=0 +_shtab_ahriman_daemon___refresh_nargs=0 _shtab_ahriman_repo_rebuild__h_nargs=0 _shtab_ahriman_repo_rebuild___help_nargs=0 _shtab_ahriman_repo_rebuild___dry_run_nargs=0 @@ -283,30 +270,6 @@ _shtab_ahriman_report__h_nargs=0 _shtab_ahriman_report___help_nargs=0 _shtab_ahriman_repo_restore__h_nargs=0 _shtab_ahriman_repo_restore___help_nargs=0 -_shtab_ahriman_repo_setup__h_nargs=0 -_shtab_ahriman_repo_setup___help_nargs=0 -_shtab_ahriman_repo_setup___makeflags_jobs_nargs=0 -_shtab_ahriman_repo_setup___no_makeflags_jobs_nargs=0 -_shtab_ahriman_repo_setup___multilib_nargs=0 -_shtab_ahriman_repo_setup___no_multilib_nargs=0 -_shtab_ahriman_init__h_nargs=0 -_shtab_ahriman_init___help_nargs=0 -_shtab_ahriman_init___makeflags_jobs_nargs=0 -_shtab_ahriman_init___no_makeflags_jobs_nargs=0 -_shtab_ahriman_init___multilib_nargs=0 -_shtab_ahriman_init___no_multilib_nargs=0 -_shtab_ahriman_repo_init__h_nargs=0 -_shtab_ahriman_repo_init___help_nargs=0 -_shtab_ahriman_repo_init___makeflags_jobs_nargs=0 -_shtab_ahriman_repo_init___no_makeflags_jobs_nargs=0 -_shtab_ahriman_repo_init___multilib_nargs=0 -_shtab_ahriman_repo_init___no_multilib_nargs=0 -_shtab_ahriman_setup__h_nargs=0 -_shtab_ahriman_setup___help_nargs=0 -_shtab_ahriman_setup___makeflags_jobs_nargs=0 -_shtab_ahriman_setup___no_makeflags_jobs_nargs=0 -_shtab_ahriman_setup___multilib_nargs=0 -_shtab_ahriman_setup___no_multilib_nargs=0 _shtab_ahriman_repo_sign_pos_0_nargs=* _shtab_ahriman_repo_sign__h_nargs=0 _shtab_ahriman_repo_sign___help_nargs=0 @@ -356,6 +319,98 @@ _shtab_ahriman_update___vcs_nargs=0 _shtab_ahriman_update___no_vcs_nargs=0 _shtab_ahriman_update__y_nargs=0 _shtab_ahriman_update___refresh_nargs=0 +_shtab_ahriman_service_clean__h_nargs=0 +_shtab_ahriman_service_clean___help_nargs=0 +_shtab_ahriman_service_clean___cache_nargs=0 +_shtab_ahriman_service_clean___no_cache_nargs=0 +_shtab_ahriman_service_clean___chroot_nargs=0 +_shtab_ahriman_service_clean___no_chroot_nargs=0 +_shtab_ahriman_service_clean___manual_nargs=0 +_shtab_ahriman_service_clean___no_manual_nargs=0 +_shtab_ahriman_service_clean___packages_nargs=0 +_shtab_ahriman_service_clean___no_packages_nargs=0 +_shtab_ahriman_service_clean___pacman_nargs=0 +_shtab_ahriman_service_clean___no_pacman_nargs=0 +_shtab_ahriman_clean__h_nargs=0 +_shtab_ahriman_clean___help_nargs=0 +_shtab_ahriman_clean___cache_nargs=0 +_shtab_ahriman_clean___no_cache_nargs=0 +_shtab_ahriman_clean___chroot_nargs=0 +_shtab_ahriman_clean___no_chroot_nargs=0 +_shtab_ahriman_clean___manual_nargs=0 +_shtab_ahriman_clean___no_manual_nargs=0 +_shtab_ahriman_clean___packages_nargs=0 +_shtab_ahriman_clean___no_packages_nargs=0 +_shtab_ahriman_clean___pacman_nargs=0 +_shtab_ahriman_clean___no_pacman_nargs=0 +_shtab_ahriman_repo_clean__h_nargs=0 +_shtab_ahriman_repo_clean___help_nargs=0 +_shtab_ahriman_repo_clean___cache_nargs=0 +_shtab_ahriman_repo_clean___no_cache_nargs=0 +_shtab_ahriman_repo_clean___chroot_nargs=0 +_shtab_ahriman_repo_clean___no_chroot_nargs=0 +_shtab_ahriman_repo_clean___manual_nargs=0 +_shtab_ahriman_repo_clean___no_manual_nargs=0 +_shtab_ahriman_repo_clean___packages_nargs=0 +_shtab_ahriman_repo_clean___no_packages_nargs=0 +_shtab_ahriman_repo_clean___pacman_nargs=0 +_shtab_ahriman_repo_clean___no_pacman_nargs=0 +_shtab_ahriman_service_config__h_nargs=0 +_shtab_ahriman_service_config___help_nargs=0 +_shtab_ahriman_config__h_nargs=0 +_shtab_ahriman_config___help_nargs=0 +_shtab_ahriman_repo_config__h_nargs=0 +_shtab_ahriman_repo_config___help_nargs=0 +_shtab_ahriman_service_config_validate__h_nargs=0 +_shtab_ahriman_service_config_validate___help_nargs=0 +_shtab_ahriman_service_config_validate__e_nargs=0 +_shtab_ahriman_service_config_validate___exit_code_nargs=0 +_shtab_ahriman_config_validate__h_nargs=0 +_shtab_ahriman_config_validate___help_nargs=0 +_shtab_ahriman_config_validate__e_nargs=0 +_shtab_ahriman_config_validate___exit_code_nargs=0 +_shtab_ahriman_repo_config_validate__h_nargs=0 +_shtab_ahriman_repo_config_validate___help_nargs=0 +_shtab_ahriman_repo_config_validate__e_nargs=0 +_shtab_ahriman_repo_config_validate___exit_code_nargs=0 +_shtab_ahriman_service_key_import__h_nargs=0 +_shtab_ahriman_service_key_import___help_nargs=0 +_shtab_ahriman_key_import__h_nargs=0 +_shtab_ahriman_key_import___help_nargs=0 +_shtab_ahriman_service_setup__h_nargs=0 +_shtab_ahriman_service_setup___help_nargs=0 +_shtab_ahriman_service_setup___makeflags_jobs_nargs=0 +_shtab_ahriman_service_setup___no_makeflags_jobs_nargs=0 +_shtab_ahriman_service_setup___multilib_nargs=0 +_shtab_ahriman_service_setup___no_multilib_nargs=0 +_shtab_ahriman_init__h_nargs=0 +_shtab_ahriman_init___help_nargs=0 +_shtab_ahriman_init___makeflags_jobs_nargs=0 +_shtab_ahriman_init___no_makeflags_jobs_nargs=0 +_shtab_ahriman_init___multilib_nargs=0 +_shtab_ahriman_init___no_multilib_nargs=0 +_shtab_ahriman_repo_init__h_nargs=0 +_shtab_ahriman_repo_init___help_nargs=0 +_shtab_ahriman_repo_init___makeflags_jobs_nargs=0 +_shtab_ahriman_repo_init___no_makeflags_jobs_nargs=0 +_shtab_ahriman_repo_init___multilib_nargs=0 +_shtab_ahriman_repo_init___no_multilib_nargs=0 +_shtab_ahriman_repo_setup__h_nargs=0 +_shtab_ahriman_repo_setup___help_nargs=0 +_shtab_ahriman_repo_setup___makeflags_jobs_nargs=0 +_shtab_ahriman_repo_setup___no_makeflags_jobs_nargs=0 +_shtab_ahriman_repo_setup___multilib_nargs=0 +_shtab_ahriman_repo_setup___no_multilib_nargs=0 +_shtab_ahriman_setup__h_nargs=0 +_shtab_ahriman_setup___help_nargs=0 +_shtab_ahriman_setup___makeflags_jobs_nargs=0 +_shtab_ahriman_setup___no_makeflags_jobs_nargs=0 +_shtab_ahriman_setup___multilib_nargs=0 +_shtab_ahriman_setup___no_multilib_nargs=0 +_shtab_ahriman_service_shell__h_nargs=0 +_shtab_ahriman_service_shell___help_nargs=0 +_shtab_ahriman_service_shell__v_nargs=0 +_shtab_ahriman_service_shell___verbose_nargs=0 _shtab_ahriman_shell__h_nargs=0 _shtab_ahriman_shell___help_nargs=0 _shtab_ahriman_shell__v_nargs=0 @@ -370,8 +425,6 @@ _shtab_ahriman_user_list__e_nargs=0 _shtab_ahriman_user_list___exit_code_nargs=0 _shtab_ahriman_user_remove__h_nargs=0 _shtab_ahriman_user_remove___help_nargs=0 -_shtab_ahriman_version__h_nargs=0 -_shtab_ahriman_version___help_nargs=0 _shtab_ahriman_web__h_nargs=0 _shtab_ahriman_web___help_nargs=0 diff --git a/docs/completions/zsh/_ahriman b/docs/completions/zsh/_ahriman index 8e1aa3c6..7d29a16e 100644 --- a/docs/completions/zsh/_ahriman +++ b/docs/completions/zsh/_ahriman @@ -14,6 +14,7 @@ _shtab_ahriman_commands() { "daemon:start process which periodically will run update process" "help:show help message for application or command and exit" "help-commands-unsafe:list unsafe commands as defined in default args" + "help-version:print application and its dependencies versions" "init:create initial service configuration, requires root" "key-import:import PGP key from public sources to the repository user" "package-add:add existing or new package to the build queue" @@ -34,6 +35,7 @@ _shtab_ahriman_commands() { "repo-clean:remove local caches" "repo-config:dump configuration for the specified architecture" "repo-config-validate:validate configuration and print found errors" + "repo-daemon:start process which periodically will run update process" "repo-init:create initial service configuration, requires root" "repo-rebuild:force rebuild whole repository" "repo-remove-unknown:remove packages which are missing in AUR and do not have local PKGBUILDs" @@ -48,6 +50,12 @@ _shtab_ahriman_commands() { "repo-update:check for packages updates and run build process if requested" "report:generate repository report according to current settings" "search:search for package in AUR using API" + "service-clean:remove local caches" + "service-config:dump configuration for the specified architecture" + "service-config-validate:validate configuration and print found errors" + "service-key-import:import PGP key from public sources to the repository user" + "service-setup:create initial service configuration, requires root" + "service-shell:drop into python shell while having created application" "setup:create initial service configuration, requires root" "shell:drop into python shell while having created application" "sign:(re-)sign packages and repository database according to current settings" @@ -140,6 +148,10 @@ _shtab_ahriman_help_commands_unsafe_options=( "--command[instead of showing commands, just test command line for unsafe subcommand and return 0 in case if command is safe and 1 otherwise]:command:" ) +_shtab_ahriman_help_version_options=( + "(- : *)"{-h,--help}"[show this help message and exit]" +) + _shtab_ahriman_init_options=( "(- : *)"{-h,--help}"[show this help message and exit]" "--build-as-user[force makepkg user to the specific one]:build_as_user:" @@ -281,6 +293,16 @@ _shtab_ahriman_repo_config_validate_options=( {-e,--exit-code}"[return non-zero exit status if configuration is invalid]" ) +_shtab_ahriman_repo_daemon_options=( + "(- : *)"{-h,--help}"[show this help message and exit]" + {-i,--interval}"[interval between runs in seconds]:interval:" + {--aur,--no-aur}"[enable or disable checking for AUR updates. Implies --no-vcs (default\: \%(default)s)]:aur:" + {--local,--no-local}"[enable or disable checking of local packages for updates (default\: \%(default)s)]:local:" + {--manual,--no-manual}"[include or exclude manual updates (default\: \%(default)s)]:manual:" + {--vcs,--no-vcs}"[enable or disable checking of VCS packages (default\: \%(default)s)]:vcs:" + "*"{-y,--refresh}"[download fresh package databases from the mirror before actions, -yy to force refresh even if up to date]" +) + _shtab_ahriman_repo_init_options=( "(- : *)"{-h,--help}"[show this help message and exit]" "--build-as-user[force makepkg user to the specific one]:build_as_user:" @@ -381,6 +403,50 @@ _shtab_ahriman_search_options=( "(*):search terms, can be specified multiple times, the result will match all terms:" ) +_shtab_ahriman_service_clean_options=( + "(- : *)"{-h,--help}"[show this help message and exit]" + {--cache,--no-cache}"[clear directory with package caches (default\: \%(default)s)]:cache:" + {--chroot,--no-chroot}"[clear build chroot (default\: \%(default)s)]:chroot:" + {--manual,--no-manual}"[clear manually added packages queue (default\: \%(default)s)]:manual:" + {--packages,--no-packages}"[clear directory with built packages (default\: \%(default)s)]:packages:" + {--pacman,--no-pacman}"[clear directory with pacman local database cache (default\: \%(default)s)]:pacman:" +) + +_shtab_ahriman_service_config_options=( + "(- : *)"{-h,--help}"[show this help message and exit]" +) + +_shtab_ahriman_service_config_validate_options=( + "(- : *)"{-h,--help}"[show this help message and exit]" + {-e,--exit-code}"[return non-zero exit status if configuration is invalid]" +) + +_shtab_ahriman_service_key_import_options=( + "(- : *)"{-h,--help}"[show this help message and exit]" + "--key-server[key server for key import]:key_server:" + ":PGP key to import from public server:" +) + +_shtab_ahriman_service_setup_options=( + "(- : *)"{-h,--help}"[show this help message and exit]" + "--build-as-user[force makepkg user to the specific one]:build_as_user:" + "--build-command[build command prefix]:build_command:" + "--from-configuration[path to default devtools pacman configuration]:from_configuration:" + {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: \%(default)s)]:makeflags_jobs:" + {--multilib,--no-multilib}"[add or do not multilib repository (default\: \%(default)s)]:multilib:" + "--packager[packager name and email]:packager:" + "--repository[repository name]:repository:" + "--sign-key[sign key id]:sign_key:" + "*--sign-target[sign options]:sign_target:(disabled packages repository)" + "--web-port[port of the web service]:web_port:" + "--web-unix-socket[path to unix socket used for interprocess communications]:web_unix_socket:" +) + +_shtab_ahriman_service_shell_options=( + "(- : *)"{-h,--help}"[show this help message and exit]" + ":instead of dropping into shell, just execute the specified code:" +) + _shtab_ahriman_setup_options=( "(- : *)"{-h,--help}"[show this help message and exit]" "--build-as-user[force makepkg user to the specific one]:build_as_user:" @@ -489,6 +555,7 @@ _shtab_ahriman() { daemon) _arguments -C $_shtab_ahriman_daemon_options ;; help) _arguments -C $_shtab_ahriman_help_options ;; help-commands-unsafe) _arguments -C $_shtab_ahriman_help_commands_unsafe_options ;; + help-version) _arguments -C $_shtab_ahriman_help_version_options ;; init) _arguments -C $_shtab_ahriman_init_options ;; key-import) _arguments -C $_shtab_ahriman_key_import_options ;; package-add) _arguments -C $_shtab_ahriman_package_add_options ;; @@ -509,6 +576,7 @@ _shtab_ahriman() { repo-clean) _arguments -C $_shtab_ahriman_repo_clean_options ;; repo-config) _arguments -C $_shtab_ahriman_repo_config_options ;; repo-config-validate) _arguments -C $_shtab_ahriman_repo_config_validate_options ;; + repo-daemon) _arguments -C $_shtab_ahriman_repo_daemon_options ;; repo-init) _arguments -C $_shtab_ahriman_repo_init_options ;; repo-rebuild) _arguments -C $_shtab_ahriman_repo_rebuild_options ;; repo-remove-unknown) _arguments -C $_shtab_ahriman_repo_remove_unknown_options ;; @@ -523,6 +591,12 @@ _shtab_ahriman() { repo-update) _arguments -C $_shtab_ahriman_repo_update_options ;; report) _arguments -C $_shtab_ahriman_report_options ;; search) _arguments -C $_shtab_ahriman_search_options ;; + service-clean) _arguments -C $_shtab_ahriman_service_clean_options ;; + service-config) _arguments -C $_shtab_ahriman_service_config_options ;; + service-config-validate) _arguments -C $_shtab_ahriman_service_config_validate_options ;; + service-key-import) _arguments -C $_shtab_ahriman_service_key_import_options ;; + service-setup) _arguments -C $_shtab_ahriman_service_setup_options ;; + service-shell) _arguments -C $_shtab_ahriman_service_shell_options ;; setup) _arguments -C $_shtab_ahriman_setup_options ;; shell) _arguments -C $_shtab_ahriman_shell_options ;; sign) _arguments -C $_shtab_ahriman_sign_options ;; diff --git a/docs/configuration.rst b/docs/configuration.rst index 5e4977c5..58e312e6 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -12,11 +12,11 @@ There are two variable types which have been added to default ones, they are pat Path values, except for casting to ``pathlib.Path`` type, will be also expanded to absolute paths relative to the configuration path. E.g. if path is set to ``ahriman.ini.d/logging.ini`` and root configuration path is ``/etc/ahriman.ini``, the value will be expanded to ``/etc/ahriman.ini.d/logging.ini``. In order to disable path expand, use the full path, e.g. ``/etc/ahriman.ini.d/logging.ini``. -There is also additional subcommand which will allow to validate configuration and print found errors. In order to do so, run ``repo-config-validate`` subcommand, e.g.: +There is also additional subcommand which will allow to validate configuration and print found errors. In order to do so, run ``service-config-validate`` subcommand, e.g.: .. code-block:: shell - ahriman -a x86_64 repo-config-validate + ahriman -a x86_64 service-config-validate It will check current settings on common errors and compare configuration with known schema. diff --git a/docs/faq.rst b/docs/faq.rst index 154c8bc8..c87ed85e 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -18,7 +18,7 @@ TL;DR .. code-block:: shell yay -S ahriman - sudo ahriman -a x86_64 repo-setup --packager "ahriman bot " --repository "repository" + sudo ahriman -a x86_64 service-setup --packager "ahriman bot " --repository "repository" systemctl enable --now ahriman@x86_64.timer Long answer @@ -33,7 +33,7 @@ There is special command which can be used in order to validate current configur .. code-block:: shell - ahriman -a x86_64 repo-config-validate --exit-code + ahriman -a x86_64 service-config-validate --exit-code This command will print found errors, based on `cerberus `_, e.g.: @@ -219,7 +219,7 @@ TL;DR .. code-block:: shell - sudo -u ahriman ahriman key-import ... + sudo -u ahriman ahriman service-key-import ... How to update VCS packages ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -409,11 +409,11 @@ You can pass any of these variables by using ``-e`` argument, e.g.: Daemon service ^^^^^^^^^^^^^^ -There is special ``daemon`` subcommand which emulates systemd timer and will perform repository update periodically: +There is special ``repo-daemon`` subcommand which emulates systemd timer and will perform repository update periodically: .. code-block:: shell - docker run --privileged -v /path/to/local/repo:/var/lib/ahriman arcan1s/ahriman:latest daemon + docker run --privileged -v /path/to/local/repo:/var/lib/ahriman arcan1s/ahriman:latest repo-daemon This command uses same rules as ``repo-update``, thus, e.g. requires ``--privileged`` flag. diff --git a/docs/setup.rst b/docs/setup.rst index 5412f24f..c6fe0a19 100644 --- a/docs/setup.rst +++ b/docs/setup.rst @@ -10,9 +10,9 @@ Initial setup .. code-block:: shell - sudo ahriman -a x86_64 repo-setup ... + sudo ahriman -a x86_64 service-setup ... - ``repo-setup`` literally does the following steps: + ``service-setup`` literally does the following steps: #. Create ``/var/lib/ahriman/.makepkg.conf`` with ``makepkg.conf`` overrides if required (at least you might want to set ``PACKAGER``): diff --git a/package/lib/systemd/system/ahriman-web@.service b/package/lib/systemd/system/ahriman-web@.service index d135cfc7..f9c8c052 100644 --- a/package/lib/systemd/system/ahriman-web@.service +++ b/package/lib/systemd/system/ahriman-web@.service @@ -9,4 +9,4 @@ User=ahriman Group=ahriman [Install] -WantedBy=multi-user.target \ No newline at end of file +WantedBy=multi-user.target diff --git a/src/ahriman/application/ahriman.py b/src/ahriman/application/ahriman.py index cf609737..27365671 100644 --- a/src/ahriman/application/ahriman.py +++ b/src/ahriman/application/ahriman.py @@ -84,10 +84,9 @@ def _parser() -> argparse.ArgumentParser: subparsers = parser.add_subparsers(title="command", help="command to run", dest="command", required=True) _set_aur_search_parser(subparsers) - _set_daemon_parser(subparsers) _set_help_parser(subparsers) _set_help_commands_unsafe_parser(subparsers) - _set_key_import_parser(subparsers) + _set_help_version_parser(subparsers) _set_package_add_parser(subparsers) _set_package_remove_parser(subparsers) _set_package_status_parser(subparsers) @@ -99,25 +98,26 @@ def _parser() -> argparse.ArgumentParser: _set_patch_set_add_parser(subparsers) _set_repo_backup_parser(subparsers) _set_repo_check_parser(subparsers) - _set_repo_clean_parser(subparsers) - _set_repo_config_parser(subparsers) - _set_repo_config_validate_parser(subparsers) + _set_repo_daemon_parser(subparsers) _set_repo_rebuild_parser(subparsers) _set_repo_remove_unknown_parser(subparsers) _set_repo_report_parser(subparsers) _set_repo_restore_parser(subparsers) - _set_repo_setup_parser(subparsers) _set_repo_sign_parser(subparsers) _set_repo_status_update_parser(subparsers) _set_repo_sync_parser(subparsers) _set_repo_tree_parser(subparsers) _set_repo_triggers_parser(subparsers) _set_repo_update_parser(subparsers) - _set_shell_parser(subparsers) + _set_service_clean_parser(subparsers) + _set_service_config_parser(subparsers) + _set_service_config_validate_parser(subparsers) + _set_service_key_import_parser(subparsers) + _set_service_setup_parser(subparsers) + _set_service_shell_parser(subparsers) _set_user_add_parser(subparsers) _set_user_list_parser(subparsers) _set_user_remove_parser(subparsers) - _set_version_parser(subparsers) _set_web_parser(subparsers) return parser @@ -147,35 +147,6 @@ def _set_aur_search_parser(root: SubParserAction) -> argparse.ArgumentParser: return parser -def _set_daemon_parser(root: SubParserAction) -> argparse.ArgumentParser: - """ - add parser for daemon subcommand - - Args: - root(SubParserAction): subparsers for the commands - - Returns: - argparse.ArgumentParser: created argument parser - """ - parser = root.add_parser("daemon", help="run application as daemon", - description="start process which periodically will run update process", - formatter_class=_formatter) - parser.add_argument("-i", "--interval", help="interval between runs in seconds", type=int, default=60 * 60 * 12) - parser.add_argument("--aur", help="enable or disable checking for AUR updates. Implies --no-vcs", - action=argparse.BooleanOptionalAction, default=True) - parser.add_argument("--local", help="enable or disable checking of local packages for updates", - action=argparse.BooleanOptionalAction, default=True) - parser.add_argument("--manual", help="include or exclude manual updates", - action=argparse.BooleanOptionalAction, default=True) - parser.add_argument("--vcs", help="enable or disable checking of VCS packages", - action=argparse.BooleanOptionalAction, default=True) - parser.add_argument("-y", "--refresh", help="download fresh package databases from the mirror before actions, " - "-yy to force refresh even if up to date", - action="count", default=False) - parser.set_defaults(handler=handlers.Daemon, dry_run=False, exit_code=False, package=[]) - return parser - - def _set_help_parser(root: SubParserAction) -> argparse.ArgumentParser: """ add parser for listing help subcommand @@ -214,9 +185,9 @@ def _set_help_commands_unsafe_parser(root: SubParserAction) -> argparse.Argument return parser -def _set_key_import_parser(root: SubParserAction) -> argparse.ArgumentParser: +def _set_help_version_parser(root: SubParserAction) -> argparse.ArgumentParser: """ - add parser for key import subcommand + add parser for version subcommand Args: root(SubParserAction): subparsers for the commands @@ -224,16 +195,10 @@ def _set_key_import_parser(root: SubParserAction) -> argparse.ArgumentParser: Returns: argparse.ArgumentParser: created argument parser """ - parser = root.add_parser("key-import", help="import PGP key", - description="import PGP key from public sources to the repository user", - epilog="By default ahriman runs build process with package sources validation " - "(in case if signature and keys are available in PKGBUILD). This process will " - "fail in case if key is not known for build user. This subcommand can be used " - "in order to import the PGP key to user keychain.", - formatter_class=_formatter) - parser.add_argument("--key-server", help="key server for key import", default="keyserver.ubuntu.com") - parser.add_argument("key", help="PGP key to import from public server") - parser.set_defaults(handler=handlers.KeyImport, architecture=[""], lock=None, report=False) + parser = root.add_parser("help-version", aliases=["version"], help="application version", + description="print application and its dependencies versions", formatter_class=_formatter) + parser.set_defaults(handler=handlers.Versions, architecture=[""], lock=None, report=False, quiet=True, + unsafe=True) return parser @@ -492,9 +457,9 @@ def _set_repo_check_parser(root: SubParserAction) -> argparse.ArgumentParser: return parser -def _set_repo_clean_parser(root: SubParserAction) -> argparse.ArgumentParser: +def _set_repo_daemon_parser(root: SubParserAction) -> argparse.ArgumentParser: """ - add parser for repository clean subcommand + add parser for daemon subcommand Args: root(SubParserAction): subparsers for the commands @@ -502,58 +467,22 @@ def _set_repo_clean_parser(root: SubParserAction) -> argparse.ArgumentParser: Returns: argparse.ArgumentParser: created argument parser """ - parser = root.add_parser("repo-clean", aliases=["clean"], help="clean local caches", - description="remove local caches", - epilog="The subcommand clears every temporary directories (builds, caches etc). Normally " - "you should not run this command manually. Also in case if you are going to clear " - "the chroot directories you will need root privileges.", + parser = root.add_parser("repo-daemon", aliases=["daemon"], help="run application as daemon", + description="start process which periodically will run update process", formatter_class=_formatter) - parser.add_argument("--cache", help="clear directory with package caches", - action=argparse.BooleanOptionalAction, default=False) - parser.add_argument("--chroot", help="clear build chroot", action=argparse.BooleanOptionalAction, default=False) - parser.add_argument("--manual", help="clear manually added packages queue", - action=argparse.BooleanOptionalAction, default=False) - parser.add_argument("--packages", help="clear directory with built packages", - action=argparse.BooleanOptionalAction, default=False) - parser.add_argument("--pacman", help="clear directory with pacman local database cache", - action=argparse.BooleanOptionalAction, default=False) - parser.set_defaults(handler=handlers.Clean, quiet=True, unsafe=True) - return parser - - -def _set_repo_config_parser(root: SubParserAction) -> argparse.ArgumentParser: - """ - add parser for config subcommand - - Args: - root(SubParserAction): subparsers for the commands - - Returns: - argparse.ArgumentParser: created argument parser - """ - parser = root.add_parser("repo-config", aliases=["config"], help="dump configuration", - description="dump configuration for the specified architecture", - formatter_class=_formatter) - parser.set_defaults(handler=handlers.Dump, lock=None, report=False, quiet=True, unsafe=True) - return parser - - -def _set_repo_config_validate_parser(root: SubParserAction) -> argparse.ArgumentParser: - """ - add parser for config validation subcommand - - Args: - root(SubParserAction): subparsers for the commands - - Returns: - argparse.ArgumentParser: created argument parser - """ - parser = root.add_parser("repo-config-validate", aliases=["config-validate"], help="validate system configuration", - description="validate configuration and print found errors", - formatter_class=_formatter) - parser.add_argument("-e", "--exit-code", help="return non-zero exit status if configuration is invalid", - action="store_true") - parser.set_defaults(handler=handlers.Validate, lock=None, report=False, quiet=True, unsafe=True) + parser.add_argument("-i", "--interval", help="interval between runs in seconds", type=int, default=60 * 60 * 12) + parser.add_argument("--aur", help="enable or disable checking for AUR updates. Implies --no-vcs", + action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("--local", help="enable or disable checking of local packages for updates", + action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("--manual", help="include or exclude manual updates", + action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("--vcs", help="enable or disable checking of VCS packages", + action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("-y", "--refresh", help="download fresh package databases from the mirror before actions, " + "-yy to force refresh even if up to date", + action="count", default=False) + parser.set_defaults(handler=handlers.Daemon, dry_run=False, exit_code=False, package=[]) return parser @@ -637,39 +566,6 @@ def _set_repo_restore_parser(root: SubParserAction) -> argparse.ArgumentParser: return parser -def _set_repo_setup_parser(root: SubParserAction) -> argparse.ArgumentParser: - """ - add parser for setup subcommand - - Args: - root(SubParserAction): subparsers for the commands - - Returns: - argparse.ArgumentParser: created argument parser - """ - parser = root.add_parser("repo-setup", aliases=["init", "repo-init", "setup"], help="initial service configuration", - description="create initial service configuration, requires root", - epilog="Create _minimal_ configuration for the service according to provided options.", - formatter_class=_formatter) - parser.add_argument("--build-as-user", help="force makepkg user to the specific one") - parser.add_argument("--build-command", help="build command prefix", default="ahriman") - parser.add_argument("--from-configuration", help="path to default devtools pacman configuration", - type=Path, default=Path("/usr/share/devtools/pacman-extra.conf")) - parser.add_argument("--makeflags-jobs", help="append MAKEFLAGS variable with parallelism set to number of cores", - action=argparse.BooleanOptionalAction, default=True) - parser.add_argument("--multilib", help="add or do not multilib repository", - action=argparse.BooleanOptionalAction, default=True) - parser.add_argument("--packager", help="packager name and email", required=True) - parser.add_argument("--repository", help="repository name", required=True) - parser.add_argument("--sign-key", help="sign key id") - parser.add_argument("--sign-target", help="sign options", action="append", - type=SignSettings.from_option, choices=enum_values(SignSettings)) - parser.add_argument("--web-port", help="port of the web service", type=int) - parser.add_argument("--web-unix-socket", help="path to unix socket used for interprocess communications", type=Path) - parser.set_defaults(handler=handlers.Setup, lock=None, report=False, quiet=True, unsafe=True) - return parser - - def _set_repo_sign_parser(root: SubParserAction) -> argparse.ArgumentParser: """ add parser for sign subcommand @@ -793,7 +689,130 @@ def _set_repo_update_parser(root: SubParserAction) -> argparse.ArgumentParser: return parser -def _set_shell_parser(root: SubParserAction) -> argparse.ArgumentParser: +def _set_service_clean_parser(root: SubParserAction) -> argparse.ArgumentParser: + """ + add parser for repository clean subcommand + + Args: + root(SubParserAction): subparsers for the commands + + Returns: + argparse.ArgumentParser: created argument parser + """ + parser = root.add_parser("service-clean", aliases=["clean", "repo-clean"], help="clean local caches", + description="remove local caches", + epilog="The subcommand clears every temporary directories (builds, caches etc). Normally " + "you should not run this command manually. Also in case if you are going to clear " + "the chroot directories you will need root privileges.", + formatter_class=_formatter) + parser.add_argument("--cache", help="clear directory with package caches", + action=argparse.BooleanOptionalAction, default=False) + parser.add_argument("--chroot", help="clear build chroot", action=argparse.BooleanOptionalAction, default=False) + parser.add_argument("--manual", help="clear manually added packages queue", + action=argparse.BooleanOptionalAction, default=False) + parser.add_argument("--packages", help="clear directory with built packages", + action=argparse.BooleanOptionalAction, default=False) + parser.add_argument("--pacman", help="clear directory with pacman local database cache", + action=argparse.BooleanOptionalAction, default=False) + parser.set_defaults(handler=handlers.Clean, quiet=True, unsafe=True) + return parser + + +def _set_service_config_parser(root: SubParserAction) -> argparse.ArgumentParser: + """ + add parser for config subcommand + + Args: + root(SubParserAction): subparsers for the commands + + Returns: + argparse.ArgumentParser: created argument parser + """ + parser = root.add_parser("service-config", aliases=["config", "repo-config"], help="dump configuration", + description="dump configuration for the specified architecture", + formatter_class=_formatter) + parser.set_defaults(handler=handlers.Dump, lock=None, report=False, quiet=True, unsafe=True) + return parser + + +def _set_service_config_validate_parser(root: SubParserAction) -> argparse.ArgumentParser: + """ + add parser for config validation subcommand + + Args: + root(SubParserAction): subparsers for the commands + + Returns: + argparse.ArgumentParser: created argument parser + """ + parser = root.add_parser("service-config-validate", aliases=["config-validate", "repo-config-validate"], + help="validate system configuration", + description="validate configuration and print found errors", + formatter_class=_formatter) + parser.add_argument("-e", "--exit-code", help="return non-zero exit status if configuration is invalid", + action="store_true") + parser.set_defaults(handler=handlers.Validate, lock=None, report=False, quiet=True, unsafe=True) + return parser + + +def _set_service_key_import_parser(root: SubParserAction) -> argparse.ArgumentParser: + """ + add parser for key import subcommand + + Args: + root(SubParserAction): subparsers for the commands + + Returns: + argparse.ArgumentParser: created argument parser + """ + parser = root.add_parser("service-key-import", aliases=["key-import"], help="import PGP key", + description="import PGP key from public sources to the repository user", + epilog="By default ahriman runs build process with package sources validation " + "(in case if signature and keys are available in PKGBUILD). This process will " + "fail in case if key is not known for build user. This subcommand can be used " + "in order to import the PGP key to user keychain.", + formatter_class=_formatter) + parser.add_argument("--key-server", help="key server for key import", default="keyserver.ubuntu.com") + parser.add_argument("key", help="PGP key to import from public server") + parser.set_defaults(handler=handlers.KeyImport, architecture=[""], lock=None, report=False) + return parser + + +def _set_service_setup_parser(root: SubParserAction) -> argparse.ArgumentParser: + """ + add parser for setup subcommand + + Args: + root(SubParserAction): subparsers for the commands + + Returns: + argparse.ArgumentParser: created argument parser + """ + parser = root.add_parser("service-setup", aliases=["init", "repo-init", "repo-setup", "setup"], + help="initial service configuration", + description="create initial service configuration, requires root", + epilog="Create _minimal_ configuration for the service according to provided options.", + formatter_class=_formatter) + parser.add_argument("--build-as-user", help="force makepkg user to the specific one") + parser.add_argument("--build-command", help="build command prefix", default="ahriman") + parser.add_argument("--from-configuration", help="path to default devtools pacman configuration", + type=Path, default=Path("/usr/share/devtools/pacman-extra.conf")) + parser.add_argument("--makeflags-jobs", help="append MAKEFLAGS variable with parallelism set to number of cores", + action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("--multilib", help="add or do not multilib repository", + action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("--packager", help="packager name and email", required=True) + parser.add_argument("--repository", help="repository name", required=True) + parser.add_argument("--sign-key", help="sign key id") + parser.add_argument("--sign-target", help="sign options", action="append", + type=SignSettings.from_option, choices=enum_values(SignSettings)) + parser.add_argument("--web-port", help="port of the web service", type=int) + parser.add_argument("--web-unix-socket", help="path to unix socket used for interprocess communications", type=Path) + parser.set_defaults(handler=handlers.Setup, lock=None, report=False, quiet=True, unsafe=True) + return parser + + +def _set_service_shell_parser(root: SubParserAction) -> argparse.ArgumentParser: """ add parser for shell subcommand @@ -803,7 +822,7 @@ def _set_shell_parser(root: SubParserAction) -> argparse.ArgumentParser: Returns: argparse.ArgumentParser: created argument parser """ - parser = root.add_parser("shell", help="invoke python shell", + parser = root.add_parser("service-shell", aliases=["shell"], help="invoke python shell", description="drop into python shell while having created application", formatter_class=_formatter) parser.add_argument("code", help="instead of dropping into shell, just execute the specified code", nargs="?") @@ -879,23 +898,6 @@ def _set_user_remove_parser(root: SubParserAction) -> argparse.ArgumentParser: return parser -def _set_version_parser(root: SubParserAction) -> argparse.ArgumentParser: - """ - add parser for version subcommand - - Args: - root(SubParserAction): subparsers for the commands - - Returns: - argparse.ArgumentParser: created argument parser - """ - parser = root.add_parser("version", help="application version", - description="print application and its dependencies versions", formatter_class=_formatter) - parser.set_defaults(handler=handlers.Versions, architecture=[""], lock=None, report=False, quiet=True, - unsafe=True) - return parser - - def _set_web_parser(root: SubParserAction) -> argparse.ArgumentParser: """ add parser for web subcommand diff --git a/src/ahriman/core/spawn.py b/src/ahriman/core/spawn.py index 45a667ad..1413309a 100644 --- a/src/ahriman/core/spawn.py +++ b/src/ahriman/core/spawn.py @@ -87,7 +87,7 @@ class Spawn(Thread, LazyLogging): server(str): PGP key server """ kwargs = {} if server is None else {"key-server": server} - self.spawn_process("key-import", key, **kwargs) + self.spawn_process("service-key-import", key, **kwargs) def packages_add(self, packages: Iterable[str], *, now: bool) -> None: """ diff --git a/tests/ahriman/application/handlers/test_handler_unsafe_commands.py b/tests/ahriman/application/handlers/test_handler_unsafe_commands.py index 85075f93..2d3d953d 100644 --- a/tests/ahriman/application/handlers/test_handler_unsafe_commands.py +++ b/tests/ahriman/application/handlers/test_handler_unsafe_commands.py @@ -57,7 +57,7 @@ def test_check_unsafe(mocker: MockerFixture) -> None: must check if command is unsafe """ check_mock = mocker.patch("ahriman.application.handlers.Handler.check_if_empty") - UnsafeCommands.check_unsafe("repo-clean", ["repo-clean"], _parser()) + UnsafeCommands.check_unsafe("service-clean", ["service-clean"], _parser()) check_mock.assert_called_once_with(True, True) @@ -66,7 +66,7 @@ def test_check_unsafe_safe(mocker: MockerFixture) -> None: must check if command is safe """ check_mock = mocker.patch("ahriman.application.handlers.Handler.check_if_empty") - UnsafeCommands.check_unsafe("package-status", ["repo-clean"], _parser()) + UnsafeCommands.check_unsafe("package-status", ["service-clean"], _parser()) check_mock.assert_called_once_with(True, False) diff --git a/tests/ahriman/application/test_ahriman.py b/tests/ahriman/application/test_ahriman.py index 1fcde7eb..653b6c62 100644 --- a/tests/ahriman/application/test_ahriman.py +++ b/tests/ahriman/application/test_ahriman.py @@ -14,16 +14,16 @@ def test_parser(parser: argparse.ArgumentParser) -> None: """ must parse valid command line """ - parser.parse_args(["-a", "x86_64", "repo-config"]) + parser.parse_args(["-a", "x86_64", "service-config"]) def test_parser_option_configuration(parser: argparse.ArgumentParser) -> None: """ must convert configuration option to Path instance """ - args = parser.parse_args(["-a", "x86_64", "repo-config"]) + args = parser.parse_args(["-a", "x86_64", "service-config"]) assert isinstance(args.configuration, Path) - args = parser.parse_args(["-a", "x86_64", "-c", "ahriman.ini", "repo-config"]) + args = parser.parse_args(["-a", "x86_64", "-c", "ahriman.ini", "service-config"]) assert isinstance(args.configuration, Path) @@ -41,7 +41,7 @@ def test_multiple_architectures(parser: argparse.ArgumentParser) -> None: """ must accept multiple architectures """ - args = parser.parse_args(["-a", "x86_64", "-a", "i686", "repo-config"]) + args = parser.parse_args(["-a", "x86_64", "-a", "i686", "service-config"]) assert args.architecture == ["x86_64", "i686"] @@ -65,38 +65,6 @@ def test_subparsers_aur_search_architecture(parser: argparse.ArgumentParser) -> assert args.architecture == [""] -def test_subparsers_daemon(parser: argparse.ArgumentParser) -> None: - """ - daemon command must imply dry run, exit code and package - """ - args = parser.parse_args(["daemon"]) - assert not args.dry_run - assert not args.exit_code - assert args.package == [] - - -def test_subparsers_daemon_option_refresh(parser: argparse.ArgumentParser) -> None: - """ - daemon command must count refresh options - """ - args = parser.parse_args(["daemon"]) - assert args.refresh == 0 - args = parser.parse_args(["daemon", "-y"]) - assert args.refresh == 1 - args = parser.parse_args(["daemon", "-yy"]) - assert args.refresh == 2 - - -def test_subparsers_daemon_option_interval(parser: argparse.ArgumentParser) -> None: - """ - daemon command must convert interval option to int instance - """ - args = parser.parse_args(["daemon"]) - assert isinstance(args.interval, int) - args = parser.parse_args(["daemon", "--interval", "10"]) - assert isinstance(args.interval, int) - - def test_subparsers_help(parser: argparse.ArgumentParser) -> None: """ help command must imply architecture list, lock, report, quiet, unsafe and parser @@ -139,21 +107,23 @@ def test_subparsers_help_commands_unsafe_architecture(parser: argparse.ArgumentP assert args.architecture == [""] -def test_subparsers_key_import(parser: argparse.ArgumentParser) -> None: +def test_subparsers_help_version(parser: argparse.ArgumentParser) -> None: """ - key-import command must imply architecture list, lock and report + help-version command must imply architecture, lock, report, quiet and unsafe """ - args = parser.parse_args(["key-import", "key"]) + args = parser.parse_args(["help-version"]) assert args.architecture == [""] assert args.lock is None assert not args.report + assert args.quiet + assert args.unsafe -def test_subparsers_key_import_architecture(parser: argparse.ArgumentParser) -> None: +def test_subparsers_help_version_architecture(parser: argparse.ArgumentParser) -> None: """ - key-import command must correctly parse architecture list + help-version command must correctly parse architecture list """ - args = parser.parse_args(["-a", "x86_64", "key-import", "key"]) + args = parser.parse_args(["-a", "x86_64", "help-version"]) assert args.architecture == [""] @@ -382,47 +352,36 @@ def test_subparsers_repo_check_option_refresh(parser: argparse.ArgumentParser) - assert args.refresh == 2 -def test_subparsers_repo_clean(parser: argparse.ArgumentParser) -> None: +def test_subparsers_repo_daemon(parser: argparse.ArgumentParser) -> None: """ - repo-clean command must imply quiet and unsafe + repo-daemon command must imply dry run, exit code and package """ - args = parser.parse_args(["repo-clean"]) - assert args.quiet - assert args.unsafe + args = parser.parse_args(["repo-daemon"]) + assert not args.dry_run + assert not args.exit_code + assert args.package == [] -def test_subparsers_repo_clean_architecture(parser: argparse.ArgumentParser) -> None: +def test_subparsers_repo_daemon_option_refresh(parser: argparse.ArgumentParser) -> None: """ - repo-clean command must correctly parse architecture list + repo-daemon command must count refresh options """ - args = parser.parse_args(["repo-clean"]) - assert args.architecture is None - args = parser.parse_args(["-a", "x86_64", "repo-clean"]) - assert args.architecture == ["x86_64"] + args = parser.parse_args(["repo-daemon"]) + assert args.refresh == 0 + args = parser.parse_args(["repo-daemon", "-y"]) + assert args.refresh == 1 + args = parser.parse_args(["repo-daemon", "-yy"]) + assert args.refresh == 2 -def test_subparsers_repo_config(parser: argparse.ArgumentParser) -> None: +def test_subparsers_repo_daemon_option_interval(parser: argparse.ArgumentParser) -> None: """ - repo-config command must imply lock, report, quiet and unsafe + repo-daemon command must convert interval option to int instance """ - args = parser.parse_args(["-a", "x86_64", "repo-config"]) - assert args.architecture == ["x86_64"] - assert args.lock is None - assert not args.report - assert args.quiet - assert args.unsafe - - -def test_subparsers_repo_config_validate(parser: argparse.ArgumentParser) -> None: - """ - repo-config-validate command must imply lock, report, quiet and unsafe - """ - args = parser.parse_args(["-a", "x86_64", "repo-config-validate"]) - assert args.architecture == ["x86_64"] - assert args.lock is None - assert not args.report - assert args.quiet - assert args.unsafe + args = parser.parse_args(["repo-daemon"]) + assert isinstance(args.interval, int) + args = parser.parse_args(["repo-daemon", "--interval", "10"]) + assert isinstance(args.interval, int) def test_subparsers_repo_rebuild_architecture(parser: argparse.ArgumentParser) -> None: @@ -482,41 +441,6 @@ def test_subparsers_repo_restore_architecture(parser: argparse.ArgumentParser) - assert args.architecture == [""] -def test_subparsers_repo_setup(parser: argparse.ArgumentParser) -> None: - """ - repo-setup command must imply lock, report, quiet and unsafe - """ - args = parser.parse_args(["-a", "x86_64", "repo-setup", "--packager", "John Doe ", - "--repository", "aur-clone"]) - assert args.architecture == ["x86_64"] - assert args.lock is None - assert not args.report - assert args.quiet - assert args.unsafe - - -def test_subparsers_repo_setup_option_from_configuration(parser: argparse.ArgumentParser) -> None: - """ - repo-setup command must convert from-configuration option to path instance - """ - args = parser.parse_args(["-a", "x86_64", "repo-setup", "--packager", "John Doe ", - "--repository", "aur-clone"]) - assert isinstance(args.from_configuration, Path) - args = parser.parse_args(["-a", "x86_64", "repo-setup", "--packager", "John Doe ", - "--repository", "aur-clone", "--from-configuration", "path"]) - assert isinstance(args.from_configuration, Path) - - -def test_subparsers_repo_setup_option_sign_target(parser: argparse.ArgumentParser) -> None: - """ - repo-setup command must convert sign-target option to signsettings instance - """ - args = parser.parse_args(["-a", "x86_64", "repo-setup", "--packager", "John Doe ", - "--repository", "aur-clone", "--sign-target", "packages"]) - assert args.sign_target - assert all(isinstance(target, SignSettings) for target in args.sign_target) - - def test_subparsers_repo_sign_architecture(parser: argparse.ArgumentParser) -> None: """ repo-sign command must correctly parse architecture list @@ -622,11 +546,107 @@ def test_subparsers_repo_update_option_refresh(parser: argparse.ArgumentParser) assert args.refresh == 2 -def test_subparsers_shell(parser: argparse.ArgumentParser) -> None: +def test_subparsers_service_clean(parser: argparse.ArgumentParser) -> None: """ - shell command must imply lock and report + service-clean command must imply quiet and unsafe """ - args = parser.parse_args(["shell"]) + args = parser.parse_args(["service-clean"]) + assert args.quiet + assert args.unsafe + + +def test_subparsers_service_clean_architecture(parser: argparse.ArgumentParser) -> None: + """ + service-clean command must correctly parse architecture list + """ + args = parser.parse_args(["service-clean"]) + assert args.architecture is None + args = parser.parse_args(["-a", "x86_64", "service-clean"]) + assert args.architecture == ["x86_64"] + + +def test_subparsers_service_config(parser: argparse.ArgumentParser) -> None: + """ + service-config command must imply lock, report, quiet and unsafe + """ + args = parser.parse_args(["-a", "x86_64", "service-config"]) + assert args.architecture == ["x86_64"] + assert args.lock is None + assert not args.report + assert args.quiet + assert args.unsafe + + +def test_subparsers_service_config_validate(parser: argparse.ArgumentParser) -> None: + """ + service-config-validate command must imply lock, report, quiet and unsafe + """ + args = parser.parse_args(["-a", "x86_64", "service-config-validate"]) + assert args.architecture == ["x86_64"] + assert args.lock is None + assert not args.report + assert args.quiet + assert args.unsafe + + +def test_subparsers_service_key_import(parser: argparse.ArgumentParser) -> None: + """ + service-key-import command must imply architecture list, lock and report + """ + args = parser.parse_args(["service-key-import", "key"]) + assert args.architecture == [""] + assert args.lock is None + assert not args.report + + +def test_subparsers_service_key_import_architecture(parser: argparse.ArgumentParser) -> None: + """ + service-key-import command must correctly parse architecture list + """ + args = parser.parse_args(["-a", "x86_64", "service-key-import", "key"]) + assert args.architecture == [""] + + +def test_subparsers_service_setup(parser: argparse.ArgumentParser) -> None: + """ + service-setup command must imply lock, report, quiet and unsafe + """ + args = parser.parse_args(["-a", "x86_64", "service-setup", "--packager", "John Doe ", + "--repository", "aur-clone"]) + assert args.architecture == ["x86_64"] + assert args.lock is None + assert not args.report + assert args.quiet + assert args.unsafe + + +def test_subparsers_service_setup_option_from_configuration(parser: argparse.ArgumentParser) -> None: + """ + service-setup command must convert from-configuration option to path instance + """ + args = parser.parse_args(["-a", "x86_64", "service-setup", "--packager", "John Doe ", + "--repository", "aur-clone"]) + assert isinstance(args.from_configuration, Path) + args = parser.parse_args(["-a", "x86_64", "service-setup", "--packager", "John Doe ", + "--repository", "aur-clone", "--from-configuration", "path"]) + assert isinstance(args.from_configuration, Path) + + +def test_subparsers_service_setup_option_sign_target(parser: argparse.ArgumentParser) -> None: + """ + service-setup command must convert sign-target option to signsettings instance + """ + args = parser.parse_args(["-a", "x86_64", "service-setup", "--packager", "John Doe ", + "--repository", "aur-clone", "--sign-target", "packages"]) + assert args.sign_target + assert all(isinstance(target, SignSettings) for target in args.sign_target) + + +def test_subparsers_service_shell(parser: argparse.ArgumentParser) -> None: + """ + service-shell command must imply lock and report + """ + args = parser.parse_args(["service-shell"]) assert args.lock is None assert not args.report @@ -712,26 +732,6 @@ def test_subparsers_user_remove_architecture(parser: argparse.ArgumentParser) -> assert args.architecture == [""] -def test_subparsers_version(parser: argparse.ArgumentParser) -> None: - """ - version command must imply architecture, lock, report, quiet and unsafe - """ - args = parser.parse_args(["version"]) - assert args.architecture == [""] - assert args.lock is None - assert not args.report - assert args.quiet - assert args.unsafe - - -def test_subparsers_version_architecture(parser: argparse.ArgumentParser) -> None: - """ - version command must correctly parse architecture list - """ - args = parser.parse_args(["-a", "x86_64", "version"]) - assert args.architecture == [""] - - def test_subparsers_web(parser: argparse.ArgumentParser) -> None: """ web command must imply lock, report and parser diff --git a/tests/ahriman/core/test_spawn.py b/tests/ahriman/core/test_spawn.py index 365b0c59..cdccac83 100644 --- a/tests/ahriman/core/test_spawn.py +++ b/tests/ahriman/core/test_spawn.py @@ -42,7 +42,7 @@ def test_key_import(spawner: Spawn, mocker: MockerFixture) -> None: """ spawn_mock = mocker.patch("ahriman.core.spawn.Spawn.spawn_process") spawner.key_import("0xdeadbeaf", None) - spawn_mock.assert_called_once_with("key-import", "0xdeadbeaf") + spawn_mock.assert_called_once_with("service-key-import", "0xdeadbeaf") def test_key_import_with_server(spawner: Spawn, mocker: MockerFixture) -> None: @@ -51,7 +51,7 @@ def test_key_import_with_server(spawner: Spawn, mocker: MockerFixture) -> None: """ spawn_mock = mocker.patch("ahriman.core.spawn.Spawn.spawn_process") spawner.key_import("0xdeadbeaf", "keyserver.ubuntu.com") - spawn_mock.assert_called_once_with("key-import", "0xdeadbeaf", **{"key-server": "keyserver.ubuntu.com"}) + spawn_mock.assert_called_once_with("service-key-import", "0xdeadbeaf", **{"key-server": "keyserver.ubuntu.com"}) def test_packages_add(spawner: Spawn, mocker: MockerFixture) -> None: