mirror of
https://github.com/arcan1s/ahriman.git
synced 2026-02-03 20:09:48 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4d1c881827 | |||
| 833978f8b4 | |||
| b2e9ba3877 | |||
| 2c913afb7a | |||
| 65bcf819b1 |
@@ -215,6 +215,7 @@ Again, the most checks can be performed by `tox` command, though some additional
|
||||
* It is allowed to change web API to add new fields or remove optional ones. However, in case of model changes, new API version must be introduced.
|
||||
* On the other hand, it is allowed to change method signatures, however, it is recommended to add new parameters as optional if possible. Deprecated API can be dropped during major release.
|
||||
* Enumerations (`Enum` classes) are allowed and recommended. However, it is recommended to use `StrEnum` class if there are from/to string conversions and `IntEnum` otherwise.
|
||||
* `Generator` return type is not allowed. Generator functions must return generic `Iterator` object. Documentation should be described as `Yields`, however, because of pylint checks. Unfortunately, `Iterable` return type is not available for generators also, because of specific `contextlib.contextmanager` case.
|
||||
|
||||
### Other checks
|
||||
|
||||
|
||||
127
docs/_static/architecture.dot
vendored
127
docs/_static/architecture.dot
vendored
@@ -184,7 +184,7 @@ digraph G {
|
||||
ahriman_core_upload_upload [fillcolor="blue",fontcolor="white",label="ahriman\.\ncore\.\nupload\.\nupload",shape="box"];
|
||||
ahriman_core_upload_upload_trigger [fillcolor="blue",fontcolor="white",label="ahriman\.\ncore\.\nupload\.\nupload_trigger",shape="box"];
|
||||
ahriman_core_util [fillcolor="#ac6349",fontcolor="#ffffff",label="ahriman\.\ncore\.\nutil"];
|
||||
ahriman_core_utils [fillcolor="#db3d05",fontcolor="#ffffff",label="ahriman\.\ncore\.\nutils"];
|
||||
ahriman_core_utils [fillcolor="#ef4306",fontcolor="#ffffff",label="ahriman\.\ncore\.\nutils"];
|
||||
ahriman_models [fillcolor="#f94d10",fontcolor="#ffffff",label="ahriman.models"];
|
||||
ahriman_models_action [fillcolor="#e75622",fontcolor="#ffffff",label="ahriman\.\nmodels\.\naction"];
|
||||
ahriman_models_aur_package [fillcolor="#db3d05",fontcolor="#ffffff",label="ahriman\.\nmodels\.\naur_package"];
|
||||
@@ -215,7 +215,7 @@ digraph G {
|
||||
ahriman_models_remote_source [fillcolor="#d13a05",fontcolor="#ffffff",label="ahriman\.\nmodels\.\nremote_source"];
|
||||
ahriman_models_report_settings [fillcolor="#c26747",fontcolor="#ffffff",label="ahriman\.\nmodels\.\nreport_settings"];
|
||||
ahriman_models_repository_id [fillcolor="#f94d10",fontcolor="#ffffff",label="ahriman\.\nmodels\.\nrepository_id"];
|
||||
ahriman_models_repository_paths [fillcolor="#d13a05",fontcolor="#ffffff",label="ahriman\.\nmodels\.\nrepository_paths"];
|
||||
ahriman_models_repository_paths [fillcolor="#c73705",fontcolor="#ffffff",label="ahriman\.\nmodels\.\nrepository_paths"];
|
||||
ahriman_models_repository_stats [fillcolor="#ca4516",fontcolor="#ffffff",label="ahriman\.\nmodels\.\nrepository_stats"];
|
||||
ahriman_models_result [fillcolor="#ef4306",fontcolor="#ffffff",label="ahriman\.\nmodels\.\nresult"];
|
||||
ahriman_models_scan_paths [fillcolor="#ce613b",fontcolor="#ffffff",label="ahriman\.\nmodels\.\nscan_paths"];
|
||||
@@ -952,56 +952,57 @@ digraph G {
|
||||
ahriman_core_upload_upload -> ahriman_core_upload_s3 [fillcolor="blue",weight="3"];
|
||||
ahriman_core_upload_upload -> ahriman_core_upload_upload_trigger [fillcolor="blue",weight="3"];
|
||||
ahriman_core_upload_upload_trigger -> ahriman_core_upload [fillcolor="blue",weight="3"];
|
||||
ahriman_core_utils -> ahriman_application_ahriman [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_application_application_application_packages [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_add [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_daemon [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_rebuild [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_setup [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_statistics [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_status [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_status_update [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_update [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_users [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_lock [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_core_alpm_pacman [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_alpm_repo [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_auth_pam [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_build_tools_package_archive [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_build_tools_sources [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_build_tools_task [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_formatters_aur_printer [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_formatters_repository_stats_printer [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_formatters_update_printer [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_gitremote_remote_pull [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_report_email [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_report_jinja_template [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_repository_executor [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_repository_package_info [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_sign_gpg [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_support_pkgbuild_pkgbuild_generator [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_tree [fillcolor="#db3d05",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_upload_github [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_upload_rsync [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_upload_s3 [fillcolor="#db3d05",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_util [fillcolor="#db3d05",weight="2"];
|
||||
ahriman_core_utils -> ahriman_models_aur_package [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_build_status [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_changes [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_counters [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_dependencies [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_event [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_filesystem_package [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_internal_status [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_package [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_package_description [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_package_source [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_pkgbuild_patch [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_remote_source [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_repository_stats [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_worker [fillcolor="#db3d05",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_web_views_api_swagger [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_web_views_v1_packages_logs [fillcolor="#db3d05",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_ahriman [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_application_application_application_packages [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_add [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_daemon [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_rebuild [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_setup [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_statistics [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_status [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_status_update [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_update [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_handlers_users [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_application_lock [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_core_alpm_pacman [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_alpm_repo [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_auth_pam [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_build_tools_package_archive [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_build_tools_sources [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_build_tools_task [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_formatters_aur_printer [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_formatters_repository_stats_printer [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_formatters_update_printer [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_gitremote_remote_pull [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_report_email [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_report_jinja_template [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_repository_executor [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_repository_package_info [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_sign_gpg [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_support_pkgbuild_pkgbuild_generator [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_tree [fillcolor="#ef4306",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_upload_github [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_upload_rsync [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_upload_s3 [fillcolor="#ef4306",minlen="2",weight="2"];
|
||||
ahriman_core_utils -> ahriman_core_util [fillcolor="#ef4306",weight="2"];
|
||||
ahriman_core_utils -> ahriman_models_aur_package [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_build_status [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_changes [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_counters [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_dependencies [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_event [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_filesystem_package [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_internal_status [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_package [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_package_description [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_package_source [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_pkgbuild_patch [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_remote_source [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_repository_paths [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_repository_stats [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_models_worker [fillcolor="#ef4306",minlen="2"];
|
||||
ahriman_core_utils -> ahriman_web_views_api_swagger [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_core_utils -> ahriman_web_views_v1_packages_logs [fillcolor="#ef4306",minlen="3"];
|
||||
ahriman_models -> ahriman_application_ahriman [fillcolor="#f94d10",minlen="2"];
|
||||
ahriman_models -> ahriman_application_application_application [fillcolor="#f94d10",minlen="3"];
|
||||
ahriman_models -> ahriman_application_application_application_packages [fillcolor="#f94d10",minlen="3"];
|
||||
@@ -1136,7 +1137,6 @@ digraph G {
|
||||
ahriman_models -> ahriman_core_upload_s3 [fillcolor="#f94d10",minlen="3"];
|
||||
ahriman_models -> ahriman_core_upload_upload [fillcolor="#f94d10",minlen="3"];
|
||||
ahriman_models -> ahriman_core_upload_upload_trigger [fillcolor="#f94d10",minlen="3"];
|
||||
ahriman_models -> ahriman_core_utils [fillcolor="#f94d10",minlen="2"];
|
||||
ahriman_models -> ahriman_web_apispec_decorators [fillcolor="#f94d10",minlen="3"];
|
||||
ahriman_models -> ahriman_web_keys [fillcolor="#f94d10",minlen="2"];
|
||||
ahriman_models -> ahriman_web_middlewares_auth_handler [fillcolor="#f94d10",minlen="3"];
|
||||
@@ -1475,17 +1475,16 @@ digraph G {
|
||||
ahriman_models_repository_id -> ahriman_web_keys [fillcolor="#f94d10",minlen="2"];
|
||||
ahriman_models_repository_id -> ahriman_web_views_base [fillcolor="#f94d10",minlen="3"];
|
||||
ahriman_models_repository_id -> ahriman_web_web [fillcolor="#f94d10",minlen="2"];
|
||||
ahriman_models_repository_paths -> ahriman_application_handlers_handler [fillcolor="#d13a05",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_application_handlers_setup [fillcolor="#d13a05",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_application_handlers_tree_migrate [fillcolor="#d13a05",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_alpm_repo [fillcolor="#d13a05",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_build_tools_sources [fillcolor="#d13a05",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_build_tools_task [fillcolor="#d13a05",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_configuration_configuration [fillcolor="#d13a05",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_repository_repository_properties [fillcolor="#d13a05",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_utils [fillcolor="#d13a05",minlen="2"];
|
||||
ahriman_models_repository_paths -> ahriman_models_package_source [fillcolor="#d13a05",weight="2"];
|
||||
ahriman_models_repository_paths -> ahriman_web_views_v1_service_upload [fillcolor="#d13a05",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_application_handlers_handler [fillcolor="#c73705",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_application_handlers_setup [fillcolor="#c73705",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_application_handlers_tree_migrate [fillcolor="#c73705",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_alpm_repo [fillcolor="#c73705",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_build_tools_sources [fillcolor="#c73705",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_build_tools_task [fillcolor="#c73705",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_configuration_configuration [fillcolor="#c73705",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_core_repository_repository_properties [fillcolor="#c73705",minlen="3"];
|
||||
ahriman_models_repository_paths -> ahriman_models_package_source [fillcolor="#c73705",weight="2"];
|
||||
ahriman_models_repository_paths -> ahriman_web_views_v1_service_upload [fillcolor="#c73705",minlen="3"];
|
||||
ahriman_models_repository_stats -> ahriman_core_formatters_repository_stats_printer [fillcolor="#ca4516",minlen="3"];
|
||||
ahriman_models_repository_stats -> ahriman_core_status_client [fillcolor="#ca4516",minlen="3"];
|
||||
ahriman_models_repository_stats -> ahriman_models_internal_status [fillcolor="#ca4516",weight="2"];
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
pkgbase='ahriman'
|
||||
pkgname=('ahriman' 'ahriman-core' 'ahriman-triggers' 'ahriman-web')
|
||||
pkgver=2.19.2
|
||||
pkgver=2.19.4
|
||||
pkgrel=1
|
||||
pkgdesc="ArcH linux ReposItory MANager"
|
||||
arch=('any')
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
.TH AHRIMAN "1" "2026\-01\-25" "ahriman 2.19.2" "ArcH linux ReposItory MANager"
|
||||
.TH AHRIMAN "1" "2026\-02\-02" "ahriman 2.19.4" "ArcH linux ReposItory MANager"
|
||||
.SH NAME
|
||||
ahriman \- ArcH linux ReposItory MANager
|
||||
.SH SYNOPSIS
|
||||
.B ahriman
|
||||
[-h] [-a ARCHITECTURE] [-c CONFIGURATION] [--force] [-l LOCK] [--log-handler {console,syslog,journald}] [-q] [--report | --no-report] [-r REPOSITORY] [--unsafe] [-V] [--wait-timeout WAIT_TIMEOUT] {add,aur-search,check,clean,config,config-validate,copy,daemon,help,help-commands-unsafe,help-updates,help-version,init,key-import,package-add,package-changes,package-changes-remove,package-copy,package-remove,package-status,package-status-remove,package-status-update,package-update,patch-add,patch-list,patch-remove,patch-set-add,rebuild,remove,remove-unknown,repo-backup,repo-check,repo-clean,repo-config,repo-config-validate,repo-create-keyring,repo-create-mirrorlist,repo-daemon,repo-init,repo-rebuild,repo-remove-unknown,repo-report,repo-restore,repo-setup,repo-sign,repo-statistics,repo-status-update,repo-sync,repo-tree,repo-triggers,repo-update,report,run,search,service-clean,service-config,service-config-validate,service-key-import,service-repositories,service-run,service-setup,service-shell,service-tree-migrate,setup,shell,sign,status,status-update,sync,update,user-add,user-list,user-remove,version,web} ...
|
||||
.B [0m[1;35mahriman[0m
|
||||
[[32m-h[0m] [[32m-a [33mARCHITECTURE[0m] [[32m-c [33mCONFIGURATION[0m] [[36m--force[0m] [[32m-l [33mLOCK[0m] [[36m--log-handler [33m{console,syslog,journald}[0m] [[32m-q[0m] [[36m--report | --no-report[0m] [[32m-r [33mREPOSITORY[0m] [[36m--unsafe[0m] [[32m-V[0m] [[36m--wait-timeout [33mWAIT_TIMEOUT[0m] [32m{add,aur-search,check,clean,config,config-validate,copy,daemon,help,help-commands-unsafe,help-updates,help-version,init,key-import,package-add,package-changes,package-changes-remove,package-copy,package-remove,package-status,package-status-remove,package-status-update,package-update,patch-add,patch-list,patch-remove,patch-set-add,rebuild,remove,remove-unknown,repo-backup,repo-check,repo-clean,repo-config,repo-config-validate,repo-create-keyring,repo-create-mirrorlist,repo-daemon,repo-init,repo-rebuild,repo-remove-unknown,repo-report,repo-restore,repo-setup,repo-sign,repo-statistics,repo-status-update,repo-sync,repo-tree,repo-triggers,repo-update,report,run,search,service-clean,service-config,service-config-validate,service-key-import,service-repositories,service-run,service-setup,service-shell,service-tree-migrate,setup,shell,sign,status,status-update,sync,update,user-add,user-list,user-remove,version,web} ...[0m
|
||||
.SH DESCRIPTION
|
||||
ArcH linux ReposItory MANager
|
||||
|
||||
@@ -195,9 +195,9 @@ remove user
|
||||
web server
|
||||
|
||||
.SH COMMAND \fI\,'ahriman aur\-search'\/\fR
|
||||
usage: ahriman aur\-search [\-h] [\-e] [\-\-info | \-\-no\-info]
|
||||
[\-\-sort\-by {description,first_submitted,id,last_modified,maintainer,name,num_votes,out_of_date,package_base,package_base_id,popularity,repository,submitter,url,url_path,version}]
|
||||
search [search ...]
|
||||
[1;34musage: [0m[1;35mahriman aur\-search[0m [[32m\-h[0m] [[32m\-e[0m] [[36m\-\-info | \-\-no\-info[0m]
|
||||
[[36m\-\-sort\-by [33m{description,first_submitted,id,last_modified,maintainer,name,num_votes,out_of_date,package_base,package_base_id,popularity,repository,submitter,url,url_path,version}[0m]
|
||||
[32msearch [search ...][0m
|
||||
|
||||
search for package in AUR using API
|
||||
|
||||
@@ -220,7 +220,7 @@ sort field by this field. In case if two packages have the same value of the spe
|
||||
by name
|
||||
|
||||
.SH COMMAND \fI\,'ahriman help'\/\fR
|
||||
usage: ahriman help [\-h] [subcommand]
|
||||
[1;34musage: [0m[1;35mahriman help[0m [[32m\-h[0m] [32m[subcommand][0m
|
||||
|
||||
show help message for application or command and exit
|
||||
|
||||
@@ -229,7 +229,7 @@ show help message for application or command and exit
|
||||
show help message for specific command
|
||||
|
||||
.SH COMMAND \fI\,'ahriman help\-commands\-unsafe'\/\fR
|
||||
usage: ahriman help\-commands\-unsafe [\-h] [subcommand ...]
|
||||
[1;34musage: [0m[1;35mahriman help\-commands\-unsafe[0m [[32m\-h[0m] [32m[subcommand ...][0m
|
||||
|
||||
list unsafe commands as defined in default args
|
||||
|
||||
@@ -239,7 +239,7 @@ instead of showing commands, just test command line for unsafe subcommand and re
|
||||
otherwise
|
||||
|
||||
.SH COMMAND \fI\,'ahriman help\-updates'\/\fR
|
||||
usage: ahriman help\-updates [\-h] [\-e]
|
||||
[1;34musage: [0m[1;35mahriman help\-updates[0m [[32m\-h[0m] [[32m\-e[0m]
|
||||
|
||||
request AUR for current version and compare with current service version
|
||||
|
||||
@@ -249,15 +249,15 @@ request AUR for current version and compare with current service version
|
||||
return non\-zero exit code if updates available
|
||||
|
||||
.SH COMMAND \fI\,'ahriman help\-version'\/\fR
|
||||
usage: ahriman help\-version [\-h]
|
||||
[1;34musage: [0m[1;35mahriman help\-version[0m [[32m\-h[0m]
|
||||
|
||||
print application and its dependencies versions
|
||||
|
||||
.SH COMMAND \fI\,'ahriman package\-add'\/\fR
|
||||
usage: ahriman package\-add [\-h] [\-\-changes | \-\-no\-changes] [\-\-dependencies | \-\-no\-dependencies] [\-e]
|
||||
[\-\-increment | \-\-no\-increment] [\-n] [\-y]
|
||||
[\-s {auto,archive,aur,directory,local,remote,repository}] [\-u USERNAME] [\-v VARIABLE]
|
||||
package [package ...]
|
||||
[1;34musage: [0m[1;35mahriman package\-add[0m [[32m\-h[0m] [[36m\-\-changes | \-\-no\-changes[0m] [[36m\-\-dependencies | \-\-no\-dependencies[0m] [[32m\-e[0m]
|
||||
[[36m\-\-increment | \-\-no\-increment[0m] [[32m\-n[0m] [[32m\-y[0m]
|
||||
[[32m\-s [33m{auto,archive,aur,directory,local,remote,repository}[0m] [[32m\-u [33mUSERNAME[0m] [[32m\-v [33mVARIABLE[0m]
|
||||
[32mpackage [package ...][0m
|
||||
|
||||
add existing or new package to the build queue
|
||||
|
||||
@@ -303,7 +303,7 @@ build as user
|
||||
apply specified makepkg variables to the next build
|
||||
|
||||
.SH COMMAND \fI\,'ahriman package\-changes'\/\fR
|
||||
usage: ahriman package\-changes [\-h] [\-e] package
|
||||
[1;34musage: [0m[1;35mahriman package\-changes[0m [[32m\-h[0m] [[32m\-e[0m] [32mpackage[0m
|
||||
|
||||
retrieve package changes stored in database
|
||||
|
||||
@@ -317,7 +317,7 @@ package base
|
||||
return non\-zero exit status if result is empty
|
||||
|
||||
.SH COMMAND \fI\,'ahriman package\-changes\-remove'\/\fR
|
||||
usage: ahriman package\-changes\-remove [\-h] package
|
||||
[1;34musage: [0m[1;35mahriman package\-changes\-remove[0m [[32m\-h[0m] [32mpackage[0m
|
||||
|
||||
remove the package changes stored remotely
|
||||
|
||||
@@ -326,7 +326,7 @@ remove the package changes stored remotely
|
||||
package base
|
||||
|
||||
.SH COMMAND \fI\,'ahriman package\-copy'\/\fR
|
||||
usage: ahriman package\-copy [\-h] [\-e] [\-\-remove] source package [package ...]
|
||||
[1;34musage: [0m[1;35mahriman package\-copy[0m [[32m\-h[0m] [[32m\-e[0m] [[36m\-\-remove[0m] [32msource[0m [32mpackage [package ...][0m
|
||||
|
||||
copy package and its metadata from another repository
|
||||
|
||||
@@ -348,7 +348,7 @@ return non\-zero exit status if result is empty
|
||||
remove package from the source repository after
|
||||
|
||||
.SH COMMAND \fI\,'ahriman package\-remove'\/\fR
|
||||
usage: ahriman package\-remove [\-h] package [package ...]
|
||||
[1;34musage: [0m[1;35mahriman package\-remove[0m [[32m\-h[0m] [32mpackage [package ...][0m
|
||||
|
||||
remove package from the repository
|
||||
|
||||
@@ -357,8 +357,8 @@ remove package from the repository
|
||||
package name or base
|
||||
|
||||
.SH COMMAND \fI\,'ahriman package\-status'\/\fR
|
||||
usage: ahriman package\-status [\-h] [\-\-ahriman] [\-e] [\-\-info | \-\-no\-info] [\-s {unknown,pending,building,failed,success}]
|
||||
[package ...]
|
||||
[1;34musage: [0m[1;35mahriman package\-status[0m [[32m\-h[0m] [[36m\-\-ahriman[0m] [[32m\-e[0m] [[36m\-\-info | \-\-no\-info[0m] [[32m\-s [33m{unknown,pending,building,failed,success}[0m]
|
||||
[32m[package ...][0m
|
||||
|
||||
request status of the package
|
||||
|
||||
@@ -384,7 +384,7 @@ show additional package information
|
||||
filter packages by status
|
||||
|
||||
.SH COMMAND \fI\,'ahriman package\-status\-remove'\/\fR
|
||||
usage: ahriman package\-status\-remove [\-h] package [package ...]
|
||||
[1;34musage: [0m[1;35mahriman package\-status\-remove[0m [[32m\-h[0m] [32mpackage [package ...][0m
|
||||
|
||||
remove the package from the status page
|
||||
|
||||
@@ -393,7 +393,7 @@ remove the package from the status page
|
||||
remove specified packages from status page
|
||||
|
||||
.SH COMMAND \fI\,'ahriman package\-status\-update'\/\fR
|
||||
usage: ahriman package\-status\-update [\-h] [\-s {unknown,pending,building,failed,success}] [package ...]
|
||||
[1;34musage: [0m[1;35mahriman package\-status\-update[0m [[32m\-h[0m] [[32m\-s [33m{unknown,pending,building,failed,success}[0m] [32m[package ...][0m
|
||||
|
||||
update package status on the status page
|
||||
|
||||
@@ -407,7 +407,7 @@ set status for specified packages. If no packages supplied, service status will
|
||||
new package build status
|
||||
|
||||
.SH COMMAND \fI\,'ahriman patch\-add'\/\fR
|
||||
usage: ahriman patch\-add [\-h] package variable [patch]
|
||||
[1;34musage: [0m[1;35mahriman patch\-add[0m [[32m\-h[0m] [32mpackage[0m [32mvariable[0m [32m[patch][0m
|
||||
|
||||
create or update patched PKGBUILD function or variable
|
||||
|
||||
@@ -424,7 +424,7 @@ PKGBUILD variable or function name. If variable is a function, it must end with
|
||||
path to file which contains function or variable value. If not set, the value will be read from stdin
|
||||
|
||||
.SH COMMAND \fI\,'ahriman patch\-list'\/\fR
|
||||
usage: ahriman patch\-list [\-h] [\-e] [\-v VARIABLE] package
|
||||
[1;34musage: [0m[1;35mahriman patch\-list[0m [[32m\-h[0m] [[32m\-e[0m] [[32m\-v [33mVARIABLE[0m] [32mpackage[0m
|
||||
|
||||
list available patches for the package
|
||||
|
||||
@@ -442,7 +442,7 @@ return non\-zero exit status if result is empty
|
||||
if set, show only patches for specified PKGBUILD variables
|
||||
|
||||
.SH COMMAND \fI\,'ahriman patch\-remove'\/\fR
|
||||
usage: ahriman patch\-remove [\-h] [\-v VARIABLE] package
|
||||
[1;34musage: [0m[1;35mahriman patch\-remove[0m [[32m\-h[0m] [[32m\-v [33mVARIABLE[0m] [32mpackage[0m
|
||||
|
||||
remove patches for the package
|
||||
|
||||
@@ -457,7 +457,7 @@ should be used for single\-function patches in case if you wold like to remove o
|
||||
if not set, it will remove all patches related to the package
|
||||
|
||||
.SH COMMAND \fI\,'ahriman patch\-set\-add'\/\fR
|
||||
usage: ahriman patch\-set\-add [\-h] [\-t TRACK] package
|
||||
[1;34musage: [0m[1;35mahriman patch\-set\-add[0m [[32m\-h[0m] [[32m\-t [33mTRACK[0m] [32mpackage[0m
|
||||
|
||||
create or update source patches
|
||||
|
||||
@@ -471,7 +471,7 @@ path to directory with changed files for patch addition/update
|
||||
files which has to be tracked
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-backup'\/\fR
|
||||
usage: ahriman repo\-backup [\-h] path
|
||||
[1;34musage: [0m[1;35mahriman repo\-backup[0m [[32m\-h[0m] [32mpath[0m
|
||||
|
||||
backup repository settings and database
|
||||
|
||||
@@ -480,9 +480,9 @@ backup repository settings and database
|
||||
path of the output archive
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-check'\/\fR
|
||||
usage: ahriman repo\-check [\-h] [\-\-changes | \-\-no\-changes] [\-\-check\-files | \-\-no\-check\-files] [\-e] [\-\-vcs | \-\-no\-vcs]
|
||||
[\-y]
|
||||
[package ...]
|
||||
[1;34musage: [0m[1;35mahriman repo\-check[0m [[32m\-h[0m] [[36m\-\-changes | \-\-no\-changes[0m] [[36m\-\-check\-files | \-\-no\-check\-files[0m] [[32m\-e[0m] [[36m\-\-vcs | \-\-no\-vcs[0m]
|
||||
[[32m\-y[0m]
|
||||
[32m[package ...][0m
|
||||
|
||||
check for packages updates. Same as repo\-update \-\-dry\-run \-\-no\-manual
|
||||
|
||||
@@ -512,20 +512,20 @@ fetch actual version of VCS packages
|
||||
download fresh package databases from the mirror before actions, \-yy to force refresh even if up to date
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-create\-keyring'\/\fR
|
||||
usage: ahriman repo\-create\-keyring [\-h]
|
||||
[1;34musage: [0m[1;35mahriman repo\-create\-keyring[0m [[32m\-h[0m]
|
||||
|
||||
create package which contains list of trusted keys as set by configuration. Note, that this action will only create package, the package itself has to be built manually
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-create\-mirrorlist'\/\fR
|
||||
usage: ahriman repo\-create\-mirrorlist [\-h]
|
||||
[1;34musage: [0m[1;35mahriman repo\-create\-mirrorlist[0m [[32m\-h[0m]
|
||||
|
||||
create package which contains list of available mirrors as set by configuration. Note, that this action will only create package, the package itself has to be built manually
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-daemon'\/\fR
|
||||
usage: ahriman repo\-daemon [\-h] [\-i INTERVAL] [\-\-aur | \-\-no\-aur] [\-\-changes | \-\-no\-changes]
|
||||
[\-\-check\-files | \-\-no\-check\-files] [\-\-dependencies | \-\-no\-dependencies] [\-\-dry\-run]
|
||||
[\-\-increment | \-\-no\-increment] [\-\-local | \-\-no\-local] [\-\-manual | \-\-no\-manual]
|
||||
[\-\-partitions | \-\-no\-partitions] [\-u USERNAME] [\-\-vcs | \-\-no\-vcs] [\-y]
|
||||
[1;34musage: [0m[1;35mahriman repo\-daemon[0m [[32m\-h[0m] [[32m\-i [33mINTERVAL[0m] [[36m\-\-aur | \-\-no\-aur[0m] [[36m\-\-changes | \-\-no\-changes[0m]
|
||||
[[36m\-\-check\-files | \-\-no\-check\-files[0m] [[36m\-\-dependencies | \-\-no\-dependencies[0m] [[36m\-\-dry\-run[0m]
|
||||
[[36m\-\-increment | \-\-no\-increment[0m] [[36m\-\-local | \-\-no\-local[0m] [[36m\-\-manual | \-\-no\-manual[0m]
|
||||
[[36m\-\-partitions | \-\-no\-partitions[0m] [[32m\-u [33mUSERNAME[0m] [[36m\-\-vcs | \-\-no\-vcs[0m] [[32m\-y[0m]
|
||||
|
||||
start process which periodically will run update process
|
||||
|
||||
@@ -583,8 +583,8 @@ fetch actual version of VCS packages
|
||||
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] [\-\-increment | \-\-no\-increment]
|
||||
[\-e] [\-s {unknown,pending,building,failed,success}] [\-u USERNAME]
|
||||
[1;34musage: [0m[1;35mahriman repo\-rebuild[0m [[32m\-h[0m] [[36m\-\-depends\-on [33mDEPENDS_ON[0m] [[36m\-\-dry\-run[0m] [[36m\-\-from\-database[0m] [[36m\-\-increment | \-\-no\-increment[0m]
|
||||
[[32m\-e[0m] [[32m\-s [33m{unknown,pending,building,failed,success}[0m] [[32m\-u [33mUSERNAME[0m]
|
||||
|
||||
force rebuild whole repository
|
||||
|
||||
@@ -620,7 +620,7 @@ filter packages by status. Requires \-\-from\-database to be set
|
||||
build as user
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-remove\-unknown'\/\fR
|
||||
usage: ahriman repo\-remove\-unknown [\-h] [\-\-dry\-run]
|
||||
[1;34musage: [0m[1;35mahriman repo\-remove\-unknown[0m [[32m\-h[0m] [[36m\-\-dry\-run[0m]
|
||||
|
||||
remove packages which are missing in AUR and do not have local PKGBUILDs
|
||||
|
||||
@@ -630,12 +630,12 @@ remove packages which are missing in AUR and do not have local PKGBUILDs
|
||||
just perform check for packages without removal
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-report'\/\fR
|
||||
usage: ahriman repo\-report [\-h]
|
||||
[1;34musage: [0m[1;35mahriman repo\-report[0m [[32m\-h[0m]
|
||||
|
||||
generate repository report according to current settings
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-restore'\/\fR
|
||||
usage: ahriman repo\-restore [\-h] [\-o OUTPUT] path
|
||||
[1;34musage: [0m[1;35mahriman repo\-restore[0m [[32m\-h[0m] [[32m\-o [33mOUTPUT[0m] [32mpath[0m
|
||||
|
||||
restore settings and database
|
||||
|
||||
@@ -649,7 +649,7 @@ path of the input archive
|
||||
root path of the extracted files
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-sign'\/\fR
|
||||
usage: ahriman repo\-sign [\-h] [package ...]
|
||||
[1;34musage: [0m[1;35mahriman repo\-sign[0m [[32m\-h[0m] [32m[package ...][0m
|
||||
|
||||
(re\-)sign packages and repository database according to current settings
|
||||
|
||||
@@ -658,10 +658,10 @@ usage: ahriman repo\-sign [\-h] [package ...]
|
||||
sign only specified packages
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-statistics'\/\fR
|
||||
usage: ahriman repo\-statistics [\-h] [\-\-chart CHART]
|
||||
[\-e {package\-outdated,package\-removed,package\-update\-failed,package\-updated}]
|
||||
[\-\-from\-date FROM_DATE] [\-\-limit LIMIT] [\-\-offset OFFSET] [\-\-to\-date TO_DATE]
|
||||
[package]
|
||||
[1;34musage: [0m[1;35mahriman repo\-statistics[0m [[32m\-h[0m] [[36m\-\-chart [33mCHART[0m]
|
||||
[[32m\-e [33m{package\-outdated,package\-removed,package\-update\-failed,package\-updated}[0m]
|
||||
[[36m\-\-from\-date [33mFROM_DATE[0m] [[36m\-\-limit [33mLIMIT[0m] [[36m\-\-offset [33mOFFSET[0m] [[36m\-\-to\-date [33mTO_DATE[0m]
|
||||
[32m[package][0m
|
||||
|
||||
fetch repository statistics
|
||||
|
||||
@@ -695,7 +695,7 @@ skip specified amount of events
|
||||
only fetch events which are older than the date
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-status\-update'\/\fR
|
||||
usage: ahriman repo\-status\-update [\-h] [\-s {unknown,pending,building,failed,success}]
|
||||
[1;34musage: [0m[1;35mahriman repo\-status\-update[0m [[32m\-h[0m] [[32m\-s [33m{unknown,pending,building,failed,success}[0m]
|
||||
|
||||
update repository status on the status page
|
||||
|
||||
@@ -705,12 +705,12 @@ update repository status on the status page
|
||||
new status
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-sync'\/\fR
|
||||
usage: ahriman repo\-sync [\-h]
|
||||
[1;34musage: [0m[1;35mahriman repo\-sync[0m [[32m\-h[0m]
|
||||
|
||||
sync repository files to remote server according to current settings
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-tree'\/\fR
|
||||
usage: ahriman repo\-tree [\-h] [\-p PARTITIONS]
|
||||
[1;34musage: [0m[1;35mahriman repo\-tree[0m [[32m\-h[0m] [[32m\-p [33mPARTITIONS[0m]
|
||||
|
||||
dump repository tree based on packages dependencies
|
||||
|
||||
@@ -720,7 +720,7 @@ dump repository tree based on packages dependencies
|
||||
also divide packages by independent partitions
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-triggers'\/\fR
|
||||
usage: ahriman repo\-triggers [\-h] [trigger ...]
|
||||
[1;34musage: [0m[1;35mahriman repo\-triggers[0m [[32m\-h[0m] [32m[trigger ...][0m
|
||||
|
||||
run triggers on empty build result as configured by settings
|
||||
|
||||
@@ -729,10 +729,10 @@ run triggers on empty build result as configured by settings
|
||||
instead of running all triggers as set by configuration, just process specified ones in order of mention
|
||||
|
||||
.SH COMMAND \fI\,'ahriman repo\-update'\/\fR
|
||||
usage: ahriman repo\-update [\-h] [\-\-aur | \-\-no\-aur] [\-\-changes | \-\-no\-changes] [\-\-check\-files | \-\-no\-check\-files]
|
||||
[\-\-dependencies | \-\-no\-dependencies] [\-\-dry\-run] [\-e] [\-\-increment | \-\-no\-increment]
|
||||
[\-\-local | \-\-no\-local] [\-\-manual | \-\-no\-manual] [\-u USERNAME] [\-\-vcs | \-\-no\-vcs] [\-y]
|
||||
[package ...]
|
||||
[1;34musage: [0m[1;35mahriman repo\-update[0m [[32m\-h[0m] [[36m\-\-aur | \-\-no\-aur[0m] [[36m\-\-changes | \-\-no\-changes[0m] [[36m\-\-check\-files | \-\-no\-check\-files[0m]
|
||||
[[36m\-\-dependencies | \-\-no\-dependencies[0m] [[36m\-\-dry\-run[0m] [[32m\-e[0m] [[36m\-\-increment | \-\-no\-increment[0m]
|
||||
[[36m\-\-local | \-\-no\-local[0m] [[36m\-\-manual | \-\-no\-manual[0m] [[32m\-u [33mUSERNAME[0m] [[36m\-\-vcs | \-\-no\-vcs[0m] [[32m\-y[0m]
|
||||
[32m[package ...][0m
|
||||
|
||||
check for packages updates and run build process if requested
|
||||
|
||||
@@ -790,8 +790,8 @@ fetch actual version of VCS packages
|
||||
download fresh package databases from the mirror before actions, \-yy to force refresh even if up to date
|
||||
|
||||
.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]
|
||||
[1;34musage: [0m[1;35mahriman service\-clean[0m [[32m\-h[0m] [[36m\-\-cache | \-\-no\-cache[0m] [[36m\-\-chroot | \-\-no\-chroot[0m] [[36m\-\-manual | \-\-no\-manual[0m]
|
||||
[[36m\-\-packages | \-\-no\-packages[0m] [[36m\-\-pacman | \-\-no\-pacman[0m]
|
||||
|
||||
remove local caches
|
||||
|
||||
@@ -817,7 +817,7 @@ clear directory with built packages
|
||||
clear directory with pacman local database cache
|
||||
|
||||
.SH COMMAND \fI\,'ahriman service\-config'\/\fR
|
||||
usage: ahriman service\-config [\-h] [\-\-info | \-\-no\-info] [\-\-secure | \-\-no\-secure] [section] [key]
|
||||
[1;34musage: [0m[1;35mahriman service\-config[0m [[32m\-h[0m] [[36m\-\-info | \-\-no\-info[0m] [[36m\-\-secure | \-\-no\-secure[0m] [32m[section][0m [32m[key][0m
|
||||
|
||||
dump configuration for the specified architecture
|
||||
|
||||
@@ -839,7 +839,7 @@ show additional information, e.g. configuration files
|
||||
hide passwords and secrets from output
|
||||
|
||||
.SH COMMAND \fI\,'ahriman service\-config\-validate'\/\fR
|
||||
usage: ahriman service\-config\-validate [\-h] [\-e]
|
||||
[1;34musage: [0m[1;35mahriman service\-config\-validate[0m [[32m\-h[0m] [[32m\-e[0m]
|
||||
|
||||
validate configuration and print found errors
|
||||
|
||||
@@ -849,7 +849,7 @@ validate configuration and print found errors
|
||||
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
|
||||
[1;34musage: [0m[1;35mahriman service\-key\-import[0m [[32m\-h[0m] [[36m\-\-key\-server [33mKEY_SERVER[0m] [32mkey[0m
|
||||
|
||||
import PGP key from public sources to the repository user
|
||||
|
||||
@@ -863,7 +863,7 @@ PGP key to import from public server
|
||||
key server for key import
|
||||
|
||||
.SH COMMAND \fI\,'ahriman service\-repositories'\/\fR
|
||||
usage: ahriman service\-repositories [\-h] [\-\-id\-only | \-\-no\-id\-only]
|
||||
[1;34musage: [0m[1;35mahriman service\-repositories[0m [[32m\-h[0m] [[36m\-\-id\-only | \-\-no\-id\-only[0m]
|
||||
|
||||
list all available repositories
|
||||
|
||||
@@ -873,7 +873,7 @@ list all available repositories
|
||||
show machine readable identifier instead
|
||||
|
||||
.SH COMMAND \fI\,'ahriman service\-run'\/\fR
|
||||
usage: ahriman service\-run [\-h] command [command ...]
|
||||
[1;34musage: [0m[1;35mahriman service\-run[0m [[32m\-h[0m] [32mcommand [command ...][0m
|
||||
|
||||
run multiple commands on success run of the previous command
|
||||
|
||||
@@ -882,11 +882,11 @@ run multiple commands on success run of the previous command
|
||||
command to be run (quoted) without ``ahriman``
|
||||
|
||||
.SH COMMAND \fI\,'ahriman service\-setup'\/\fR
|
||||
usage: ahriman service\-setup [\-h] [\-\-build\-as\-user BUILD_AS_USER] [\-\-from\-configuration FROM_CONFIGURATION]
|
||||
[\-\-generate\-salt | \-\-no\-generate\-salt] [\-\-makeflags\-jobs | \-\-no\-makeflags\-jobs]
|
||||
[\-\-mirror MIRROR] [\-\-multilib | \-\-no\-multilib] \-\-packager PACKAGER [\-\-server SERVER]
|
||||
[\-\-sign\-key SIGN_KEY] [\-\-sign\-target {disabled,packages,repository}] [\-\-web\-port WEB_PORT]
|
||||
[\-\-web\-unix\-socket WEB_UNIX_SOCKET]
|
||||
[1;34musage: [0m[1;35mahriman service\-setup[0m [[32m\-h[0m] [[36m\-\-build\-as\-user [33mBUILD_AS_USER[0m] [[36m\-\-from\-configuration [33mFROM_CONFIGURATION[0m]
|
||||
[[36m\-\-generate\-salt | \-\-no\-generate\-salt[0m] [[36m\-\-makeflags\-jobs | \-\-no\-makeflags\-jobs[0m]
|
||||
[[36m\-\-mirror [33mMIRROR[0m] [[36m\-\-multilib | \-\-no\-multilib[0m] [36m\-\-packager [33mPACKAGER[0m [[36m\-\-server [33mSERVER[0m]
|
||||
[[36m\-\-sign\-key [33mSIGN_KEY[0m] [[36m\-\-sign\-target [33m{disabled,packages,repository}[0m] [[36m\-\-web\-port [33mWEB_PORT[0m]
|
||||
[[36m\-\-web\-unix\-socket [33mWEB_UNIX_SOCKET[0m]
|
||||
|
||||
create initial service configuration, requires root
|
||||
|
||||
@@ -940,7 +940,7 @@ port of the web service
|
||||
path to unix socket used for interprocess communications
|
||||
|
||||
.SH COMMAND \fI\,'ahriman service\-shell'\/\fR
|
||||
usage: ahriman service\-shell [\-h] [\-o OUTPUT] [code]
|
||||
[1;34musage: [0m[1;35mahriman service\-shell[0m [[32m\-h[0m] [[32m\-o [33mOUTPUT[0m] [32m[code][0m
|
||||
|
||||
drop into python shell
|
||||
|
||||
@@ -954,13 +954,13 @@ instead of dropping into shell, just execute the specified code
|
||||
output commands and result to the file
|
||||
|
||||
.SH COMMAND \fI\,'ahriman service\-tree\-migrate'\/\fR
|
||||
usage: ahriman service\-tree\-migrate [\-h]
|
||||
[1;34musage: [0m[1;35mahriman service\-tree\-migrate[0m [[32m\-h[0m]
|
||||
|
||||
migrate repository tree between versions
|
||||
|
||||
.SH COMMAND \fI\,'ahriman user\-add'\/\fR
|
||||
usage: ahriman user\-add [\-h] [\-\-key KEY] [\-\-packager PACKAGER] [\-p PASSWORD] [\-R {unauthorized,read,reporter,full}]
|
||||
username
|
||||
[1;34musage: [0m[1;35mahriman user\-add[0m [[32m\-h[0m] [[36m\-\-key [33mKEY[0m] [[36m\-\-packager [33mPACKAGER[0m] [[32m\-p [33mPASSWORD[0m] [[32m\-R [33m{unauthorized,read,reporter,full}[0m]
|
||||
[32musername[0m
|
||||
|
||||
update user for web services with the given password and role. In case if password was not entered it will be asked interactively
|
||||
|
||||
@@ -987,7 +987,7 @@ authorization type.
|
||||
user access level
|
||||
|
||||
.SH COMMAND \fI\,'ahriman user\-list'\/\fR
|
||||
usage: ahriman user\-list [\-h] [\-e] [\-R {unauthorized,read,reporter,full}] [username]
|
||||
[1;34musage: [0m[1;35mahriman user\-list[0m [[32m\-h[0m] [[32m\-e[0m] [[32m\-R [33m{unauthorized,read,reporter,full}[0m] [32m[username][0m
|
||||
|
||||
list users from the user mapping and their roles
|
||||
|
||||
@@ -1005,7 +1005,7 @@ return non\-zero exit status if result is empty
|
||||
filter users by role
|
||||
|
||||
.SH COMMAND \fI\,'ahriman user\-remove'\/\fR
|
||||
usage: ahriman user\-remove [\-h] username
|
||||
[1;34musage: [0m[1;35mahriman user\-remove[0m [[32m\-h[0m] [32musername[0m
|
||||
|
||||
remove user from the user mapping and update the configuration
|
||||
|
||||
@@ -1014,7 +1014,7 @@ remove user from the user mapping and update the configuration
|
||||
username for web service
|
||||
|
||||
.SH COMMAND \fI\,'ahriman web'\/\fR
|
||||
usage: ahriman web [\-h]
|
||||
[1;34musage: [0m[1;35mahriman web[0m [[32m\-h[0m]
|
||||
|
||||
start web server
|
||||
|
||||
|
||||
@@ -17,4 +17,4 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
__version__ = "2.19.2"
|
||||
__version__ = "2.19.4"
|
||||
|
||||
@@ -21,7 +21,7 @@ import argparse
|
||||
import re
|
||||
import sys
|
||||
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from importlib import metadata
|
||||
from typing import ClassVar
|
||||
|
||||
@@ -77,7 +77,7 @@ class Versions(Handler):
|
||||
return parser
|
||||
|
||||
@staticmethod
|
||||
def package_dependencies(root: str) -> Generator[tuple[str, str], None, None]:
|
||||
def package_dependencies(root: str) -> Iterator[tuple[str, str]]:
|
||||
"""
|
||||
extract list of ahriman package dependencies installed into system with their versions
|
||||
|
||||
@@ -87,7 +87,7 @@ class Versions(Handler):
|
||||
Yields:
|
||||
tuple[str, str]: map of installed dependency to its version
|
||||
"""
|
||||
def dependencies_by_key(key: str) -> Generator[str, None, None]:
|
||||
def dependencies_by_key(key: str) -> Iterator[str]:
|
||||
# in importlib it returns requires in the following format
|
||||
# ["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"]
|
||||
try:
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#
|
||||
import argparse
|
||||
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from pathlib import Path
|
||||
|
||||
from ahriman.application.handlers.handler import Handler, SubParserAction
|
||||
@@ -86,7 +86,7 @@ class Web(Handler):
|
||||
return parser
|
||||
|
||||
@staticmethod
|
||||
def extract_arguments(args: argparse.Namespace, configuration: Configuration) -> Generator[str, None, None]:
|
||||
def extract_arguments(args: argparse.Namespace, configuration: Configuration) -> Iterator[str]:
|
||||
"""
|
||||
extract list of arguments used for current command, except for command specific ones
|
||||
|
||||
|
||||
@@ -158,7 +158,7 @@ class Lock(LazyLogging):
|
||||
"""
|
||||
check if current user is actually owner of ahriman root
|
||||
"""
|
||||
check_user(self.paths, unsafe=self.unsafe)
|
||||
check_user(self.paths.root, unsafe=self.unsafe)
|
||||
self.paths.tree_create()
|
||||
|
||||
def check_version(self) -> None:
|
||||
|
||||
@@ -21,7 +21,7 @@ import itertools
|
||||
import shutil
|
||||
import tarfile
|
||||
|
||||
from collections.abc import Generator, Iterable
|
||||
from collections.abc import Iterable, Iterator
|
||||
from functools import cached_property
|
||||
from pathlib import Path
|
||||
from pyalpm import DB, Handle, Package, SIG_DATABASE_OPTIONAL, SIG_PACKAGE_OPTIONAL # type: ignore[import-not-found]
|
||||
@@ -188,7 +188,7 @@ class Pacman(LazyLogging):
|
||||
Returns:
|
||||
dict[str, set[str]]: map of package name to its list of files
|
||||
"""
|
||||
def extract(tar: tarfile.TarFile, versions: dict[str, str]) -> Generator[tuple[str, set[str]], None, None]:
|
||||
def extract(tar: tarfile.TarFile, versions: dict[str, str]) -> Iterator[tuple[str, set[str]]]:
|
||||
for package_name, version in versions.items():
|
||||
path = Path(f"{package_name}-{version}") / "files"
|
||||
try:
|
||||
@@ -223,7 +223,7 @@ class Pacman(LazyLogging):
|
||||
|
||||
return result
|
||||
|
||||
def package(self, package_name: str) -> Generator[Package, None, None]:
|
||||
def package(self, package_name: str) -> Iterator[Package]:
|
||||
"""
|
||||
retrieve list of the packages from the repository by name
|
||||
|
||||
@@ -256,7 +256,7 @@ class Pacman(LazyLogging):
|
||||
|
||||
return result
|
||||
|
||||
def provided_by(self, package_name: str) -> Generator[Package, None, None]:
|
||||
def provided_by(self, package_name: str) -> Iterator[Package]:
|
||||
"""
|
||||
search through databases and emit packages which provides the ``package_name``
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ import itertools
|
||||
import re
|
||||
import shlex
|
||||
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from enum import StrEnum
|
||||
from typing import IO
|
||||
|
||||
@@ -209,7 +209,7 @@ class PkgbuildParser(shlex.shlex):
|
||||
Raises:
|
||||
PkgbuildParserError: if array is not closed
|
||||
"""
|
||||
def extract() -> Generator[str, None, None]:
|
||||
def extract() -> Iterator[str]:
|
||||
while token := self.get_token():
|
||||
match token:
|
||||
case _ if self._is_escaped():
|
||||
@@ -276,7 +276,7 @@ class PkgbuildParser(shlex.shlex):
|
||||
|
||||
return content
|
||||
|
||||
def _parse_token(self, token: str) -> Generator[PkgbuildPatch, None, None]:
|
||||
def _parse_token(self, token: str) -> Iterator[PkgbuildPatch]:
|
||||
"""
|
||||
parse single token to the PKGBUILD field
|
||||
|
||||
@@ -360,7 +360,7 @@ class PkgbuildParser(shlex.shlex):
|
||||
|
||||
raise PkgbuildParserError("reached starting position, no valid symbols found")
|
||||
|
||||
def parse(self) -> Generator[PkgbuildPatch, None, None]:
|
||||
def parse(self) -> Iterator[PkgbuildPatch]:
|
||||
"""
|
||||
parse source stream and yield parsed entries
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#
|
||||
import shutil
|
||||
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from pathlib import Path
|
||||
from typing import ClassVar
|
||||
|
||||
@@ -347,7 +347,7 @@ class Sources(LazyLogging):
|
||||
"""
|
||||
gitconfig = gitconfig or {}
|
||||
|
||||
def configuration_flags() -> Generator[str, None, None]:
|
||||
def configuration_flags() -> Iterator[str]:
|
||||
for option, value in (self.GITCONFIG | gitconfig).items():
|
||||
yield "-c"
|
||||
yield f"{option}=\"{value}\""
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from pathlib import Path
|
||||
|
||||
from ahriman.core.build_tools.sources import Sources
|
||||
@@ -77,7 +77,7 @@ class Task(LazyLogging):
|
||||
Returns:
|
||||
list[Path]: list of file paths which looks like freshly generated archives
|
||||
"""
|
||||
def files() -> Generator[Path, None, None]:
|
||||
def files() -> Iterator[Path]:
|
||||
for filepath in sources_dir.iterdir():
|
||||
if filepath in source_files:
|
||||
continue # skip files which were already there
|
||||
|
||||
@@ -21,7 +21,7 @@ import configparser
|
||||
import os
|
||||
import sys
|
||||
|
||||
from collections.abc import Generator, Mapping, MutableMapping
|
||||
from collections.abc import Iterator, Mapping, MutableMapping
|
||||
from string import Template
|
||||
from typing import Any, ClassVar
|
||||
|
||||
@@ -37,7 +37,7 @@ class ShellInterpolator(configparser.Interpolation):
|
||||
|
||||
@staticmethod
|
||||
def _extract_variables(parser: MutableMapping[str, Mapping[str, str]], value: str,
|
||||
defaults: Mapping[str, str]) -> Generator[tuple[str, str], None, None]:
|
||||
defaults: Mapping[str, str]) -> Iterator[tuple[str, str]]:
|
||||
"""
|
||||
extract keys and values (if available) from the configuration. In case if a key is not available, it will be
|
||||
silently skipped from the result
|
||||
@@ -50,7 +50,7 @@ class ShellInterpolator(configparser.Interpolation):
|
||||
Yields:
|
||||
tuple[str, str]: variable name used for substitution and its value
|
||||
"""
|
||||
def identifiers() -> Generator[tuple[str | None, str], None, None]:
|
||||
def identifiers() -> Iterator[tuple[str | None, str]]:
|
||||
# extract all found identifiers and parse them
|
||||
for identifier in ShellTemplate(value).get_identifiers():
|
||||
match identifier.rsplit(":", maxsplit=1):
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
import fnmatch
|
||||
import re
|
||||
|
||||
from collections.abc import Generator, Mapping
|
||||
from collections.abc import Iterator, Mapping
|
||||
from string import Template
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ class ShellTemplate(Template):
|
||||
(self._REPLACE, self._replace, "/"),
|
||||
)
|
||||
|
||||
def generator(variables: dict[str, str]) -> Generator[tuple[str, str], None, None]:
|
||||
def generator(variables: dict[str, str]) -> Iterator[tuple[str, str]]:
|
||||
for identifier in self.get_identifiers():
|
||||
for regex, function, greediness in substitutions:
|
||||
if m := regex.match(identifier):
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
from collections.abc import Generator, Iterable
|
||||
from collections.abc import Iterable, Iterator
|
||||
from sqlite3 import Connection
|
||||
|
||||
from ahriman.core.database.operations.operations import Operations
|
||||
@@ -263,7 +263,7 @@ class PackageOperations(Operations):
|
||||
"""
|
||||
repository_id = repository_id or self._repository_id
|
||||
|
||||
def run(connection: Connection) -> Generator[tuple[Package, BuildStatus], None, None]:
|
||||
def run(connection: Connection) -> Iterator[tuple[Package, BuildStatus]]:
|
||||
packages = self._packages_get_select_package_bases(connection, repository_id)
|
||||
statuses = self._packages_get_select_statuses(connection, repository_id)
|
||||
per_package_base = self._packages_get_select_packages(connection, packages, repository_id)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from typing import Any
|
||||
|
||||
from ahriman.core.formatters.string_printer import StringPrinter
|
||||
@@ -44,8 +44,7 @@ class ValidationPrinter(StringPrinter):
|
||||
self.errors = errors
|
||||
|
||||
@staticmethod
|
||||
def get_error_messages(node: str, errors: list[str | dict[str, Any]],
|
||||
current_level: int = 1) -> Generator[Property, None, None]:
|
||||
def get_error_messages(node: str, errors: list[str | dict[str, Any]], current_level: int = 1) -> Iterator[Property]:
|
||||
"""
|
||||
extract default error message from cerberus class
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#
|
||||
import shutil
|
||||
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from pathlib import Path
|
||||
from tempfile import TemporaryDirectory
|
||||
|
||||
@@ -96,7 +96,7 @@ class RemotePush(LazyLogging):
|
||||
# ...and finally return path to the copied directory
|
||||
return package.base
|
||||
|
||||
def packages_update(self, result: Result, target_dir: Path) -> Generator[str, None, None]:
|
||||
def packages_update(self, result: Result, target_dir: Path) -> Iterator[str]:
|
||||
"""
|
||||
update all packages from the build result
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
import contextlib
|
||||
import logging
|
||||
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from functools import cached_property
|
||||
from typing import Any
|
||||
|
||||
@@ -80,7 +80,7 @@ class LazyLogging:
|
||||
logging.setLogRecordFactory(package_record_factory)
|
||||
|
||||
@contextlib.contextmanager
|
||||
def in_package_context(self, package_base: str, version: str | None) -> Generator[None, None, None]:
|
||||
def in_package_context(self, package_base: str, version: str | None) -> Iterator[None]:
|
||||
"""
|
||||
execute function while setting package context
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#
|
||||
import inspect
|
||||
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from importlib import import_module
|
||||
from pathlib import Path
|
||||
from pkgutil import ModuleInfo, walk_packages
|
||||
@@ -33,7 +33,7 @@ __all__ = ["implementations"]
|
||||
T = TypeVar("T")
|
||||
|
||||
|
||||
def _modules(module_root: Path, prefix: str) -> Generator[ModuleInfo, None, None]:
|
||||
def _modules(module_root: Path, prefix: str) -> Iterator[ModuleInfo]:
|
||||
"""
|
||||
extract available modules from package
|
||||
|
||||
@@ -52,7 +52,7 @@ def _modules(module_root: Path, prefix: str) -> Generator[ModuleInfo, None, None
|
||||
yield module_info
|
||||
|
||||
|
||||
def implementations(root_module: ModuleType, base_class: type[T]) -> Generator[type[T], None, None]:
|
||||
def implementations(root_module: ModuleType, base_class: type[T]) -> Iterator[type[T]]:
|
||||
"""
|
||||
extract implementations of the ``base_class`` from the module
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#
|
||||
import contextlib
|
||||
|
||||
from typing import Generator
|
||||
from collections.abc import Iterator
|
||||
|
||||
from ahriman.core.status import Client
|
||||
from ahriman.models.event import Event, EventType
|
||||
@@ -55,7 +55,7 @@ class EventLogger:
|
||||
|
||||
@contextlib.contextmanager
|
||||
def in_event(self, package_base: str, event: EventType, message: str | None = None,
|
||||
failure: EventType | None = None) -> Generator[None, None, None]:
|
||||
failure: EventType | None = None) -> Iterator[None]:
|
||||
"""
|
||||
perform action in package context and log event with time elapsed
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
import hashlib
|
||||
import itertools
|
||||
|
||||
from collections.abc import Callable, Generator
|
||||
from collections.abc import Callable, Iterator
|
||||
from pathlib import Path
|
||||
from typing import ClassVar
|
||||
|
||||
@@ -187,7 +187,7 @@ class PkgbuildGenerator:
|
||||
Returns:
|
||||
list[PkgbuildPatch]: list of patches to be applied to the PKGBUILD
|
||||
"""
|
||||
def sources_generator() -> Generator[tuple[str, str], None, None]:
|
||||
def sources_generator() -> Iterator[tuple[str, str]]:
|
||||
for source, generator in sorted(self.sources().items()):
|
||||
source_path = source_dir / source
|
||||
generator(source_path)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
import contextlib
|
||||
import os
|
||||
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from importlib import import_module, machinery
|
||||
from pathlib import Path
|
||||
from types import ModuleType
|
||||
@@ -119,7 +119,7 @@ class TriggerLoader(LazyLogging):
|
||||
return configuration.getlist("build", "triggers", fallback=[])
|
||||
|
||||
@contextlib.contextmanager
|
||||
def __execute_trigger(self, trigger: Trigger) -> Generator[None, None, None]:
|
||||
def __execute_trigger(self, trigger: Trigger) -> Iterator[None]:
|
||||
"""
|
||||
decorator for calling triggers
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ import re
|
||||
import selectors
|
||||
import subprocess
|
||||
|
||||
from collections.abc import Callable, Generator, Iterable, Mapping
|
||||
from collections.abc import Callable, Iterable, Iterator, Mapping
|
||||
from dataclasses import asdict
|
||||
from enum import Enum
|
||||
from pathlib import Path
|
||||
@@ -35,7 +35,6 @@ from pwd import getpwuid
|
||||
from typing import Any, IO, TypeVar
|
||||
|
||||
from ahriman.core.exceptions import CalledProcessError, OptionError, UnsafeRunError
|
||||
from ahriman.models.repository_paths import RepositoryPaths
|
||||
|
||||
|
||||
__all__ = [
|
||||
@@ -47,12 +46,14 @@ __all__ = [
|
||||
"filter_json",
|
||||
"full_version",
|
||||
"minmax",
|
||||
"owner",
|
||||
"package_like",
|
||||
"parse_version",
|
||||
"partition",
|
||||
"pretty_datetime",
|
||||
"pretty_size",
|
||||
"safe_filename",
|
||||
"safe_iterdir",
|
||||
"srcinfo_property",
|
||||
"srcinfo_property_list",
|
||||
"trim_package",
|
||||
@@ -112,7 +113,7 @@ def check_output(*args: str, exception: Exception | Callable[[int, list[str], st
|
||||
return channel if channel is not None else io.StringIO()
|
||||
|
||||
# wrapper around selectors polling
|
||||
def poll(sel: selectors.BaseSelector) -> Generator[tuple[str, str], None, None]:
|
||||
def poll(sel: selectors.BaseSelector) -> Iterator[tuple[str, str]]:
|
||||
for key, _ in sel.select(): # we don't need to check mask here because we have only subscribed on reading
|
||||
line = key.fileobj.readline() # type: ignore[union-attr]
|
||||
if not line: # in case of empty line we remove selector as there is no data here anymore
|
||||
@@ -169,12 +170,13 @@ def check_output(*args: str, exception: Exception | Callable[[int, list[str], st
|
||||
return stdout
|
||||
|
||||
|
||||
def check_user(paths: RepositoryPaths, *, unsafe: bool) -> None:
|
||||
def check_user(root: Path, *, unsafe: bool) -> None:
|
||||
"""
|
||||
check if current user is the owner of the root
|
||||
|
||||
Args:
|
||||
paths(RepositoryPaths): repository paths object
|
||||
root(Path): path to root directory (e.g. repository root
|
||||
:attr:`ahriman.models.repository_paths.RepositoryPaths.root`)
|
||||
unsafe(bool): if set no user check will be performed before path creation
|
||||
|
||||
Raises:
|
||||
@@ -183,14 +185,16 @@ def check_user(paths: RepositoryPaths, *, unsafe: bool) -> None:
|
||||
Examples:
|
||||
Simply run function with arguments::
|
||||
|
||||
>>> check_user(paths, unsafe=False)
|
||||
>>> check_user(root, unsafe=False)
|
||||
"""
|
||||
if not paths.root.exists():
|
||||
if not root.exists():
|
||||
return # no directory found, skip check
|
||||
if unsafe:
|
||||
return # unsafe flag is enabled, no check performed
|
||||
|
||||
current_uid = os.getuid()
|
||||
root_uid, _ = paths.root_owner
|
||||
root_uid, _ = owner(root)
|
||||
|
||||
if current_uid != root_uid:
|
||||
raise UnsafeRunError(current_uid, root_uid)
|
||||
|
||||
@@ -288,6 +292,20 @@ def minmax(source: Iterable[T], *, key: Callable[[T], Any] | None = None) -> tup
|
||||
return min(first_iter, key=key), max(second_iter, key=key) # type: ignore
|
||||
|
||||
|
||||
def owner(path: Path) -> tuple[int, int]:
|
||||
"""
|
||||
retrieve owner information by path
|
||||
|
||||
Args:
|
||||
path(Path): path for which extract ids
|
||||
|
||||
Returns:
|
||||
tuple[int, int]: owner user and group ids of the directory
|
||||
"""
|
||||
stat = path.stat()
|
||||
return stat.st_uid, stat.st_gid
|
||||
|
||||
|
||||
def package_like(filename: Path) -> bool:
|
||||
"""
|
||||
check if file looks like package
|
||||
@@ -408,6 +426,22 @@ def safe_filename(source: str) -> str:
|
||||
return re.sub(r"[^A-Za-z\d\-._~:\[\]@]", "-", source)
|
||||
|
||||
|
||||
def safe_iterdir(path: Path) -> Iterator[Path]:
|
||||
"""
|
||||
wrapper around :func:`pathlib.Path.iterdir`, which suppresses :exc:`PermissionError`
|
||||
|
||||
Args:
|
||||
path(Path): path to iterate
|
||||
|
||||
Yields:
|
||||
Path: content of the directory
|
||||
"""
|
||||
try:
|
||||
yield from path.iterdir()
|
||||
except PermissionError:
|
||||
pass
|
||||
|
||||
|
||||
def srcinfo_property(key: str, srcinfo: Mapping[str, Any], package_srcinfo: Mapping[str, Any], *,
|
||||
default: Any = None) -> Any:
|
||||
"""
|
||||
@@ -476,7 +510,7 @@ def utcnow() -> datetime.datetime:
|
||||
return datetime.datetime.now(datetime.UTC)
|
||||
|
||||
|
||||
def walk(directory_path: Path) -> Generator[Path, None, None]:
|
||||
def walk(directory_path: Path) -> Iterator[Path]:
|
||||
"""
|
||||
list all file paths in given directory
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ from __future__ import annotations
|
||||
|
||||
import copy
|
||||
|
||||
from collections.abc import Callable, Generator, Iterable
|
||||
from collections.abc import Callable, Iterable, Iterator
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from pyalpm import vercmp # type: ignore[import-not-found]
|
||||
@@ -205,7 +205,7 @@ class Package(LazyLogging):
|
||||
package = pacman.handle.load_pkg(str(path))
|
||||
description = PackageDescription.from_package(package, path)
|
||||
return cls(
|
||||
base=package.base,
|
||||
base=package.base or package.name,
|
||||
version=package.version,
|
||||
remote=RemoteSource(source=PackageSource.Archive),
|
||||
packages={package.name: description},
|
||||
@@ -346,7 +346,7 @@ class Package(LazyLogging):
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def local_files(path: Path) -> Generator[Path, None, None]:
|
||||
def local_files(path: Path) -> Iterator[Path]:
|
||||
"""
|
||||
extract list of local files
|
||||
|
||||
@@ -407,7 +407,7 @@ class Package(LazyLogging):
|
||||
Returns:
|
||||
list[str]: combined list of unique entries in properties list
|
||||
"""
|
||||
def generator() -> Generator[str, None, None]:
|
||||
def generator() -> Iterator[str]:
|
||||
for package in self.packages.values():
|
||||
yield from extractor(package)
|
||||
|
||||
@@ -570,7 +570,7 @@ class Package(LazyLogging):
|
||||
"""
|
||||
return dataclass_view(self)
|
||||
|
||||
def with_packages(self, packages: list[Path], pacman: Pacman) -> None:
|
||||
def with_packages(self, packages: Iterable[Path], pacman: Pacman) -> None:
|
||||
"""
|
||||
replace packages descriptions with ones from archives
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ import shlex
|
||||
|
||||
from dataclasses import dataclass, fields
|
||||
from pathlib import Path
|
||||
from typing import Any, Generator, Self
|
||||
from typing import Any, Iterator, Self
|
||||
|
||||
from ahriman.core.configuration.shell_template import ShellTemplate
|
||||
from ahriman.core.utils import dataclass_view, filter_json
|
||||
@@ -166,7 +166,7 @@ class PkgbuildPatch:
|
||||
ValueError: if no closing quotation
|
||||
"""
|
||||
|
||||
def generator() -> Generator[str, None, None]:
|
||||
def generator() -> Iterator[str]:
|
||||
token = None
|
||||
for char in source:
|
||||
if token is not None:
|
||||
|
||||
@@ -21,7 +21,7 @@ import contextlib
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
from dataclasses import dataclass, field
|
||||
from functools import cached_property
|
||||
from pathlib import Path
|
||||
@@ -29,6 +29,7 @@ from pwd import getpwuid
|
||||
|
||||
from ahriman.core.exceptions import PathError
|
||||
from ahriman.core.log import LazyLogging
|
||||
from ahriman.core.utils import owner, safe_iterdir
|
||||
from ahriman.models.repository_id import RepositoryId
|
||||
|
||||
|
||||
@@ -93,7 +94,7 @@ class RepositoryPaths(LazyLogging):
|
||||
Returns:
|
||||
Path: path to directory in which build process is run
|
||||
"""
|
||||
uid, _ = self.owner(self.root)
|
||||
uid, _ = owner(self.root)
|
||||
return self.chroot / f"{self.repository_id.name}-{self.repository_id.architecture}" / getpwuid(uid).pw_name
|
||||
|
||||
@property
|
||||
@@ -155,7 +156,7 @@ class RepositoryPaths(LazyLogging):
|
||||
Returns:
|
||||
tuple[int, int]: owner user and group of the root directory
|
||||
"""
|
||||
return self.owner(self.root)
|
||||
return owner(self.root)
|
||||
|
||||
# pylint: disable=protected-access
|
||||
@classmethod
|
||||
@@ -170,7 +171,7 @@ class RepositoryPaths(LazyLogging):
|
||||
Returns:
|
||||
set[str]: list of repository architectures for which there is created tree
|
||||
"""
|
||||
def walk(repository_dir: Path) -> Generator[str, None, None]:
|
||||
def walk(repository_dir: Path) -> Iterator[str]:
|
||||
for architecture in filter(lambda path: path.is_dir(), repository_dir.iterdir()):
|
||||
yield architecture.name
|
||||
|
||||
@@ -197,7 +198,7 @@ class RepositoryPaths(LazyLogging):
|
||||
is loaded in legacy mode
|
||||
"""
|
||||
# simply walk through the root. In case if there are subdirectories, emit the name
|
||||
def walk(paths: RepositoryPaths) -> Generator[str, None, None]:
|
||||
def walk(paths: RepositoryPaths) -> Iterator[str]:
|
||||
for repository in filter(lambda path: path.is_dir(), paths._repository_root.iterdir()):
|
||||
if any(path.is_dir() for path in repository.iterdir()):
|
||||
yield repository.name
|
||||
@@ -208,20 +209,6 @@ class RepositoryPaths(LazyLogging):
|
||||
|
||||
return set(walk(instance))
|
||||
|
||||
@staticmethod
|
||||
def owner(path: Path) -> tuple[int, int]:
|
||||
"""
|
||||
retrieve owner information by path
|
||||
|
||||
Args:
|
||||
path(Path): path for which extract ids
|
||||
|
||||
Returns:
|
||||
tuple[int, int]: owner user and group ids of the directory
|
||||
"""
|
||||
stat = path.stat()
|
||||
return stat.st_uid, stat.st_gid
|
||||
|
||||
def _chown(self, path: Path) -> None:
|
||||
"""
|
||||
set owner of path recursively (from root) to root owner
|
||||
@@ -237,7 +224,7 @@ class RepositoryPaths(LazyLogging):
|
||||
PathError: if path does not belong to root
|
||||
"""
|
||||
def set_owner(current: Path) -> None:
|
||||
uid, gid = self.owner(current)
|
||||
uid, gid = owner(current)
|
||||
if uid == root_uid and gid == root_gid:
|
||||
return
|
||||
os.chown(current, root_uid, root_gid, follow_symlinks=False)
|
||||
@@ -262,7 +249,7 @@ class RepositoryPaths(LazyLogging):
|
||||
return self.cache / package_base
|
||||
|
||||
@contextlib.contextmanager
|
||||
def preserve_owner(self, path: Path | None = None) -> Generator[None, None, None]:
|
||||
def preserve_owner(self, path: Path | None = None) -> Iterator[None]:
|
||||
"""
|
||||
perform any action preserving owner for any newly created file or directory
|
||||
|
||||
@@ -281,12 +268,12 @@ class RepositoryPaths(LazyLogging):
|
||||
"""
|
||||
path = path or self.root
|
||||
|
||||
def walk(root: Path) -> Generator[Path, None, None]:
|
||||
def walk(root: Path) -> Iterator[Path]:
|
||||
# basically walk, but skipping some content
|
||||
for child in root.iterdir():
|
||||
for child in safe_iterdir(root):
|
||||
yield child
|
||||
if child in (self.chroot.parent,):
|
||||
yield from child.iterdir() # we only yield top-level in chroot directory
|
||||
yield from safe_iterdir(child) # we only yield top-level in chroot directory
|
||||
elif child.is_dir():
|
||||
yield from walk(child)
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
import re
|
||||
|
||||
from aiohttp.web import Application, View
|
||||
from collections.abc import Generator
|
||||
from collections.abc import Iterator
|
||||
|
||||
import ahriman.web.views
|
||||
|
||||
@@ -32,7 +32,7 @@ from ahriman.web.views.base import BaseView
|
||||
__all__ = ["setup_routes"]
|
||||
|
||||
|
||||
def _dynamic_routes(configuration: Configuration) -> Generator[tuple[str, type[View]], None, None]:
|
||||
def _dynamic_routes(configuration: Configuration) -> Iterator[tuple[str, type[View]]]:
|
||||
"""
|
||||
extract dynamic routes based on views
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@ def test_check_user(lock: Lock, mocker: MockerFixture) -> None:
|
||||
tree_create = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create")
|
||||
|
||||
lock.check_user()
|
||||
check_user_patch.assert_called_once_with(lock.paths, unsafe=False)
|
||||
check_user_patch.assert_called_once_with(lock.paths.root, unsafe=False)
|
||||
tree_create.assert_called_once_with()
|
||||
|
||||
|
||||
|
||||
@@ -6,12 +6,10 @@ import pytest
|
||||
from pathlib import Path
|
||||
from pytest_mock import MockerFixture
|
||||
from typing import Any
|
||||
from unittest.mock import call as MockCall
|
||||
from unittest.mock import MagicMock, call as MockCall
|
||||
|
||||
from ahriman.core.exceptions import BuildError, CalledProcessError, OptionError, UnsafeRunError
|
||||
from ahriman.core.utils import check_output, check_user, dataclass_view, enum_values, extract_user, filter_json, \
|
||||
full_version, minmax, package_like, parse_version, partition, pretty_datetime, pretty_size, safe_filename, \
|
||||
srcinfo_property, srcinfo_property_list, trim_package, utcnow, walk
|
||||
from ahriman.core.utils import *
|
||||
from ahriman.models.package import Package
|
||||
from ahriman.models.package_source import PackageSource
|
||||
from ahriman.models.repository_id import RepositoryId
|
||||
@@ -163,7 +161,7 @@ def test_check_user(repository_id: RepositoryId, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
paths = RepositoryPaths(Path.cwd(), repository_id)
|
||||
mocker.patch("os.getuid", return_value=paths.root_owner[0])
|
||||
check_user(paths, unsafe=False)
|
||||
check_user(paths.root, unsafe=False)
|
||||
|
||||
|
||||
def test_check_user_no_directory(repository_paths: RepositoryPaths, mocker: MockerFixture) -> None:
|
||||
@@ -171,7 +169,7 @@ def test_check_user_no_directory(repository_paths: RepositoryPaths, mocker: Mock
|
||||
must not fail in case if no directory found
|
||||
"""
|
||||
mocker.patch("pathlib.Path.exists", return_value=False)
|
||||
check_user(repository_paths, unsafe=False)
|
||||
check_user(repository_paths.root, unsafe=False)
|
||||
|
||||
|
||||
def test_check_user_exception(repository_id: RepositoryId, mocker: MockerFixture) -> None:
|
||||
@@ -182,7 +180,7 @@ def test_check_user_exception(repository_id: RepositoryId, mocker: MockerFixture
|
||||
mocker.patch("os.getuid", return_value=paths.root_owner[0] + 1)
|
||||
|
||||
with pytest.raises(UnsafeRunError):
|
||||
check_user(paths, unsafe=False)
|
||||
check_user(paths.root, unsafe=False)
|
||||
|
||||
|
||||
def test_check_user_unsafe(repository_id: RepositoryId, mocker: MockerFixture) -> None:
|
||||
@@ -191,7 +189,7 @@ def test_check_user_unsafe(repository_id: RepositoryId, mocker: MockerFixture) -
|
||||
"""
|
||||
paths = RepositoryPaths(Path.cwd(), repository_id)
|
||||
mocker.patch("os.getuid", return_value=paths.root_owner[0] + 1)
|
||||
check_user(paths, unsafe=True)
|
||||
check_user(paths.root, unsafe=True)
|
||||
|
||||
|
||||
def test_dataclass_view(package_ahriman: Package) -> None:
|
||||
@@ -275,6 +273,18 @@ def test_minmax() -> None:
|
||||
assert minmax([[1, 2, 3], [4, 5], [6, 7, 8, 9]], key=len) == ([4, 5], [6, 7, 8, 9])
|
||||
|
||||
|
||||
def test_owner(repository_paths: RepositoryPaths, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must correctly retrieve owner of the path
|
||||
"""
|
||||
stat_mock = MagicMock()
|
||||
stat_mock.st_uid = 42
|
||||
stat_mock.st_gid = 142
|
||||
mocker.patch("pathlib.Path.stat", return_value=stat_mock)
|
||||
|
||||
assert owner(repository_paths.root) == (42, 142)
|
||||
|
||||
|
||||
def test_package_like(package_ahriman: Package) -> None:
|
||||
"""
|
||||
package_like must return true for archives
|
||||
@@ -414,6 +424,17 @@ def test_safe_filename() -> None:
|
||||
assert safe_filename("tolua++-1.0.93-4-x86_64.pkg.tar.zst") == "tolua---1.0.93-4-x86_64.pkg.tar.zst"
|
||||
|
||||
|
||||
def test_safe_iterdir(mocker: MockerFixture, resource_path_root: Path) -> None:
|
||||
"""
|
||||
must suppress PermissionError
|
||||
"""
|
||||
assert list(safe_iterdir(resource_path_root))
|
||||
|
||||
iterdir_mock = mocker.patch("pathlib.Path.iterdir", side_effect=PermissionError)
|
||||
assert list(safe_iterdir(Path("root"))) == []
|
||||
iterdir_mock.assert_called_once_with()
|
||||
|
||||
|
||||
def test_srcinfo_property() -> None:
|
||||
"""
|
||||
must correctly extract properties
|
||||
|
||||
@@ -2,7 +2,7 @@ import copy
|
||||
|
||||
from pathlib import Path
|
||||
from pytest_mock import MockerFixture
|
||||
from unittest.mock import MagicMock, call as MockCall
|
||||
from unittest.mock import MagicMock, PropertyMock, call as MockCall
|
||||
|
||||
from ahriman.core.alpm.pacman import Pacman
|
||||
from ahriman.core.configuration import Configuration
|
||||
@@ -163,6 +163,23 @@ def test_from_archive(package_ahriman: Package, pyalpm_handle: MagicMock, mocker
|
||||
assert generated == package_ahriman
|
||||
|
||||
|
||||
def test_from_archive_empty_base(package_ahriman: Package, pyalpm_package_ahriman: MagicMock,
|
||||
mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must construct package with empty base from alpm library
|
||||
"""
|
||||
pyalpm_handle = MagicMock()
|
||||
type(pyalpm_package_ahriman).base = PropertyMock(return_value=None)
|
||||
pyalpm_handle.handle.load_pkg.return_value = pyalpm_package_ahriman
|
||||
|
||||
mocker.patch("ahriman.models.package_description.PackageDescription.from_package",
|
||||
return_value=package_ahriman.packages[package_ahriman.base])
|
||||
generated = Package.from_archive(Path("path"), pyalpm_handle)
|
||||
generated.remote = package_ahriman.remote
|
||||
|
||||
assert generated == package_ahriman
|
||||
|
||||
|
||||
def test_from_aur(package_ahriman: Package, aur_package_ahriman: AURPackage, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must construct package from aur
|
||||
|
||||
@@ -55,7 +55,7 @@ def test_root_owner(repository_paths: RepositoryPaths, mocker: MockerFixture) ->
|
||||
"""
|
||||
must correctly define root directory owner
|
||||
"""
|
||||
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.owner", return_value=(42, 142))
|
||||
mocker.patch("ahriman.models.repository_paths.owner", return_value=(42, 142))
|
||||
assert repository_paths.root_owner == (42, 142)
|
||||
|
||||
|
||||
@@ -186,23 +186,11 @@ def test_known_repositories_empty(repository_paths: RepositoryPaths, mocker: Moc
|
||||
iterdir_mock.assert_not_called()
|
||||
|
||||
|
||||
def test_owner(repository_paths: RepositoryPaths, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must correctly retrieve owner of the path
|
||||
"""
|
||||
stat_mock = MagicMock()
|
||||
stat_mock.st_uid = 42
|
||||
stat_mock.st_gid = 142
|
||||
mocker.patch("pathlib.Path.stat", return_value=stat_mock)
|
||||
|
||||
assert RepositoryPaths.owner(repository_paths.root) == (42, 142)
|
||||
|
||||
|
||||
def test_chown(repository_paths: RepositoryPaths, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must correctly set owner for the directory
|
||||
"""
|
||||
object.__setattr__(repository_paths, "owner", _get_owner(repository_paths.root, same=False))
|
||||
mocker.patch("ahriman.models.repository_paths.owner", _get_owner(repository_paths.root, same=False))
|
||||
mocker.patch.object(RepositoryPaths, "root_owner", (42, 42))
|
||||
chown_mock = mocker.patch("os.chown")
|
||||
|
||||
@@ -215,7 +203,7 @@ def test_chown_parent(repository_paths: RepositoryPaths, mocker: MockerFixture)
|
||||
"""
|
||||
must correctly set owner for the directory including parents
|
||||
"""
|
||||
object.__setattr__(repository_paths, "owner", _get_owner(repository_paths.root, same=False))
|
||||
mocker.patch("ahriman.models.repository_paths.owner", _get_owner(repository_paths.root, same=False))
|
||||
mocker.patch.object(RepositoryPaths, "root_owner", (42, 42))
|
||||
chown_mock = mocker.patch("os.chown")
|
||||
|
||||
@@ -231,7 +219,7 @@ def test_chown_skip(repository_paths: RepositoryPaths, mocker: MockerFixture) ->
|
||||
"""
|
||||
must skip ownership set in case if it is same as root
|
||||
"""
|
||||
object.__setattr__(repository_paths, "owner", _get_owner(repository_paths.root, same=True))
|
||||
mocker.patch("ahriman.models.repository_paths.owner", _get_owner(repository_paths.root, same=True))
|
||||
mocker.patch.object(RepositoryPaths, "root_owner", (42, 42))
|
||||
chown_mock = mocker.patch("os.chown")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user