mirror of
https://github.com/arcan1s/ahriman.git
synced 2026-02-03 20:09:48 +00:00
Compare commits
1 Commits
2.19.4
...
feature/br
| Author | SHA1 | Date | |
|---|---|---|---|
| 3da3caaaa5 |
6
.bandit-test.yml
Normal file
6
.bandit-test.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
skips:
|
||||||
|
- B101
|
||||||
|
- B104
|
||||||
|
- B105
|
||||||
|
- B106
|
||||||
|
- B404
|
||||||
12
.github/workflows/docker.yml
vendored
12
.github/workflows/docker.yml
vendored
@@ -21,18 +21,18 @@ jobs:
|
|||||||
packages: write
|
packages: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: docker/setup-qemu-action@v3
|
- uses: docker/setup-qemu-action@v2
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
- uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
- name: Login to docker hub
|
- name: Login to docker hub
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Login to github container registry
|
- name: Login to github container registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
@@ -40,7 +40,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Extract docker metadata
|
- name: Extract docker metadata
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v5
|
uses: docker/metadata-action@v3
|
||||||
with:
|
with:
|
||||||
images: |
|
images: |
|
||||||
arcan1s/ahriman
|
arcan1s/ahriman
|
||||||
@@ -50,7 +50,7 @@ jobs:
|
|||||||
type=edge
|
type=edge
|
||||||
|
|
||||||
- name: Build an image and push
|
- name: Build an image and push
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v4
|
||||||
with:
|
with:
|
||||||
file: docker/Dockerfile
|
file: docker/Dockerfile
|
||||||
push: true
|
push: true
|
||||||
|
|||||||
7
.github/workflows/regress.yml
vendored
7
.github/workflows/regress.yml
vendored
@@ -1,9 +1,6 @@
|
|||||||
name: Regress
|
name: Regress
|
||||||
|
|
||||||
on:
|
on: workflow_dispatch
|
||||||
schedule:
|
|
||||||
- cron: 1 0 * * 0
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -37,6 +34,8 @@ jobs:
|
|||||||
- repo:/var/lib/ahriman
|
- repo:/var/lib/ahriman
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- run: pacman -Sy
|
- run: pacman -Sy
|
||||||
|
|
||||||
- name: Init repository
|
- name: Init repository
|
||||||
|
|||||||
17
.github/workflows/release.yml
vendored
17
.github/workflows/release.yml
vendored
@@ -13,16 +13,8 @@ jobs:
|
|||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
container:
|
|
||||||
image: archlinux:base
|
|
||||||
options: -w /build
|
|
||||||
volumes:
|
|
||||||
- ${{ github.workspace }}:/build
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- run: pacman --noconfirm -Syu base-devel git python-tox
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Extract version
|
- name: Extract version
|
||||||
id: version
|
id: version
|
||||||
@@ -35,13 +27,18 @@ jobs:
|
|||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
filter: 'Release \d+\.\d+\.\d+'
|
filter: 'Release \d+\.\d+\.\d+'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
uses: ConorMacBride/install-package@v1.1.0
|
||||||
|
with:
|
||||||
|
apt: tox
|
||||||
|
|
||||||
- name: Create archive
|
- name: Create archive
|
||||||
run: tox -e archive
|
run: tox -e archive
|
||||||
env:
|
env:
|
||||||
VERSION: ${{ steps.version.outputs.VERSION }}
|
VERSION: ${{ steps.version.outputs.VERSION }}
|
||||||
|
|
||||||
- name: Publish release
|
- name: Publish release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
body: |
|
body: |
|
||||||
${{ steps.changelog.outputs.compareurl }}
|
${{ steps.changelog.outputs.compareurl }}
|
||||||
|
|||||||
5
.github/workflows/setup.yml
vendored
5
.github/workflows/setup.yml
vendored
@@ -7,7 +7,6 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -24,7 +23,7 @@ jobs:
|
|||||||
- ${{ github.workspace }}:/build
|
- ${{ github.workspace }}:/build
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Setup the minimal service in arch linux container
|
- name: Setup the minimal service in arch linux container
|
||||||
run: .github/workflows/setup.sh minimal
|
run: .github/workflows/setup.sh minimal
|
||||||
@@ -40,7 +39,7 @@ jobs:
|
|||||||
options: --privileged -w /build
|
options: --privileged -w /build
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Setup the service in arch linux container
|
- name: Setup the service in arch linux container
|
||||||
run: .github/workflows/setup.sh
|
run: .github/workflows/setup.sh
|
||||||
|
|||||||
10
.github/workflows/tests.sh
vendored
Executable file
10
.github/workflows/tests.sh
vendored
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Install dependencies and run test in container
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
# install dependencies
|
||||||
|
pacman --noconfirm -Syyu base-devel python-tox
|
||||||
|
|
||||||
|
# run test and check targets
|
||||||
|
tox
|
||||||
16
.github/workflows/tests.yml
vendored
16
.github/workflows/tests.yml
vendored
@@ -9,7 +9,6 @@ on:
|
|||||||
- master
|
- master
|
||||||
schedule:
|
schedule:
|
||||||
- cron: 1 0 * * *
|
- cron: 1 0 * * *
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -26,16 +25,7 @@ jobs:
|
|||||||
- ${{ github.workspace }}:/build
|
- ${{ github.workspace }}:/build
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- run: pacman --noconfirm -Syu base-devel git python-tox
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- run: git config --global --add safe.directory *
|
- name: Run check and tests in arch linux container
|
||||||
|
run: .github/workflows/tests.sh
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Run check and tests
|
|
||||||
run: tox
|
|
||||||
|
|
||||||
- name: Generate documentation and check if there are untracked changes
|
|
||||||
run: |
|
|
||||||
tox -e docs
|
|
||||||
[ -z "$(git status --porcelain docs/*.rst)" ]
|
|
||||||
|
|||||||
45
.pylint.toml
45
.pylint.toml
@@ -1,45 +0,0 @@
|
|||||||
[tool.pylint.main]
|
|
||||||
init-hook = "sys.path.append('tools')"
|
|
||||||
load-plugins = [
|
|
||||||
"pylint.extensions.docparams",
|
|
||||||
"pylint.extensions.bad_builtin",
|
|
||||||
"pylint_plugins.definition_order",
|
|
||||||
"pylint_plugins.import_order",
|
|
||||||
]
|
|
||||||
|
|
||||||
[tool.pylint.classes]
|
|
||||||
bad-functions = [
|
|
||||||
"print",
|
|
||||||
]
|
|
||||||
|
|
||||||
[tool.pylint.design]
|
|
||||||
max-parents = 15
|
|
||||||
|
|
||||||
[tool.pylint."messages control"]
|
|
||||||
disable = [
|
|
||||||
"raw-checker-failed",
|
|
||||||
"bad-inline-option",
|
|
||||||
"locally-disabled",
|
|
||||||
"file-ignored",
|
|
||||||
"suppressed-message",
|
|
||||||
"useless-suppression",
|
|
||||||
"deprecated-pragma",
|
|
||||||
"use-symbolic-message-instead",
|
|
||||||
"use-implicit-booleaness-not-comparison-to-string",
|
|
||||||
"use-implicit-booleaness-not-comparison-to-zero",
|
|
||||||
"missing-module-docstring",
|
|
||||||
"line-too-long",
|
|
||||||
"no-name-in-module",
|
|
||||||
"import-outside-toplevel",
|
|
||||||
"invalid-name",
|
|
||||||
"raise-missing-from",
|
|
||||||
"wrong-import-order",
|
|
||||||
"too-few-public-methods",
|
|
||||||
"too-many-instance-attributes",
|
|
||||||
"broad-exception-caught",
|
|
||||||
"fixme",
|
|
||||||
"too-many-arguments",
|
|
||||||
"duplicate-code",
|
|
||||||
"cyclic-import",
|
|
||||||
"too-many-positional-arguments",
|
|
||||||
]
|
|
||||||
651
.pylintrc
Normal file
651
.pylintrc
Normal file
@@ -0,0 +1,651 @@
|
|||||||
|
[MAIN]
|
||||||
|
|
||||||
|
# Analyse import fallback blocks. This can be used to support both Python 2 and
|
||||||
|
# 3 compatible code, which means that the block might have code that exists
|
||||||
|
# only in one or another interpreter, leading to false positives when analysed.
|
||||||
|
analyse-fallback-blocks=no
|
||||||
|
|
||||||
|
# Clear in-memory caches upon conclusion of linting. Useful if running pylint
|
||||||
|
# in a server-like mode.
|
||||||
|
clear-cache-post-run=no
|
||||||
|
|
||||||
|
# Load and enable all available extensions. Use --list-extensions to see a list
|
||||||
|
# all available extensions.
|
||||||
|
#enable-all-extensions=
|
||||||
|
|
||||||
|
# In error mode, messages with a category besides ERROR or FATAL are
|
||||||
|
# suppressed, and no reports are done by default. Error mode is compatible with
|
||||||
|
# disabling specific errors.
|
||||||
|
#errors-only=
|
||||||
|
|
||||||
|
# Always return a 0 (non-error) status code, even if lint errors are found.
|
||||||
|
# This is primarily useful in continuous integration scripts.
|
||||||
|
#exit-zero=
|
||||||
|
|
||||||
|
# A comma-separated list of package or module names from where C extensions may
|
||||||
|
# be loaded. Extensions are loading into the active Python interpreter and may
|
||||||
|
# run arbitrary code.
|
||||||
|
extension-pkg-allow-list=
|
||||||
|
|
||||||
|
# A comma-separated list of package or module names from where C extensions may
|
||||||
|
# be loaded. Extensions are loading into the active Python interpreter and may
|
||||||
|
# run arbitrary code. (This is an alternative name to extension-pkg-allow-list
|
||||||
|
# for backward compatibility.)
|
||||||
|
extension-pkg-whitelist=
|
||||||
|
|
||||||
|
# Return non-zero exit code if any of these messages/categories are detected,
|
||||||
|
# even if score is above --fail-under value. Syntax same as enable. Messages
|
||||||
|
# specified are enabled, while categories only check already-enabled messages.
|
||||||
|
fail-on=
|
||||||
|
|
||||||
|
# Specify a score threshold under which the program will exit with error.
|
||||||
|
fail-under=10
|
||||||
|
|
||||||
|
# Interpret the stdin as a python script, whose filename needs to be passed as
|
||||||
|
# the module_or_package argument.
|
||||||
|
#from-stdin=
|
||||||
|
|
||||||
|
# Files or directories to be skipped. They should be base names, not paths.
|
||||||
|
ignore=CVS
|
||||||
|
|
||||||
|
# Add files or directories matching the regular expressions patterns to the
|
||||||
|
# ignore-list. The regex matches against paths and can be in Posix or Windows
|
||||||
|
# format. Because '\\' represents the directory delimiter on Windows systems,
|
||||||
|
# it can't be used as an escape character.
|
||||||
|
ignore-paths=
|
||||||
|
|
||||||
|
# Files or directories matching the regular expression patterns are skipped.
|
||||||
|
# The regex matches against base names, not paths. The default value ignores
|
||||||
|
# Emacs file locks
|
||||||
|
ignore-patterns=^\.#
|
||||||
|
|
||||||
|
# List of module names for which member attributes should not be checked
|
||||||
|
# (useful for modules/projects where namespaces are manipulated during runtime
|
||||||
|
# and thus existing member attributes cannot be deduced by static analysis). It
|
||||||
|
# supports qualified module names, as well as Unix pattern matching.
|
||||||
|
ignored-modules=
|
||||||
|
|
||||||
|
# Python code to execute, usually for sys.path manipulation such as
|
||||||
|
# pygtk.require().
|
||||||
|
init-hook='import sys; sys.path.append("pylint_plugins")'
|
||||||
|
|
||||||
|
# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
|
||||||
|
# number of processors available to use, and will cap the count on Windows to
|
||||||
|
# avoid hangs.
|
||||||
|
jobs=1
|
||||||
|
|
||||||
|
# Control the amount of potential inferred values when inferring a single
|
||||||
|
# object. This can help the performance when dealing with large functions or
|
||||||
|
# complex, nested conditions.
|
||||||
|
limit-inference-results=100
|
||||||
|
|
||||||
|
# List of plugins (as comma separated values of python module names) to load,
|
||||||
|
# usually to register additional checkers.
|
||||||
|
load-plugins=pylint.extensions.docparams,
|
||||||
|
pylint.extensions.bad_builtin,
|
||||||
|
definition_order,
|
||||||
|
import_order,
|
||||||
|
|
||||||
|
# Pickle collected data for later comparisons.
|
||||||
|
persistent=yes
|
||||||
|
|
||||||
|
# Minimum Python version to use for version dependent checks. Will default to
|
||||||
|
# the version used to run pylint.
|
||||||
|
py-version=3.11
|
||||||
|
|
||||||
|
# Discover python modules and packages in the file system subtree.
|
||||||
|
recursive=no
|
||||||
|
|
||||||
|
# Add paths to the list of the source roots. Supports globbing patterns. The
|
||||||
|
# source root is an absolute path or a path relative to the current working
|
||||||
|
# directory used to determine a package namespace for modules located under the
|
||||||
|
# source root.
|
||||||
|
source-roots=
|
||||||
|
|
||||||
|
# When enabled, pylint would attempt to guess common misconfiguration and emit
|
||||||
|
# user-friendly hints instead of false-positive error messages.
|
||||||
|
suggestion-mode=yes
|
||||||
|
|
||||||
|
# Allow loading of arbitrary C extensions. Extensions are imported into the
|
||||||
|
# active Python interpreter and may run arbitrary code.
|
||||||
|
unsafe-load-any-extension=no
|
||||||
|
|
||||||
|
# In verbose mode, extra non-checker-related info will be displayed.
|
||||||
|
#verbose=
|
||||||
|
|
||||||
|
|
||||||
|
[BASIC]
|
||||||
|
|
||||||
|
# Naming style matching correct argument names.
|
||||||
|
argument-naming-style=snake_case
|
||||||
|
|
||||||
|
# Regular expression matching correct argument names. Overrides argument-
|
||||||
|
# naming-style. If left empty, argument names will be checked with the set
|
||||||
|
# naming style.
|
||||||
|
#argument-rgx=
|
||||||
|
|
||||||
|
# Naming style matching correct attribute names.
|
||||||
|
attr-naming-style=snake_case
|
||||||
|
|
||||||
|
# Regular expression matching correct attribute names. Overrides attr-naming-
|
||||||
|
# style. If left empty, attribute names will be checked with the set naming
|
||||||
|
# style.
|
||||||
|
#attr-rgx=
|
||||||
|
|
||||||
|
bad-functions=print,
|
||||||
|
|
||||||
|
# Bad variable names which should always be refused, separated by a comma.
|
||||||
|
bad-names=foo,
|
||||||
|
bar,
|
||||||
|
baz,
|
||||||
|
toto,
|
||||||
|
tutu,
|
||||||
|
tata
|
||||||
|
|
||||||
|
# Bad variable names regexes, separated by a comma. If names match any regex,
|
||||||
|
# they will always be refused
|
||||||
|
bad-names-rgxs=
|
||||||
|
|
||||||
|
# Naming style matching correct class attribute names.
|
||||||
|
class-attribute-naming-style=any
|
||||||
|
|
||||||
|
# Regular expression matching correct class attribute names. Overrides class-
|
||||||
|
# attribute-naming-style. If left empty, class attribute names will be checked
|
||||||
|
# with the set naming style.
|
||||||
|
#class-attribute-rgx=
|
||||||
|
|
||||||
|
# Naming style matching correct class constant names.
|
||||||
|
class-const-naming-style=UPPER_CASE
|
||||||
|
|
||||||
|
# Regular expression matching correct class constant names. Overrides class-
|
||||||
|
# const-naming-style. If left empty, class constant names will be checked with
|
||||||
|
# the set naming style.
|
||||||
|
#class-const-rgx=
|
||||||
|
|
||||||
|
# Naming style matching correct class names.
|
||||||
|
class-naming-style=PascalCase
|
||||||
|
|
||||||
|
# Regular expression matching correct class names. Overrides class-naming-
|
||||||
|
# style. If left empty, class names will be checked with the set naming style.
|
||||||
|
#class-rgx=
|
||||||
|
|
||||||
|
# Naming style matching correct constant names.
|
||||||
|
const-naming-style=UPPER_CASE
|
||||||
|
|
||||||
|
# Regular expression matching correct constant names. Overrides const-naming-
|
||||||
|
# style. If left empty, constant names will be checked with the set naming
|
||||||
|
# style.
|
||||||
|
#const-rgx=
|
||||||
|
|
||||||
|
# Minimum line length for functions/classes that require docstrings, shorter
|
||||||
|
# ones are exempt.
|
||||||
|
docstring-min-length=-1
|
||||||
|
|
||||||
|
# Naming style matching correct function names.
|
||||||
|
function-naming-style=snake_case
|
||||||
|
|
||||||
|
# Regular expression matching correct function names. Overrides function-
|
||||||
|
# naming-style. If left empty, function names will be checked with the set
|
||||||
|
# naming style.
|
||||||
|
#function-rgx=
|
||||||
|
|
||||||
|
# Good variable names which should always be accepted, separated by a comma.
|
||||||
|
good-names=i,
|
||||||
|
j,
|
||||||
|
k,
|
||||||
|
ex,
|
||||||
|
Run,
|
||||||
|
_
|
||||||
|
|
||||||
|
# Good variable names regexes, separated by a comma. If names match any regex,
|
||||||
|
# they will always be accepted
|
||||||
|
good-names-rgxs=
|
||||||
|
|
||||||
|
# Include a hint for the correct naming format with invalid-name.
|
||||||
|
include-naming-hint=no
|
||||||
|
|
||||||
|
# Naming style matching correct inline iteration names.
|
||||||
|
inlinevar-naming-style=any
|
||||||
|
|
||||||
|
# Regular expression matching correct inline iteration names. Overrides
|
||||||
|
# inlinevar-naming-style. If left empty, inline iteration names will be checked
|
||||||
|
# with the set naming style.
|
||||||
|
#inlinevar-rgx=
|
||||||
|
|
||||||
|
# Naming style matching correct method names.
|
||||||
|
method-naming-style=snake_case
|
||||||
|
|
||||||
|
# Regular expression matching correct method names. Overrides method-naming-
|
||||||
|
# style. If left empty, method names will be checked with the set naming style.
|
||||||
|
#method-rgx=
|
||||||
|
|
||||||
|
# Naming style matching correct module names.
|
||||||
|
module-naming-style=snake_case
|
||||||
|
|
||||||
|
# Regular expression matching correct module names. Overrides module-naming-
|
||||||
|
# style. If left empty, module names will be checked with the set naming style.
|
||||||
|
#module-rgx=
|
||||||
|
|
||||||
|
# Colon-delimited sets of names that determine each other's naming style when
|
||||||
|
# the name regexes allow several styles.
|
||||||
|
name-group=
|
||||||
|
|
||||||
|
# Regular expression which should only match function or class names that do
|
||||||
|
# not require a docstring.
|
||||||
|
no-docstring-rgx=
|
||||||
|
|
||||||
|
# List of decorators that produce properties, such as abc.abstractproperty. Add
|
||||||
|
# to this list to register other decorators that produce valid properties.
|
||||||
|
# These decorators are taken in consideration only for invalid-name.
|
||||||
|
property-classes=abc.abstractproperty
|
||||||
|
|
||||||
|
# Regular expression matching correct type alias names. If left empty, type
|
||||||
|
# alias names will be checked with the set naming style.
|
||||||
|
#typealias-rgx=
|
||||||
|
|
||||||
|
# Regular expression matching correct type variable names. If left empty, type
|
||||||
|
# variable names will be checked with the set naming style.
|
||||||
|
#typevar-rgx=
|
||||||
|
|
||||||
|
# Naming style matching correct variable names.
|
||||||
|
variable-naming-style=snake_case
|
||||||
|
|
||||||
|
# Regular expression matching correct variable names. Overrides variable-
|
||||||
|
# naming-style. If left empty, variable names will be checked with the set
|
||||||
|
# naming style.
|
||||||
|
#variable-rgx=
|
||||||
|
|
||||||
|
|
||||||
|
[CLASSES]
|
||||||
|
|
||||||
|
# Warn about protected attribute access inside special methods
|
||||||
|
check-protected-access-in-special-methods=no
|
||||||
|
|
||||||
|
# List of method names used to declare (i.e. assign) instance attributes.
|
||||||
|
defining-attr-methods=__init__,
|
||||||
|
__new__,
|
||||||
|
setUp,
|
||||||
|
asyncSetUp,
|
||||||
|
__post_init__
|
||||||
|
|
||||||
|
# List of member names, which should be excluded from the protected access
|
||||||
|
# warning.
|
||||||
|
exclude-protected=_asdict,_fields,_replace,_source,_make,os._exit
|
||||||
|
|
||||||
|
# List of valid names for the first argument in a class method.
|
||||||
|
valid-classmethod-first-arg=cls
|
||||||
|
|
||||||
|
# List of valid names for the first argument in a metaclass class method.
|
||||||
|
valid-metaclass-classmethod-first-arg=mcs
|
||||||
|
|
||||||
|
|
||||||
|
[DESIGN]
|
||||||
|
|
||||||
|
# List of regular expressions of class ancestor names to ignore when counting
|
||||||
|
# public methods (see R0903)
|
||||||
|
exclude-too-few-public-methods=
|
||||||
|
|
||||||
|
# List of qualified class names to ignore when counting class parents (see
|
||||||
|
# R0901)
|
||||||
|
ignored-parents=
|
||||||
|
|
||||||
|
# Maximum number of arguments for function / method.
|
||||||
|
max-args=5
|
||||||
|
|
||||||
|
# Maximum number of attributes for a class (see R0902).
|
||||||
|
max-attributes=7
|
||||||
|
|
||||||
|
# Maximum number of boolean expressions in an if statement (see R0916).
|
||||||
|
max-bool-expr=5
|
||||||
|
|
||||||
|
# Maximum number of branch for function / method body.
|
||||||
|
max-branches=12
|
||||||
|
|
||||||
|
# Maximum number of locals for function / method body.
|
||||||
|
max-locals=15
|
||||||
|
|
||||||
|
# Maximum number of parents for a class (see R0901).
|
||||||
|
max-parents=15
|
||||||
|
|
||||||
|
# Maximum number of public methods for a class (see R0904).
|
||||||
|
max-public-methods=20
|
||||||
|
|
||||||
|
# Maximum number of return / yield for function / method body.
|
||||||
|
max-returns=6
|
||||||
|
|
||||||
|
# Maximum number of statements in function / method body.
|
||||||
|
max-statements=50
|
||||||
|
|
||||||
|
# Minimum number of public methods for a class (see R0903).
|
||||||
|
min-public-methods=2
|
||||||
|
|
||||||
|
|
||||||
|
[EXCEPTIONS]
|
||||||
|
|
||||||
|
# Exceptions that will emit a warning when caught.
|
||||||
|
overgeneral-exceptions=builtins.BaseException,builtins.Exception
|
||||||
|
|
||||||
|
|
||||||
|
[FORMAT]
|
||||||
|
|
||||||
|
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
|
||||||
|
expected-line-ending-format=
|
||||||
|
|
||||||
|
# Regexp for a line that is allowed to be longer than the limit.
|
||||||
|
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
|
||||||
|
|
||||||
|
# Number of spaces of indent required inside a hanging or continued line.
|
||||||
|
indent-after-paren=4
|
||||||
|
|
||||||
|
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
|
||||||
|
# tab).
|
||||||
|
indent-string=' '
|
||||||
|
|
||||||
|
# Maximum number of characters on a single line.
|
||||||
|
max-line-length=100
|
||||||
|
|
||||||
|
# Maximum number of lines in a module.
|
||||||
|
max-module-lines=1000
|
||||||
|
|
||||||
|
# Allow the body of a class to be on the same line as the declaration if body
|
||||||
|
# contains single statement.
|
||||||
|
single-line-class-stmt=no
|
||||||
|
|
||||||
|
# Allow the body of an if to be on the same line as the test if there is no
|
||||||
|
# else.
|
||||||
|
single-line-if-stmt=no
|
||||||
|
|
||||||
|
|
||||||
|
[IMPORTS]
|
||||||
|
|
||||||
|
# List of modules that can be imported at any level, not just the top level
|
||||||
|
# one.
|
||||||
|
allow-any-import-level=
|
||||||
|
|
||||||
|
# Allow explicit reexports by alias from a package __init__.
|
||||||
|
allow-reexport-from-package=no
|
||||||
|
|
||||||
|
# Allow wildcard imports from modules that define __all__.
|
||||||
|
allow-wildcard-with-all=no
|
||||||
|
|
||||||
|
# Deprecated modules which should not be used, separated by a comma.
|
||||||
|
deprecated-modules=
|
||||||
|
|
||||||
|
# Output a graph (.gv or any supported image format) of external dependencies
|
||||||
|
# to the given file (report RP0402 must not be disabled).
|
||||||
|
ext-import-graph=
|
||||||
|
|
||||||
|
# Output a graph (.gv or any supported image format) of all (i.e. internal and
|
||||||
|
# external) dependencies to the given file (report RP0402 must not be
|
||||||
|
# disabled).
|
||||||
|
import-graph=
|
||||||
|
|
||||||
|
# Output a graph (.gv or any supported image format) of internal dependencies
|
||||||
|
# to the given file (report RP0402 must not be disabled).
|
||||||
|
int-import-graph=
|
||||||
|
|
||||||
|
# Force import order to recognize a module as part of the standard
|
||||||
|
# compatibility libraries.
|
||||||
|
known-standard-library=
|
||||||
|
|
||||||
|
# Force import order to recognize a module as part of a third party library.
|
||||||
|
known-third-party=enchant
|
||||||
|
|
||||||
|
# Couples of modules and preferred modules, separated by a comma.
|
||||||
|
preferred-modules=
|
||||||
|
|
||||||
|
|
||||||
|
[LOGGING]
|
||||||
|
|
||||||
|
# The type of string formatting that logging methods do. `old` means using %
|
||||||
|
# formatting, `new` is for `{}` formatting.
|
||||||
|
logging-format-style=old
|
||||||
|
|
||||||
|
# Logging modules to check that the string format arguments are in logging
|
||||||
|
# function parameter format.
|
||||||
|
logging-modules=logging
|
||||||
|
|
||||||
|
|
||||||
|
[MESSAGES CONTROL]
|
||||||
|
|
||||||
|
# Only show warnings with the listed confidence levels. Leave empty to show
|
||||||
|
# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE,
|
||||||
|
# UNDEFINED.
|
||||||
|
confidence=HIGH,
|
||||||
|
CONTROL_FLOW,
|
||||||
|
INFERENCE,
|
||||||
|
INFERENCE_FAILURE,
|
||||||
|
UNDEFINED
|
||||||
|
|
||||||
|
# Disable the message, report, category or checker with the given id(s). You
|
||||||
|
# can either give multiple identifiers separated by comma (,) or put this
|
||||||
|
# option multiple times (only on the command line, not in the configuration
|
||||||
|
# file where it should appear only once). You can also use "--disable=all" to
|
||||||
|
# disable everything first and then re-enable specific checks. For example, if
|
||||||
|
# you want to run only the similarities checker, you can use "--disable=all
|
||||||
|
# --enable=similarities". If you want to run only the classes checker, but have
|
||||||
|
# no Warning level messages displayed, use "--disable=all --enable=classes
|
||||||
|
# --disable=W".
|
||||||
|
disable=raw-checker-failed,
|
||||||
|
bad-inline-option,
|
||||||
|
locally-disabled,
|
||||||
|
file-ignored,
|
||||||
|
suppressed-message,
|
||||||
|
useless-suppression,
|
||||||
|
deprecated-pragma,
|
||||||
|
use-symbolic-message-instead,
|
||||||
|
missing-module-docstring,
|
||||||
|
line-too-long,
|
||||||
|
no-name-in-module,
|
||||||
|
import-outside-toplevel,
|
||||||
|
invalid-name,
|
||||||
|
raise-missing-from,
|
||||||
|
wrong-import-order,
|
||||||
|
too-few-public-methods,
|
||||||
|
too-many-instance-attributes,
|
||||||
|
broad-except,
|
||||||
|
fixme,
|
||||||
|
too-many-arguments,
|
||||||
|
duplicate-code,
|
||||||
|
cyclic-import,
|
||||||
|
too-many-positional-arguments,
|
||||||
|
|
||||||
|
# Enable the message, report, category or checker with the given id(s). You can
|
||||||
|
# either give multiple identifier separated by comma (,) or put this option
|
||||||
|
# multiple time (only on the command line, not in the configuration file where
|
||||||
|
# it should appear only once). See also the "--disable" option for examples.
|
||||||
|
enable=c-extension-no-member
|
||||||
|
|
||||||
|
|
||||||
|
[METHOD_ARGS]
|
||||||
|
|
||||||
|
# List of qualified names (i.e., library.method) which require a timeout
|
||||||
|
# parameter e.g. 'requests.api.get,requests.api.post'
|
||||||
|
timeout-methods=requests.api.delete,requests.api.get,requests.api.head,requests.api.options,requests.api.patch,requests.api.post,requests.api.put,requests.api.request
|
||||||
|
|
||||||
|
|
||||||
|
[MISCELLANEOUS]
|
||||||
|
|
||||||
|
# List of note tags to take in consideration, separated by a comma.
|
||||||
|
notes=FIXME,
|
||||||
|
XXX,
|
||||||
|
TODO
|
||||||
|
|
||||||
|
# Regular expression of note tags to take in consideration.
|
||||||
|
notes-rgx=
|
||||||
|
|
||||||
|
|
||||||
|
[REFACTORING]
|
||||||
|
|
||||||
|
# Maximum number of nested blocks for function / method body
|
||||||
|
max-nested-blocks=5
|
||||||
|
|
||||||
|
# Complete name of functions that never returns. When checking for
|
||||||
|
# inconsistent-return-statements if a never returning function is called then
|
||||||
|
# it will be considered as an explicit return statement and no message will be
|
||||||
|
# printed.
|
||||||
|
never-returning-functions=sys.exit,argparse.parse_error
|
||||||
|
|
||||||
|
|
||||||
|
[REPORTS]
|
||||||
|
|
||||||
|
# Python expression which should return a score less than or equal to 10. You
|
||||||
|
# have access to the variables 'fatal', 'error', 'warning', 'refactor',
|
||||||
|
# 'convention', and 'info' which contain the number of messages in each
|
||||||
|
# category, as well as 'statement' which is the total number of statements
|
||||||
|
# analyzed. This score is used by the global evaluation report (RP0004).
|
||||||
|
evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))
|
||||||
|
|
||||||
|
# Template used to display messages. This is a python new-style format string
|
||||||
|
# used to format the message information. See doc for all details.
|
||||||
|
msg-template=
|
||||||
|
|
||||||
|
# Set the output format. Available formats are text, parseable, colorized, json
|
||||||
|
# and msvs (visual studio). You can also give a reporter class, e.g.
|
||||||
|
# mypackage.mymodule.MyReporterClass.
|
||||||
|
#output-format=
|
||||||
|
|
||||||
|
# Tells whether to display a full report or only the messages.
|
||||||
|
reports=no
|
||||||
|
|
||||||
|
# Activate the evaluation score.
|
||||||
|
score=yes
|
||||||
|
|
||||||
|
|
||||||
|
[SIMILARITIES]
|
||||||
|
|
||||||
|
# Comments are removed from the similarity computation
|
||||||
|
ignore-comments=yes
|
||||||
|
|
||||||
|
# Docstrings are removed from the similarity computation
|
||||||
|
ignore-docstrings=yes
|
||||||
|
|
||||||
|
# Imports are removed from the similarity computation
|
||||||
|
ignore-imports=yes
|
||||||
|
|
||||||
|
# Signatures are removed from the similarity computation
|
||||||
|
ignore-signatures=yes
|
||||||
|
|
||||||
|
# Minimum lines number of a similarity.
|
||||||
|
min-similarity-lines=4
|
||||||
|
|
||||||
|
|
||||||
|
[SPELLING]
|
||||||
|
|
||||||
|
# Limits count of emitted suggestions for spelling mistakes.
|
||||||
|
max-spelling-suggestions=4
|
||||||
|
|
||||||
|
# Spelling dictionary name. No available dictionaries : You need to install
|
||||||
|
# both the python package and the system dependency for enchant to work..
|
||||||
|
spelling-dict=
|
||||||
|
|
||||||
|
# List of comma separated words that should be considered directives if they
|
||||||
|
# appear at the beginning of a comment and should not be checked.
|
||||||
|
spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:
|
||||||
|
|
||||||
|
# List of comma separated words that should not be checked.
|
||||||
|
spelling-ignore-words=
|
||||||
|
|
||||||
|
# A path to a file that contains the private dictionary; one word per line.
|
||||||
|
spelling-private-dict-file=
|
||||||
|
|
||||||
|
# Tells whether to store unknown words to the private dictionary (see the
|
||||||
|
# --spelling-private-dict-file option) instead of raising a message.
|
||||||
|
spelling-store-unknown-words=no
|
||||||
|
|
||||||
|
|
||||||
|
[STRING]
|
||||||
|
|
||||||
|
# This flag controls whether inconsistent-quotes generates a warning when the
|
||||||
|
# character used as a quote delimiter is used inconsistently within a module.
|
||||||
|
check-quote-consistency=no
|
||||||
|
|
||||||
|
# This flag controls whether the implicit-str-concat should generate a warning
|
||||||
|
# on implicit string concatenation in sequences defined over several lines.
|
||||||
|
check-str-concat-over-line-jumps=no
|
||||||
|
|
||||||
|
|
||||||
|
[TYPECHECK]
|
||||||
|
|
||||||
|
# List of decorators that produce context managers, such as
|
||||||
|
# contextlib.contextmanager. Add to this list to register other decorators that
|
||||||
|
# produce valid context managers.
|
||||||
|
contextmanager-decorators=contextlib.contextmanager
|
||||||
|
|
||||||
|
# List of members which are set dynamically and missed by pylint inference
|
||||||
|
# system, and so shouldn't trigger E1101 when accessed. Python regular
|
||||||
|
# expressions are accepted.
|
||||||
|
generated-members=
|
||||||
|
|
||||||
|
# Tells whether to warn about missing members when the owner of the attribute
|
||||||
|
# is inferred to be None.
|
||||||
|
ignore-none=yes
|
||||||
|
|
||||||
|
# This flag controls whether pylint should warn about no-member and similar
|
||||||
|
# checks whenever an opaque object is returned when inferring. The inference
|
||||||
|
# can return multiple potential results while evaluating a Python object, but
|
||||||
|
# some branches might not be evaluated, which results in partial inference. In
|
||||||
|
# that case, it might be useful to still emit no-member and other checks for
|
||||||
|
# the rest of the inferred objects.
|
||||||
|
ignore-on-opaque-inference=yes
|
||||||
|
|
||||||
|
# List of symbolic message names to ignore for Mixin members.
|
||||||
|
ignored-checks-for-mixins=no-member,
|
||||||
|
not-async-context-manager,
|
||||||
|
not-context-manager,
|
||||||
|
attribute-defined-outside-init
|
||||||
|
|
||||||
|
# List of class names for which member attributes should not be checked (useful
|
||||||
|
# for classes with dynamically set attributes). This supports the use of
|
||||||
|
# qualified names.
|
||||||
|
ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace
|
||||||
|
|
||||||
|
# Show a hint with possible names when a member name was not found. The aspect
|
||||||
|
# of finding the hint is based on edit distance.
|
||||||
|
missing-member-hint=yes
|
||||||
|
|
||||||
|
# The minimum edit distance a name should have in order to be considered a
|
||||||
|
# similar match for a missing member name.
|
||||||
|
missing-member-hint-distance=1
|
||||||
|
|
||||||
|
# The total number of similar names that should be taken in consideration when
|
||||||
|
# showing a hint for a missing member.
|
||||||
|
missing-member-max-choices=1
|
||||||
|
|
||||||
|
# Regex pattern to define which classes are considered mixins.
|
||||||
|
mixin-class-rgx=.*[Mm]ixin
|
||||||
|
|
||||||
|
# List of decorators that change the signature of a decorated function.
|
||||||
|
signature-mutators=
|
||||||
|
|
||||||
|
|
||||||
|
[VARIABLES]
|
||||||
|
|
||||||
|
# List of additional names supposed to be defined in builtins. Remember that
|
||||||
|
# you should avoid defining new builtins when possible.
|
||||||
|
additional-builtins=
|
||||||
|
|
||||||
|
# Tells whether unused global variables should be treated as a violation.
|
||||||
|
allow-global-unused-variables=yes
|
||||||
|
|
||||||
|
# List of names allowed to shadow builtins
|
||||||
|
allowed-redefined-builtins=
|
||||||
|
|
||||||
|
# List of strings which can identify a callback function by name. A callback
|
||||||
|
# name must start or end with one of those strings.
|
||||||
|
callbacks=cb_,
|
||||||
|
_cb
|
||||||
|
|
||||||
|
# A regular expression matching the name of dummy variables (i.e. expected to
|
||||||
|
# not be used).
|
||||||
|
dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
|
||||||
|
|
||||||
|
# Argument names that match this expression will be ignored.
|
||||||
|
ignored-argument-names=_.*|^ignored_|^unused_
|
||||||
|
|
||||||
|
# Tells whether we should check for unused import in __init__ files.
|
||||||
|
init-import=no
|
||||||
|
|
||||||
|
# List of qualified module names which can have objects that can redefine
|
||||||
|
# builtins.
|
||||||
|
redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
[pytest]
|
|
||||||
addopts = --cov=ahriman --cov-report=term-missing:skip-covered --no-cov-on-fail --cov-fail-under=100 --spec
|
|
||||||
asyncio_default_fixture_loop_scope = function
|
|
||||||
asyncio_mode = auto
|
|
||||||
spec_test_format = {result} {docstring_summary}
|
|
||||||
@@ -215,7 +215,6 @@ 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.
|
* 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.
|
* 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.
|
* 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
|
### Other checks
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ RUN pacman -S --noconfirm --asdeps \
|
|||||||
pacman -S --noconfirm --asdeps \
|
pacman -S --noconfirm --asdeps \
|
||||||
git \
|
git \
|
||||||
python-aiohttp \
|
python-aiohttp \
|
||||||
python-aiohttp-openmetrics \
|
|
||||||
python-boto3 \
|
python-boto3 \
|
||||||
python-cerberus \
|
python-cerberus \
|
||||||
python-cryptography \
|
python-cryptography \
|
||||||
@@ -113,7 +112,6 @@ RUN pacman -S --noconfirm ahriman
|
|||||||
RUN pacman -S --noconfirm --asdeps \
|
RUN pacman -S --noconfirm --asdeps \
|
||||||
python-aioauth-client \
|
python-aioauth-client \
|
||||||
python-aiohttp-apispec-git \
|
python-aiohttp-apispec-git \
|
||||||
python-aiohttp-openmetrics \
|
|
||||||
python-aiohttp-security \
|
python-aiohttp-security \
|
||||||
python-aiohttp-session \
|
python-aiohttp-session \
|
||||||
python-boto3 \
|
python-boto3 \
|
||||||
|
|||||||
3660
docs/_static/architecture.dot
vendored
3660
docs/_static/architecture.dot
vendored
File diff suppressed because it is too large
Load Diff
@@ -20,14 +20,6 @@ ahriman.web.middlewares.exception\_handler module
|
|||||||
:no-undoc-members:
|
:no-undoc-members:
|
||||||
:show-inheritance:
|
:show-inheritance:
|
||||||
|
|
||||||
ahriman.web.middlewares.metrics\_handler module
|
|
||||||
-----------------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: ahriman.web.middlewares.metrics_handler
|
|
||||||
:members:
|
|
||||||
:no-undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
Module contents
|
Module contents
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
|||||||
@@ -4,14 +4,6 @@ ahriman.web.schemas package
|
|||||||
Submodules
|
Submodules
|
||||||
----------
|
----------
|
||||||
|
|
||||||
ahriman.web.schemas.any\_schema module
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: ahriman.web.schemas.any_schema
|
|
||||||
:members:
|
|
||||||
:no-undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
ahriman.web.schemas.aur\_package\_schema module
|
ahriman.web.schemas.aur\_package\_schema module
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -12,14 +12,6 @@ ahriman.web.views.v1.status.info module
|
|||||||
:no-undoc-members:
|
:no-undoc-members:
|
||||||
:show-inheritance:
|
:show-inheritance:
|
||||||
|
|
||||||
ahriman.web.views.v1.status.metrics module
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: ahriman.web.views.v1.status.metrics
|
|
||||||
:members:
|
|
||||||
:no-undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
ahriman.web.views.v1.status.repositories module
|
ahriman.web.views.v1.status.repositories module
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -413,11 +413,10 @@ Web application
|
|||||||
Web application requires the following python packages to be installed:
|
Web application requires the following python packages to be installed:
|
||||||
|
|
||||||
* Core part requires ``aiohttp`` (application itself), ``aiohttp_jinja2`` and ``Jinja2`` (HTML generation from templates).
|
* Core part requires ``aiohttp`` (application itself), ``aiohttp_jinja2`` and ``Jinja2`` (HTML generation from templates).
|
||||||
* Additional web features also require ``aiohttp-apispec`` (autogenerated documentation, optional), ``aiohttp_cors`` (CORS support, required by documentation).
|
* Additional web features also require ``aiohttp-apispec`` (autogenerated documentation), ``aiohttp_cors`` (CORS support, required by documentation).
|
||||||
* In addition, authorization feature requires ``aiohttp_security``, ``aiohttp_session`` and ``cryptography``.
|
* In addition, authorization feature requires ``aiohttp_security``, ``aiohttp_session`` and ``cryptography``.
|
||||||
* In addition to base authorization dependencies, OAuth2 also requires ``aioauth-client`` library.
|
* In addition to base authorization dependencies, OAuth2 also requires ``aioauth-client`` library.
|
||||||
* In addition if you would like to disable authorization for local access (recommended way in order to run the application itself with reporting support), the ``requests-unixsocket2`` library is required.
|
* In addition if you would like to disable authorization for local access (recommended way in order to run the application itself with reporting support), the ``requests-unixsocket2`` library is required.
|
||||||
* Application metrics will be automatically enabled after installing ``aiohttp-openmetrics`` package.
|
|
||||||
|
|
||||||
Middlewares
|
Middlewares
|
||||||
^^^^^^^^^^^
|
^^^^^^^^^^^
|
||||||
|
|||||||
@@ -138,8 +138,6 @@ Build related configuration. Group name can refer to architecture, e.g. ``build:
|
|||||||
|
|
||||||
Base repository settings.
|
Base repository settings.
|
||||||
|
|
||||||
* ``architecture`` - repository architecture, string. This field is read-only and generated automatically from run options if possible.
|
|
||||||
* ``name`` - repository name, string. This field is read-only and generated automatically from run options if possible.
|
|
||||||
* ``root`` - root path for application, string, required.
|
* ``root`` - root path for application, string, required.
|
||||||
|
|
||||||
``sign:*`` groups
|
``sign:*`` groups
|
||||||
|
|||||||
@@ -1,36 +1,36 @@
|
|||||||
# This file was autogenerated by uv via the following command:
|
# This file was autogenerated by uv via the following command:
|
||||||
# uv pip compile --group pyproject.toml:docs --extra s3 --extra validator --extra web --output-file docs/requirements.txt pyproject.toml
|
# uv pip compile --group ../pyproject.toml:docs --extra s3 --extra validator --extra web --output-file ../docs/requirements.txt ../pyproject.toml
|
||||||
aiohappyeyeballs==2.6.1
|
aiohappyeyeballs==2.6.1
|
||||||
# via aiohttp
|
# via aiohttp
|
||||||
aiohttp==3.11.18
|
aiohttp==3.11.18
|
||||||
# via
|
# via
|
||||||
# ahriman (pyproject.toml)
|
# ahriman (../pyproject.toml)
|
||||||
# aiohttp-cors
|
# aiohttp-cors
|
||||||
# aiohttp-jinja2
|
# aiohttp-jinja2
|
||||||
aiohttp-cors==0.8.1
|
aiohttp-cors==0.8.1
|
||||||
# via ahriman (pyproject.toml)
|
# via ahriman (../pyproject.toml)
|
||||||
aiohttp-jinja2==1.6
|
aiohttp-jinja2==1.6
|
||||||
# via ahriman (pyproject.toml)
|
# via ahriman (../pyproject.toml)
|
||||||
aiosignal==1.3.2
|
aiosignal==1.3.2
|
||||||
# via aiohttp
|
# via aiohttp
|
||||||
alabaster==1.0.0
|
alabaster==1.0.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
argparse-manpage==4.6
|
argparse-manpage==4.6
|
||||||
# via ahriman (pyproject.toml:docs)
|
# via ahriman (../pyproject.toml:docs)
|
||||||
attrs==25.3.0
|
attrs==25.3.0
|
||||||
# via aiohttp
|
# via aiohttp
|
||||||
babel==2.17.0
|
babel==2.17.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
bcrypt==4.3.0
|
bcrypt==4.3.0
|
||||||
# via ahriman (pyproject.toml)
|
# via ahriman (../pyproject.toml)
|
||||||
boto3==1.38.11
|
boto3==1.38.11
|
||||||
# via ahriman (pyproject.toml)
|
# via ahriman (../pyproject.toml)
|
||||||
botocore==1.38.11
|
botocore==1.38.11
|
||||||
# via
|
# via
|
||||||
# boto3
|
# boto3
|
||||||
# s3transfer
|
# s3transfer
|
||||||
cerberus==1.3.7
|
cerberus==1.3.7
|
||||||
# via ahriman (pyproject.toml)
|
# via ahriman (../pyproject.toml)
|
||||||
certifi==2025.4.26
|
certifi==2025.4.26
|
||||||
# via requests
|
# via requests
|
||||||
charset-normalizer==3.4.2
|
charset-normalizer==3.4.2
|
||||||
@@ -51,7 +51,7 @@ idna==3.10
|
|||||||
imagesize==1.4.1
|
imagesize==1.4.1
|
||||||
# via sphinx
|
# via sphinx
|
||||||
inflection==0.5.1
|
inflection==0.5.1
|
||||||
# via ahriman (pyproject.toml)
|
# via ahriman (../pyproject.toml)
|
||||||
jinja2==3.1.6
|
jinja2==3.1.6
|
||||||
# via
|
# via
|
||||||
# aiohttp-jinja2
|
# aiohttp-jinja2
|
||||||
@@ -73,37 +73,37 @@ propcache==0.3.1
|
|||||||
# aiohttp
|
# aiohttp
|
||||||
# yarl
|
# yarl
|
||||||
pydeps==3.0.1
|
pydeps==3.0.1
|
||||||
# via ahriman (pyproject.toml:docs)
|
# via ahriman (../pyproject.toml:docs)
|
||||||
pyelftools==0.32
|
pyelftools==0.32
|
||||||
# via ahriman (pyproject.toml)
|
# via ahriman (../pyproject.toml)
|
||||||
pygments==2.19.1
|
pygments==2.19.1
|
||||||
# via sphinx
|
# via sphinx
|
||||||
python-dateutil==2.9.0.post0
|
python-dateutil==2.9.0.post0
|
||||||
# via botocore
|
# via botocore
|
||||||
requests==2.32.3
|
requests==2.32.3
|
||||||
# via
|
# via
|
||||||
# ahriman (pyproject.toml)
|
# ahriman (../pyproject.toml)
|
||||||
# sphinx
|
# sphinx
|
||||||
roman-numerals-py==3.1.0
|
roman-numerals-py==3.1.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
s3transfer==0.12.0
|
s3transfer==0.12.0
|
||||||
# via boto3
|
# via boto3
|
||||||
shtab==1.7.2
|
shtab==1.7.2
|
||||||
# via ahriman (pyproject.toml:docs)
|
# via ahriman (../pyproject.toml:docs)
|
||||||
six==1.17.0
|
six==1.17.0
|
||||||
# via python-dateutil
|
# via python-dateutil
|
||||||
snowballstemmer==3.0.0.1
|
snowballstemmer==3.0.0.1
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinx==8.2.3
|
sphinx==8.2.3
|
||||||
# via
|
# via
|
||||||
# ahriman (pyproject.toml:docs)
|
# ahriman (../pyproject.toml:docs)
|
||||||
# sphinx-argparse
|
# sphinx-argparse
|
||||||
# sphinx-rtd-theme
|
# sphinx-rtd-theme
|
||||||
# sphinxcontrib-jquery
|
# sphinxcontrib-jquery
|
||||||
sphinx-argparse==0.5.2
|
sphinx-argparse==0.5.2
|
||||||
# via ahriman (pyproject.toml:docs)
|
# via ahriman (../pyproject.toml:docs)
|
||||||
sphinx-rtd-theme==3.0.2
|
sphinx-rtd-theme==3.0.2
|
||||||
# via ahriman (pyproject.toml:docs)
|
# via ahriman (../pyproject.toml:docs)
|
||||||
sphinxcontrib-applehelp==2.0.0
|
sphinxcontrib-applehelp==2.0.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinxcontrib-devhelp==2.0.0
|
sphinxcontrib-devhelp==2.0.0
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
pkgbase='ahriman'
|
pkgbase='ahriman'
|
||||||
pkgname=('ahriman' 'ahriman-core' 'ahriman-triggers' 'ahriman-web')
|
pkgname=('ahriman' 'ahriman-core' 'ahriman-triggers' 'ahriman-web')
|
||||||
pkgver=2.19.4
|
pkgver=2.17.1
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="ArcH linux ReposItory MANager"
|
pkgdesc="ArcH linux ReposItory MANager"
|
||||||
arch=('any')
|
arch=('any')
|
||||||
@@ -75,7 +75,6 @@ package_ahriman-web() {
|
|||||||
depends=("$pkgbase-core=$pkgver" 'python-aiohttp-cors' 'python-aiohttp-jinja2')
|
depends=("$pkgbase-core=$pkgver" 'python-aiohttp-cors' 'python-aiohttp-jinja2')
|
||||||
optdepends=('python-aioauth-client: OAuth2 authorization support'
|
optdepends=('python-aioauth-client: OAuth2 authorization support'
|
||||||
'python-aiohttp-apispec>=3.0.0: autogenerated API documentation'
|
'python-aiohttp-apispec>=3.0.0: autogenerated API documentation'
|
||||||
'python-aiohttp-openmetrics: HTTP metrics support'
|
|
||||||
'python-aiohttp-security: authorization support'
|
'python-aiohttp-security: authorization support'
|
||||||
'python-aiohttp-session: authorization support'
|
'python-aiohttp-session: authorization support'
|
||||||
'python-cryptography: authorization support')
|
'python-cryptography: authorization support')
|
||||||
|
|||||||
@@ -55,11 +55,6 @@
|
|||||||
<i class="bi bi-play"></i> update
|
<i class="bi bi-play"></i> update
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<button id="update-repositories-button" class="btn dropdown-item" onclick="refreshDatabases()">
|
|
||||||
<i class="bi bi-arrow-down-circle"></i> update pacman databases
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<button id="package-rebuild-button" class="btn dropdown-item" data-bs-toggle="modal" data-bs-target="#package-rebuild-modal">
|
<button id="package-rebuild-button" class="btn dropdown-item" data-bs-toggle="modal" data-bs-target="#package-rebuild-modal">
|
||||||
<i class="bi bi-arrow-clockwise"></i> rebuild
|
<i class="bi bi-arrow-clockwise"></i> rebuild
|
||||||
|
|||||||
@@ -24,13 +24,6 @@
|
|||||||
<datalist id="package-add-known-packages-dlist"></datalist>
|
<datalist id="package-add-known-packages-dlist"></datalist>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
|
||||||
<label class="col-3 col-form-label"></label>
|
|
||||||
<div class="col-9">
|
|
||||||
<input id="package-add-refresh-input" type="checkbox" class="form-check-input" value="" checked>
|
|
||||||
<label for="package-add-refresh-input" class="form-check-label">update pacman databases</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<button id="package-add-variable-button" type="button" class="form-control btn btn-light rounded" onclick="packageAddVariableInputCreate()"><i class="bi bi-plus"></i> add environment variable </button>
|
<button id="package-add-variable-button" type="button" class="form-control btn btn-light rounded" onclick="packageAddVariableInputCreate()"><i class="bi bi-plus"></i> add environment variable </button>
|
||||||
@@ -57,8 +50,6 @@
|
|||||||
|
|
||||||
const packageAddVariablesDiv = document.getElementById("package-add-variables-div");
|
const packageAddVariablesDiv = document.getElementById("package-add-variables-div");
|
||||||
|
|
||||||
const packageAddRefreshInput = document.getElementById("package-add-refresh-input");
|
|
||||||
|
|
||||||
function packageAddVariableInputCreate() {
|
function packageAddVariableInputCreate() {
|
||||||
const variableInput = document.createElement("div");
|
const variableInput = document.createElement("div");
|
||||||
variableInput.classList.add("input-group");
|
variableInput.classList.add("input-group");
|
||||||
@@ -108,18 +99,16 @@
|
|||||||
return {patches: patches};
|
return {patches: patches};
|
||||||
}
|
}
|
||||||
|
|
||||||
function packagesAdd(packages, patches, repository, data) {
|
function packagesAdd(packages, patches, repository) {
|
||||||
packages = packages ?? packageAddInput.value;
|
packages = packages ?? packageAddInput.value;
|
||||||
patches = patches ?? patchesParse();
|
patches = patches ?? patchesParse();
|
||||||
repository = repository ?? getRepositorySelector(packageAddRepositoryInput);
|
repository = repository ?? getRepositorySelector(packageAddRepositoryInput);
|
||||||
data = data ?? {refresh: packageAddRefreshInput.checked};
|
|
||||||
|
|
||||||
if (packages) {
|
if (packages) {
|
||||||
bootstrap.Modal.getOrCreateInstance(packageAddModal).hide();
|
bootstrap.Modal.getOrCreateInstance(packageAddModal).hide();
|
||||||
const onSuccess = update => `Packages ${update} have been added`;
|
const onSuccess = update => `Packages ${update} have been added`;
|
||||||
const onFailure = error => `Package addition failed: ${error}`;
|
const onFailure = error => `Package addition failed: ${error}`;
|
||||||
const parameters = Object.assign({}, data, patches);
|
doPackageAction("/api/v1/service/add", [packages], repository, onSuccess, onFailure, patches);
|
||||||
doPackageAction("/api/v1/service/add", [packages], repository, onSuccess, onFailure, parameters);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,9 +95,6 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
{% if not auth.enabled or auth.username is not none %}
|
{% if not auth.enabled or auth.username is not none %}
|
||||||
<input id="package-info-refresh-input" type="checkbox" class="form-check-input" value="" checked>
|
|
||||||
<label for="package-info-refresh-input" class="form-check-label">update pacman databases</label>
|
|
||||||
|
|
||||||
<button id="package-info-update-button" type="submit" class="btn btn-success" onclick="packageInfoUpdate()" data-bs-dismiss="modal"><i class="bi bi-play"></i><span class="d-none d-sm-inline"> update</span></button>
|
<button id="package-info-update-button" type="submit" class="btn btn-success" onclick="packageInfoUpdate()" data-bs-dismiss="modal"><i class="bi bi-play"></i><span class="d-none d-sm-inline"> update</span></button>
|
||||||
<button id="package-info-remove-button" type="submit" class="btn btn-danger" onclick="packageInfoRemove()" data-bs-dismiss="modal"><i class="bi bi-trash"></i><span class="d-none d-sm-inline"> remove</span></button>
|
<button id="package-info-remove-button" type="submit" class="btn btn-danger" onclick="packageInfoRemove()" data-bs-dismiss="modal"><i class="bi bi-trash"></i><span class="d-none d-sm-inline"> remove</span></button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -138,8 +135,6 @@
|
|||||||
const packageInfoVariablesBlock = document.getElementById("package-info-variables-block");
|
const packageInfoVariablesBlock = document.getElementById("package-info-variables-block");
|
||||||
const packageInfoVariablesDiv = document.getElementById("package-info-variables-div");
|
const packageInfoVariablesDiv = document.getElementById("package-info-variables-div");
|
||||||
|
|
||||||
const packageInfoRefreshInput = document.getElementById("package-info-refresh-input");
|
|
||||||
|
|
||||||
function clearChart() {
|
function clearChart() {
|
||||||
packageInfoEventsUpdateChartCanvas.hidden = true;
|
packageInfoEventsUpdateChartCanvas.hidden = true;
|
||||||
if (packageInfoEventsUpdateChart) {
|
if (packageInfoEventsUpdateChart) {
|
||||||
@@ -409,7 +404,7 @@
|
|||||||
|
|
||||||
function packageInfoUpdate() {
|
function packageInfoUpdate() {
|
||||||
const packageBase = packageInfoModal.package;
|
const packageBase = packageInfoModal.package;
|
||||||
packagesAdd(packageBase, [], repository, {refresh: packageInfoRefreshInput.checked});
|
packagesAdd(packageBase, [], repository);
|
||||||
}
|
}
|
||||||
|
|
||||||
function showPackageInfo(packageBase) {
|
function showPackageInfo(packageBase) {
|
||||||
|
|||||||
@@ -73,19 +73,6 @@
|
|||||||
doPackageAction(url, currentSelection, repository, onSuccess, onFailure);
|
doPackageAction(url, currentSelection, repository, onSuccess, onFailure);
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshDatabases() {
|
|
||||||
const onSuccess = _ => "Pacman database update has been requested";
|
|
||||||
const onFailure = error => `Could not update pacman databases: ${error}`;
|
|
||||||
const parameters = {
|
|
||||||
refresh: true,
|
|
||||||
aur: false,
|
|
||||||
local: false,
|
|
||||||
manual: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
doPackageAction("/api/v1/service/update", [], repository, onSuccess, onFailure, parameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
function reload() {
|
function reload() {
|
||||||
table.bootstrapTable("showLoading");
|
table.bootstrapTable("showLoading");
|
||||||
|
|
||||||
|
|||||||
@@ -635,7 +635,6 @@ _set_new_action() {
|
|||||||
# ${!x} -> ${hello} -> "world"
|
# ${!x} -> ${hello} -> "world"
|
||||||
_shtab_ahriman() {
|
_shtab_ahriman() {
|
||||||
local completing_word="${COMP_WORDS[COMP_CWORD]}"
|
local completing_word="${COMP_WORDS[COMP_CWORD]}"
|
||||||
local previous_word="${COMP_WORDS[COMP_CWORD-1]}"
|
|
||||||
local completed_positional_actions
|
local completed_positional_actions
|
||||||
local current_action
|
local current_action
|
||||||
local current_action_args_start_index
|
local current_action_args_start_index
|
||||||
@@ -674,7 +673,6 @@ _shtab_ahriman() {
|
|||||||
|
|
||||||
if [[ "$current_action_nargs" != "*" ]] && \
|
if [[ "$current_action_nargs" != "*" ]] && \
|
||||||
[[ "$current_action_nargs" != "+" ]] && \
|
[[ "$current_action_nargs" != "+" ]] && \
|
||||||
[[ "$current_action_nargs" != "?" ]] && \
|
|
||||||
[[ "$current_action_nargs" != *"..." ]] && \
|
[[ "$current_action_nargs" != *"..." ]] && \
|
||||||
(( $word_index + 1 - $current_action_args_start_index - $pos_only >= \
|
(( $word_index + 1 - $current_action_args_start_index - $pos_only >= \
|
||||||
$current_action_nargs )); then
|
$current_action_nargs )); then
|
||||||
@@ -693,10 +691,6 @@ _shtab_ahriman() {
|
|||||||
if [[ $pos_only = 0 && "${completing_word}" == -* ]]; then
|
if [[ $pos_only = 0 && "${completing_word}" == -* ]]; then
|
||||||
# optional argument started: use option strings
|
# optional argument started: use option strings
|
||||||
COMPREPLY=( $(compgen -W "${current_option_strings[*]}" -- "${completing_word}") )
|
COMPREPLY=( $(compgen -W "${current_option_strings[*]}" -- "${completing_word}") )
|
||||||
elif [[ "${previous_word}" == ">" || "${previous_word}" == ">>" ||
|
|
||||||
"${previous_word}" =~ ^[12]">" || "${previous_word}" =~ ^[12]">>" ]]; then
|
|
||||||
# handle redirection operators
|
|
||||||
COMPREPLY=( $(compgen -f -- "${completing_word}") )
|
|
||||||
else
|
else
|
||||||
# use choices & compgen
|
# use choices & compgen
|
||||||
local IFS=$'\n' # items may contain spaces, so delimit using newline
|
local IFS=$'\n' # items may contain spaces, so delimit using newline
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
.TH AHRIMAN "1" "2026\-02\-02" "ahriman 2.19.4" "ArcH linux ReposItory MANager"
|
.TH AHRIMAN "1" "2025\-01\-05" "ahriman" "Generated Python Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
ahriman \- ArcH linux ReposItory MANager
|
ahriman
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B [0m[1;35mahriman[0m
|
.B ahriman
|
||||||
[[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
|
[-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} ...
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
ArcH linux ReposItory MANager
|
ArcH linux ReposItory MANager
|
||||||
|
|
||||||
@@ -195,9 +195,9 @@ remove user
|
|||||||
web server
|
web server
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman aur\-search'\/\fR
|
.SH COMMAND \fI\,'ahriman aur\-search'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman aur\-search[0m [[32m\-h[0m] [[32m\-e[0m] [[36m\-\-info | \-\-no\-info[0m]
|
usage: ahriman aur\-search [\-h] [\-e] [\-\-info | \-\-no\-info]
|
||||||
[[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]
|
[\-\-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}]
|
||||||
[32msearch [search ...][0m
|
search [search ...]
|
||||||
|
|
||||||
search for package in AUR using API
|
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
|
by name
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman help'\/\fR
|
.SH COMMAND \fI\,'ahriman help'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman help[0m [[32m\-h[0m] [32m[subcommand][0m
|
usage: ahriman help [\-h] [subcommand]
|
||||||
|
|
||||||
show help message for application or command and exit
|
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
|
show help message for specific command
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman help\-commands\-unsafe'\/\fR
|
.SH COMMAND \fI\,'ahriman help\-commands\-unsafe'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman help\-commands\-unsafe[0m [[32m\-h[0m] [32m[subcommand ...][0m
|
usage: ahriman help\-commands\-unsafe [\-h] [subcommand ...]
|
||||||
|
|
||||||
list unsafe commands as defined in default args
|
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
|
otherwise
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman help\-updates'\/\fR
|
.SH COMMAND \fI\,'ahriman help\-updates'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman help\-updates[0m [[32m\-h[0m] [[32m\-e[0m]
|
usage: ahriman help\-updates [\-h] [\-e]
|
||||||
|
|
||||||
request AUR for current version and compare with current service version
|
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
|
return non\-zero exit code if updates available
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman help\-version'\/\fR
|
.SH COMMAND \fI\,'ahriman help\-version'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman help\-version[0m [[32m\-h[0m]
|
usage: ahriman help\-version [\-h]
|
||||||
|
|
||||||
print application and its dependencies versions
|
print application and its dependencies versions
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman package\-add'\/\fR
|
.SH COMMAND \fI\,'ahriman package\-add'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman package\-add[0m [[32m\-h[0m] [[36m\-\-changes | \-\-no\-changes[0m] [[36m\-\-dependencies | \-\-no\-dependencies[0m] [[32m\-e[0m]
|
usage: ahriman package\-add [\-h] [\-\-changes | \-\-no\-changes] [\-\-dependencies | \-\-no\-dependencies] [\-e]
|
||||||
[[36m\-\-increment | \-\-no\-increment[0m] [[32m\-n[0m] [[32m\-y[0m]
|
[\-\-increment | \-\-no\-increment] [\-n] [\-y]
|
||||||
[[32m\-s [33m{auto,archive,aur,directory,local,remote,repository}[0m] [[32m\-u [33mUSERNAME[0m] [[32m\-v [33mVARIABLE[0m]
|
[\-s {auto,archive,aur,directory,local,remote,repository}] [\-u USERNAME] [\-v VARIABLE]
|
||||||
[32mpackage [package ...][0m
|
package [package ...]
|
||||||
|
|
||||||
add existing or new package to the build queue
|
add existing or new package to the build queue
|
||||||
|
|
||||||
@@ -303,7 +303,7 @@ build as user
|
|||||||
apply specified makepkg variables to the next build
|
apply specified makepkg variables to the next build
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman package\-changes'\/\fR
|
.SH COMMAND \fI\,'ahriman package\-changes'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman package\-changes[0m [[32m\-h[0m] [[32m\-e[0m] [32mpackage[0m
|
usage: ahriman package\-changes [\-h] [\-e] package
|
||||||
|
|
||||||
retrieve package changes stored in database
|
retrieve package changes stored in database
|
||||||
|
|
||||||
@@ -317,7 +317,7 @@ package base
|
|||||||
return non\-zero exit status if result is empty
|
return non\-zero exit status if result is empty
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman package\-changes\-remove'\/\fR
|
.SH COMMAND \fI\,'ahriman package\-changes\-remove'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman package\-changes\-remove[0m [[32m\-h[0m] [32mpackage[0m
|
usage: ahriman package\-changes\-remove [\-h] package
|
||||||
|
|
||||||
remove the package changes stored remotely
|
remove the package changes stored remotely
|
||||||
|
|
||||||
@@ -326,7 +326,7 @@ remove the package changes stored remotely
|
|||||||
package base
|
package base
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman package\-copy'\/\fR
|
.SH COMMAND \fI\,'ahriman package\-copy'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman package\-copy[0m [[32m\-h[0m] [[32m\-e[0m] [[36m\-\-remove[0m] [32msource[0m [32mpackage [package ...][0m
|
usage: ahriman package\-copy [\-h] [\-e] [\-\-remove] source package [package ...]
|
||||||
|
|
||||||
copy package and its metadata from another repository
|
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
|
remove package from the source repository after
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman package\-remove'\/\fR
|
.SH COMMAND \fI\,'ahriman package\-remove'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman package\-remove[0m [[32m\-h[0m] [32mpackage [package ...][0m
|
usage: ahriman package\-remove [\-h] package [package ...]
|
||||||
|
|
||||||
remove package from the repository
|
remove package from the repository
|
||||||
|
|
||||||
@@ -357,8 +357,8 @@ remove package from the repository
|
|||||||
package name or base
|
package name or base
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman package\-status'\/\fR
|
.SH COMMAND \fI\,'ahriman package\-status'\/\fR
|
||||||
[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]
|
usage: ahriman package\-status [\-h] [\-\-ahriman] [\-e] [\-\-info | \-\-no\-info] [\-s {unknown,pending,building,failed,success}]
|
||||||
[32m[package ...][0m
|
[package ...]
|
||||||
|
|
||||||
request status of the package
|
request status of the package
|
||||||
|
|
||||||
@@ -384,7 +384,7 @@ show additional package information
|
|||||||
filter packages by status
|
filter packages by status
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman package\-status\-remove'\/\fR
|
.SH COMMAND \fI\,'ahriman package\-status\-remove'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman package\-status\-remove[0m [[32m\-h[0m] [32mpackage [package ...][0m
|
usage: ahriman package\-status\-remove [\-h] package [package ...]
|
||||||
|
|
||||||
remove the package from the status page
|
remove the package from the status page
|
||||||
|
|
||||||
@@ -393,7 +393,7 @@ remove the package from the status page
|
|||||||
remove specified packages from status page
|
remove specified packages from status page
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman package\-status\-update'\/\fR
|
.SH COMMAND \fI\,'ahriman package\-status\-update'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman package\-status\-update[0m [[32m\-h[0m] [[32m\-s [33m{unknown,pending,building,failed,success}[0m] [32m[package ...][0m
|
usage: ahriman package\-status\-update [\-h] [\-s {unknown,pending,building,failed,success}] [package ...]
|
||||||
|
|
||||||
update package status on the status page
|
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
|
new package build status
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman patch\-add'\/\fR
|
.SH COMMAND \fI\,'ahriman patch\-add'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman patch\-add[0m [[32m\-h[0m] [32mpackage[0m [32mvariable[0m [32m[patch][0m
|
usage: ahriman patch\-add [\-h] package variable [patch]
|
||||||
|
|
||||||
create or update patched PKGBUILD function or variable
|
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
|
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
|
.SH COMMAND \fI\,'ahriman patch\-list'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman patch\-list[0m [[32m\-h[0m] [[32m\-e[0m] [[32m\-v [33mVARIABLE[0m] [32mpackage[0m
|
usage: ahriman patch\-list [\-h] [\-e] [\-v VARIABLE] package
|
||||||
|
|
||||||
list available patches for the package
|
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
|
if set, show only patches for specified PKGBUILD variables
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman patch\-remove'\/\fR
|
.SH COMMAND \fI\,'ahriman patch\-remove'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman patch\-remove[0m [[32m\-h[0m] [[32m\-v [33mVARIABLE[0m] [32mpackage[0m
|
usage: ahriman patch\-remove [\-h] [\-v VARIABLE] package
|
||||||
|
|
||||||
remove patches for the package
|
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
|
if not set, it will remove all patches related to the package
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman patch\-set\-add'\/\fR
|
.SH COMMAND \fI\,'ahriman patch\-set\-add'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman patch\-set\-add[0m [[32m\-h[0m] [[32m\-t [33mTRACK[0m] [32mpackage[0m
|
usage: ahriman patch\-set\-add [\-h] [\-t TRACK] package
|
||||||
|
|
||||||
create or update source patches
|
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
|
files which has to be tracked
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-backup'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-backup'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-backup[0m [[32m\-h[0m] [32mpath[0m
|
usage: ahriman repo\-backup [\-h] path
|
||||||
|
|
||||||
backup repository settings and database
|
backup repository settings and database
|
||||||
|
|
||||||
@@ -480,9 +480,9 @@ backup repository settings and database
|
|||||||
path of the output archive
|
path of the output archive
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-check'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-check'\/\fR
|
||||||
[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]
|
usage: ahriman repo\-check [\-h] [\-\-changes | \-\-no\-changes] [\-\-check\-files | \-\-no\-check\-files] [\-e] [\-\-vcs | \-\-no\-vcs]
|
||||||
[[32m\-y[0m]
|
[\-y]
|
||||||
[32m[package ...][0m
|
[package ...]
|
||||||
|
|
||||||
check for packages updates. Same as repo\-update \-\-dry\-run \-\-no\-manual
|
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
|
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
|
.SH COMMAND \fI\,'ahriman repo\-create\-keyring'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-create\-keyring[0m [[32m\-h[0m]
|
usage: ahriman repo\-create\-keyring [\-h]
|
||||||
|
|
||||||
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
|
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
|
.SH COMMAND \fI\,'ahriman repo\-create\-mirrorlist'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-create\-mirrorlist[0m [[32m\-h[0m]
|
usage: ahriman repo\-create\-mirrorlist [\-h]
|
||||||
|
|
||||||
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
|
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
|
.SH COMMAND \fI\,'ahriman repo\-daemon'\/\fR
|
||||||
[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]
|
usage: ahriman repo\-daemon [\-h] [\-i INTERVAL] [\-\-aur | \-\-no\-aur] [\-\-changes | \-\-no\-changes]
|
||||||
[[36m\-\-check\-files | \-\-no\-check\-files[0m] [[36m\-\-dependencies | \-\-no\-dependencies[0m] [[36m\-\-dry\-run[0m]
|
[\-\-check\-files | \-\-no\-check\-files] [\-\-dependencies | \-\-no\-dependencies] [\-\-dry\-run]
|
||||||
[[36m\-\-increment | \-\-no\-increment[0m] [[36m\-\-local | \-\-no\-local[0m] [[36m\-\-manual | \-\-no\-manual[0m]
|
[\-\-increment | \-\-no\-increment] [\-\-local | \-\-no\-local] [\-\-manual | \-\-no\-manual]
|
||||||
[[36m\-\-partitions | \-\-no\-partitions[0m] [[32m\-u [33mUSERNAME[0m] [[36m\-\-vcs | \-\-no\-vcs[0m] [[32m\-y[0m]
|
[\-\-partitions | \-\-no\-partitions] [\-u USERNAME] [\-\-vcs | \-\-no\-vcs] [\-y]
|
||||||
|
|
||||||
start process which periodically will run update process
|
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
|
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
|
.SH COMMAND \fI\,'ahriman repo\-rebuild'\/\fR
|
||||||
[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]
|
usage: ahriman repo\-rebuild [\-h] [\-\-depends\-on DEPENDS_ON] [\-\-dry\-run] [\-\-from\-database] [\-\-increment | \-\-no\-increment]
|
||||||
[[32m\-e[0m] [[32m\-s [33m{unknown,pending,building,failed,success}[0m] [[32m\-u [33mUSERNAME[0m]
|
[\-e] [\-s {unknown,pending,building,failed,success}] [\-u USERNAME]
|
||||||
|
|
||||||
force rebuild whole repository
|
force rebuild whole repository
|
||||||
|
|
||||||
@@ -620,7 +620,7 @@ filter packages by status. Requires \-\-from\-database to be set
|
|||||||
build as user
|
build as user
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-remove\-unknown'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-remove\-unknown'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-remove\-unknown[0m [[32m\-h[0m] [[36m\-\-dry\-run[0m]
|
usage: ahriman repo\-remove\-unknown [\-h] [\-\-dry\-run]
|
||||||
|
|
||||||
remove packages which are missing in AUR and do not have local PKGBUILDs
|
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
|
just perform check for packages without removal
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-report'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-report'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-report[0m [[32m\-h[0m]
|
usage: ahriman repo\-report [\-h]
|
||||||
|
|
||||||
generate repository report according to current settings
|
generate repository report according to current settings
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-restore'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-restore'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-restore[0m [[32m\-h[0m] [[32m\-o [33mOUTPUT[0m] [32mpath[0m
|
usage: ahriman repo\-restore [\-h] [\-o OUTPUT] path
|
||||||
|
|
||||||
restore settings and database
|
restore settings and database
|
||||||
|
|
||||||
@@ -649,7 +649,7 @@ path of the input archive
|
|||||||
root path of the extracted files
|
root path of the extracted files
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-sign'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-sign'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-sign[0m [[32m\-h[0m] [32m[package ...][0m
|
usage: ahriman repo\-sign [\-h] [package ...]
|
||||||
|
|
||||||
(re\-)sign packages and repository database according to current settings
|
(re\-)sign packages and repository database according to current settings
|
||||||
|
|
||||||
@@ -658,10 +658,10 @@ root path of the extracted files
|
|||||||
sign only specified packages
|
sign only specified packages
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-statistics'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-statistics'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-statistics[0m [[32m\-h[0m] [[36m\-\-chart [33mCHART[0m]
|
usage: ahriman repo\-statistics [\-h] [\-\-chart CHART]
|
||||||
[[32m\-e [33m{package\-outdated,package\-removed,package\-update\-failed,package\-updated}[0m]
|
[\-e {package\-outdated,package\-removed,package\-update\-failed,package\-updated}]
|
||||||
[[36m\-\-from\-date [33mFROM_DATE[0m] [[36m\-\-limit [33mLIMIT[0m] [[36m\-\-offset [33mOFFSET[0m] [[36m\-\-to\-date [33mTO_DATE[0m]
|
[\-\-from\-date FROM_DATE] [\-\-limit LIMIT] [\-\-offset OFFSET] [\-\-to\-date TO_DATE]
|
||||||
[32m[package][0m
|
[package]
|
||||||
|
|
||||||
fetch repository statistics
|
fetch repository statistics
|
||||||
|
|
||||||
@@ -695,7 +695,7 @@ skip specified amount of events
|
|||||||
only fetch events which are older than the date
|
only fetch events which are older than the date
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-status\-update'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-status\-update'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-status\-update[0m [[32m\-h[0m] [[32m\-s [33m{unknown,pending,building,failed,success}[0m]
|
usage: ahriman repo\-status\-update [\-h] [\-s {unknown,pending,building,failed,success}]
|
||||||
|
|
||||||
update repository status on the status page
|
update repository status on the status page
|
||||||
|
|
||||||
@@ -705,12 +705,12 @@ update repository status on the status page
|
|||||||
new status
|
new status
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-sync'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-sync'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-sync[0m [[32m\-h[0m]
|
usage: ahriman repo\-sync [\-h]
|
||||||
|
|
||||||
sync repository files to remote server according to current settings
|
sync repository files to remote server according to current settings
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-tree'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-tree'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-tree[0m [[32m\-h[0m] [[32m\-p [33mPARTITIONS[0m]
|
usage: ahriman repo\-tree [\-h] [\-p PARTITIONS]
|
||||||
|
|
||||||
dump repository tree based on packages dependencies
|
dump repository tree based on packages dependencies
|
||||||
|
|
||||||
@@ -720,7 +720,7 @@ dump repository tree based on packages dependencies
|
|||||||
also divide packages by independent partitions
|
also divide packages by independent partitions
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-triggers'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-triggers'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman repo\-triggers[0m [[32m\-h[0m] [32m[trigger ...][0m
|
usage: ahriman repo\-triggers [\-h] [trigger ...]
|
||||||
|
|
||||||
run triggers on empty build result as configured by settings
|
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
|
instead of running all triggers as set by configuration, just process specified ones in order of mention
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman repo\-update'\/\fR
|
.SH COMMAND \fI\,'ahriman repo\-update'\/\fR
|
||||||
[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]
|
usage: ahriman repo\-update [\-h] [\-\-aur | \-\-no\-aur] [\-\-changes | \-\-no\-changes] [\-\-check\-files | \-\-no\-check\-files]
|
||||||
[[36m\-\-dependencies | \-\-no\-dependencies[0m] [[36m\-\-dry\-run[0m] [[32m\-e[0m] [[36m\-\-increment | \-\-no\-increment[0m]
|
[\-\-dependencies | \-\-no\-dependencies] [\-\-dry\-run] [\-e] [\-\-increment | \-\-no\-increment]
|
||||||
[[36m\-\-local | \-\-no\-local[0m] [[36m\-\-manual | \-\-no\-manual[0m] [[32m\-u [33mUSERNAME[0m] [[36m\-\-vcs | \-\-no\-vcs[0m] [[32m\-y[0m]
|
[\-\-local | \-\-no\-local] [\-\-manual | \-\-no\-manual] [\-u USERNAME] [\-\-vcs | \-\-no\-vcs] [\-y]
|
||||||
[32m[package ...][0m
|
[package ...]
|
||||||
|
|
||||||
check for packages updates and run build process if requested
|
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
|
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
|
.SH COMMAND \fI\,'ahriman service\-clean'\/\fR
|
||||||
[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]
|
usage: ahriman service\-clean [\-h] [\-\-cache | \-\-no\-cache] [\-\-chroot | \-\-no\-chroot] [\-\-manual | \-\-no\-manual]
|
||||||
[[36m\-\-packages | \-\-no\-packages[0m] [[36m\-\-pacman | \-\-no\-pacman[0m]
|
[\-\-packages | \-\-no\-packages] [\-\-pacman | \-\-no\-pacman]
|
||||||
|
|
||||||
remove local caches
|
remove local caches
|
||||||
|
|
||||||
@@ -817,7 +817,7 @@ clear directory with built packages
|
|||||||
clear directory with pacman local database cache
|
clear directory with pacman local database cache
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman service\-config'\/\fR
|
.SH COMMAND \fI\,'ahriman service\-config'\/\fR
|
||||||
[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
|
usage: ahriman service\-config [\-h] [\-\-info | \-\-no\-info] [\-\-secure | \-\-no\-secure] [section] [key]
|
||||||
|
|
||||||
dump configuration for the specified architecture
|
dump configuration for the specified architecture
|
||||||
|
|
||||||
@@ -839,7 +839,7 @@ show additional information, e.g. configuration files
|
|||||||
hide passwords and secrets from output
|
hide passwords and secrets from output
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman service\-config\-validate'\/\fR
|
.SH COMMAND \fI\,'ahriman service\-config\-validate'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman service\-config\-validate[0m [[32m\-h[0m] [[32m\-e[0m]
|
usage: ahriman service\-config\-validate [\-h] [\-e]
|
||||||
|
|
||||||
validate configuration and print found errors
|
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
|
return non\-zero exit status if configuration is invalid
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman service\-key\-import'\/\fR
|
.SH COMMAND \fI\,'ahriman service\-key\-import'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman service\-key\-import[0m [[32m\-h[0m] [[36m\-\-key\-server [33mKEY_SERVER[0m] [32mkey[0m
|
usage: ahriman service\-key\-import [\-h] [\-\-key\-server KEY_SERVER] key
|
||||||
|
|
||||||
import PGP key from public sources to the repository user
|
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
|
key server for key import
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman service\-repositories'\/\fR
|
.SH COMMAND \fI\,'ahriman service\-repositories'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman service\-repositories[0m [[32m\-h[0m] [[36m\-\-id\-only | \-\-no\-id\-only[0m]
|
usage: ahriman service\-repositories [\-h] [\-\-id\-only | \-\-no\-id\-only]
|
||||||
|
|
||||||
list all available repositories
|
list all available repositories
|
||||||
|
|
||||||
@@ -873,7 +873,7 @@ list all available repositories
|
|||||||
show machine readable identifier instead
|
show machine readable identifier instead
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman service\-run'\/\fR
|
.SH COMMAND \fI\,'ahriman service\-run'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman service\-run[0m [[32m\-h[0m] [32mcommand [command ...][0m
|
usage: ahriman service\-run [\-h] command [command ...]
|
||||||
|
|
||||||
run multiple commands on success run of the previous command
|
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``
|
command to be run (quoted) without ``ahriman``
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman service\-setup'\/\fR
|
.SH COMMAND \fI\,'ahriman service\-setup'\/\fR
|
||||||
[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]
|
usage: ahriman service\-setup [\-h] [\-\-build\-as\-user BUILD_AS_USER] [\-\-from\-configuration FROM_CONFIGURATION]
|
||||||
[[36m\-\-generate\-salt | \-\-no\-generate\-salt[0m] [[36m\-\-makeflags\-jobs | \-\-no\-makeflags\-jobs[0m]
|
[\-\-generate\-salt | \-\-no\-generate\-salt] [\-\-makeflags\-jobs | \-\-no\-makeflags\-jobs]
|
||||||
[[36m\-\-mirror [33mMIRROR[0m] [[36m\-\-multilib | \-\-no\-multilib[0m] [36m\-\-packager [33mPACKAGER[0m [[36m\-\-server [33mSERVER[0m]
|
[\-\-mirror MIRROR] [\-\-multilib | \-\-no\-multilib] \-\-packager PACKAGER [\-\-server SERVER]
|
||||||
[[36m\-\-sign\-key [33mSIGN_KEY[0m] [[36m\-\-sign\-target [33m{disabled,packages,repository}[0m] [[36m\-\-web\-port [33mWEB_PORT[0m]
|
[\-\-sign\-key SIGN_KEY] [\-\-sign\-target {disabled,packages,repository}] [\-\-web\-port WEB_PORT]
|
||||||
[[36m\-\-web\-unix\-socket [33mWEB_UNIX_SOCKET[0m]
|
[\-\-web\-unix\-socket WEB_UNIX_SOCKET]
|
||||||
|
|
||||||
create initial service configuration, requires root
|
create initial service configuration, requires root
|
||||||
|
|
||||||
@@ -940,7 +940,7 @@ port of the web service
|
|||||||
path to unix socket used for interprocess communications
|
path to unix socket used for interprocess communications
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman service\-shell'\/\fR
|
.SH COMMAND \fI\,'ahriman service\-shell'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman service\-shell[0m [[32m\-h[0m] [[32m\-o [33mOUTPUT[0m] [32m[code][0m
|
usage: ahriman service\-shell [\-h] [\-o OUTPUT] [code]
|
||||||
|
|
||||||
drop into python shell
|
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
|
output commands and result to the file
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman service\-tree\-migrate'\/\fR
|
.SH COMMAND \fI\,'ahriman service\-tree\-migrate'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman service\-tree\-migrate[0m [[32m\-h[0m]
|
usage: ahriman service\-tree\-migrate [\-h]
|
||||||
|
|
||||||
migrate repository tree between versions
|
migrate repository tree between versions
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman user\-add'\/\fR
|
.SH COMMAND \fI\,'ahriman user\-add'\/\fR
|
||||||
[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]
|
usage: ahriman user\-add [\-h] [\-\-key KEY] [\-\-packager PACKAGER] [\-p PASSWORD] [\-R {unauthorized,read,reporter,full}]
|
||||||
[32musername[0m
|
username
|
||||||
|
|
||||||
update user for web services with the given password and role. In case if password was not entered it will be asked interactively
|
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
|
user access level
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman user\-list'\/\fR
|
.SH COMMAND \fI\,'ahriman user\-list'\/\fR
|
||||||
[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
|
usage: ahriman user\-list [\-h] [\-e] [\-R {unauthorized,read,reporter,full}] [username]
|
||||||
|
|
||||||
list users from the user mapping and their roles
|
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
|
filter users by role
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman user\-remove'\/\fR
|
.SH COMMAND \fI\,'ahriman user\-remove'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman user\-remove[0m [[32m\-h[0m] [32musername[0m
|
usage: ahriman user\-remove [\-h] username
|
||||||
|
|
||||||
remove user from the user mapping and update the configuration
|
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
|
username for web service
|
||||||
|
|
||||||
.SH COMMAND \fI\,'ahriman web'\/\fR
|
.SH COMMAND \fI\,'ahriman web'\/\fR
|
||||||
[1;34musage: [0m[1;35mahriman web[0m [[32m\-h[0m]
|
usage: ahriman web [\-h]
|
||||||
|
|
||||||
start web server
|
start web server
|
||||||
|
|
||||||
|
|||||||
@@ -99,9 +99,6 @@ _shtab_ahriman_options=(
|
|||||||
"--wait-timeout[wait for lock to be free. Negative value will lead to immediate application run even if there is lock file. In case of zero value, the application will wait infinitely (default\: -1)]:wait_timeout:"
|
"--wait-timeout[wait for lock to be free. Negative value will lead to immediate application run even if there is lock file. In case of zero value, the application will wait infinitely (default\: -1)]:wait_timeout:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_add_options=(
|
_shtab_ahriman_add_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--changes,--no-changes}"[calculate changes from the latest known commit if available (default\: True)]:changes:"
|
{--changes,--no-changes}"[calculate changes from the latest known commit if available (default\: True)]:changes:"
|
||||||
@@ -116,9 +113,6 @@ _shtab_ahriman_add_options=(
|
|||||||
"(*):package source (base name, path to local files, remote URL):"
|
"(*):package source (base name, path to local files, remote URL):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_add_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_aur_search_options=(
|
_shtab_ahriman_aur_search_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
||||||
@@ -127,9 +121,6 @@ _shtab_ahriman_aur_search_options=(
|
|||||||
"(*):search terms, can be specified multiple times, the result will match all terms:"
|
"(*):search terms, can be specified multiple times, the result will match all terms:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_aur_search_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_check_options=(
|
_shtab_ahriman_check_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--changes,--no-changes}"[calculate changes from the latest known commit if available (default\: True)]:changes:"
|
{--changes,--no-changes}"[calculate changes from the latest known commit if available (default\: True)]:changes:"
|
||||||
@@ -140,9 +131,6 @@ _shtab_ahriman_check_options=(
|
|||||||
"(*)::filter check by package base (default\: None):"
|
"(*)::filter check by package base (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_check_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_clean_options=(
|
_shtab_ahriman_clean_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--cache,--no-cache}"[clear directory with package caches (default\: False)]:cache:"
|
{--cache,--no-cache}"[clear directory with package caches (default\: False)]:cache:"
|
||||||
@@ -152,9 +140,6 @@ _shtab_ahriman_clean_options=(
|
|||||||
{--pacman,--no-pacman}"[clear directory with pacman local database cache (default\: False)]:pacman:"
|
{--pacman,--no-pacman}"[clear directory with pacman local database cache (default\: False)]:pacman:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_clean_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_config_options=(
|
_shtab_ahriman_config_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--info,--no-info}"[show additional information, e.g. configuration files (default\: True)]:info:"
|
{--info,--no-info}"[show additional information, e.g. configuration files (default\: True)]:info:"
|
||||||
@@ -163,17 +148,11 @@ _shtab_ahriman_config_options=(
|
|||||||
":filter settings by key (default\: None):"
|
":filter settings by key (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_config_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_config_validate_options=(
|
_shtab_ahriman_config_validate_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit status if configuration is invalid (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit status if configuration is invalid (default\: False)]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_config_validate_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_copy_options=(
|
_shtab_ahriman_copy_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
||||||
@@ -182,9 +161,6 @@ _shtab_ahriman_copy_options=(
|
|||||||
"(*):package base:"
|
"(*):package base:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_copy_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_daemon_options=(
|
_shtab_ahriman_daemon_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-i,--interval}"[interval between runs in seconds (default\: 43200)]:interval:"
|
{-i,--interval}"[interval between runs in seconds (default\: 43200)]:interval:"
|
||||||
@@ -202,40 +178,25 @@ _shtab_ahriman_daemon_options=(
|
|||||||
"*"{-y,--refresh}"[download fresh package databases from the mirror before actions, -yy to force refresh even if up to date (default\: False)]"
|
"*"{-y,--refresh}"[download fresh package databases from the mirror before actions, -yy to force refresh even if up to date (default\: False)]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_daemon_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_help_options=(
|
_shtab_ahriman_help_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
":show help message for specific command (default\: None):"
|
":show help message for specific command (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_help_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_help_commands_unsafe_options=(
|
_shtab_ahriman_help_commands_unsafe_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"(*)::instead of showing commands, just test command line for unsafe subcommand and return 0 in case if command is safe and 1 otherwise (default\: None):"
|
"(*)::instead of showing commands, just test command line for unsafe subcommand and return 0 in case if command is safe and 1 otherwise (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_help_commands_unsafe_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_help_updates_options=(
|
_shtab_ahriman_help_updates_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit code if updates available (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit code if updates available (default\: False)]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_help_updates_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_help_version_options=(
|
_shtab_ahriman_help_version_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_help_version_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_init_options=(
|
_shtab_ahriman_init_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:"
|
"--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:"
|
||||||
@@ -252,18 +213,12 @@ _shtab_ahriman_init_options=(
|
|||||||
"--web-unix-socket[path to unix socket used for interprocess communications (default\: None)]:web_unix_socket:"
|
"--web-unix-socket[path to unix socket used for interprocess communications (default\: None)]:web_unix_socket:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_init_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_key_import_options=(
|
_shtab_ahriman_key_import_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--key-server[key server for key import (default\: keyserver.ubuntu.com)]:key_server:"
|
"--key-server[key server for key import (default\: keyserver.ubuntu.com)]:key_server:"
|
||||||
":PGP key to import from public server:"
|
":PGP key to import from public server:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_key_import_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_package_add_options=(
|
_shtab_ahriman_package_add_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--changes,--no-changes}"[calculate changes from the latest known commit if available (default\: True)]:changes:"
|
{--changes,--no-changes}"[calculate changes from the latest known commit if available (default\: True)]:changes:"
|
||||||
@@ -278,26 +233,17 @@ _shtab_ahriman_package_add_options=(
|
|||||||
"(*):package source (base name, path to local files, remote URL):"
|
"(*):package source (base name, path to local files, remote URL):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_package_add_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_package_changes_options=(
|
_shtab_ahriman_package_changes_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
||||||
":package base:"
|
":package base:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_package_changes_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_package_changes_remove_options=(
|
_shtab_ahriman_package_changes_remove_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
":package base:"
|
":package base:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_package_changes_remove_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_package_copy_options=(
|
_shtab_ahriman_package_copy_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
||||||
@@ -306,17 +252,11 @@ _shtab_ahriman_package_copy_options=(
|
|||||||
"(*):package base:"
|
"(*):package base:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_package_copy_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_package_remove_options=(
|
_shtab_ahriman_package_remove_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"(*):package name or base:"
|
"(*):package name or base:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_package_remove_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_package_status_options=(
|
_shtab_ahriman_package_status_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--ahriman[get service status itself (default\: False)]"
|
"--ahriman[get service status itself (default\: False)]"
|
||||||
@@ -326,26 +266,17 @@ _shtab_ahriman_package_status_options=(
|
|||||||
"(*)::filter status by package base (default\: None):"
|
"(*)::filter status by package base (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_package_status_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_package_status_remove_options=(
|
_shtab_ahriman_package_status_remove_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"(*):remove specified packages from status page:"
|
"(*):remove specified packages from status page:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_package_status_remove_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_package_status_update_options=(
|
_shtab_ahriman_package_status_update_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-s,--status}"[new package build status (default\: success)]:status:(unknown pending building failed success)"
|
{-s,--status}"[new package build status (default\: success)]:status:(unknown pending building failed success)"
|
||||||
"(*)::set status for specified packages. If no packages supplied, service status will be updated (default\: None):"
|
"(*)::set status for specified packages. If no packages supplied, service status will be updated (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_package_status_update_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_package_update_options=(
|
_shtab_ahriman_package_update_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--changes,--no-changes}"[calculate changes from the latest known commit if available (default\: True)]:changes:"
|
{--changes,--no-changes}"[calculate changes from the latest known commit if available (default\: True)]:changes:"
|
||||||
@@ -360,9 +291,6 @@ _shtab_ahriman_package_update_options=(
|
|||||||
"(*):package source (base name, path to local files, remote URL):"
|
"(*):package source (base name, path to local files, remote URL):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_package_update_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_patch_add_options=(
|
_shtab_ahriman_patch_add_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
":package base:"
|
":package base:"
|
||||||
@@ -370,9 +298,6 @@ _shtab_ahriman_patch_add_options=(
|
|||||||
":path to file which contains function or variable value. If not set, the value will be read from stdin (default\: None):"
|
":path to file which contains function or variable value. If not set, the value will be read from stdin (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_patch_add_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_patch_list_options=(
|
_shtab_ahriman_patch_list_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
||||||
@@ -380,27 +305,18 @@ _shtab_ahriman_patch_list_options=(
|
|||||||
":package base:"
|
":package base:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_patch_list_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_patch_remove_options=(
|
_shtab_ahriman_patch_remove_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"*"{-v,--variable}"[should be used for single-function patches in case if you wold like to remove only specified PKGBUILD variables. In case if not set, it will remove all patches related to the package (default\: None)]:variable:"
|
"*"{-v,--variable}"[should be used for single-function patches in case if you wold like to remove only specified PKGBUILD variables. In case if not set, it will remove all patches related to the package (default\: None)]:variable:"
|
||||||
":package base:"
|
":package base:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_patch_remove_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_patch_set_add_options=(
|
_shtab_ahriman_patch_set_add_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"*"{-t,--track}"[files which has to be tracked (default\: \[\'\*.diff\', \'\*.patch\'\])]:track:"
|
"*"{-t,--track}"[files which has to be tracked (default\: \[\'\*.diff\', \'\*.patch\'\])]:track:"
|
||||||
":path to directory with changed files for patch addition\/update:"
|
":path to directory with changed files for patch addition\/update:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_patch_set_add_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_rebuild_options=(
|
_shtab_ahriman_rebuild_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"*--depends-on[only rebuild packages that depend on specified packages (default\: None)]:depends_on:"
|
"*--depends-on[only rebuild packages that depend on specified packages (default\: None)]:depends_on:"
|
||||||
@@ -412,33 +328,21 @@ _shtab_ahriman_rebuild_options=(
|
|||||||
{-u,--username}"[build as user (default\: None)]:username:"
|
{-u,--username}"[build as user (default\: None)]:username:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_rebuild_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_remove_options=(
|
_shtab_ahriman_remove_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"(*):package name or base:"
|
"(*):package name or base:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_remove_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_remove_unknown_options=(
|
_shtab_ahriman_remove_unknown_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--dry-run[just perform check for packages without removal (default\: False)]"
|
"--dry-run[just perform check for packages without removal (default\: False)]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_remove_unknown_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_backup_options=(
|
_shtab_ahriman_repo_backup_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
":path of the output archive:"
|
":path of the output archive:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_backup_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_check_options=(
|
_shtab_ahriman_repo_check_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--changes,--no-changes}"[calculate changes from the latest known commit if available (default\: True)]:changes:"
|
{--changes,--no-changes}"[calculate changes from the latest known commit if available (default\: True)]:changes:"
|
||||||
@@ -449,9 +353,6 @@ _shtab_ahriman_repo_check_options=(
|
|||||||
"(*)::filter check by package base (default\: None):"
|
"(*)::filter check by package base (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_check_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_clean_options=(
|
_shtab_ahriman_repo_clean_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--cache,--no-cache}"[clear directory with package caches (default\: False)]:cache:"
|
{--cache,--no-cache}"[clear directory with package caches (default\: False)]:cache:"
|
||||||
@@ -461,9 +362,6 @@ _shtab_ahriman_repo_clean_options=(
|
|||||||
{--pacman,--no-pacman}"[clear directory with pacman local database cache (default\: False)]:pacman:"
|
{--pacman,--no-pacman}"[clear directory with pacman local database cache (default\: False)]:pacman:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_clean_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_config_options=(
|
_shtab_ahriman_repo_config_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--info,--no-info}"[show additional information, e.g. configuration files (default\: True)]:info:"
|
{--info,--no-info}"[show additional information, e.g. configuration files (default\: True)]:info:"
|
||||||
@@ -472,31 +370,19 @@ _shtab_ahriman_repo_config_options=(
|
|||||||
":filter settings by key (default\: None):"
|
":filter settings by key (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_config_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_config_validate_options=(
|
_shtab_ahriman_repo_config_validate_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit status if configuration is invalid (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit status if configuration is invalid (default\: False)]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_config_validate_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_create_keyring_options=(
|
_shtab_ahriman_repo_create_keyring_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_create_keyring_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_create_mirrorlist_options=(
|
_shtab_ahriman_repo_create_mirrorlist_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_create_mirrorlist_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_daemon_options=(
|
_shtab_ahriman_repo_daemon_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-i,--interval}"[interval between runs in seconds (default\: 43200)]:interval:"
|
{-i,--interval}"[interval between runs in seconds (default\: 43200)]:interval:"
|
||||||
@@ -514,9 +400,6 @@ _shtab_ahriman_repo_daemon_options=(
|
|||||||
"*"{-y,--refresh}"[download fresh package databases from the mirror before actions, -yy to force refresh even if up to date (default\: False)]"
|
"*"{-y,--refresh}"[download fresh package databases from the mirror before actions, -yy to force refresh even if up to date (default\: False)]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_daemon_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_init_options=(
|
_shtab_ahriman_repo_init_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:"
|
"--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:"
|
||||||
@@ -533,9 +416,6 @@ _shtab_ahriman_repo_init_options=(
|
|||||||
"--web-unix-socket[path to unix socket used for interprocess communications (default\: None)]:web_unix_socket:"
|
"--web-unix-socket[path to unix socket used for interprocess communications (default\: None)]:web_unix_socket:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_init_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_rebuild_options=(
|
_shtab_ahriman_repo_rebuild_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"*--depends-on[only rebuild packages that depend on specified packages (default\: None)]:depends_on:"
|
"*--depends-on[only rebuild packages that depend on specified packages (default\: None)]:depends_on:"
|
||||||
@@ -547,33 +427,21 @@ _shtab_ahriman_repo_rebuild_options=(
|
|||||||
{-u,--username}"[build as user (default\: None)]:username:"
|
{-u,--username}"[build as user (default\: None)]:username:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_rebuild_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_remove_unknown_options=(
|
_shtab_ahriman_repo_remove_unknown_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--dry-run[just perform check for packages without removal (default\: False)]"
|
"--dry-run[just perform check for packages without removal (default\: False)]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_remove_unknown_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_report_options=(
|
_shtab_ahriman_repo_report_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_report_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_restore_options=(
|
_shtab_ahriman_repo_restore_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-o,--output}"[root path of the extracted files (default\: \/)]:output:"
|
{-o,--output}"[root path of the extracted files (default\: \/)]:output:"
|
||||||
":path of the input archive:"
|
":path of the input archive:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_restore_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_setup_options=(
|
_shtab_ahriman_repo_setup_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:"
|
"--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:"
|
||||||
@@ -590,17 +458,11 @@ _shtab_ahriman_repo_setup_options=(
|
|||||||
"--web-unix-socket[path to unix socket used for interprocess communications (default\: None)]:web_unix_socket:"
|
"--web-unix-socket[path to unix socket used for interprocess communications (default\: None)]:web_unix_socket:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_setup_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_sign_options=(
|
_shtab_ahriman_repo_sign_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"(*)::sign only specified packages (default\: None):"
|
"(*)::sign only specified packages (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_sign_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_statistics_options=(
|
_shtab_ahriman_repo_statistics_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--chart[create updates chart and save it to the specified path (default\: None)]:chart:"
|
"--chart[create updates chart and save it to the specified path (default\: None)]:chart:"
|
||||||
@@ -612,40 +474,25 @@ _shtab_ahriman_repo_statistics_options=(
|
|||||||
":fetch only events for the specified package (default\: None):"
|
":fetch only events for the specified package (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_statistics_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_status_update_options=(
|
_shtab_ahriman_repo_status_update_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-s,--status}"[new status (default\: success)]:status:(unknown pending building failed success)"
|
{-s,--status}"[new status (default\: success)]:status:(unknown pending building failed success)"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_status_update_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_sync_options=(
|
_shtab_ahriman_repo_sync_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_sync_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_tree_options=(
|
_shtab_ahriman_repo_tree_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-p,--partitions}"[also divide packages by independent partitions (default\: 1)]:partitions:"
|
{-p,--partitions}"[also divide packages by independent partitions (default\: 1)]:partitions:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_tree_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_triggers_options=(
|
_shtab_ahriman_repo_triggers_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"(*)::instead of running all triggers as set by configuration, just process specified ones in order of mention (default\: None):"
|
"(*)::instead of running all triggers as set by configuration, just process specified ones in order of mention (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_triggers_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_repo_update_options=(
|
_shtab_ahriman_repo_update_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--aur,--no-aur}"[enable or disable checking for AUR updates (default\: True)]:aur:"
|
{--aur,--no-aur}"[enable or disable checking for AUR updates (default\: True)]:aur:"
|
||||||
@@ -663,24 +510,15 @@ _shtab_ahriman_repo_update_options=(
|
|||||||
"(*)::filter check by package base (default\: None):"
|
"(*)::filter check by package base (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_repo_update_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_report_options=(
|
_shtab_ahriman_report_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_report_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_run_options=(
|
_shtab_ahriman_run_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"(*):command to be run (quoted) without \`\`ahriman\`\`:"
|
"(*):command to be run (quoted) without \`\`ahriman\`\`:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_run_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_search_options=(
|
_shtab_ahriman_search_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
||||||
@@ -689,9 +527,6 @@ _shtab_ahriman_search_options=(
|
|||||||
"(*):search terms, can be specified multiple times, the result will match all terms:"
|
"(*):search terms, can be specified multiple times, the result will match all terms:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_search_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_service_clean_options=(
|
_shtab_ahriman_service_clean_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--cache,--no-cache}"[clear directory with package caches (default\: False)]:cache:"
|
{--cache,--no-cache}"[clear directory with package caches (default\: False)]:cache:"
|
||||||
@@ -701,9 +536,6 @@ _shtab_ahriman_service_clean_options=(
|
|||||||
{--pacman,--no-pacman}"[clear directory with pacman local database cache (default\: False)]:pacman:"
|
{--pacman,--no-pacman}"[clear directory with pacman local database cache (default\: False)]:pacman:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_service_clean_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_service_config_options=(
|
_shtab_ahriman_service_config_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--info,--no-info}"[show additional information, e.g. configuration files (default\: True)]:info:"
|
{--info,--no-info}"[show additional information, e.g. configuration files (default\: True)]:info:"
|
||||||
@@ -712,42 +544,27 @@ _shtab_ahriman_service_config_options=(
|
|||||||
":filter settings by key (default\: None):"
|
":filter settings by key (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_service_config_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_service_config_validate_options=(
|
_shtab_ahriman_service_config_validate_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit status if configuration is invalid (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit status if configuration is invalid (default\: False)]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_service_config_validate_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_service_key_import_options=(
|
_shtab_ahriman_service_key_import_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--key-server[key server for key import (default\: keyserver.ubuntu.com)]:key_server:"
|
"--key-server[key server for key import (default\: keyserver.ubuntu.com)]:key_server:"
|
||||||
":PGP key to import from public server:"
|
":PGP key to import from public server:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_service_key_import_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_service_repositories_options=(
|
_shtab_ahriman_service_repositories_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--id-only,--no-id-only}"[show machine readable identifier instead (default\: False)]:id_only:"
|
{--id-only,--no-id-only}"[show machine readable identifier instead (default\: False)]:id_only:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_service_repositories_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_service_run_options=(
|
_shtab_ahriman_service_run_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"(*):command to be run (quoted) without \`\`ahriman\`\`:"
|
"(*):command to be run (quoted) without \`\`ahriman\`\`:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_service_run_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_service_setup_options=(
|
_shtab_ahriman_service_setup_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:"
|
"--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:"
|
||||||
@@ -764,25 +581,16 @@ _shtab_ahriman_service_setup_options=(
|
|||||||
"--web-unix-socket[path to unix socket used for interprocess communications (default\: None)]:web_unix_socket:"
|
"--web-unix-socket[path to unix socket used for interprocess communications (default\: None)]:web_unix_socket:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_service_setup_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_service_shell_options=(
|
_shtab_ahriman_service_shell_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-o,--output}"[output commands and result to the file (default\: None)]:output:"
|
{-o,--output}"[output commands and result to the file (default\: None)]:output:"
|
||||||
":instead of dropping into shell, just execute the specified code (default\: None):"
|
":instead of dropping into shell, just execute the specified code (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_service_shell_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_service_tree_migrate_options=(
|
_shtab_ahriman_service_tree_migrate_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_service_tree_migrate_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_setup_options=(
|
_shtab_ahriman_setup_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:"
|
"--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:"
|
||||||
@@ -799,26 +607,17 @@ _shtab_ahriman_setup_options=(
|
|||||||
"--web-unix-socket[path to unix socket used for interprocess communications (default\: None)]:web_unix_socket:"
|
"--web-unix-socket[path to unix socket used for interprocess communications (default\: None)]:web_unix_socket:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_setup_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_shell_options=(
|
_shtab_ahriman_shell_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-o,--output}"[output commands and result to the file (default\: None)]:output:"
|
{-o,--output}"[output commands and result to the file (default\: None)]:output:"
|
||||||
":instead of dropping into shell, just execute the specified code (default\: None):"
|
":instead of dropping into shell, just execute the specified code (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_shell_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_sign_options=(
|
_shtab_ahriman_sign_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"(*)::sign only specified packages (default\: None):"
|
"(*)::sign only specified packages (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_sign_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_status_options=(
|
_shtab_ahriman_status_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--ahriman[get service status itself (default\: False)]"
|
"--ahriman[get service status itself (default\: False)]"
|
||||||
@@ -828,25 +627,16 @@ _shtab_ahriman_status_options=(
|
|||||||
"(*)::filter status by package base (default\: None):"
|
"(*)::filter status by package base (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_status_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_status_update_options=(
|
_shtab_ahriman_status_update_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-s,--status}"[new package build status (default\: success)]:status:(unknown pending building failed success)"
|
{-s,--status}"[new package build status (default\: success)]:status:(unknown pending building failed success)"
|
||||||
"(*)::set status for specified packages. If no packages supplied, service status will be updated (default\: None):"
|
"(*)::set status for specified packages. If no packages supplied, service status will be updated (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_status_update_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_sync_options=(
|
_shtab_ahriman_sync_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_sync_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_update_options=(
|
_shtab_ahriman_update_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{--aur,--no-aur}"[enable or disable checking for AUR updates (default\: True)]:aur:"
|
{--aur,--no-aur}"[enable or disable checking for AUR updates (default\: True)]:aur:"
|
||||||
@@ -864,9 +654,6 @@ _shtab_ahriman_update_options=(
|
|||||||
"(*)::filter check by package base (default\: None):"
|
"(*)::filter check by package base (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_update_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_user_add_options=(
|
_shtab_ahriman_user_add_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
"--key[optional PGP key used by this user. The private key must be imported (default\: None)]:key:"
|
"--key[optional PGP key used by this user. The private key must be imported (default\: None)]:key:"
|
||||||
@@ -876,9 +663,6 @@ _shtab_ahriman_user_add_options=(
|
|||||||
":username for web service:"
|
":username for web service:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_user_add_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_user_list_options=(
|
_shtab_ahriman_user_list_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
{-e,--exit-code}"[return non-zero exit status if result is empty (default\: False)]"
|
||||||
@@ -886,41 +670,25 @@ _shtab_ahriman_user_list_options=(
|
|||||||
":filter users by username (default\: None):"
|
":filter users by username (default\: None):"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_user_list_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_user_remove_options=(
|
_shtab_ahriman_user_remove_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
":username for web service:"
|
":username for web service:"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_user_remove_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_version_options=(
|
_shtab_ahriman_version_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_version_defaults_added=0
|
|
||||||
|
|
||||||
_shtab_ahriman_web_options=(
|
_shtab_ahriman_web_options=(
|
||||||
"(- : *)"{-h,--help}"[show this help message and exit]"
|
"(- : *)"{-h,--help}"[show this help message and exit]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# guard to ensure default positional specs are added only once per session
|
|
||||||
_shtab_ahriman_web_defaults_added=0
|
|
||||||
|
|
||||||
|
|
||||||
_shtab_ahriman() {
|
_shtab_ahriman() {
|
||||||
local context state line curcontext="$curcontext" one_or_more='(*)' remainder='(-)*' default='*::: :->ahriman'
|
local context state line curcontext="$curcontext" one_or_more='(-)*' remainder='(*)'
|
||||||
|
|
||||||
# Add default positional/remainder specs only if none exist, and only once per session
|
if ((${_shtab_ahriman_options[(I)${(q)one_or_more}*]} + ${_shtab_ahriman_options[(I)${(q)remainder}*]} == 0)); then # noqa: E501
|
||||||
if (( ! _shtab_ahriman_defaults_added )); then
|
_shtab_ahriman_options+=(': :_shtab_ahriman_commands' '*::: :->ahriman')
|
||||||
if (( ${_shtab_ahriman_options[(I)${(q)one_or_more}*]} + ${_shtab_ahriman_options[(I)${(q)remainder}*]} + ${_shtab_ahriman_options[(I)${(q)default}]} == 0 )); then
|
|
||||||
_shtab_ahriman_options+=(': :_shtab_ahriman_commands' '*::: :->ahriman')
|
|
||||||
fi
|
|
||||||
_shtab_ahriman_defaults_added=1
|
|
||||||
fi
|
fi
|
||||||
_arguments -C -s $_shtab_ahriman_options
|
_arguments -C -s $_shtab_ahriman_options
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2021-2025 ahriman team.
|
# Copyright (c) 2021-2023 ahriman team.
|
||||||
#
|
#
|
||||||
# This file is part of ahriman
|
# This file is part of ahriman
|
||||||
# (see https://github.com/arcan1s/ahriman).
|
# (see https://github.com/arcan1s/ahriman).
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2021-2025 ahriman team.
|
# Copyright (c) 2021-2023 ahriman team.
|
||||||
#
|
#
|
||||||
# This file is part of ahriman
|
# This file is part of ahriman
|
||||||
# (see https://github.com/arcan1s/ahriman).
|
# (see https://github.com/arcan1s/ahriman).
|
||||||
@@ -58,23 +58,19 @@ web = [
|
|||||||
"aiohttp_cors",
|
"aiohttp_cors",
|
||||||
"aiohttp_jinja2",
|
"aiohttp_jinja2",
|
||||||
]
|
]
|
||||||
web-auth = [
|
web_api-docs = [
|
||||||
|
"ahriman[web]",
|
||||||
|
"aiohttp-apispec",
|
||||||
|
"setuptools", # required by aiohttp-apispec
|
||||||
|
]
|
||||||
|
web_auth = [
|
||||||
"ahriman[web]",
|
"ahriman[web]",
|
||||||
"aiohttp_session",
|
"aiohttp_session",
|
||||||
"aiohttp_security",
|
"aiohttp_security",
|
||||||
"cryptography",
|
"cryptography",
|
||||||
]
|
]
|
||||||
web-docs = [
|
web_oauth2 = [
|
||||||
"ahriman[web]",
|
"ahriman[web_auth]",
|
||||||
"aiohttp-apispec",
|
|
||||||
"setuptools", # required by aiohttp-apispec
|
|
||||||
]
|
|
||||||
web-metrics = [
|
|
||||||
"ahriman[web]",
|
|
||||||
"aiohttp-openmetrics",
|
|
||||||
]
|
|
||||||
web-oauth2 = [
|
|
||||||
"ahriman[web-auth]",
|
|
||||||
"aioauth-client",
|
"aioauth-client",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ services:
|
|||||||
AHRIMAN_OUTPUT: console
|
AHRIMAN_OUTPUT: console
|
||||||
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
||||||
AHRIMAN_PORT: 8080
|
AHRIMAN_PORT: 8080
|
||||||
AHRIMAN_POSTSETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
AHRIMAN_PRESETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
||||||
AHRIMAN_REPOSITORY: ahriman-demo
|
AHRIMAN_REPOSITORY: ahriman-demo
|
||||||
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ services:
|
|||||||
AHRIMAN_OUTPUT: console
|
AHRIMAN_OUTPUT: console
|
||||||
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
||||||
AHRIMAN_PORT: 8080
|
AHRIMAN_PORT: 8080
|
||||||
AHRIMAN_POSTSETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
AHRIMAN_PRESETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
||||||
AHRIMAN_REPOSITORY: ahriman-demo
|
AHRIMAN_REPOSITORY: ahriman-demo
|
||||||
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ services:
|
|||||||
AHRIMAN_OUTPUT: console
|
AHRIMAN_OUTPUT: console
|
||||||
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
||||||
AHRIMAN_PORT: 8080
|
AHRIMAN_PORT: 8080
|
||||||
AHRIMAN_POSTSETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
AHRIMAN_PRESETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
||||||
AHRIMAN_REPOSITORY: ahriman-demo
|
AHRIMAN_REPOSITORY: ahriman-demo
|
||||||
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ services:
|
|||||||
AHRIMAN_OUTPUT: console
|
AHRIMAN_OUTPUT: console
|
||||||
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
||||||
AHRIMAN_PORT: 8080
|
AHRIMAN_PORT: 8080
|
||||||
AHRIMAN_POSTSETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
AHRIMAN_PRESETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
||||||
AHRIMAN_REPOSITORY: ahriman-demo
|
AHRIMAN_REPOSITORY: ahriman-demo
|
||||||
AHRIMAN_REPOSITORY_SERVER: http://frontend/repo/$$repo/$$arch
|
AHRIMAN_REPOSITORY_SERVER: http://frontend/repo/$$repo/$$arch
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ services:
|
|||||||
AHRIMAN_PACMAN_MIRROR: https://de.mirror.archlinux32.org/$$arch/$$repo
|
AHRIMAN_PACMAN_MIRROR: https://de.mirror.archlinux32.org/$$arch/$$repo
|
||||||
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
||||||
AHRIMAN_PORT: 8080
|
AHRIMAN_PORT: 8080
|
||||||
AHRIMAN_POSTSETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
AHRIMAN_PRESETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
||||||
AHRIMAN_REPOSITORY: ahriman-demo
|
AHRIMAN_REPOSITORY: ahriman-demo
|
||||||
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ services:
|
|||||||
AHRIMAN_OUTPUT: console
|
AHRIMAN_OUTPUT: console
|
||||||
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
||||||
AHRIMAN_PORT: 8080
|
AHRIMAN_PORT: 8080
|
||||||
AHRIMAN_POSTSETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
AHRIMAN_POSTSETUP_COMMAND: ahriman --architecture x86_64 --repository another-demo service-setup --build-as-user ahriman --packager 'ahriman bot <ahriman@example.com>'
|
||||||
AHRIMAN_PRESETUP_COMMAND: ahriman --architecture x86_64 --repository another-demo service-setup --build-as-user ahriman --packager 'ahriman bot <ahriman@example.com>'
|
AHRIMAN_PRESETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
||||||
AHRIMAN_REPOSITORY: ahriman-demo
|
AHRIMAN_REPOSITORY: ahriman-demo
|
||||||
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ services:
|
|||||||
AHRIMAN_OAUTH_CLIENT_SECRET: ${AHRIMAN_OAUTH_CLIENT_SECRET}
|
AHRIMAN_OAUTH_CLIENT_SECRET: ${AHRIMAN_OAUTH_CLIENT_SECRET}
|
||||||
AHRIMAN_OUTPUT: console
|
AHRIMAN_OUTPUT: console
|
||||||
AHRIMAN_PORT: 8080
|
AHRIMAN_PORT: 8080
|
||||||
AHRIMAN_POSTSETUP_COMMAND: sudo -u ahriman ahriman user-add ${AHRIMAN_OAUTH_USER} -R full -p ""
|
AHRIMAN_PRESETUP_COMMAND: sudo -u ahriman ahriman user-add ${AHRIMAN_OAUTH_USER} -R full -p ""
|
||||||
AHRIMAN_REPOSITORY: ahriman-demo
|
AHRIMAN_REPOSITORY: ahriman-demo
|
||||||
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
AHRIMAN_DEBUG: yes
|
AHRIMAN_DEBUG: yes
|
||||||
AHRIMAN_OUTPUT: console
|
AHRIMAN_OUTPUT: console
|
||||||
AHRIMAN_POSTSETUP_COMMAND: sudo -u ahriman gpg --import /run/secrets/key
|
AHRIMAN_PRESETUP_COMMAND: sudo -u ahriman gpg --import /run/secrets/key
|
||||||
AHRIMAN_REPOSITORY: ahriman-demo
|
AHRIMAN_REPOSITORY: ahriman-demo
|
||||||
|
|
||||||
configs:
|
configs:
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ services:
|
|||||||
AHRIMAN_OUTPUT: console
|
AHRIMAN_OUTPUT: console
|
||||||
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
AHRIMAN_PASSWORD: ${AHRIMAN_PASSWORD}
|
||||||
AHRIMAN_PORT: 8080
|
AHRIMAN_PORT: 8080
|
||||||
AHRIMAN_POSTSETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
AHRIMAN_PRESETUP_COMMAND: (cat /run/secrets/password; echo; cat /run/secrets/password) | sudo -u ahriman ahriman user-add demo -R full
|
||||||
AHRIMAN_REPOSITORY: ahriman-demo
|
AHRIMAN_REPOSITORY: ahriman-demo
|
||||||
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
AHRIMAN_UNIX_SOCKET: /var/lib/ahriman/ahriman/ahriman.sock
|
||||||
|
|
||||||
|
|||||||
@@ -17,4 +17,4 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
__version__ = "2.19.4"
|
__version__ = "2.17.1"
|
||||||
|
|||||||
@@ -133,18 +133,18 @@ class Application(ApplicationPackages, ApplicationRepository):
|
|||||||
if not process_dependencies or not packages:
|
if not process_dependencies or not packages:
|
||||||
return packages
|
return packages
|
||||||
|
|
||||||
def missing_dependencies(sources: Iterable[Package]) -> dict[str, str | None]:
|
def missing_dependencies(source: Iterable[Package]) -> dict[str, str | None]:
|
||||||
# append list of known packages with packages which are in current sources
|
# append list of known packages with packages which are in current sources
|
||||||
satisfied_packages = known_packages | {
|
satisfied_packages = known_packages | {
|
||||||
single
|
single
|
||||||
for source in sources
|
for package in source
|
||||||
for single in source.packages_full
|
for single in package.packages_full
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
dependency: source.packager
|
dependency: package.packager
|
||||||
for source in sources
|
for package in source
|
||||||
for dependency in source.depends_build
|
for dependency in package.depends_build
|
||||||
if dependency not in satisfied_packages
|
if dependency not in satisfied_packages
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,7 +156,7 @@ class Application(ApplicationPackages, ApplicationRepository):
|
|||||||
# there is local cache, load package from it
|
# there is local cache, load package from it
|
||||||
leaf = Package.from_build(source_dir, self.repository.architecture, packager)
|
leaf = Package.from_build(source_dir, self.repository.architecture, packager)
|
||||||
else:
|
else:
|
||||||
leaf = Package.from_aur(package_name, packager, include_provides=True)
|
leaf = Package.from_aur(package_name, packager)
|
||||||
portion[leaf.base] = leaf
|
portion[leaf.base] = leaf
|
||||||
|
|
||||||
# register package in the database
|
# register package in the database
|
||||||
|
|||||||
@@ -72,17 +72,16 @@ class Setup(Handler):
|
|||||||
|
|
||||||
application = Application(repository_id, configuration, report=report)
|
application = Application(repository_id, configuration, report=report)
|
||||||
|
|
||||||
with application.repository.paths.preserve_owner():
|
Setup.configuration_create_makepkg(args.packager, args.makeflags_jobs, application.repository.paths)
|
||||||
Setup.configuration_create_makepkg(args.packager, args.makeflags_jobs, application.repository.paths)
|
Setup.executable_create(application.repository.paths, repository_id)
|
||||||
Setup.executable_create(application.repository.paths, repository_id)
|
repository_server = f"file://{application.repository.paths.repository}" if args.server is None else args.server
|
||||||
repository_server = f"file://{application.repository.paths.repository}" if args.server is None else args.server
|
Setup.configuration_create_devtools(
|
||||||
Setup.configuration_create_devtools(
|
repository_id, args.from_configuration, args.mirror, args.multilib, repository_server)
|
||||||
repository_id, args.from_configuration, args.mirror, args.multilib, repository_server)
|
Setup.configuration_create_sudo(application.repository.paths, repository_id)
|
||||||
Setup.configuration_create_sudo(application.repository.paths, repository_id)
|
|
||||||
|
|
||||||
application.repository.repo.init()
|
application.repository.repo.init()
|
||||||
# lazy database sync
|
# lazy database sync
|
||||||
application.repository.pacman.handle # pylint: disable=pointless-statement
|
application.repository.pacman.handle # pylint: disable=pointless-statement
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _set_service_setup_parser(root: SubParserAction) -> argparse.ArgumentParser:
|
def _set_service_setup_parser(root: SubParserAction) -> argparse.ArgumentParser:
|
||||||
@@ -281,5 +280,6 @@ class Setup(Handler):
|
|||||||
command = Setup.build_command(paths.root, repository_id)
|
command = Setup.build_command(paths.root, repository_id)
|
||||||
command.unlink(missing_ok=True)
|
command.unlink(missing_ok=True)
|
||||||
command.symlink_to(Setup.ARCHBUILD_COMMAND_PATH)
|
command.symlink_to(Setup.ARCHBUILD_COMMAND_PATH)
|
||||||
|
paths.chown(command) # we would like to keep owner inside ahriman's home
|
||||||
|
|
||||||
arguments = [_set_service_setup_parser]
|
arguments = [_set_service_setup_parser]
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ class Validate(Handler):
|
|||||||
"""
|
"""
|
||||||
from ahriman.core.configuration.validator import Validator
|
from ahriman.core.configuration.validator import Validator
|
||||||
|
|
||||||
schema = Validate.schema(configuration)
|
schema = Validate.schema(repository_id, configuration)
|
||||||
validator = Validator(configuration=configuration, schema=schema)
|
validator = Validator(configuration=configuration, schema=schema)
|
||||||
|
|
||||||
if validator.validate(configuration.dump()):
|
if validator.validate(configuration.dump()):
|
||||||
@@ -83,11 +83,12 @@ class Validate(Handler):
|
|||||||
return parser
|
return parser
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def schema(configuration: Configuration) -> ConfigurationSchema:
|
def schema(repository_id: RepositoryId, configuration: Configuration) -> ConfigurationSchema:
|
||||||
"""
|
"""
|
||||||
get schema with triggers
|
get schema with triggers
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
repository_id(RepositoryId): repository unique identifier
|
||||||
configuration(Configuration): configuration instance
|
configuration(Configuration): configuration instance
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@@ -106,12 +107,12 @@ class Validate(Handler):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
# default settings if any
|
# default settings if any
|
||||||
for schema_name, schema in trigger_class.configuration_schema(None).items():
|
for schema_name, schema in trigger_class.configuration_schema(repository_id, None).items():
|
||||||
erased = Validate.schema_erase_required(copy.deepcopy(schema))
|
erased = Validate.schema_erase_required(copy.deepcopy(schema))
|
||||||
root[schema_name] = Validate.schema_merge(root.get(schema_name, {}), erased)
|
root[schema_name] = Validate.schema_merge(root.get(schema_name, {}), erased)
|
||||||
|
|
||||||
# settings according to enabled triggers
|
# settings according to enabled triggers
|
||||||
for schema_name, schema in trigger_class.configuration_schema(configuration).items():
|
for schema_name, schema in trigger_class.configuration_schema(repository_id, configuration).items():
|
||||||
root[schema_name] = Validate.schema_merge(root.get(schema_name, {}), copy.deepcopy(schema))
|
root[schema_name] = Validate.schema_merge(root.get(schema_name, {}), copy.deepcopy(schema))
|
||||||
|
|
||||||
return root
|
return root
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import argparse
|
|||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from importlib import metadata
|
from importlib import metadata
|
||||||
from typing import ClassVar
|
from typing import ClassVar
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ class Versions(Handler):
|
|||||||
return parser
|
return parser
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def package_dependencies(root: str) -> Iterator[tuple[str, str]]:
|
def package_dependencies(root: str) -> Generator[tuple[str, str], None, None]:
|
||||||
"""
|
"""
|
||||||
extract list of ahriman package dependencies installed into system with their versions
|
extract list of ahriman package dependencies installed into system with their versions
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ class Versions(Handler):
|
|||||||
Yields:
|
Yields:
|
||||||
tuple[str, str]: map of installed dependency to its version
|
tuple[str, str]: map of installed dependency to its version
|
||||||
"""
|
"""
|
||||||
def dependencies_by_key(key: str) -> Iterator[str]:
|
def dependencies_by_key(key: str) -> Generator[str, None, None]:
|
||||||
# in importlib it returns requires in the following format
|
# in importlib it returns requires in the following format
|
||||||
# ["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"]
|
# ["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"]
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
#
|
#
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from ahriman.application.handlers.handler import Handler, SubParserAction
|
from ahriman.application.handlers.handler import Handler, SubParserAction
|
||||||
@@ -86,7 +86,7 @@ class Web(Handler):
|
|||||||
return parser
|
return parser
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def extract_arguments(args: argparse.Namespace, configuration: Configuration) -> Iterator[str]:
|
def extract_arguments(args: argparse.Namespace, configuration: Configuration) -> Generator[str, None, None]:
|
||||||
"""
|
"""
|
||||||
extract list of arguments used for current command, except for command specific ones
|
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 if current user is actually owner of ahriman root
|
||||||
"""
|
"""
|
||||||
check_user(self.paths.root, unsafe=self.unsafe)
|
check_user(self.paths, unsafe=self.unsafe)
|
||||||
self.paths.tree_create()
|
self.paths.tree_create()
|
||||||
|
|
||||||
def check_version(self) -> None:
|
def check_version(self) -> None:
|
||||||
|
|||||||
183
src/ahriman/core/alpm/bytes_pkgbuild_parser.py
Normal file
183
src/ahriman/core/alpm/bytes_pkgbuild_parser.py
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2021-2025 ahriman team.
|
||||||
|
#
|
||||||
|
# This file is part of ahriman
|
||||||
|
# (see https://github.com/arcan1s/ahriman).
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# 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 __future__ import annotations
|
||||||
|
|
||||||
|
from collections import defaultdict
|
||||||
|
from collections.abc import Iterator
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from enum import ReprEnum
|
||||||
|
from types import SimpleNamespace
|
||||||
|
from typing import Generator, IO, Self
|
||||||
|
|
||||||
|
from ahriman.models.pkgbuild_patch import PkgbuildPatch
|
||||||
|
|
||||||
|
|
||||||
|
class PkgbuildToken(bytes, ReprEnum):
|
||||||
|
|
||||||
|
Comment = b"#"
|
||||||
|
Assignment = b"="
|
||||||
|
SingleQuote = b"'"
|
||||||
|
DoubleQuote = b"\""
|
||||||
|
Space = b" "
|
||||||
|
NewLine = b"\n"
|
||||||
|
|
||||||
|
ParenthesisOpen = b"("
|
||||||
|
ParenthesisClose = b")"
|
||||||
|
|
||||||
|
FunctionStarts = b"function"
|
||||||
|
FunctionDeclaration = b"()"
|
||||||
|
BraceOpen = b"{"
|
||||||
|
BraceClose = b"}"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class PkgbuildWord:
|
||||||
|
|
||||||
|
word: bytes
|
||||||
|
quote: bytes | None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def closing(self) -> PkgbuildToken | None:
|
||||||
|
if self.quote:
|
||||||
|
return None
|
||||||
|
match self.word:
|
||||||
|
case PkgbuildToken.ParenthesisOpen:
|
||||||
|
return PkgbuildToken.ParenthesisClose
|
||||||
|
case PkgbuildToken.BraceOpen:
|
||||||
|
return PkgbuildToken.BraceClose
|
||||||
|
return None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def original(self) -> bytes:
|
||||||
|
quote = self.quote or b""
|
||||||
|
return quote + self.word + quote
|
||||||
|
|
||||||
|
def __bool__(self) -> bool:
|
||||||
|
return bool(self.original)
|
||||||
|
|
||||||
|
|
||||||
|
class BytesPkgbuildParser(Iterator[PkgbuildPatch]):
|
||||||
|
|
||||||
|
def __init__(self, stream: IO[bytes]) -> None:
|
||||||
|
self._io = stream
|
||||||
|
|
||||||
|
def _next(self, *, declaration: bool) -> bytes:
|
||||||
|
while not (token := self._next_token(declaration=declaration)):
|
||||||
|
continue
|
||||||
|
return token
|
||||||
|
|
||||||
|
def _next_token(self, *, declaration: bool) -> bytes:
|
||||||
|
buffer = b""
|
||||||
|
while word := self._next_word():
|
||||||
|
match word:
|
||||||
|
case PkgbuildWord(PkgbuildToken.Comment, None):
|
||||||
|
self._io.readline()
|
||||||
|
|
||||||
|
case PkgbuildWord(PkgbuildToken.NewLine, None):
|
||||||
|
if declaration:
|
||||||
|
buffer = b""
|
||||||
|
return buffer
|
||||||
|
|
||||||
|
case PkgbuildWord(PkgbuildToken.Assignment, None) if declaration:
|
||||||
|
return buffer
|
||||||
|
|
||||||
|
case PkgbuildWord(PkgbuildToken.Space, None) if declaration:
|
||||||
|
if buffer.endswith(PkgbuildToken.FunctionDeclaration):
|
||||||
|
return buffer
|
||||||
|
buffer = b""
|
||||||
|
continue
|
||||||
|
|
||||||
|
case PkgbuildWord(PkgbuildToken.Space, None):
|
||||||
|
return buffer
|
||||||
|
|
||||||
|
case PkgbuildWord(PkgbuildToken.ParenthesisOpen, None):
|
||||||
|
buffer += PkgbuildToken.ParenthesisOpen
|
||||||
|
buffer += b"".join(self._next_words_until(PkgbuildWord(PkgbuildToken.ParenthesisClose, None)))
|
||||||
|
|
||||||
|
case PkgbuildWord(PkgbuildToken.BraceOpen, None):
|
||||||
|
buffer += PkgbuildToken.BraceOpen
|
||||||
|
buffer += b"".join(self._next_words_until(PkgbuildWord(PkgbuildToken.BraceClose, None)))
|
||||||
|
|
||||||
|
case PkgbuildWord(token, _):
|
||||||
|
buffer += token
|
||||||
|
|
||||||
|
raise StopIteration
|
||||||
|
|
||||||
|
def _next_word(self) -> PkgbuildWord:
|
||||||
|
# pass SimpleNamespace as an argument to implement side effects
|
||||||
|
def generator(quote: SimpleNamespace) -> Generator[bytes, None, None]:
|
||||||
|
while token := self._io.read(1):
|
||||||
|
match token:
|
||||||
|
case (PkgbuildToken.SingleQuote | PkgbuildToken.DoubleQuote) if quote.open is None:
|
||||||
|
quote.open = token
|
||||||
|
case closing_quote if closing_quote == quote.open:
|
||||||
|
return
|
||||||
|
case part:
|
||||||
|
yield part
|
||||||
|
if quote.open is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
if quote.open is not None:
|
||||||
|
raise ValueError("No closing quotation")
|
||||||
|
|
||||||
|
open_quote = SimpleNamespace(open=None)
|
||||||
|
value = b"".join(generator(open_quote))
|
||||||
|
|
||||||
|
return PkgbuildWord(value, open_quote.open)
|
||||||
|
|
||||||
|
def _next_words_until(self, ending: PkgbuildWord) -> Generator[bytes, None, None]:
|
||||||
|
braces = defaultdict(int)
|
||||||
|
while element := self._next_word():
|
||||||
|
yield element.original
|
||||||
|
match element:
|
||||||
|
case PkgbuildWord(token, None) if braces[token] > 0:
|
||||||
|
braces[token] -= 1
|
||||||
|
case with_closure if (closing := with_closure.closing) is not None:
|
||||||
|
braces[closing] += 1
|
||||||
|
case _ if element == ending:
|
||||||
|
return
|
||||||
|
|
||||||
|
if any(brace for brace in braces.values() if brace > 0):
|
||||||
|
raise ValueError("Unclosed parenthesis and/or braces found")
|
||||||
|
raise ValueError(f"No matching ending element {ending.word} found")
|
||||||
|
|
||||||
|
def parse(self) -> Generator[PkgbuildPatch, None, None]:
|
||||||
|
"""
|
||||||
|
parse source stream and yield parsed entries
|
||||||
|
|
||||||
|
Yields:
|
||||||
|
PkgbuildPatch: extracted a PKGBUILD node
|
||||||
|
"""
|
||||||
|
yield from self
|
||||||
|
|
||||||
|
def __iter__(self) -> Self:
|
||||||
|
"""
|
||||||
|
base iterator method
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Self: iterator instance
|
||||||
|
"""
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __next__(self) -> PkgbuildPatch:
|
||||||
|
key = self._next(declaration=True)
|
||||||
|
value = self._next(declaration=False)
|
||||||
|
|
||||||
|
return PkgbuildPatch(key.decode(encoding="utf8"), value.decode(encoding="utf8"))
|
||||||
@@ -21,7 +21,7 @@ import itertools
|
|||||||
import shutil
|
import shutil
|
||||||
import tarfile
|
import tarfile
|
||||||
|
|
||||||
from collections.abc import Iterable, Iterator
|
from collections.abc import Generator, Iterable
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from pyalpm import DB, Handle, Package, SIG_DATABASE_OPTIONAL, SIG_PACKAGE_OPTIONAL # type: ignore[import-not-found]
|
from pyalpm import DB, Handle, Package, SIG_DATABASE_OPTIONAL, SIG_PACKAGE_OPTIONAL # type: ignore[import-not-found]
|
||||||
@@ -130,8 +130,8 @@ class Pacman(LazyLogging):
|
|||||||
return # database for some reason deos not exist
|
return # database for some reason deos not exist
|
||||||
|
|
||||||
self.logger.info("copy pacman database %s from operating system root to ahriman's home %s", src, dst)
|
self.logger.info("copy pacman database %s from operating system root to ahriman's home %s", src, dst)
|
||||||
with self.repository_paths.preserve_owner(dst.parent):
|
shutil.copy(src, dst)
|
||||||
shutil.copy(src, dst)
|
self.repository_paths.chown(dst)
|
||||||
|
|
||||||
def database_init(self, handle: Handle, repository: str, architecture: str) -> DB:
|
def database_init(self, handle: Handle, repository: str, architecture: str) -> DB:
|
||||||
"""
|
"""
|
||||||
@@ -188,7 +188,7 @@ class Pacman(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
dict[str, set[str]]: map of package name to its list of files
|
dict[str, set[str]]: map of package name to its list of files
|
||||||
"""
|
"""
|
||||||
def extract(tar: tarfile.TarFile, versions: dict[str, str]) -> Iterator[tuple[str, set[str]]]:
|
def extract(tar: tarfile.TarFile, versions: dict[str, str]) -> Generator[tuple[str, set[str]], None, None]:
|
||||||
for package_name, version in versions.items():
|
for package_name, version in versions.items():
|
||||||
path = Path(f"{package_name}-{version}") / "files"
|
path = Path(f"{package_name}-{version}") / "files"
|
||||||
try:
|
try:
|
||||||
@@ -223,7 +223,7 @@ class Pacman(LazyLogging):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def package(self, package_name: str) -> Iterator[Package]:
|
def package(self, package_name: str) -> Generator[Package, None, None]:
|
||||||
"""
|
"""
|
||||||
retrieve list of the packages from the repository by name
|
retrieve list of the packages from the repository by name
|
||||||
|
|
||||||
@@ -255,20 +255,3 @@ class Pacman(LazyLogging):
|
|||||||
result.update(trim_package(provides) for provides in package.provides)
|
result.update(trim_package(provides) for provides in package.provides)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def provided_by(self, package_name: str) -> Iterator[Package]:
|
|
||||||
"""
|
|
||||||
search through databases and emit packages which provides the ``package_name``
|
|
||||||
|
|
||||||
Args:
|
|
||||||
package_name(str): package name to search
|
|
||||||
|
|
||||||
Yields:
|
|
||||||
Package: list of packages which were returned by the query
|
|
||||||
"""
|
|
||||||
def is_package_provided(package: Package) -> bool:
|
|
||||||
provides = [trim_package(name) for name in package.provides]
|
|
||||||
return package_name in provides
|
|
||||||
|
|
||||||
for database in self.handle.get_syncdbs():
|
|
||||||
yield from filter(is_package_provided, database.search(package_name))
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import itertools
|
|||||||
import re
|
import re
|
||||||
import shlex
|
import shlex
|
||||||
|
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from enum import StrEnum
|
from enum import StrEnum
|
||||||
from typing import IO
|
from typing import IO
|
||||||
|
|
||||||
@@ -209,7 +209,7 @@ class PkgbuildParser(shlex.shlex):
|
|||||||
Raises:
|
Raises:
|
||||||
PkgbuildParserError: if array is not closed
|
PkgbuildParserError: if array is not closed
|
||||||
"""
|
"""
|
||||||
def extract() -> Iterator[str]:
|
def extract() -> Generator[str, None, None]:
|
||||||
while token := self.get_token():
|
while token := self.get_token():
|
||||||
match token:
|
match token:
|
||||||
case _ if self._is_escaped():
|
case _ if self._is_escaped():
|
||||||
@@ -276,7 +276,7 @@ class PkgbuildParser(shlex.shlex):
|
|||||||
|
|
||||||
return content
|
return content
|
||||||
|
|
||||||
def _parse_token(self, token: str) -> Iterator[PkgbuildPatch]:
|
def _parse_token(self, token: str) -> Generator[PkgbuildPatch, None, None]:
|
||||||
"""
|
"""
|
||||||
parse single token to the PKGBUILD field
|
parse single token to the PKGBUILD field
|
||||||
|
|
||||||
@@ -360,7 +360,7 @@ class PkgbuildParser(shlex.shlex):
|
|||||||
|
|
||||||
raise PkgbuildParserError("reached starting position, no valid symbols found")
|
raise PkgbuildParserError("reached starting position, no valid symbols found")
|
||||||
|
|
||||||
def parse(self) -> Iterator[PkgbuildPatch]:
|
def parse(self) -> Generator[PkgbuildPatch, None, None]:
|
||||||
"""
|
"""
|
||||||
parse source stream and yield parsed entries
|
parse source stream and yield parsed entries
|
||||||
|
|
||||||
|
|||||||
@@ -97,17 +97,20 @@ class AUR(Remote):
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
list[AURPackage]: response parsed to package list
|
list[AURPackage]: response parsed to package list
|
||||||
|
|
||||||
Raises:
|
|
||||||
PackageInfoError: if multiple arguments are passed
|
|
||||||
"""
|
"""
|
||||||
if len(args) != 1:
|
query: list[tuple[str, str]] = [
|
||||||
raise PackageInfoError("AUR API requires exactly one argument to search")
|
("type", request_type),
|
||||||
|
("v", self.DEFAULT_RPC_VERSION),
|
||||||
|
]
|
||||||
|
|
||||||
url = f"{self.DEFAULT_RPC_URL}/v{self.DEFAULT_RPC_VERSION}/{request_type}/{args[0]}"
|
arg_query = "arg[]" if len(args) > 1 else "arg"
|
||||||
query = list(kwargs.items())
|
for arg in args:
|
||||||
|
query.append((arg_query, arg))
|
||||||
|
|
||||||
response = self.make_request("GET", url, params=query)
|
for key, value in kwargs.items():
|
||||||
|
query.append((key, value))
|
||||||
|
|
||||||
|
response = self.make_request("GET", self.DEFAULT_RPC_URL, params=query)
|
||||||
return self.parse_response(response.json())
|
return self.parse_response(response.json())
|
||||||
|
|
||||||
def package_info(self, package_name: str, *, pacman: Pacman | None) -> AURPackage:
|
def package_info(self, package_name: str, *, pacman: Pacman | None) -> AURPackage:
|
||||||
@@ -130,36 +133,15 @@ class AUR(Remote):
|
|||||||
except StopIteration:
|
except StopIteration:
|
||||||
raise UnknownPackageError(package_name) from None
|
raise UnknownPackageError(package_name) from None
|
||||||
|
|
||||||
def package_provided_by(self, package_name: str, *, pacman: Pacman | None) -> list[AURPackage]:
|
def package_search(self, *keywords: str, pacman: Pacman | None) -> list[AURPackage]:
|
||||||
"""
|
|
||||||
get package list which provide the specified package name
|
|
||||||
|
|
||||||
Args:
|
|
||||||
package_name(str): package name to search
|
|
||||||
pacman(Pacman | None): alpm wrapper instance, required for official repositories search
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
list[AURPackage]: list of packages which match the criteria
|
|
||||||
"""
|
|
||||||
return [
|
|
||||||
package
|
|
||||||
# search api provides reduced models
|
|
||||||
for stub in self.package_search(package_name, pacman=pacman, search_by="provides")
|
|
||||||
# verity that found package actually provides it
|
|
||||||
if package_name in (package := self.package_info(stub.name, pacman=pacman)).provides
|
|
||||||
]
|
|
||||||
|
|
||||||
def package_search(self, *keywords: str, pacman: Pacman | None, search_by: str | None) -> list[AURPackage]:
|
|
||||||
"""
|
"""
|
||||||
search package in AUR web
|
search package in AUR web
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
*keywords(str): keywords to search
|
*keywords(str): keywords to search
|
||||||
pacman(Pacman | None): alpm wrapper instance, required for official repositories search
|
pacman(Pacman | None): alpm wrapper instance, required for official repositories search
|
||||||
search_by(str | None): search by keywords
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
list[AURPackage]: list of packages which match the criteria
|
list[AURPackage]: list of packages which match the criteria
|
||||||
"""
|
"""
|
||||||
search_by = search_by or "name-desc"
|
return self.aur_request("search", *keywords, by="name-desc")
|
||||||
return self.aur_request("search", *keywords, by=search_by)
|
|
||||||
|
|||||||
@@ -127,17 +127,15 @@ class Official(Remote):
|
|||||||
except StopIteration:
|
except StopIteration:
|
||||||
raise UnknownPackageError(package_name) from None
|
raise UnknownPackageError(package_name) from None
|
||||||
|
|
||||||
def package_search(self, *keywords: str, pacman: Pacman | None, search_by: str | None) -> list[AURPackage]:
|
def package_search(self, *keywords: str, pacman: Pacman | None) -> list[AURPackage]:
|
||||||
"""
|
"""
|
||||||
search package in AUR web
|
search package in AUR web
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
*keywords(str): keywords to search
|
*keywords(str): keywords to search
|
||||||
pacman(Pacman | None): alpm wrapper instance, required for official repositories search
|
pacman(Pacman | None): alpm wrapper instance, required for official repositories search
|
||||||
search_by(str | None): search by keywords
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
list[AURPackage]: list of packages which match the criteria
|
list[AURPackage]: list of packages which match the criteria
|
||||||
"""
|
"""
|
||||||
search_by = search_by or "q"
|
return self.arch_request(*keywords, by="q")
|
||||||
return self.arch_request(*keywords, by=search_by)
|
|
||||||
|
|||||||
@@ -59,22 +59,3 @@ class OfficialSyncdb(Official):
|
|||||||
return next(AURPackage.from_pacman(package) for package in pacman.package(package_name))
|
return next(AURPackage.from_pacman(package) for package in pacman.package(package_name))
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
raise UnknownPackageError(package_name) from None
|
raise UnknownPackageError(package_name) from None
|
||||||
|
|
||||||
def package_provided_by(self, package_name: str, *, pacman: Pacman | None) -> list[AURPackage]:
|
|
||||||
"""
|
|
||||||
get package list which provide the specified package name
|
|
||||||
|
|
||||||
Args:
|
|
||||||
package_name(str): package name to search
|
|
||||||
pacman(Pacman | None): alpm wrapper instance, required for official repositories search
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
list[AURPackage]: list of packages which match the criteria
|
|
||||||
"""
|
|
||||||
if pacman is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
return [
|
|
||||||
AURPackage.from_pacman(package)
|
|
||||||
for package in pacman.provided_by(package_name)
|
|
||||||
]
|
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
from ahriman.core.alpm.pacman import Pacman
|
from ahriman.core.alpm.pacman import Pacman
|
||||||
from ahriman.core.exceptions import UnknownPackageError
|
|
||||||
from ahriman.core.http import SyncHttpClient
|
from ahriman.core.http import SyncHttpClient
|
||||||
from ahriman.models.aur_package import AURPackage
|
from ahriman.models.aur_package import AURPackage
|
||||||
|
|
||||||
@@ -36,42 +35,28 @@ class Remote(SyncHttpClient):
|
|||||||
>>> package = AUR.info("ahriman")
|
>>> package = AUR.info("ahriman")
|
||||||
>>> search_result = Official.multisearch("pacman", "manager", pacman=pacman)
|
>>> search_result = Official.multisearch("pacman", "manager", pacman=pacman)
|
||||||
|
|
||||||
Difference between :func:`search()` and :func:`multisearch()` is that :func:`search()` passes all arguments to
|
Differnece between :func:`search()` and :func:`multisearch()` is that :func:`search()` passes all arguments to
|
||||||
underlying wrapper directly, whereas :func:`multisearch()` splits search one by one and finds intersection
|
underlying wrapper directly, whereas :func:`multisearch()` splits search one by one and finds intersection
|
||||||
between search results.
|
between search results.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def info(cls, package_name: str, *, pacman: Pacman | None = None, include_provides: bool = False) -> AURPackage:
|
def info(cls, package_name: str, *, pacman: Pacman | None = None) -> AURPackage:
|
||||||
"""
|
"""
|
||||||
get package info by its name. If ``include_provides`` is set to ``True``, then, in addition, this method
|
get package info by its name
|
||||||
will perform search by :attr:`ahriman.models.aur_package.AURPackage.provides` and return first package found.
|
|
||||||
Note, however, that in this case some implementation might not provide this method and search result will might
|
|
||||||
not be stable
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
package_name(str): package name to search
|
package_name(str): package name to search
|
||||||
pacman(Pacman | None, optional): alpm wrapper instance, required for official repositories search
|
pacman(Pacman | None, optional): alpm wrapper instance, required for official repositories search
|
||||||
(Default value = None)
|
(Default value = None)
|
||||||
include_provides(bool, optional): search by provides if no exact match found (Default value = False)
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
AURPackage: package which match the package name
|
AURPackage: package which match the package name
|
||||||
|
|
||||||
Raises:
|
|
||||||
UnknownPackageError: if requested package not found
|
|
||||||
"""
|
"""
|
||||||
instance = cls()
|
return cls().package_info(package_name, pacman=pacman)
|
||||||
try:
|
|
||||||
return instance.package_info(package_name, pacman=pacman)
|
|
||||||
except UnknownPackageError:
|
|
||||||
if include_provides and (provided_by := instance.package_provided_by(package_name, pacman=pacman)):
|
|
||||||
return next(iter(provided_by))
|
|
||||||
raise
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def multisearch(cls, *keywords: str, pacman: Pacman | None = None,
|
def multisearch(cls, *keywords: str, pacman: Pacman | None = None) -> list[AURPackage]:
|
||||||
search_by: str | None = None) -> list[AURPackage]:
|
|
||||||
"""
|
"""
|
||||||
search in remote repository by using API with multiple words. This method is required in order to handle
|
search in remote repository by using API with multiple words. This method is required in order to handle
|
||||||
https://bugs.archlinux.org/task/49133. In addition, short words will be dropped
|
https://bugs.archlinux.org/task/49133. In addition, short words will be dropped
|
||||||
@@ -80,7 +65,6 @@ class Remote(SyncHttpClient):
|
|||||||
*keywords(str): search terms, e.g. "ahriman", "is", "cool"
|
*keywords(str): search terms, e.g. "ahriman", "is", "cool"
|
||||||
pacman(Pacman | None, optional): alpm wrapper instance, required for official repositories search
|
pacman(Pacman | None, optional): alpm wrapper instance, required for official repositories search
|
||||||
(Default value = None)
|
(Default value = None)
|
||||||
search_by(str | None, optional): search by keywords (Default value = None)
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
list[AURPackage]: list of packages each of them matches all search terms
|
list[AURPackage]: list of packages each of them matches all search terms
|
||||||
@@ -88,7 +72,7 @@ class Remote(SyncHttpClient):
|
|||||||
instance = cls()
|
instance = cls()
|
||||||
packages: dict[str, AURPackage] = {}
|
packages: dict[str, AURPackage] = {}
|
||||||
for term in filter(lambda word: len(word) >= 3, keywords):
|
for term in filter(lambda word: len(word) >= 3, keywords):
|
||||||
portion = instance.package_search(term, pacman=pacman, search_by=search_by)
|
portion = instance.search(term, pacman=pacman)
|
||||||
packages = {
|
packages = {
|
||||||
package.name: package # not mistake to group them by name
|
package.name: package # not mistake to group them by name
|
||||||
for package in portion
|
for package in portion
|
||||||
@@ -130,7 +114,7 @@ class Remote(SyncHttpClient):
|
|||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def search(cls, *keywords: str, pacman: Pacman | None = None, search_by: str | None = None) -> list[AURPackage]:
|
def search(cls, *keywords: str, pacman: Pacman | None = None) -> list[AURPackage]:
|
||||||
"""
|
"""
|
||||||
search package in AUR web
|
search package in AUR web
|
||||||
|
|
||||||
@@ -138,12 +122,11 @@ class Remote(SyncHttpClient):
|
|||||||
*keywords(str): search terms, e.g. "ahriman", "is", "cool"
|
*keywords(str): search terms, e.g. "ahriman", "is", "cool"
|
||||||
pacman(Pacman | None, optional): alpm wrapper instance, required for official repositories search
|
pacman(Pacman | None, optional): alpm wrapper instance, required for official repositories search
|
||||||
(Default value = None)
|
(Default value = None)
|
||||||
search_by(str | None, optional): search by keywords (Default value = None)
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
list[AURPackage]: list of packages which match the criteria
|
list[AURPackage]: list of packages which match the criteria
|
||||||
"""
|
"""
|
||||||
return cls().package_search(*keywords, pacman=pacman, search_by=search_by)
|
return cls().package_search(*keywords, pacman=pacman)
|
||||||
|
|
||||||
def package_info(self, package_name: str, *, pacman: Pacman | None) -> AURPackage:
|
def package_info(self, package_name: str, *, pacman: Pacman | None) -> AURPackage:
|
||||||
"""
|
"""
|
||||||
@@ -161,28 +144,13 @@ class Remote(SyncHttpClient):
|
|||||||
"""
|
"""
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
def package_provided_by(self, package_name: str, *, pacman: Pacman | None) -> list[AURPackage]:
|
def package_search(self, *keywords: str, pacman: Pacman | None) -> list[AURPackage]:
|
||||||
"""
|
|
||||||
get package list which provide the specified package name
|
|
||||||
|
|
||||||
Args:
|
|
||||||
package_name(str): package name to search
|
|
||||||
pacman(Pacman | None): alpm wrapper instance, required for official repositories search
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
list[AURPackage]: list of packages which match the criteria
|
|
||||||
"""
|
|
||||||
del package_name, pacman
|
|
||||||
return []
|
|
||||||
|
|
||||||
def package_search(self, *keywords: str, pacman: Pacman | None, search_by: str | None) -> list[AURPackage]:
|
|
||||||
"""
|
"""
|
||||||
search package in AUR web
|
search package in AUR web
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
*keywords(str): keywords to search
|
*keywords(str): keywords to search
|
||||||
pacman(Pacman | None): alpm wrapper instance, required for official repositories search
|
pacman(Pacman | None): alpm wrapper instance, required for official repositories search
|
||||||
search_by(str | None): search by keywords
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
list[AURPackage]: list of packages which match the criteria
|
list[AURPackage]: list of packages which match the criteria
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
#
|
#
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import ClassVar
|
from typing import ClassVar
|
||||||
|
|
||||||
@@ -347,7 +347,7 @@ class Sources(LazyLogging):
|
|||||||
"""
|
"""
|
||||||
gitconfig = gitconfig or {}
|
gitconfig = gitconfig or {}
|
||||||
|
|
||||||
def configuration_flags() -> Iterator[str]:
|
def configuration_flags() -> Generator[str, None, None]:
|
||||||
for option, value in (self.GITCONFIG | gitconfig).items():
|
for option, value in (self.GITCONFIG | gitconfig).items():
|
||||||
yield "-c"
|
yield "-c"
|
||||||
yield f"{option}=\"{value}\""
|
yield f"{option}=\"{value}\""
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from ahriman.core.build_tools.sources import Sources
|
from ahriman.core.build_tools.sources import Sources
|
||||||
@@ -77,7 +77,7 @@ class Task(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
list[Path]: list of file paths which looks like freshly generated archives
|
list[Path]: list of file paths which looks like freshly generated archives
|
||||||
"""
|
"""
|
||||||
def files() -> Iterator[Path]:
|
def files() -> Generator[Path, None, None]:
|
||||||
for filepath in sources_dir.iterdir():
|
for filepath in sources_dir.iterdir():
|
||||||
if filepath in source_files:
|
if filepath in source_files:
|
||||||
continue # skip files which were already there
|
continue # skip files which were already there
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ class Configuration(configparser.RawConfigParser):
|
|||||||
SYSTEM_CONFIGURATION_PATH(Path): (class attribute) default system configuration path distributed by package
|
SYSTEM_CONFIGURATION_PATH(Path): (class attribute) default system configuration path distributed by package
|
||||||
includes(list[Path]): list of includes which were read
|
includes(list[Path]): list of includes which were read
|
||||||
path(Path | None): path to root configuration file
|
path(Path | None): path to root configuration file
|
||||||
|
repository_id(RepositoryId | None): repository unique identifier
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
Configuration class provides additional method in order to handle application configuration. Since this class is
|
Configuration class provides additional method in order to handle application configuration. Since this class is
|
||||||
@@ -90,7 +91,7 @@ class Configuration(configparser.RawConfigParser):
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
self._repository_id: RepositoryId | None = None
|
self.repository_id: RepositoryId | None = None
|
||||||
self.path: Path | None = None
|
self.path: Path | None = None
|
||||||
self.includes: list[Path] = []
|
self.includes: list[Path] = []
|
||||||
|
|
||||||
@@ -125,32 +126,6 @@ class Configuration(configparser.RawConfigParser):
|
|||||||
"""
|
"""
|
||||||
return self.getpath("settings", "logging")
|
return self.getpath("settings", "logging")
|
||||||
|
|
||||||
@property
|
|
||||||
def repository_id(self) -> RepositoryId | None:
|
|
||||||
"""
|
|
||||||
repository identifier
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
RepositoryId: repository unique identifier
|
|
||||||
"""
|
|
||||||
return self._repository_id
|
|
||||||
|
|
||||||
@repository_id.setter
|
|
||||||
def repository_id(self, repository_id: RepositoryId | None) -> None:
|
|
||||||
"""
|
|
||||||
setter for repository identifier
|
|
||||||
|
|
||||||
Args:
|
|
||||||
repository_id(RepositoryId | None): repository unique identifier
|
|
||||||
"""
|
|
||||||
self._repository_id = repository_id
|
|
||||||
if repository_id is None or repository_id.is_empty:
|
|
||||||
self.remove_option("repository", "name")
|
|
||||||
self.remove_option("repository", "architecture")
|
|
||||||
else:
|
|
||||||
self.set_option("repository", "name", repository_id.name)
|
|
||||||
self.set_option("repository", "architecture", repository_id.architecture)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def repository_name(self) -> str:
|
def repository_name(self) -> str:
|
||||||
"""
|
"""
|
||||||
@@ -235,17 +210,6 @@ class Configuration(configparser.RawConfigParser):
|
|||||||
raise InitializeError("Configuration path and/or repository id are not set")
|
raise InitializeError("Configuration path and/or repository id are not set")
|
||||||
return self.path, self.repository_id
|
return self.path, self.repository_id
|
||||||
|
|
||||||
def copy_from(self, configuration: Self) -> None:
|
|
||||||
"""
|
|
||||||
copy values from another instance overriding existing
|
|
||||||
|
|
||||||
Args:
|
|
||||||
configuration(Self): configuration instance to merge from
|
|
||||||
"""
|
|
||||||
for section in configuration.sections():
|
|
||||||
for key, value in configuration.items(section):
|
|
||||||
self.set_option(section, key, value)
|
|
||||||
|
|
||||||
def dump(self) -> dict[str, dict[str, str]]:
|
def dump(self) -> dict[str, dict[str, str]]:
|
||||||
"""
|
"""
|
||||||
dump configuration to dictionary
|
dump configuration to dictionary
|
||||||
@@ -256,7 +220,6 @@ class Configuration(configparser.RawConfigParser):
|
|||||||
return {
|
return {
|
||||||
section: dict(self.items(section))
|
section: dict(self.items(section))
|
||||||
for section in self.sections()
|
for section in self.sections()
|
||||||
if self[section]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# pylint and mypy are too stupid to find these methods
|
# pylint and mypy are too stupid to find these methods
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class ConfigurationMultiDict(dict[str, Any]):
|
|||||||
OptionError: if the key already exists in the dictionary, but not a single value list or a string
|
OptionError: if the key already exists in the dictionary, but not a single value list or a string
|
||||||
"""
|
"""
|
||||||
match self.get(key):
|
match self.get(key):
|
||||||
case [current_value] | (str() as current_value):
|
case [current_value] | str(current_value):
|
||||||
value = f"{current_value} {value}"
|
value = f"{current_value} {value}"
|
||||||
case None:
|
case None:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -254,10 +254,6 @@ CONFIGURATION_SCHEMA: ConfigurationSchema = {
|
|||||||
"repository": {
|
"repository": {
|
||||||
"type": "dict",
|
"type": "dict",
|
||||||
"schema": {
|
"schema": {
|
||||||
"architecture": {
|
|
||||||
"type": "string",
|
|
||||||
"empty": False,
|
|
||||||
},
|
|
||||||
"name": {
|
"name": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"empty": False,
|
"empty": False,
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import configparser
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from collections.abc import Iterator, Mapping, MutableMapping
|
from collections.abc import Generator, Mapping, MutableMapping
|
||||||
from string import Template
|
from string import Template
|
||||||
from typing import Any, ClassVar
|
from typing import Any, ClassVar
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ class ShellInterpolator(configparser.Interpolation):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _extract_variables(parser: MutableMapping[str, Mapping[str, str]], value: str,
|
def _extract_variables(parser: MutableMapping[str, Mapping[str, str]], value: str,
|
||||||
defaults: Mapping[str, str]) -> Iterator[tuple[str, str]]:
|
defaults: Mapping[str, str]) -> Generator[tuple[str, str], None, None]:
|
||||||
"""
|
"""
|
||||||
extract keys and values (if available) from the configuration. In case if a key is not available, it will be
|
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
|
silently skipped from the result
|
||||||
@@ -50,7 +50,7 @@ class ShellInterpolator(configparser.Interpolation):
|
|||||||
Yields:
|
Yields:
|
||||||
tuple[str, str]: variable name used for substitution and its value
|
tuple[str, str]: variable name used for substitution and its value
|
||||||
"""
|
"""
|
||||||
def identifiers() -> Iterator[tuple[str | None, str]]:
|
def identifiers() -> Generator[tuple[str | None, str], None, None]:
|
||||||
# extract all found identifiers and parse them
|
# extract all found identifiers and parse them
|
||||||
for identifier in ShellTemplate(value).get_identifiers():
|
for identifier in ShellTemplate(value).get_identifiers():
|
||||||
match identifier.rsplit(":", maxsplit=1):
|
match identifier.rsplit(":", maxsplit=1):
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
import fnmatch
|
import fnmatch
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from collections.abc import Iterator, Mapping
|
from collections.abc import Generator, Mapping
|
||||||
from string import Template
|
from string import Template
|
||||||
|
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ class ShellTemplate(Template):
|
|||||||
(self._REPLACE, self._replace, "/"),
|
(self._REPLACE, self._replace, "/"),
|
||||||
)
|
)
|
||||||
|
|
||||||
def generator(variables: dict[str, str]) -> Iterator[tuple[str, str]]:
|
def generator(variables: dict[str, str]) -> Generator[tuple[str, str], None, None]:
|
||||||
for identifier in self.get_identifiers():
|
for identifier in self.get_identifiers():
|
||||||
for regex, function, greediness in substitutions:
|
for regex, function, greediness in substitutions:
|
||||||
if m := regex.match(identifier):
|
if m := regex.match(identifier):
|
||||||
|
|||||||
@@ -153,13 +153,10 @@ class LogsOperations(Operations):
|
|||||||
"""
|
"""
|
||||||
delete from logs
|
delete from logs
|
||||||
where (package_base, repository, process_id) in (
|
where (package_base, repository, process_id) in (
|
||||||
select package_base, repository, process_id from (
|
select package_base, repository, process_id from logs
|
||||||
select package_base, repository, process_id, row_number() over (partition by package_base order by max(created) desc) as rn
|
where repository = :repository
|
||||||
from logs
|
group by package_base, repository, process_id
|
||||||
where repository = :repository
|
order by min(created) desc limit -1 offset :offset
|
||||||
group by package_base, repository, process_id
|
|
||||||
)
|
|
||||||
where rn > :offset
|
|
||||||
)
|
)
|
||||||
""",
|
""",
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import contextlib
|
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
@@ -88,12 +87,10 @@ class Operations(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
T: result of the ``query`` call
|
T: result of the ``query`` call
|
||||||
"""
|
"""
|
||||||
with contextlib.closing(sqlite3.connect(self.path, detect_types=sqlite3.PARSE_DECLTYPES)) as connection:
|
with sqlite3.connect(self.path, detect_types=sqlite3.PARSE_DECLTYPES) as connection:
|
||||||
connection.set_trace_callback(self.logger.debug)
|
connection.set_trace_callback(self.logger.debug)
|
||||||
connection.row_factory = self.factory
|
connection.row_factory = self.factory
|
||||||
|
|
||||||
result = query(connection)
|
result = query(connection)
|
||||||
if commit:
|
if commit:
|
||||||
connection.commit()
|
connection.commit()
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
from collections.abc import Iterable, Iterator
|
from collections.abc import Generator, Iterable
|
||||||
from sqlite3 import Connection
|
from sqlite3 import Connection
|
||||||
|
|
||||||
from ahriman.core.database.operations.operations import Operations
|
from ahriman.core.database.operations.operations import Operations
|
||||||
@@ -263,7 +263,7 @@ class PackageOperations(Operations):
|
|||||||
"""
|
"""
|
||||||
repository_id = repository_id or self._repository_id
|
repository_id = repository_id or self._repository_id
|
||||||
|
|
||||||
def run(connection: Connection) -> Iterator[tuple[Package, BuildStatus]]:
|
def run(connection: Connection) -> Generator[tuple[Package, BuildStatus], None, None]:
|
||||||
packages = self._packages_get_select_package_bases(connection, repository_id)
|
packages = self._packages_get_select_package_bases(connection, repository_id)
|
||||||
statuses = self._packages_get_select_statuses(connection, repository_id)
|
statuses = self._packages_get_select_statuses(connection, repository_id)
|
||||||
per_package_base = self._packages_get_select_packages(connection, packages, repository_id)
|
per_package_base = self._packages_get_select_packages(connection, packages, repository_id)
|
||||||
|
|||||||
@@ -94,13 +94,9 @@ class SQLite(
|
|||||||
sqlite3.register_adapter(list, json.dumps)
|
sqlite3.register_adapter(list, json.dumps)
|
||||||
sqlite3.register_converter("json", json.loads)
|
sqlite3.register_converter("json", json.loads)
|
||||||
|
|
||||||
if not self._configuration.getboolean("settings", "apply_migrations", fallback=True):
|
if self._configuration.getboolean("settings", "apply_migrations", fallback=True):
|
||||||
return
|
|
||||||
if self._repository_id.is_empty:
|
|
||||||
return # do not perform migration on empty repository identifier (e.g. multirepo command)
|
|
||||||
|
|
||||||
with self._repository_paths.preserve_owner():
|
|
||||||
self.with_connection(lambda connection: Migrations.migrate(connection, self._configuration))
|
self.with_connection(lambda connection: Migrations.migrate(connection, self._configuration))
|
||||||
|
self._repository_paths.chown(self.path)
|
||||||
|
|
||||||
def package_clear(self, package_base: str, repository_id: RepositoryId | None = None) -> None:
|
def package_clear(self, package_base: str, repository_id: RepositoryId | None = None) -> None:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from ahriman.core.formatters.string_printer import StringPrinter
|
from ahriman.core.formatters.string_printer import StringPrinter
|
||||||
@@ -44,7 +44,8 @@ class ValidationPrinter(StringPrinter):
|
|||||||
self.errors = errors
|
self.errors = errors
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_error_messages(node: str, errors: list[str | dict[str, Any]], current_level: int = 1) -> Iterator[Property]:
|
def get_error_messages(node: str, errors: list[str | dict[str, Any]],
|
||||||
|
current_level: int = 1) -> Generator[Property, None, None]:
|
||||||
"""
|
"""
|
||||||
extract default error message from cerberus class
|
extract default error message from cerberus class
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
#
|
#
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from tempfile import TemporaryDirectory
|
from tempfile import TemporaryDirectory
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ class RemotePush(LazyLogging):
|
|||||||
# ...and finally return path to the copied directory
|
# ...and finally return path to the copied directory
|
||||||
return package.base
|
return package.base
|
||||||
|
|
||||||
def packages_update(self, result: Result, target_dir: Path) -> Iterator[str]:
|
def packages_update(self, result: Result, target_dir: Path) -> Generator[str, None, None]:
|
||||||
"""
|
"""
|
||||||
update all packages from the build result
|
update all packages from the build result
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import requests
|
import requests
|
||||||
import sys
|
|
||||||
|
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
from typing import Any, IO, Literal
|
from typing import Any, IO, Literal
|
||||||
@@ -71,10 +70,7 @@ class SyncHttpClient(LazyLogging):
|
|||||||
request.Session: created session object
|
request.Session: created session object
|
||||||
"""
|
"""
|
||||||
session = requests.Session()
|
session = requests.Session()
|
||||||
python_version = ".".join(map(str, sys.version_info[:3])) # just major.minor.patch
|
session.headers["User-Agent"] = f"ahriman/{__version__}"
|
||||||
session.headers["User-Agent"] = f"ahriman/{__version__} " \
|
|
||||||
f"{requests.utils.default_user_agent()} " \
|
|
||||||
f"python/{python_version}"
|
|
||||||
|
|
||||||
return session
|
return session
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
import contextlib
|
import contextlib
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ class LazyLogging:
|
|||||||
logging.setLogRecordFactory(package_record_factory)
|
logging.setLogRecordFactory(package_record_factory)
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def in_package_context(self, package_base: str, version: str | None) -> Iterator[None]:
|
def in_package_context(self, package_base: str, version: str | None) -> Generator[None, None, None]:
|
||||||
"""
|
"""
|
||||||
execute function while setting package context
|
execute function while setting package context
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
#
|
#
|
||||||
import inspect
|
import inspect
|
||||||
|
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from pkgutil import ModuleInfo, walk_packages
|
from pkgutil import ModuleInfo, walk_packages
|
||||||
@@ -33,7 +33,7 @@ __all__ = ["implementations"]
|
|||||||
T = TypeVar("T")
|
T = TypeVar("T")
|
||||||
|
|
||||||
|
|
||||||
def _modules(module_root: Path, prefix: str) -> Iterator[ModuleInfo]:
|
def _modules(module_root: Path, prefix: str) -> Generator[ModuleInfo, None, None]:
|
||||||
"""
|
"""
|
||||||
extract available modules from package
|
extract available modules from package
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ def _modules(module_root: Path, prefix: str) -> Iterator[ModuleInfo]:
|
|||||||
yield module_info
|
yield module_info
|
||||||
|
|
||||||
|
|
||||||
def implementations(root_module: ModuleType, base_class: type[T]) -> Iterator[type[T]]:
|
def implementations(root_module: ModuleType, base_class: type[T]) -> Generator[type[T], None, None]:
|
||||||
"""
|
"""
|
||||||
extract implementations of the ``base_class`` from the module
|
extract implementations of the ``base_class`` from the module
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class JinjaTemplate:
|
|||||||
|
|
||||||
* homepage - link to homepage, string, optional
|
* homepage - link to homepage, string, optional
|
||||||
* last_update - report generation time, pretty printed datetime, required
|
* last_update - report generation time, pretty printed datetime, required
|
||||||
* link_path - prefix of packages to download, string, required
|
* link_path - prefix fo packages to download, string, required
|
||||||
* has_package_signed - ``True`` in case if package sign enabled, ``False`` otherwise, required
|
* has_package_signed - ``True`` in case if package sign enabled, ``False`` otherwise, required
|
||||||
* has_repo_signed - ``True`` in case if repository database sign enabled, ``False`` otherwise, required
|
* has_repo_signed - ``True`` in case if repository database sign enabled, ``False`` otherwise, required
|
||||||
* packages - sorted list of packages properties, required
|
* packages - sorted list of packages properties, required
|
||||||
@@ -64,7 +64,7 @@ class JinjaTemplate:
|
|||||||
Attributes:
|
Attributes:
|
||||||
default_pgp_key(str | None): default PGP key
|
default_pgp_key(str | None): default PGP key
|
||||||
homepage(str | None): homepage link if any (for footer)
|
homepage(str | None): homepage link if any (for footer)
|
||||||
link_path(str): prefix of packages to download
|
link_path(str): prefix fo packages to download
|
||||||
name(str): repository name
|
name(str): repository name
|
||||||
rss_url(str | None): link to the RSS feed
|
rss_url(str | None): link to the RSS feed
|
||||||
sign_targets(set[SignSettings]): targets to sign enabled in configuration
|
sign_targets(set[SignSettings]): targets to sign enabled in configuration
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
#
|
#
|
||||||
import contextlib
|
import contextlib
|
||||||
|
|
||||||
from collections.abc import Iterator
|
from typing import Generator
|
||||||
|
|
||||||
from ahriman.core.status import Client
|
from ahriman.core.status import Client
|
||||||
from ahriman.models.event import Event, EventType
|
from ahriman.models.event import Event, EventType
|
||||||
@@ -55,7 +55,7 @@ class EventLogger:
|
|||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def in_event(self, package_base: str, event: EventType, message: str | None = None,
|
def in_event(self, package_base: str, event: EventType, message: str | None = None,
|
||||||
failure: EventType | None = None) -> Iterator[None]:
|
failure: EventType | None = None) -> Generator[None, None, None]:
|
||||||
"""
|
"""
|
||||||
perform action in package context and log event with time elapsed
|
perform action in package context and log event with time elapsed
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ class EventLogger:
|
|||||||
>>> with self.in_event(package_base, EventType.PackageUpdated):
|
>>> with self.in_event(package_base, EventType.PackageUpdated):
|
||||||
>>> do_something()
|
>>> do_something()
|
||||||
|
|
||||||
Additional parameter ``failure`` can be set in order to emit an event on exception occurred. If none set
|
Additional parameter ``failure`` can be set in order to emit an event on exception occured. If none set
|
||||||
(default), then no event will be recorded on exception
|
(default), then no event will be recorded on exception
|
||||||
"""
|
"""
|
||||||
with MetricsTimer() as timer:
|
with MetricsTimer() as timer:
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
import hashlib
|
import hashlib
|
||||||
import itertools
|
import itertools
|
||||||
|
|
||||||
from collections.abc import Callable, Iterator
|
from collections.abc import Callable, Generator
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import ClassVar
|
from typing import ClassVar
|
||||||
|
|
||||||
@@ -187,7 +187,7 @@ class PkgbuildGenerator:
|
|||||||
Returns:
|
Returns:
|
||||||
list[PkgbuildPatch]: list of patches to be applied to the PKGBUILD
|
list[PkgbuildPatch]: list of patches to be applied to the PKGBUILD
|
||||||
"""
|
"""
|
||||||
def sources_generator() -> Iterator[tuple[str, str]]:
|
def sources_generator() -> Generator[tuple[str, str], None, None]:
|
||||||
for source, generator in sorted(self.sources().items()):
|
for source, generator in sorted(self.sources().items()):
|
||||||
source_path = source_dir / source
|
source_path = source_dir / source
|
||||||
generator(source_path)
|
generator(source_path)
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ class Leaf:
|
|||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
dependencies(set[str]): list of package dependencies
|
dependencies(set[str]): list of package dependencies
|
||||||
items(list[str]): list of packages in this leaf including provides
|
|
||||||
package(Package): leaf package properties
|
package(Package): leaf package properties
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -43,9 +42,17 @@ class Leaf:
|
|||||||
package(Package): package properties
|
package(Package): package properties
|
||||||
"""
|
"""
|
||||||
self.package = package
|
self.package = package
|
||||||
# store frequently used properties
|
|
||||||
self.dependencies = package.depends_build
|
self.dependencies = package.depends_build
|
||||||
self.items = self.package.packages_full
|
|
||||||
|
@property
|
||||||
|
def items(self) -> Iterable[str]:
|
||||||
|
"""
|
||||||
|
extract all packages from the leaf
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Iterable[str]: packages containing in this leaf
|
||||||
|
"""
|
||||||
|
return self.package.packages.keys()
|
||||||
|
|
||||||
def is_dependency(self, packages: Iterable[Leaf]) -> bool:
|
def is_dependency(self, packages: Iterable[Leaf]) -> bool:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -80,7 +80,8 @@ class Trigger(LazyLogging):
|
|||||||
return self.repository_id.architecture
|
return self.repository_id.architecture
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def configuration_schema(cls, configuration: Configuration | None) -> ConfigurationSchema:
|
def configuration_schema(cls, repository_id: RepositoryId,
|
||||||
|
configuration: Configuration | None) -> ConfigurationSchema:
|
||||||
"""
|
"""
|
||||||
configuration schema based on supplied service configuration
|
configuration schema based on supplied service configuration
|
||||||
|
|
||||||
@@ -88,6 +89,7 @@ class Trigger(LazyLogging):
|
|||||||
Schema must be in cerberus format, for details and examples you can check built-in triggers.
|
Schema must be in cerberus format, for details and examples you can check built-in triggers.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
repository_id(str): repository unique identifier
|
||||||
configuration(Configuration | None): configuration instance. If set to None, the default schema
|
configuration(Configuration | None): configuration instance. If set to None, the default schema
|
||||||
should be returned
|
should be returned
|
||||||
|
|
||||||
@@ -99,15 +101,13 @@ class Trigger(LazyLogging):
|
|||||||
|
|
||||||
result: ConfigurationSchema = {}
|
result: ConfigurationSchema = {}
|
||||||
for target in cls.configuration_sections(configuration):
|
for target in cls.configuration_sections(configuration):
|
||||||
for section in configuration.sections():
|
if not configuration.has_section(target):
|
||||||
if not (section == target or section.startswith(f"{target}:")):
|
continue
|
||||||
# either repository specific or exact name
|
section, schema_name = configuration.gettype(
|
||||||
continue
|
target, repository_id, fallback=cls.CONFIGURATION_SCHEMA_FALLBACK)
|
||||||
schema_name = configuration.get(section, "type", fallback=section)
|
if schema_name not in cls.CONFIGURATION_SCHEMA:
|
||||||
|
continue
|
||||||
if schema_name not in cls.CONFIGURATION_SCHEMA:
|
result[section] = cls.CONFIGURATION_SCHEMA[schema_name]
|
||||||
continue
|
|
||||||
result[section] = cls.CONFIGURATION_SCHEMA[schema_name]
|
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
import contextlib
|
import contextlib
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from importlib import import_module, machinery
|
from importlib import import_module, machinery
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from types import ModuleType
|
from types import ModuleType
|
||||||
@@ -119,7 +119,7 @@ class TriggerLoader(LazyLogging):
|
|||||||
return configuration.getlist("build", "triggers", fallback=[])
|
return configuration.getlist("build", "triggers", fallback=[])
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def __execute_trigger(self, trigger: Trigger) -> Iterator[None]:
|
def __execute_trigger(self, trigger: Trigger) -> Generator[None, None, None]:
|
||||||
"""
|
"""
|
||||||
decorator for calling triggers
|
decorator for calling triggers
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import re
|
|||||||
import selectors
|
import selectors
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
from collections.abc import Callable, Iterable, Iterator, Mapping
|
from collections.abc import Callable, Generator, Iterable, Mapping
|
||||||
from dataclasses import asdict
|
from dataclasses import asdict
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -35,6 +35,7 @@ from pwd import getpwuid
|
|||||||
from typing import Any, IO, TypeVar
|
from typing import Any, IO, TypeVar
|
||||||
|
|
||||||
from ahriman.core.exceptions import CalledProcessError, OptionError, UnsafeRunError
|
from ahriman.core.exceptions import CalledProcessError, OptionError, UnsafeRunError
|
||||||
|
from ahriman.models.repository_paths import RepositoryPaths
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
@@ -46,14 +47,12 @@ __all__ = [
|
|||||||
"filter_json",
|
"filter_json",
|
||||||
"full_version",
|
"full_version",
|
||||||
"minmax",
|
"minmax",
|
||||||
"owner",
|
|
||||||
"package_like",
|
"package_like",
|
||||||
"parse_version",
|
"parse_version",
|
||||||
"partition",
|
"partition",
|
||||||
"pretty_datetime",
|
"pretty_datetime",
|
||||||
"pretty_size",
|
"pretty_size",
|
||||||
"safe_filename",
|
"safe_filename",
|
||||||
"safe_iterdir",
|
|
||||||
"srcinfo_property",
|
"srcinfo_property",
|
||||||
"srcinfo_property_list",
|
"srcinfo_property_list",
|
||||||
"trim_package",
|
"trim_package",
|
||||||
@@ -113,7 +112,7 @@ def check_output(*args: str, exception: Exception | Callable[[int, list[str], st
|
|||||||
return channel if channel is not None else io.StringIO()
|
return channel if channel is not None else io.StringIO()
|
||||||
|
|
||||||
# wrapper around selectors polling
|
# wrapper around selectors polling
|
||||||
def poll(sel: selectors.BaseSelector) -> Iterator[tuple[str, str]]:
|
def poll(sel: selectors.BaseSelector) -> Generator[tuple[str, str], None, None]:
|
||||||
for key, _ in sel.select(): # we don't need to check mask here because we have only subscribed on reading
|
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]
|
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
|
if not line: # in case of empty line we remove selector as there is no data here anymore
|
||||||
@@ -137,8 +136,7 @@ def check_output(*args: str, exception: Exception | Callable[[int, list[str], st
|
|||||||
} | environment
|
} | environment
|
||||||
|
|
||||||
with subprocess.Popen(args, cwd=cwd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
with subprocess.Popen(args, cwd=cwd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
||||||
user=user, env=full_environment, text=True, encoding="utf8", errors="backslashreplace",
|
user=user, env=full_environment, text=True, encoding="utf8", bufsize=1) as process:
|
||||||
bufsize=1) as process:
|
|
||||||
if input_data is not None:
|
if input_data is not None:
|
||||||
input_channel = get_io(process, "stdin")
|
input_channel = get_io(process, "stdin")
|
||||||
input_channel.write(input_data)
|
input_channel.write(input_data)
|
||||||
@@ -170,13 +168,12 @@ def check_output(*args: str, exception: Exception | Callable[[int, list[str], st
|
|||||||
return stdout
|
return stdout
|
||||||
|
|
||||||
|
|
||||||
def check_user(root: Path, *, unsafe: bool) -> None:
|
def check_user(paths: RepositoryPaths, *, unsafe: bool) -> None:
|
||||||
"""
|
"""
|
||||||
check if current user is the owner of the root
|
check if current user is the owner of the root
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
root(Path): path to root directory (e.g. repository root
|
paths(RepositoryPaths): repository paths object
|
||||||
:attr:`ahriman.models.repository_paths.RepositoryPaths.root`)
|
|
||||||
unsafe(bool): if set no user check will be performed before path creation
|
unsafe(bool): if set no user check will be performed before path creation
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
@@ -185,16 +182,14 @@ def check_user(root: Path, *, unsafe: bool) -> None:
|
|||||||
Examples:
|
Examples:
|
||||||
Simply run function with arguments::
|
Simply run function with arguments::
|
||||||
|
|
||||||
>>> check_user(root, unsafe=False)
|
>>> check_user(paths, unsafe=False)
|
||||||
"""
|
"""
|
||||||
if not root.exists():
|
if not paths.root.exists():
|
||||||
return # no directory found, skip check
|
return # no directory found, skip check
|
||||||
if unsafe:
|
if unsafe:
|
||||||
return # unsafe flag is enabled, no check performed
|
return # unsafe flag is enabled, no check performed
|
||||||
|
|
||||||
current_uid = os.getuid()
|
current_uid = os.getuid()
|
||||||
root_uid, _ = owner(root)
|
root_uid, _ = paths.root_owner
|
||||||
|
|
||||||
if current_uid != root_uid:
|
if current_uid != root_uid:
|
||||||
raise UnsafeRunError(current_uid, root_uid)
|
raise UnsafeRunError(current_uid, root_uid)
|
||||||
|
|
||||||
@@ -292,20 +287,6 @@ 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
|
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:
|
def package_like(filename: Path) -> bool:
|
||||||
"""
|
"""
|
||||||
check if file looks like package
|
check if file looks like package
|
||||||
@@ -426,22 +407,6 @@ def safe_filename(source: str) -> str:
|
|||||||
return re.sub(r"[^A-Za-z\d\-._~:\[\]@]", "-", source)
|
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], *,
|
def srcinfo_property(key: str, srcinfo: Mapping[str, Any], package_srcinfo: Mapping[str, Any], *,
|
||||||
default: Any = None) -> Any:
|
default: Any = None) -> Any:
|
||||||
"""
|
"""
|
||||||
@@ -510,7 +475,7 @@ def utcnow() -> datetime.datetime:
|
|||||||
return datetime.datetime.now(datetime.UTC)
|
return datetime.datetime.now(datetime.UTC)
|
||||||
|
|
||||||
|
|
||||||
def walk(directory_path: Path) -> Iterator[Path]:
|
def walk(directory_path: Path) -> Generator[Path, None, None]:
|
||||||
"""
|
"""
|
||||||
list all file paths in given directory
|
list all file paths in given directory
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ from dataclasses import dataclass, field, fields
|
|||||||
from pyalpm import Package # type: ignore[import-not-found]
|
from pyalpm import Package # type: ignore[import-not-found]
|
||||||
from typing import Any, Self
|
from typing import Any, Self
|
||||||
|
|
||||||
from ahriman.core.utils import filter_json, full_version, trim_package
|
from ahriman.core.utils import filter_json, full_version
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True, kw_only=True)
|
@dataclass(frozen=True, kw_only=True)
|
||||||
@@ -103,17 +103,6 @@ class AURPackage:
|
|||||||
keywords: list[str] = field(default_factory=list)
|
keywords: list[str] = field(default_factory=list)
|
||||||
groups: list[str] = field(default_factory=list)
|
groups: list[str] = field(default_factory=list)
|
||||||
|
|
||||||
def __post_init__(self) -> None:
|
|
||||||
"""
|
|
||||||
update packages lists accordingly
|
|
||||||
"""
|
|
||||||
object.__setattr__(self, "depends", [trim_package(package) for package in self.depends])
|
|
||||||
object.__setattr__(self, "make_depends", [trim_package(package) for package in self.make_depends])
|
|
||||||
object.__setattr__(self, "opt_depends", [trim_package(package) for package in self.opt_depends])
|
|
||||||
object.__setattr__(self, "check_depends", [trim_package(package) for package in self.check_depends])
|
|
||||||
object.__setattr__(self, "conflicts", [trim_package(package) for package in self.conflicts])
|
|
||||||
object.__setattr__(self, "provides", [trim_package(package) for package in self.provides])
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_json(cls, dump: dict[str, Any]) -> Self:
|
def from_json(cls, dump: dict[str, Any]) -> Self:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
from collections.abc import Callable, Iterable, Iterator
|
from collections.abc import Callable, Generator, Iterable
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from pyalpm import vercmp # type: ignore[import-not-found]
|
from pyalpm import vercmp # type: ignore[import-not-found]
|
||||||
@@ -69,7 +69,7 @@ class Package(LazyLogging):
|
|||||||
:attr:`ahriman.models.package_source.PackageSource.Archive`,
|
:attr:`ahriman.models.package_source.PackageSource.Archive`,
|
||||||
:attr:`ahriman.models.package_source.PackageSource.AUR`,
|
:attr:`ahriman.models.package_source.PackageSource.AUR`,
|
||||||
:attr:`ahriman.models.package_source.PackageSource.Local` and
|
:attr:`ahriman.models.package_source.PackageSource.Local` and
|
||||||
:attr:`ahriman.models.package_source.PackageSource.Repository` respectively:
|
:attr:`ahriman.models.package_source.PackageSource.Repository` repsectively:
|
||||||
|
|
||||||
>>> ahriman_package = Package.from_aur("ahriman")
|
>>> ahriman_package = Package.from_aur("ahriman")
|
||||||
>>> pacman_package = Package.from_official("pacman", pacman)
|
>>> pacman_package = Package.from_official("pacman", pacman)
|
||||||
@@ -205,7 +205,7 @@ class Package(LazyLogging):
|
|||||||
package = pacman.handle.load_pkg(str(path))
|
package = pacman.handle.load_pkg(str(path))
|
||||||
description = PackageDescription.from_package(package, path)
|
description = PackageDescription.from_package(package, path)
|
||||||
return cls(
|
return cls(
|
||||||
base=package.base or package.name,
|
base=package.base,
|
||||||
version=package.version,
|
version=package.version,
|
||||||
remote=RemoteSource(source=PackageSource.Archive),
|
remote=RemoteSource(source=PackageSource.Archive),
|
||||||
packages={package.name: description},
|
packages={package.name: description},
|
||||||
@@ -213,19 +213,18 @@ class Package(LazyLogging):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_aur(cls, name: str, packager: str | None = None, *, include_provides: bool = False) -> Self:
|
def from_aur(cls, name: str, packager: str | None = None) -> Self:
|
||||||
"""
|
"""
|
||||||
construct package properties from AUR page
|
construct package properties from AUR page
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
name(str): package name (either base or normal name)
|
name(str): package name (either base or normal name)
|
||||||
packager(str | None, optional): packager to be used for this build (Default value = None)
|
packager(str | None, optional): packager to be used for this build (Default value = None)
|
||||||
include_provides(bool, optional): search by provides if no exact match found (Default value = False)
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Self: package properties
|
Self: package properties
|
||||||
"""
|
"""
|
||||||
package = AUR.info(name, include_provides=include_provides)
|
package = AUR.info(name)
|
||||||
|
|
||||||
remote = RemoteSource(
|
remote = RemoteSource(
|
||||||
source=PackageSource.AUR,
|
source=PackageSource.AUR,
|
||||||
@@ -311,8 +310,7 @@ class Package(LazyLogging):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_official(cls, name: str, pacman: Pacman, packager: str | None = None, *, use_syncdb: bool = True,
|
def from_official(cls, name: str, pacman: Pacman, packager: str | None = None, *, use_syncdb: bool = True) -> Self:
|
||||||
include_provides: bool = False) -> Self:
|
|
||||||
"""
|
"""
|
||||||
construct package properties from official repository page
|
construct package properties from official repository page
|
||||||
|
|
||||||
@@ -321,13 +319,11 @@ class Package(LazyLogging):
|
|||||||
pacman(Pacman): alpm wrapper instance
|
pacman(Pacman): alpm wrapper instance
|
||||||
packager(str | None, optional): packager to be used for this build (Default value = None)
|
packager(str | None, optional): packager to be used for this build (Default value = None)
|
||||||
use_syncdb(bool, optional): use pacman databases instead of official repositories RPC (Default value = True)
|
use_syncdb(bool, optional): use pacman databases instead of official repositories RPC (Default value = True)
|
||||||
include_provides(bool, optional): search by provides if no exact match found (Default value = False)
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Self: package properties
|
Self: package properties
|
||||||
"""
|
"""
|
||||||
impl = OfficialSyncdb if use_syncdb else Official
|
package = OfficialSyncdb.info(name, pacman=pacman) if use_syncdb else Official.info(name)
|
||||||
package = impl.info(name, pacman=pacman, include_provides=include_provides)
|
|
||||||
|
|
||||||
remote = RemoteSource(
|
remote = RemoteSource(
|
||||||
source=PackageSource.Repository,
|
source=PackageSource.Repository,
|
||||||
@@ -346,7 +342,7 @@ class Package(LazyLogging):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def local_files(path: Path) -> Iterator[Path]:
|
def local_files(path: Path) -> Generator[Path, None, None]:
|
||||||
"""
|
"""
|
||||||
extract list of local files
|
extract list of local files
|
||||||
|
|
||||||
@@ -407,7 +403,7 @@ class Package(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
list[str]: combined list of unique entries in properties list
|
list[str]: combined list of unique entries in properties list
|
||||||
"""
|
"""
|
||||||
def generator() -> Iterator[str]:
|
def generator() -> Generator[str, None, None]:
|
||||||
for package in self.packages.values():
|
for package in self.packages.values():
|
||||||
yield from extractor(package)
|
yield from extractor(package)
|
||||||
|
|
||||||
@@ -570,7 +566,7 @@ class Package(LazyLogging):
|
|||||||
"""
|
"""
|
||||||
return dataclass_view(self)
|
return dataclass_view(self)
|
||||||
|
|
||||||
def with_packages(self, packages: Iterable[Path], pacman: Pacman) -> None:
|
def with_packages(self, packages: list[Path], pacman: Pacman) -> None:
|
||||||
"""
|
"""
|
||||||
replace packages descriptions with ones from archives
|
replace packages descriptions with ones from archives
|
||||||
|
|
||||||
|
|||||||
@@ -83,13 +83,12 @@ class PackageDescription:
|
|||||||
|
|
||||||
def __post_init__(self) -> None:
|
def __post_init__(self) -> None:
|
||||||
"""
|
"""
|
||||||
update packages lists accordingly
|
update dependencies list accordingly
|
||||||
"""
|
"""
|
||||||
self.depends = [trim_package(package) for package in self.depends]
|
self.depends = [trim_package(package) for package in self.depends]
|
||||||
self.make_depends = [trim_package(package) for package in self.make_depends]
|
|
||||||
self.opt_depends = [trim_package(package) for package in self.opt_depends]
|
self.opt_depends = [trim_package(package) for package in self.opt_depends]
|
||||||
|
self.make_depends = [trim_package(package) for package in self.make_depends]
|
||||||
self.check_depends = [trim_package(package) for package in self.check_depends]
|
self.check_depends = [trim_package(package) for package in self.check_depends]
|
||||||
self.provides = [trim_package(package) for package in self.provides]
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def filepath(self) -> Path | None:
|
def filepath(self) -> Path | None:
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import shlex
|
|||||||
|
|
||||||
from dataclasses import dataclass, fields
|
from dataclasses import dataclass, fields
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Iterator, Self
|
from typing import Any, Generator, Self
|
||||||
|
|
||||||
from ahriman.core.configuration.shell_template import ShellTemplate
|
from ahriman.core.configuration.shell_template import ShellTemplate
|
||||||
from ahriman.core.utils import dataclass_view, filter_json
|
from ahriman.core.utils import dataclass_view, filter_json
|
||||||
@@ -166,7 +166,7 @@ class PkgbuildPatch:
|
|||||||
ValueError: if no closing quotation
|
ValueError: if no closing quotation
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def generator() -> Iterator[str]:
|
def generator() -> Generator[str, None, None]:
|
||||||
token = None
|
token = None
|
||||||
for char in source:
|
for char in source:
|
||||||
if token is not None:
|
if token is not None:
|
||||||
|
|||||||
@@ -17,11 +17,10 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import contextlib
|
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -29,7 +28,6 @@ from pwd import getpwuid
|
|||||||
|
|
||||||
from ahriman.core.exceptions import PathError
|
from ahriman.core.exceptions import PathError
|
||||||
from ahriman.core.log import LazyLogging
|
from ahriman.core.log import LazyLogging
|
||||||
from ahriman.core.utils import owner, safe_iterdir
|
|
||||||
from ahriman.models.repository_id import RepositoryId
|
from ahriman.models.repository_id import RepositoryId
|
||||||
|
|
||||||
|
|
||||||
@@ -94,7 +92,7 @@ class RepositoryPaths(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
Path: path to directory in which build process is run
|
Path: path to directory in which build process is run
|
||||||
"""
|
"""
|
||||||
uid, _ = owner(self.root)
|
uid, _ = self.owner(self.root)
|
||||||
return self.chroot / f"{self.repository_id.name}-{self.repository_id.architecture}" / getpwuid(uid).pw_name
|
return self.chroot / f"{self.repository_id.name}-{self.repository_id.architecture}" / getpwuid(uid).pw_name
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -156,7 +154,7 @@ class RepositoryPaths(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
tuple[int, int]: owner user and group of the root directory
|
tuple[int, int]: owner user and group of the root directory
|
||||||
"""
|
"""
|
||||||
return owner(self.root)
|
return self.owner(self.root)
|
||||||
|
|
||||||
# pylint: disable=protected-access
|
# pylint: disable=protected-access
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -171,7 +169,7 @@ class RepositoryPaths(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
set[str]: list of repository architectures for which there is created tree
|
set[str]: list of repository architectures for which there is created tree
|
||||||
"""
|
"""
|
||||||
def walk(repository_dir: Path) -> Iterator[str]:
|
def walk(repository_dir: Path) -> Generator[str, None, None]:
|
||||||
for architecture in filter(lambda path: path.is_dir(), repository_dir.iterdir()):
|
for architecture in filter(lambda path: path.is_dir(), repository_dir.iterdir()):
|
||||||
yield architecture.name
|
yield architecture.name
|
||||||
|
|
||||||
@@ -198,7 +196,7 @@ class RepositoryPaths(LazyLogging):
|
|||||||
is loaded in legacy mode
|
is loaded in legacy mode
|
||||||
"""
|
"""
|
||||||
# simply walk through the root. In case if there are subdirectories, emit the name
|
# simply walk through the root. In case if there are subdirectories, emit the name
|
||||||
def walk(paths: RepositoryPaths) -> Iterator[str]:
|
def walk(paths: RepositoryPaths) -> Generator[str, None, None]:
|
||||||
for repository in filter(lambda path: path.is_dir(), paths._repository_root.iterdir()):
|
for repository in filter(lambda path: path.is_dir(), paths._repository_root.iterdir()):
|
||||||
if any(path.is_dir() for path in repository.iterdir()):
|
if any(path.is_dir() for path in repository.iterdir()):
|
||||||
yield repository.name
|
yield repository.name
|
||||||
@@ -209,32 +207,19 @@ class RepositoryPaths(LazyLogging):
|
|||||||
|
|
||||||
return set(walk(instance))
|
return set(walk(instance))
|
||||||
|
|
||||||
def _chown(self, path: Path) -> None:
|
@staticmethod
|
||||||
|
def owner(path: Path) -> tuple[int, int]:
|
||||||
"""
|
"""
|
||||||
set owner of path recursively (from root) to root owner
|
retrieve owner information by path
|
||||||
|
|
||||||
Notes:
|
|
||||||
More likely you don't want to call this method explicitly, consider using :func:`preserve_owner`
|
|
||||||
as context manager instead
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
path(Path): path to be chown
|
path(Path): path for which extract ids
|
||||||
|
|
||||||
Raises:
|
Returns:
|
||||||
PathError: if path does not belong to root
|
tuple[int, int]: owner user and group ids of the directory
|
||||||
"""
|
"""
|
||||||
def set_owner(current: Path) -> None:
|
stat = path.stat()
|
||||||
uid, gid = owner(current)
|
return stat.st_uid, stat.st_gid
|
||||||
if uid == root_uid and gid == root_gid:
|
|
||||||
return
|
|
||||||
os.chown(current, root_uid, root_gid, follow_symlinks=False)
|
|
||||||
|
|
||||||
if self.root not in path.parents:
|
|
||||||
raise PathError(path, self.root)
|
|
||||||
root_uid, root_gid = self.root_owner
|
|
||||||
while path != self.root:
|
|
||||||
set_owner(path)
|
|
||||||
path = path.parent
|
|
||||||
|
|
||||||
def cache_for(self, package_base: str) -> Path:
|
def cache_for(self, package_base: str) -> Path:
|
||||||
"""
|
"""
|
||||||
@@ -248,43 +233,28 @@ class RepositoryPaths(LazyLogging):
|
|||||||
"""
|
"""
|
||||||
return self.cache / package_base
|
return self.cache / package_base
|
||||||
|
|
||||||
@contextlib.contextmanager
|
def chown(self, path: Path) -> None:
|
||||||
def preserve_owner(self, path: Path | None = None) -> Iterator[None]:
|
|
||||||
"""
|
"""
|
||||||
perform any action preserving owner for any newly created file or directory
|
set owner of path recursively (from root) to root owner
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
path(Path | None, optional): use this path as root instead of repository root (Default value = None)
|
path(Path): path to be chown
|
||||||
|
|
||||||
Examples:
|
Raises:
|
||||||
This method is designed to use as context manager when you are going to perform operations which might
|
PathError: if path does not belong to root
|
||||||
change filesystem, especially if you are doing it under unsafe flag, e.g.::
|
|
||||||
|
|
||||||
>>> with paths.preserve_owner():
|
|
||||||
>>> paths.tree_create()
|
|
||||||
|
|
||||||
Note, however, that this method doesn't handle any exceptions and will eventually interrupt
|
|
||||||
if there will be any.
|
|
||||||
"""
|
"""
|
||||||
path = path or self.root
|
def set_owner(current: Path) -> None:
|
||||||
|
uid, gid = self.owner(current)
|
||||||
|
if uid == root_uid and gid == root_gid:
|
||||||
|
return
|
||||||
|
os.chown(current, root_uid, root_gid, follow_symlinks=False)
|
||||||
|
|
||||||
def walk(root: Path) -> Iterator[Path]:
|
if self.root not in path.parents:
|
||||||
# basically walk, but skipping some content
|
raise PathError(path, self.root)
|
||||||
for child in safe_iterdir(root):
|
root_uid, root_gid = self.root_owner
|
||||||
yield child
|
while path != self.root:
|
||||||
if child in (self.chroot.parent,):
|
set_owner(path)
|
||||||
yield from safe_iterdir(child) # we only yield top-level in chroot directory
|
path = path.parent
|
||||||
elif child.is_dir():
|
|
||||||
yield from walk(child)
|
|
||||||
|
|
||||||
# get current filesystem and run action
|
|
||||||
previous_snapshot = set(walk(path))
|
|
||||||
yield
|
|
||||||
|
|
||||||
# get newly created files and directories and chown them
|
|
||||||
new_entries = set(walk(path)).difference(previous_snapshot)
|
|
||||||
for entry in new_entries:
|
|
||||||
self._chown(entry)
|
|
||||||
|
|
||||||
def tree_clear(self, package_base: str) -> None:
|
def tree_clear(self, package_base: str) -> None:
|
||||||
"""
|
"""
|
||||||
@@ -304,13 +274,12 @@ class RepositoryPaths(LazyLogging):
|
|||||||
"""
|
"""
|
||||||
if self.repository_id.is_empty:
|
if self.repository_id.is_empty:
|
||||||
return # do not even try to create tree in case if no repository id set
|
return # do not even try to create tree in case if no repository id set
|
||||||
|
for directory in (
|
||||||
with self.preserve_owner():
|
self.cache,
|
||||||
for directory in (
|
self.chroot,
|
||||||
self.cache,
|
self.packages,
|
||||||
self.chroot,
|
self.pacman,
|
||||||
self.packages,
|
self.repository,
|
||||||
self.pacman,
|
):
|
||||||
self.repository,
|
directory.mkdir(mode=0o755, parents=True, exist_ok=True)
|
||||||
):
|
self.chown(directory)
|
||||||
directory.mkdir(mode=0o755, parents=True, exist_ok=True)
|
|
||||||
|
|||||||
@@ -1,69 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2021-2025 ahriman team.
|
|
||||||
#
|
|
||||||
# This file is part of ahriman
|
|
||||||
# (see https://github.com/arcan1s/ahriman).
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
try:
|
|
||||||
import aiohttp_openmetrics
|
|
||||||
except ImportError:
|
|
||||||
aiohttp_openmetrics = None # type: ignore[assignment]
|
|
||||||
|
|
||||||
from aiohttp.typedefs import Middleware
|
|
||||||
from aiohttp.web import HTTPNotFound, Request, Response, StreamResponse, middleware
|
|
||||||
|
|
||||||
from ahriman.web.middlewares import HandlerType
|
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"metrics",
|
|
||||||
"metrics_handler",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
async def metrics(request: Request) -> Response:
|
|
||||||
"""
|
|
||||||
handler for returning metrics
|
|
||||||
|
|
||||||
Args:
|
|
||||||
request(Request): request object
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Response: response object
|
|
||||||
|
|
||||||
Raises:
|
|
||||||
HTTPNotFound: endpoint is disabled
|
|
||||||
"""
|
|
||||||
if aiohttp_openmetrics is None:
|
|
||||||
raise HTTPNotFound
|
|
||||||
return await aiohttp_openmetrics.metrics(request)
|
|
||||||
|
|
||||||
|
|
||||||
def metrics_handler() -> Middleware:
|
|
||||||
"""
|
|
||||||
middleware for metrics support
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Middleware: middleware function to handle server metrics
|
|
||||||
"""
|
|
||||||
if aiohttp_openmetrics is not None:
|
|
||||||
return aiohttp_openmetrics.metrics_middleware
|
|
||||||
|
|
||||||
@middleware
|
|
||||||
async def handle(request: Request, handler: HandlerType) -> StreamResponse:
|
|
||||||
return await handler(request)
|
|
||||||
|
|
||||||
return handle
|
|
||||||
@@ -17,10 +17,8 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import re
|
|
||||||
|
|
||||||
from aiohttp.web import Application, View
|
from aiohttp.web import Application, View
|
||||||
from collections.abc import Iterator
|
from collections.abc import Generator
|
||||||
|
|
||||||
import ahriman.web.views
|
import ahriman.web.views
|
||||||
|
|
||||||
@@ -32,7 +30,7 @@ from ahriman.web.views.base import BaseView
|
|||||||
__all__ = ["setup_routes"]
|
__all__ = ["setup_routes"]
|
||||||
|
|
||||||
|
|
||||||
def _dynamic_routes(configuration: Configuration) -> Iterator[tuple[str, type[View]]]:
|
def _dynamic_routes(configuration: Configuration) -> Generator[tuple[str, type[View]], None, None]:
|
||||||
"""
|
"""
|
||||||
extract dynamic routes based on views
|
extract dynamic routes based on views
|
||||||
|
|
||||||
@@ -47,23 +45,6 @@ def _dynamic_routes(configuration: Configuration) -> Iterator[tuple[str, type[Vi
|
|||||||
yield route, view
|
yield route, view
|
||||||
|
|
||||||
|
|
||||||
def _identifier(route: str) -> str:
|
|
||||||
"""
|
|
||||||
extract valid route identifier (aka name) for the route. This method replaces curly brackets by single colon
|
|
||||||
and replaces other special symbols (including slashes) by underscore
|
|
||||||
|
|
||||||
Args:
|
|
||||||
route(str): source route
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
str: route with special symbols being replaced
|
|
||||||
"""
|
|
||||||
# replace special symbols
|
|
||||||
alphanum = re.sub(r"[^A-Za-z\d\-{}]", "_", route)
|
|
||||||
# finally replace curly brackets
|
|
||||||
return alphanum.replace("{", ":").replace("}", "")
|
|
||||||
|
|
||||||
|
|
||||||
def setup_routes(application: Application, configuration: Configuration) -> None:
|
def setup_routes(application: Application, configuration: Configuration) -> None:
|
||||||
"""
|
"""
|
||||||
setup all defined routes
|
setup all defined routes
|
||||||
@@ -72,8 +53,7 @@ def setup_routes(application: Application, configuration: Configuration) -> None
|
|||||||
application(Application): web application instance
|
application(Application): web application instance
|
||||||
configuration(Configuration): configuration instance
|
configuration(Configuration): configuration instance
|
||||||
"""
|
"""
|
||||||
application.router.add_static("/static", configuration.getpath("web", "static_path"),
|
application.router.add_static("/static", configuration.getpath("web", "static_path"), follow_symlinks=True)
|
||||||
name="_static", follow_symlinks=True)
|
|
||||||
|
|
||||||
for route, view in _dynamic_routes(configuration):
|
for route, view in _dynamic_routes(configuration):
|
||||||
application.router.add_view(route, view, name=_identifier(route))
|
application.router.add_view(route, view)
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
from ahriman.web.schemas.any_schema import AnySchema
|
|
||||||
from ahriman.web.schemas.aur_package_schema import AURPackageSchema
|
from ahriman.web.schemas.aur_package_schema import AURPackageSchema
|
||||||
from ahriman.web.schemas.auth_schema import AuthSchema
|
from ahriman.web.schemas.auth_schema import AuthSchema
|
||||||
from ahriman.web.schemas.build_options_schema import BuildOptionsSchema
|
from ahriman.web.schemas.build_options_schema import BuildOptionsSchema
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2021-2025 ahriman team.
|
|
||||||
#
|
|
||||||
# This file is part of ahriman
|
|
||||||
# (see https://github.com/arcan1s/ahriman).
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# 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 ahriman.web.apispec import Schema
|
|
||||||
|
|
||||||
|
|
||||||
class AnySchema(Schema):
|
|
||||||
"""
|
|
||||||
response dummy schema
|
|
||||||
"""
|
|
||||||
@@ -39,7 +39,7 @@ class RemoteSchema(Schema):
|
|||||||
"example": ".",
|
"example": ".",
|
||||||
})
|
})
|
||||||
source = fields.Enum(PackageSource, by_value=True, required=True, metadata={
|
source = fields.Enum(PackageSource, by_value=True, required=True, metadata={
|
||||||
"description": "Package source",
|
"description": "Pacakge source",
|
||||||
})
|
})
|
||||||
web_url = fields.String(metadata={
|
web_url = fields.String(metadata={
|
||||||
"description": "Package repository page",
|
"description": "Package repository page",
|
||||||
|
|||||||
@@ -167,9 +167,6 @@ class BaseView(View, CorsViewMixin):
|
|||||||
"""
|
"""
|
||||||
HEAD method implementation based on the result of GET method
|
HEAD method implementation based on the result of GET method
|
||||||
|
|
||||||
Returns:
|
|
||||||
StreamResponse: generated response for the request
|
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
HTTPMethodNotAllowed: in case if there is no GET method implemented
|
HTTPMethodNotAllowed: in case if there is no GET method implemented
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ class PackageView(StatusViewGuard, BaseView):
|
|||||||
@apidocs(
|
@apidocs(
|
||||||
tags=["Packages"],
|
tags=["Packages"],
|
||||||
summary="Update package",
|
summary="Update package",
|
||||||
description="Update package status and set its descriptor optionally",
|
description="Update package status and set its descriptior optionally",
|
||||||
permission=POST_PERMISSION,
|
permission=POST_PERMISSION,
|
||||||
error_400_enabled=True,
|
error_400_enabled=True,
|
||||||
error_404_description="Repository is unknown",
|
error_404_description="Repository is unknown",
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class PackagesView(StatusViewGuard, BaseView):
|
|||||||
ROUTES = ["/api/v1/packages"]
|
ROUTES = ["/api/v1/packages"]
|
||||||
|
|
||||||
@apidocs(
|
@apidocs(
|
||||||
tags=["Packages"],
|
tags=["packages"],
|
||||||
summary="Get packages list",
|
summary="Get packages list",
|
||||||
description="Retrieve packages and their descriptors",
|
description="Retrieve packages and their descriptors",
|
||||||
permission=GET_PERMISSION,
|
permission=GET_PERMISSION,
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2021-2025 ahriman team.
|
|
||||||
#
|
|
||||||
# This file is part of ahriman
|
|
||||||
# (see https://github.com/arcan1s/ahriman).
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# 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 aiohttp.web import Response
|
|
||||||
from typing import ClassVar
|
|
||||||
|
|
||||||
from ahriman.models.user_access import UserAccess
|
|
||||||
from ahriman.web.apispec.decorators import apidocs
|
|
||||||
from ahriman.web.middlewares.metrics_handler import metrics
|
|
||||||
from ahriman.web.schemas import AnySchema
|
|
||||||
from ahriman.web.views.base import BaseView
|
|
||||||
|
|
||||||
|
|
||||||
class MetricsView(BaseView):
|
|
||||||
"""
|
|
||||||
open metrics endpoints
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
GET_PERMISSION(UserAccess): (class attribute) get permissions of self
|
|
||||||
"""
|
|
||||||
|
|
||||||
GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Unauthorized
|
|
||||||
ROUTES = ["/api/v1/metrics"]
|
|
||||||
|
|
||||||
@apidocs(
|
|
||||||
tags=["Status"],
|
|
||||||
summary="OpenMetrics endpoint",
|
|
||||||
description="Get service metrics in OpenMetrics format",
|
|
||||||
permission=GET_PERMISSION,
|
|
||||||
error_404_description="Endpoint is disabled",
|
|
||||||
schema=AnySchema,
|
|
||||||
)
|
|
||||||
async def get(self) -> Response:
|
|
||||||
"""
|
|
||||||
get service HTTP metrics
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Response: 200 with service metrics as generated by the library
|
|
||||||
"""
|
|
||||||
return await metrics(self.request)
|
|
||||||
@@ -97,7 +97,6 @@ class LoginView(BaseView):
|
|||||||
login user to service. The authentication session will be passed in ``Set-Cookie`` header.
|
login user to service. The authentication session will be passed in ``Set-Cookie`` header.
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
HTTPBadRequest: if bad data is supplied
|
|
||||||
HTTPFound: on success response
|
HTTPFound: on success response
|
||||||
HTTPUnauthorized: if case of authorization error
|
HTTPUnauthorized: if case of authorization error
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ from ahriman.web.apispec.info import setup_apispec
|
|||||||
from ahriman.web.cors import setup_cors
|
from ahriman.web.cors import setup_cors
|
||||||
from ahriman.web.keys import AuthKey, ConfigurationKey, SpawnKey, WatcherKey, WorkersKey
|
from ahriman.web.keys import AuthKey, ConfigurationKey, SpawnKey, WatcherKey, WorkersKey
|
||||||
from ahriman.web.middlewares.exception_handler import exception_handler
|
from ahriman.web.middlewares.exception_handler import exception_handler
|
||||||
from ahriman.web.middlewares.metrics_handler import metrics_handler
|
|
||||||
from ahriman.web.routes import setup_routes
|
from ahriman.web.routes import setup_routes
|
||||||
|
|
||||||
|
|
||||||
@@ -147,7 +146,6 @@ def setup_server(configuration: Configuration, spawner: Spawn, repositories: lis
|
|||||||
|
|
||||||
application.middlewares.append(normalize_path_middleware(append_slash=False, remove_slash=True))
|
application.middlewares.append(normalize_path_middleware(append_slash=False, remove_slash=True))
|
||||||
application.middlewares.append(exception_handler(application.logger))
|
application.middlewares.append(exception_handler(application.logger))
|
||||||
application.middlewares.append(metrics_handler())
|
|
||||||
|
|
||||||
application.logger.info("setup routes")
|
application.logger.info("setup routes")
|
||||||
setup_routes(application, configuration)
|
setup_routes(application, configuration)
|
||||||
@@ -166,16 +164,11 @@ def setup_server(configuration: Configuration, spawner: Spawn, repositories: lis
|
|||||||
# package cache
|
# package cache
|
||||||
if not repositories:
|
if not repositories:
|
||||||
raise InitializeError("No repositories configured, exiting")
|
raise InitializeError("No repositories configured, exiting")
|
||||||
|
database = SQLite.load(configuration)
|
||||||
watchers: dict[RepositoryId, Watcher] = {}
|
watchers: dict[RepositoryId, Watcher] = {}
|
||||||
configuration_path, _ = configuration.check_loaded()
|
|
||||||
for repository_id in repositories:
|
for repository_id in repositories:
|
||||||
application.logger.info("load repository %s", repository_id)
|
application.logger.info("load repository %s", repository_id)
|
||||||
# load settings explicitly for architecture if any
|
client = Client.load(repository_id, configuration, database, report=False) # explicitly load local client
|
||||||
repository_configuration = Configuration.from_path(configuration_path, repository_id)
|
|
||||||
# load database instance, because it holds identifier
|
|
||||||
database = SQLite.load(repository_configuration)
|
|
||||||
# explicitly load local client
|
|
||||||
client = Client.load(repository_id, repository_configuration, database, report=False)
|
|
||||||
watchers[repository_id] = Watcher(client)
|
watchers[repository_id] = Watcher(client)
|
||||||
application[WatcherKey] = watchers
|
application[WatcherKey] = watchers
|
||||||
# workers cache
|
# workers cache
|
||||||
@@ -184,7 +177,6 @@ def setup_server(configuration: Configuration, spawner: Spawn, repositories: lis
|
|||||||
application[SpawnKey] = spawner
|
application[SpawnKey] = spawner
|
||||||
|
|
||||||
application.logger.info("setup authorization")
|
application.logger.info("setup authorization")
|
||||||
database = SQLite.load(configuration)
|
|
||||||
validator = application[AuthKey] = Auth.load(configuration, database)
|
validator = application[AuthKey] = Auth.load(configuration, database)
|
||||||
if validator.enabled:
|
if validator.enabled:
|
||||||
from ahriman.web.middlewares.auth_handler import setup_auth
|
from ahriman.web.middlewares.auth_handler import setup_auth
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2021-2025 ahriman team.
|
# Copyright (c) 2021-2024 ahriman team.
|
||||||
#
|
#
|
||||||
# This file is part of ahriman
|
# This file is part of ahriman
|
||||||
# (see https://github.com/arcan1s/ahriman).
|
# (see https://github.com/arcan1s/ahriman).
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
from pathlib import Path
|
|
||||||
from pytest_mock import MockerFixture
|
from pytest_mock import MockerFixture
|
||||||
from typing import Any
|
|
||||||
from unittest.mock import MagicMock, call as MockCall
|
from unittest.mock import MagicMock, call as MockCall
|
||||||
|
|
||||||
from ahriman.application.application import Application
|
from ahriman.application.application import Application
|
||||||
@@ -75,10 +73,6 @@ def test_with_dependencies(application: Application, package_ahriman: Package, p
|
|||||||
mock.packages_full = [package_base]
|
mock.packages_full = [package_base]
|
||||||
return mock
|
return mock
|
||||||
|
|
||||||
def get_package(name: str | Path, *args: Any, **kwargs: Any) -> Package:
|
|
||||||
name = name if isinstance(name, str) else name.name
|
|
||||||
return packages[name]
|
|
||||||
|
|
||||||
package_python_schedule.packages = {
|
package_python_schedule.packages = {
|
||||||
package_python_schedule.base: package_python_schedule.packages[package_python_schedule.base]
|
package_python_schedule.base: package_python_schedule.packages[package_python_schedule.base]
|
||||||
}
|
}
|
||||||
@@ -93,8 +87,10 @@ def test_with_dependencies(application: Application, package_ahriman: Package, p
|
|||||||
}
|
}
|
||||||
|
|
||||||
mocker.patch("pathlib.Path.is_dir", autospec=True, side_effect=lambda p: p.name == "python")
|
mocker.patch("pathlib.Path.is_dir", autospec=True, side_effect=lambda p: p.name == "python")
|
||||||
package_aur_mock = mocker.patch("ahriman.models.package.Package.from_aur", side_effect=get_package)
|
package_aur_mock = mocker.patch("ahriman.models.package.Package.from_aur",
|
||||||
package_local_mock = mocker.patch("ahriman.models.package.Package.from_build", side_effect=get_package)
|
side_effect=lambda *args: packages[args[0]])
|
||||||
|
package_local_mock = mocker.patch("ahriman.models.package.Package.from_build",
|
||||||
|
side_effect=lambda *args: packages[args[0].name])
|
||||||
packages_mock = mocker.patch("ahriman.application.application.Application._known_packages",
|
packages_mock = mocker.patch("ahriman.application.application.Application._known_packages",
|
||||||
return_value={"devtools", "python-build", "python-pytest"})
|
return_value={"devtools", "python-build", "python-pytest"})
|
||||||
status_client_mock = mocker.patch("ahriman.core.status.Client.set_unknown")
|
status_client_mock = mocker.patch("ahriman.core.status.Client.set_unknown")
|
||||||
@@ -102,8 +98,8 @@ def test_with_dependencies(application: Application, package_ahriman: Package, p
|
|||||||
result = application.with_dependencies([package_ahriman], process_dependencies=True)
|
result = application.with_dependencies([package_ahriman], process_dependencies=True)
|
||||||
assert {package.base: package for package in result} == packages
|
assert {package.base: package for package in result} == packages
|
||||||
package_aur_mock.assert_has_calls([
|
package_aur_mock.assert_has_calls([
|
||||||
MockCall(package_python_schedule.base, package_ahriman.packager, include_provides=True),
|
MockCall(package_python_schedule.base, package_ahriman.packager),
|
||||||
MockCall("python-installer", package_ahriman.packager, include_provides=True),
|
MockCall("python-installer", package_ahriman.packager),
|
||||||
], any_order=True)
|
], any_order=True)
|
||||||
package_local_mock.assert_has_calls([
|
package_local_mock.assert_has_calls([
|
||||||
MockCall(application.repository.paths.cache_for("python"), "x86_64", package_ahriman.packager),
|
MockCall(application.repository.paths.cache_for("python"), "x86_64", package_ahriman.packager),
|
||||||
|
|||||||
@@ -144,7 +144,6 @@ def test_repositories_extract(args: argparse.Namespace, configuration: Configura
|
|||||||
args.architecture = "arch"
|
args.architecture = "arch"
|
||||||
args.configuration = configuration.path
|
args.configuration = configuration.path
|
||||||
args.repository = "repo"
|
args.repository = "repo"
|
||||||
mocker.patch("ahriman.core.configuration.Configuration.load", new=lambda self, _: self.copy_from(configuration))
|
|
||||||
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
||||||
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories")
|
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories")
|
||||||
|
|
||||||
@@ -160,7 +159,6 @@ def test_repositories_extract_repository(args: argparse.Namespace, configuration
|
|||||||
"""
|
"""
|
||||||
args.architecture = "arch"
|
args.architecture = "arch"
|
||||||
args.configuration = configuration.path
|
args.configuration = configuration.path
|
||||||
mocker.patch("ahriman.core.configuration.Configuration.load", new=lambda self, _: self.copy_from(configuration))
|
|
||||||
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
||||||
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories",
|
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories",
|
||||||
return_value={"repo"})
|
return_value={"repo"})
|
||||||
@@ -177,7 +175,6 @@ def test_repositories_extract_repository_legacy(args: argparse.Namespace, config
|
|||||||
"""
|
"""
|
||||||
args.architecture = "arch"
|
args.architecture = "arch"
|
||||||
args.configuration = configuration.path
|
args.configuration = configuration.path
|
||||||
mocker.patch("ahriman.core.configuration.Configuration.load", new=lambda self, _: self.copy_from(configuration))
|
|
||||||
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
||||||
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories",
|
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories",
|
||||||
return_value=set())
|
return_value=set())
|
||||||
@@ -194,7 +191,6 @@ def test_repositories_extract_architecture(args: argparse.Namespace, configurati
|
|||||||
"""
|
"""
|
||||||
args.configuration = configuration.path
|
args.configuration = configuration.path
|
||||||
args.repository = "repo"
|
args.repository = "repo"
|
||||||
mocker.patch("ahriman.core.configuration.Configuration.load", new=lambda self, _: self.copy_from(configuration))
|
|
||||||
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures",
|
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures",
|
||||||
return_value={"arch"})
|
return_value={"arch"})
|
||||||
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories")
|
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories")
|
||||||
@@ -211,7 +207,6 @@ def test_repositories_extract_empty(args: argparse.Namespace, configuration: Con
|
|||||||
"""
|
"""
|
||||||
args.command = "config"
|
args.command = "config"
|
||||||
args.configuration = configuration.path
|
args.configuration = configuration.path
|
||||||
mocker.patch("ahriman.core.configuration.Configuration.load", new=lambda self, _: self.copy_from(configuration))
|
|
||||||
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures", return_value=set())
|
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures", return_value=set())
|
||||||
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories", return_value=set())
|
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories", return_value=set())
|
||||||
|
|
||||||
@@ -226,7 +221,6 @@ def test_repositories_extract_systemd(args: argparse.Namespace, configuration: C
|
|||||||
"""
|
"""
|
||||||
args.configuration = configuration.path
|
args.configuration = configuration.path
|
||||||
args.repository_id = "i686/some/repo/name"
|
args.repository_id = "i686/some/repo/name"
|
||||||
mocker.patch("ahriman.core.configuration.Configuration.load", new=lambda self, _: self.copy_from(configuration))
|
|
||||||
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
||||||
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories")
|
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories")
|
||||||
|
|
||||||
@@ -242,7 +236,6 @@ def test_repositories_extract_systemd_with_dash(args: argparse.Namespace, config
|
|||||||
"""
|
"""
|
||||||
args.configuration = configuration.path
|
args.configuration = configuration.path
|
||||||
args.repository_id = "i686-some-repo-name"
|
args.repository_id = "i686-some-repo-name"
|
||||||
mocker.patch("ahriman.core.configuration.Configuration.load", new=lambda self, _: self.copy_from(configuration))
|
|
||||||
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
||||||
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories")
|
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories")
|
||||||
|
|
||||||
@@ -258,7 +251,6 @@ def test_repositories_extract_systemd_legacy(args: argparse.Namespace, configura
|
|||||||
"""
|
"""
|
||||||
args.configuration = configuration.path
|
args.configuration = configuration.path
|
||||||
args.repository_id = "i686"
|
args.repository_id = "i686"
|
||||||
mocker.patch("ahriman.core.configuration.Configuration.load", new=lambda self, _: self.copy_from(configuration))
|
|
||||||
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
known_architectures_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_architectures")
|
||||||
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories",
|
known_repositories_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.known_repositories",
|
||||||
return_value=set())
|
return_value=set())
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ from pytest_mock import MockerFixture
|
|||||||
from ahriman.application.application import Application
|
from ahriman.application.application import Application
|
||||||
from ahriman.application.handlers.copy import Copy
|
from ahriman.application.handlers.copy import Copy
|
||||||
from ahriman.core.configuration import Configuration
|
from ahriman.core.configuration import Configuration
|
||||||
from ahriman.core.database import SQLite
|
|
||||||
from ahriman.core.repository import Repository
|
from ahriman.core.repository import Repository
|
||||||
from ahriman.models.build_status import BuildStatusEnum
|
from ahriman.models.build_status import BuildStatusEnum
|
||||||
from ahriman.models.package import Package
|
from ahriman.models.package import Package
|
||||||
@@ -31,12 +30,11 @@ def _default_args(args: argparse.Namespace) -> argparse.Namespace:
|
|||||||
|
|
||||||
|
|
||||||
def test_run(args: argparse.Namespace, configuration: Configuration, repository: Repository,
|
def test_run(args: argparse.Namespace, configuration: Configuration, repository: Repository,
|
||||||
database: SQLite, package_ahriman: Package, mocker: MockerFixture) -> None:
|
package_ahriman: Package, mocker: MockerFixture) -> None:
|
||||||
"""
|
"""
|
||||||
must run command
|
must run command
|
||||||
"""
|
"""
|
||||||
args = _default_args(args)
|
args = _default_args(args)
|
||||||
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
|
|
||||||
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
||||||
mocker.patch("ahriman.core.repository.Repository.packages", return_value=[package_ahriman])
|
mocker.patch("ahriman.core.repository.Repository.packages", return_value=[package_ahriman])
|
||||||
application_mock = mocker.patch("ahriman.application.handlers.copy.Copy.copy_package")
|
application_mock = mocker.patch("ahriman.application.handlers.copy.Copy.copy_package")
|
||||||
@@ -53,13 +51,12 @@ def test_run(args: argparse.Namespace, configuration: Configuration, repository:
|
|||||||
|
|
||||||
|
|
||||||
def test_run_remove(args: argparse.Namespace, configuration: Configuration, repository: Repository,
|
def test_run_remove(args: argparse.Namespace, configuration: Configuration, repository: Repository,
|
||||||
database: SQLite, package_ahriman: Package, mocker: MockerFixture) -> None:
|
package_ahriman: Package, mocker: MockerFixture) -> None:
|
||||||
"""
|
"""
|
||||||
must run command and remove packages afterward
|
must run command and remove packages afterward
|
||||||
"""
|
"""
|
||||||
args = _default_args(args)
|
args = _default_args(args)
|
||||||
args.remove = True
|
args.remove = True
|
||||||
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
|
|
||||||
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
||||||
mocker.patch("ahriman.core.repository.Repository.packages", return_value=[package_ahriman])
|
mocker.patch("ahriman.core.repository.Repository.packages", return_value=[package_ahriman])
|
||||||
mocker.patch("ahriman.application.handlers.copy.Copy.copy_package")
|
mocker.patch("ahriman.application.handlers.copy.Copy.copy_package")
|
||||||
@@ -72,14 +69,12 @@ def test_run_remove(args: argparse.Namespace, configuration: Configuration, repo
|
|||||||
|
|
||||||
|
|
||||||
def test_run_empty_exception(args: argparse.Namespace, configuration: Configuration, repository: Repository,
|
def test_run_empty_exception(args: argparse.Namespace, configuration: Configuration, repository: Repository,
|
||||||
database: SQLite, mocker: MockerFixture) -> None:
|
mocker: MockerFixture) -> None:
|
||||||
"""
|
"""
|
||||||
must raise ExitCode exception on empty result
|
must raise ExitCode exception on empty result
|
||||||
"""
|
"""
|
||||||
args = _default_args(args)
|
args = _default_args(args)
|
||||||
args.exit_code = True
|
args.exit_code = True
|
||||||
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
|
|
||||||
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
|
||||||
mocker.patch("ahriman.core.repository.Repository.packages", return_value=[])
|
mocker.patch("ahriman.core.repository.Repository.packages", return_value=[])
|
||||||
mocker.patch("ahriman.application.application.Application.update")
|
mocker.patch("ahriman.application.application.Application.update")
|
||||||
check_mock = mocker.patch("ahriman.application.handlers.handler.Handler.check_status")
|
check_mock = mocker.patch("ahriman.application.handlers.handler.Handler.check_status")
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ from urllib.parse import quote_plus as url_encode
|
|||||||
|
|
||||||
from ahriman.application.handlers.setup import Setup
|
from ahriman.application.handlers.setup import Setup
|
||||||
from ahriman.core.configuration import Configuration
|
from ahriman.core.configuration import Configuration
|
||||||
from ahriman.core.database import SQLite
|
|
||||||
from ahriman.core.exceptions import MissingArchitectureError
|
from ahriman.core.exceptions import MissingArchitectureError
|
||||||
from ahriman.core.repository import Repository
|
from ahriman.core.repository import Repository
|
||||||
from ahriman.models.repository_id import RepositoryId
|
from ahriman.models.repository_id import RepositoryId
|
||||||
@@ -45,12 +44,11 @@ def _default_args(args: argparse.Namespace) -> argparse.Namespace:
|
|||||||
|
|
||||||
|
|
||||||
def test_run(args: argparse.Namespace, configuration: Configuration, repository: Repository,
|
def test_run(args: argparse.Namespace, configuration: Configuration, repository: Repository,
|
||||||
database: SQLite, repository_paths: RepositoryPaths, mocker: MockerFixture) -> None:
|
repository_paths: RepositoryPaths, mocker: MockerFixture) -> None:
|
||||||
"""
|
"""
|
||||||
must run command
|
must run command
|
||||||
"""
|
"""
|
||||||
args = _default_args(args)
|
args = _default_args(args)
|
||||||
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
|
|
||||||
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
||||||
ahriman_configuration_mock = mocker.patch("ahriman.application.handlers.setup.Setup.configuration_create_ahriman")
|
ahriman_configuration_mock = mocker.patch("ahriman.application.handlers.setup.Setup.configuration_create_ahriman")
|
||||||
devtools_configuration_mock = mocker.patch("ahriman.application.handlers.setup.Setup.configuration_create_devtools")
|
devtools_configuration_mock = mocker.patch("ahriman.application.handlers.setup.Setup.configuration_create_devtools")
|
||||||
@@ -58,11 +56,9 @@ def test_run(args: argparse.Namespace, configuration: Configuration, repository:
|
|||||||
sudo_configuration_mock = mocker.patch("ahriman.application.handlers.setup.Setup.configuration_create_sudo")
|
sudo_configuration_mock = mocker.patch("ahriman.application.handlers.setup.Setup.configuration_create_sudo")
|
||||||
executable_mock = mocker.patch("ahriman.application.handlers.setup.Setup.executable_create")
|
executable_mock = mocker.patch("ahriman.application.handlers.setup.Setup.executable_create")
|
||||||
init_mock = mocker.patch("ahriman.core.alpm.repo.Repo.init")
|
init_mock = mocker.patch("ahriman.core.alpm.repo.Repo.init")
|
||||||
owner_guard_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.preserve_owner")
|
|
||||||
|
|
||||||
_, repository_id = configuration.check_loaded()
|
_, repository_id = configuration.check_loaded()
|
||||||
Setup.run(args, repository_id, configuration, report=False)
|
Setup.run(args, repository_id, configuration, report=False)
|
||||||
owner_guard_mock.assert_called_once_with()
|
|
||||||
ahriman_configuration_mock.assert_called_once_with(args, repository_id, configuration)
|
ahriman_configuration_mock.assert_called_once_with(args, repository_id, configuration)
|
||||||
devtools_configuration_mock.assert_called_once_with(
|
devtools_configuration_mock.assert_called_once_with(
|
||||||
repository_id, args.from_configuration, args.mirror, args.multilib, f"file://{repository_paths.repository}")
|
repository_id, args.from_configuration, args.mirror, args.multilib, f"file://{repository_paths.repository}")
|
||||||
@@ -92,13 +88,12 @@ def test_run_no_architecture_or_repository(configuration: Configuration) -> None
|
|||||||
|
|
||||||
|
|
||||||
def test_run_with_server(args: argparse.Namespace, configuration: Configuration, repository: Repository,
|
def test_run_with_server(args: argparse.Namespace, configuration: Configuration, repository: Repository,
|
||||||
database: SQLite, mocker: MockerFixture) -> None:
|
mocker: MockerFixture) -> None:
|
||||||
"""
|
"""
|
||||||
must run command with server specified
|
must run command with server specified
|
||||||
"""
|
"""
|
||||||
args = _default_args(args)
|
args = _default_args(args)
|
||||||
args.server = "server"
|
args.server = "server"
|
||||||
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
|
|
||||||
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
||||||
mocker.patch("ahriman.application.handlers.setup.Setup.configuration_create_ahriman")
|
mocker.patch("ahriman.application.handlers.setup.Setup.configuration_create_ahriman")
|
||||||
mocker.patch("ahriman.application.handlers.setup.Setup.configuration_create_makepkg")
|
mocker.patch("ahriman.application.handlers.setup.Setup.configuration_create_makepkg")
|
||||||
@@ -270,11 +265,13 @@ def test_executable_create(configuration: Configuration, repository_paths: Repos
|
|||||||
"""
|
"""
|
||||||
must create executable
|
must create executable
|
||||||
"""
|
"""
|
||||||
|
chown_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.chown")
|
||||||
symlink_mock = mocker.patch("pathlib.Path.symlink_to")
|
symlink_mock = mocker.patch("pathlib.Path.symlink_to")
|
||||||
unlink_mock = mocker.patch("pathlib.Path.unlink")
|
unlink_mock = mocker.patch("pathlib.Path.unlink")
|
||||||
|
|
||||||
_, repository_id = configuration.check_loaded()
|
_, repository_id = configuration.check_loaded()
|
||||||
Setup.executable_create(repository_paths, repository_id)
|
Setup.executable_create(repository_paths, repository_id)
|
||||||
|
chown_mock.assert_called_once_with(Setup.build_command(repository_paths.root, repository_id))
|
||||||
symlink_mock.assert_called_once_with(Setup.ARCHBUILD_COMMAND_PATH)
|
symlink_mock.assert_called_once_with(Setup.ARCHBUILD_COMMAND_PATH)
|
||||||
unlink_mock.assert_called_once_with(missing_ok=True)
|
unlink_mock.assert_called_once_with(missing_ok=True)
|
||||||
|
|
||||||
|
|||||||
@@ -51,8 +51,7 @@ def test_run(args: argparse.Namespace, configuration: Configuration, database: S
|
|||||||
update_mock.assert_called_once_with(user)
|
update_mock.assert_called_once_with(user)
|
||||||
|
|
||||||
|
|
||||||
def test_run_empty_salt(args: argparse.Namespace, configuration: Configuration, database: SQLite,
|
def test_run_empty_salt(args: argparse.Namespace, configuration: Configuration, mocker: MockerFixture) -> None:
|
||||||
mocker: MockerFixture) -> None:
|
|
||||||
"""
|
"""
|
||||||
must process users with empty password salt
|
must process users with empty password salt
|
||||||
"""
|
"""
|
||||||
@@ -60,7 +59,6 @@ def test_run_empty_salt(args: argparse.Namespace, configuration: Configuration,
|
|||||||
args = _default_args(args)
|
args = _default_args(args)
|
||||||
user = User(username=args.username, password=args.password, access=args.role,
|
user = User(username=args.username, password=args.password, access=args.role,
|
||||||
packager_id=args.packager, key=args.key)
|
packager_id=args.packager, key=args.key)
|
||||||
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
|
|
||||||
mocker.patch("ahriman.models.user.User.hash_password", return_value=user)
|
mocker.patch("ahriman.models.user.User.hash_password", return_value=user)
|
||||||
create_user_mock = mocker.patch("ahriman.application.handlers.users.Users.user_create", return_value=user)
|
create_user_mock = mocker.patch("ahriman.application.handlers.users.Users.user_create", return_value=user)
|
||||||
update_mock = mocker.patch("ahriman.core.database.SQLite.user_update")
|
update_mock = mocker.patch("ahriman.core.database.SQLite.user_update")
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import argparse
|
|||||||
import json
|
import json
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
from pytest_mock import MockerFixture
|
from pytest_mock import MockerFixture
|
||||||
|
|
||||||
from ahriman.application.handlers.validate import Validate
|
from ahriman.application.handlers.validate import Validate
|
||||||
@@ -54,50 +53,12 @@ def test_run_skip(args: argparse.Namespace, configuration: Configuration, mocker
|
|||||||
print_mock.assert_not_called()
|
print_mock.assert_not_called()
|
||||||
|
|
||||||
|
|
||||||
def test_run_default(args: argparse.Namespace, configuration: Configuration) -> None:
|
|
||||||
"""
|
|
||||||
must run on default configuration without errors
|
|
||||||
"""
|
|
||||||
args.exit_code = True
|
|
||||||
_, repository_id = configuration.check_loaded()
|
|
||||||
|
|
||||||
default = Configuration.from_path(Configuration.SYSTEM_CONFIGURATION_PATH, repository_id)
|
|
||||||
# copy autogenerated values
|
|
||||||
for section, key in (("build", "build_command"), ("repository", "root")):
|
|
||||||
value = configuration.get(section, key)
|
|
||||||
default.set_option(section, key, value)
|
|
||||||
|
|
||||||
Validate.run(args, repository_id, default, report=False)
|
|
||||||
|
|
||||||
|
|
||||||
def test_run_repo_specific_triggers(args: argparse.Namespace, configuration: Configuration,
|
|
||||||
resource_path_root: Path) -> None:
|
|
||||||
"""
|
|
||||||
must correctly insert repo specific triggers
|
|
||||||
"""
|
|
||||||
args.exit_code = True
|
|
||||||
_, repository_id = configuration.check_loaded()
|
|
||||||
|
|
||||||
# remove unused sections
|
|
||||||
for section in ("customs3", "github:x86_64", "logs-rotation", "mirrorlist"):
|
|
||||||
configuration.remove_section(section)
|
|
||||||
|
|
||||||
configuration.set_option("report", "target", "test")
|
|
||||||
for section in ("test", "test:i686", "test:another-repo:x86_64"):
|
|
||||||
configuration.set_option(section, "type", "html")
|
|
||||||
configuration.set_option(section, "link_path", "http://link_path")
|
|
||||||
configuration.set_option(section, "path", "path")
|
|
||||||
configuration.set_option(section, "template", "template")
|
|
||||||
configuration.set_option(section, "templates", str(resource_path_root))
|
|
||||||
|
|
||||||
Validate.run(args, repository_id, configuration, report=False)
|
|
||||||
|
|
||||||
|
|
||||||
def test_schema(configuration: Configuration) -> None:
|
def test_schema(configuration: Configuration) -> None:
|
||||||
"""
|
"""
|
||||||
must generate full schema correctly
|
must generate full schema correctly
|
||||||
"""
|
"""
|
||||||
schema = Validate.schema(configuration)
|
_, repository_id = configuration.check_loaded()
|
||||||
|
schema = Validate.schema(repository_id, configuration)
|
||||||
|
|
||||||
# defaults
|
# defaults
|
||||||
assert schema.pop("console")
|
assert schema.pop("console")
|
||||||
@@ -130,7 +91,9 @@ def test_schema_invalid_trigger(configuration: Configuration) -> None:
|
|||||||
"""
|
"""
|
||||||
configuration.set_option("build", "triggers", "some.invalid.trigger.path.Trigger")
|
configuration.set_option("build", "triggers", "some.invalid.trigger.path.Trigger")
|
||||||
configuration.remove_option("build", "triggers_known")
|
configuration.remove_option("build", "triggers_known")
|
||||||
assert Validate.schema(configuration) == CONFIGURATION_SCHEMA
|
_, repository_id = configuration.check_loaded()
|
||||||
|
|
||||||
|
assert Validate.schema(repository_id, configuration) == CONFIGURATION_SCHEMA
|
||||||
|
|
||||||
|
|
||||||
def test_schema_erase_required() -> None:
|
def test_schema_erase_required() -> None:
|
||||||
|
|||||||
@@ -1575,7 +1575,6 @@ def test_run(args: argparse.Namespace, configuration: Configuration, mocker: Moc
|
|||||||
args.command = ""
|
args.command = ""
|
||||||
args.handler = Handler
|
args.handler = Handler
|
||||||
|
|
||||||
mocker.patch("ahriman.core.configuration.Configuration.load", new=lambda self, _: self.copy_from(configuration))
|
|
||||||
mocker.patch("argparse.ArgumentParser.parse_args", return_value=args)
|
mocker.patch("argparse.ArgumentParser.parse_args", return_value=args)
|
||||||
|
|
||||||
assert ahriman.run() == 1
|
assert ahriman.run() == 1
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ def test_check_user(lock: Lock, mocker: MockerFixture) -> None:
|
|||||||
tree_create = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create")
|
tree_create = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create")
|
||||||
|
|
||||||
lock.check_user()
|
lock.check_user()
|
||||||
check_user_patch.assert_called_once_with(lock.paths.root, unsafe=False)
|
check_user_patch.assert_called_once_with(lock.paths, unsafe=False)
|
||||||
tree_create.assert_called_once_with()
|
tree_create.assert_called_once_with()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user