mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-06-28 14:51:43 +00:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
f01f35238d | |||
d30d512eb6 | |||
0437f90e5a | |||
3cab65855a | |||
ecfb615f97 | |||
243983ee64 |
7
.github/workflows/setup.sh
vendored
7
.github/workflows/setup.sh
vendored
@ -12,7 +12,7 @@ pacman -Syu --noconfirm
|
|||||||
# main dependencies
|
# main dependencies
|
||||||
pacman -Sy --noconfirm devtools git pyalpm python-cerberus python-inflection python-passlib python-requests python-srcinfo python-systemd sudo
|
pacman -Sy --noconfirm devtools git pyalpm python-cerberus python-inflection python-passlib python-requests python-srcinfo python-systemd sudo
|
||||||
# make dependencies
|
# make dependencies
|
||||||
pacman -Sy --noconfirm python-build python-flit python-installer python-tox python-wheel
|
pacman -Sy --noconfirm --asdeps base-devel python-build python-flit python-installer python-tox python-wheel
|
||||||
# optional dependencies
|
# optional dependencies
|
||||||
if [[ -z $MINIMAL_INSTALL ]]; then
|
if [[ -z $MINIMAL_INSTALL ]]; then
|
||||||
# VCS support
|
# VCS support
|
||||||
@ -36,6 +36,9 @@ sudo -u nobody -- makepkg --packagelist | grep -v -- -debug- | pacman -U --nocon
|
|||||||
# create machine-id which is required by build tools
|
# create machine-id which is required by build tools
|
||||||
systemd-machine-id-setup
|
systemd-machine-id-setup
|
||||||
|
|
||||||
|
# remove unused dependencies
|
||||||
|
pacman -Qdtq | pacman -Rscn --noconfirm -
|
||||||
|
|
||||||
# initial setup command as root
|
# initial setup command as root
|
||||||
[[ -z $MINIMAL_INSTALL ]] && WEB_ARGS=("--web-port" "8080")
|
[[ -z $MINIMAL_INSTALL ]] && WEB_ARGS=("--web-port" "8080")
|
||||||
ahriman -a x86_64 -r "github" service-setup --packager "ahriman bot <ahriman@example.com>" "${WEB_ARGS[@]}"
|
ahriman -a x86_64 -r "github" service-setup --packager "ahriman bot <ahriman@example.com>" "${WEB_ARGS[@]}"
|
||||||
@ -50,7 +53,7 @@ if [[ -z $MINIMAL_INSTALL ]]; then
|
|||||||
WEB_PID=$!
|
WEB_PID=$!
|
||||||
fi
|
fi
|
||||||
# add the first package
|
# add the first package
|
||||||
sudo -u ahriman -- ahriman package-add --now ahriman
|
sudo -u ahriman -- ahriman --log-handler console package-add --now ahriman
|
||||||
# check if package was actually installed
|
# check if package was actually installed
|
||||||
test -n "$(find "/var/lib/ahriman/repository/github/x86_64" -name "ahriman*pkg*")"
|
test -n "$(find "/var/lib/ahriman/repository/github/x86_64" -name "ahriman*pkg*")"
|
||||||
# run package check
|
# run package check
|
||||||
|
@ -33,9 +33,9 @@ COPY "docker/install-aur-package.sh" "/usr/local/bin/install-aur-package"
|
|||||||
## install package dependencies
|
## install package dependencies
|
||||||
## darcs is not installed by reasons, because it requires a lot haskell packages which dramatically increase image size
|
## darcs is not installed by reasons, because it requires a lot haskell packages which dramatically increase image size
|
||||||
RUN pacman -Sy --noconfirm --asdeps devtools git pyalpm python-cerberus python-inflection python-passlib python-requests python-srcinfo && \
|
RUN pacman -Sy --noconfirm --asdeps devtools git pyalpm python-cerberus python-inflection python-passlib python-requests python-srcinfo && \
|
||||||
pacman -Sy --noconfirm --asdeps python-build python-flit python-installer python-wheel && \
|
pacman -Sy --noconfirm --asdeps base-devel python-build python-flit python-installer python-wheel && \
|
||||||
pacman -Sy --noconfirm --asdeps breezy git mercurial python-aiohttp python-boto3 python-cryptography python-jinja python-requests-unixsocket python-systemd rsync subversion && \
|
pacman -Sy --noconfirm --asdeps breezy git mercurial python-aiohttp python-boto3 python-cryptography python-jinja python-requests-unixsocket python-systemd rsync subversion && \
|
||||||
runuser -u build -- install-aur-package python-aioauth-client python-aiohttp-apispec-git python-aiohttp-cors \
|
runuser -u build -- install-aur-package python-aioauth-client python-webargs python-aiohttp-apispec-git python-aiohttp-cors \
|
||||||
python-aiohttp-jinja2 python-aiohttp-session python-aiohttp-security
|
python-aiohttp-jinja2 python-aiohttp-session python-aiohttp-security
|
||||||
|
|
||||||
## FIXME since 1.0.4 devtools requires dbus to be run, which doesn't work now in container
|
## FIXME since 1.0.4 devtools requires dbus to be run, which doesn't work now in container
|
||||||
|
@ -6,7 +6,7 @@ for PACKAGE in "$@"; do
|
|||||||
BUILD_DIR="$(mktemp -d)"
|
BUILD_DIR="$(mktemp -d)"
|
||||||
git clone https://aur.archlinux.org/"$PACKAGE".git "$BUILD_DIR"
|
git clone https://aur.archlinux.org/"$PACKAGE".git "$BUILD_DIR"
|
||||||
cd "$BUILD_DIR"
|
cd "$BUILD_DIR"
|
||||||
makepkg --noconfirm --install --rmdeps --syncdeps
|
makepkg --nocheck --noconfirm --install --rmdeps --syncdeps
|
||||||
cd /
|
cd /
|
||||||
rm -r "$BUILD_DIR"
|
rm -r "$BUILD_DIR"
|
||||||
done
|
done
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<!-- Generated by graphviz version 9.0.0 (0)
|
<!-- Generated by graphviz version 10.0.1 (0)
|
||||||
-->
|
-->
|
||||||
<!-- Title: G Pages: 1 -->
|
<!-- Title: G Pages: 1 -->
|
||||||
<svg width="28664pt" height="4176pt"
|
<svg width="28664pt" height="4176pt"
|
||||||
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
21
docs/ahriman.web.views.v2.packages.rst
Normal file
21
docs/ahriman.web.views.v2.packages.rst
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
ahriman.web.views.v2.packages package
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
Submodules
|
||||||
|
----------
|
||||||
|
|
||||||
|
ahriman.web.views.v2.packages.logs module
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
|
.. automodule:: ahriman.web.views.v2.packages.logs
|
||||||
|
:members:
|
||||||
|
:no-undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
||||||
|
Module contents
|
||||||
|
---------------
|
||||||
|
|
||||||
|
.. automodule:: ahriman.web.views.v2.packages
|
||||||
|
:members:
|
||||||
|
:no-undoc-members:
|
||||||
|
:show-inheritance:
|
18
docs/ahriman.web.views.v2.rst
Normal file
18
docs/ahriman.web.views.v2.rst
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
ahriman.web.views.v2 package
|
||||||
|
============================
|
||||||
|
|
||||||
|
Subpackages
|
||||||
|
-----------
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 4
|
||||||
|
|
||||||
|
ahriman.web.views.v2.packages
|
||||||
|
|
||||||
|
Module contents
|
||||||
|
---------------
|
||||||
|
|
||||||
|
.. automodule:: ahriman.web.views.v2
|
||||||
|
:members:
|
||||||
|
:no-undoc-members:
|
||||||
|
:show-inheritance:
|
@ -81,6 +81,7 @@ Build related configuration. Group name can refer to architecture, e.g. ``build:
|
|||||||
* ``archbuild_flags`` - additional flags passed to ``archbuild`` command, space separated list of strings, optional.
|
* ``archbuild_flags`` - additional flags passed to ``archbuild`` command, space separated list of strings, optional.
|
||||||
* ``build_command`` - default build command, string, required.
|
* ``build_command`` - default build command, string, required.
|
||||||
* ``ignore_packages`` - list packages to ignore during a regular update (manual update will still work), space separated list of strings, optional.
|
* ``ignore_packages`` - list packages to ignore during a regular update (manual update will still work), space separated list of strings, optional.
|
||||||
|
* ``include_debug_packages`` - distribute debug packages, boolean, optional, default ``yes``.
|
||||||
* ``makepkg_flags`` - additional flags passed to ``makepkg`` command, space separated list of strings, optional.
|
* ``makepkg_flags`` - additional flags passed to ``makepkg`` command, space separated list of strings, optional.
|
||||||
* ``makechrootpkg_flags`` - additional flags passed to ``makechrootpkg`` command, space separated list of strings, optional.
|
* ``makechrootpkg_flags`` - additional flags passed to ``makechrootpkg`` command, space separated list of strings, optional.
|
||||||
* ``triggers`` - list of ``ahriman.core.triggers.Trigger`` class implementation (e.g. ``ahriman.core.report.ReportTrigger ahriman.core.upload.UploadTrigger``) which will be loaded and run at the end of processing, space separated list of strings, optional. You can also specify triggers by their paths, e.g. ``/usr/lib/python3.10/site-packages/ahriman/core/report/report.py.ReportTrigger``. Triggers are run in the order of definition.
|
* ``triggers`` - list of ``ahriman.core.triggers.Trigger`` class implementation (e.g. ``ahriman.core.report.ReportTrigger ahriman.core.upload.UploadTrigger``) which will be loaded and run at the end of processing, space separated list of strings, optional. You can also specify triggers by their paths, e.g. ``/usr/lib/python3.10/site-packages/ahriman/core/report/report.py.ReportTrigger``. Triggers are run in the order of definition.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Maintainer: Evgeniy Alekseev
|
# Maintainer: Evgeniy Alekseev
|
||||||
|
|
||||||
pkgname='ahriman'
|
pkgname='ahriman'
|
||||||
pkgver=2.13.4
|
pkgver=2.13.5
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="ArcH linux ReposItory MANager"
|
pkgdesc="ArcH linux ReposItory MANager"
|
||||||
arch=('any')
|
arch=('any')
|
||||||
|
@ -46,8 +46,12 @@ allow_read_only = yes
|
|||||||
[build]
|
[build]
|
||||||
; List of additional flags passed to archbuild command.
|
; List of additional flags passed to archbuild command.
|
||||||
;archbuild_flags =
|
;archbuild_flags =
|
||||||
|
; Path to build command
|
||||||
|
;build_command =
|
||||||
; List of packages to be ignored during automatic updates.
|
; List of packages to be ignored during automatic updates.
|
||||||
;ignore_packages =
|
;ignore_packages =
|
||||||
|
; Include debug packages
|
||||||
|
;include_debug_packages = yes
|
||||||
; List of additional flags passed to makechrootpkg command.
|
; List of additional flags passed to makechrootpkg command.
|
||||||
;makechrootpkg_flags =
|
;makechrootpkg_flags =
|
||||||
; List of additional flags passed to makepkg command.
|
; List of additional flags passed to makepkg command.
|
||||||
|
@ -38,10 +38,6 @@
|
|||||||
<script>
|
<script>
|
||||||
const keyImportModal = $("#key-import-modal");
|
const keyImportModal = $("#key-import-modal");
|
||||||
const keyImportForm = $("#key-import-form");
|
const keyImportForm = $("#key-import-form");
|
||||||
keyImportModal.on("hidden.bs.modal", () => {
|
|
||||||
keyImportBodyInput.text("");
|
|
||||||
keyImportForm.trigger("reset");
|
|
||||||
});
|
|
||||||
|
|
||||||
const keyImportBodyInput = $("#key-import-body-input");
|
const keyImportBodyInput = $("#key-import-body-input");
|
||||||
const keyImportCopyButton = $("#key-import-copy-button");
|
const keyImportCopyButton = $("#key-import-copy-button");
|
||||||
@ -90,4 +86,11 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$(() => {
|
||||||
|
keyImportModal.on("hidden.bs.modal", () => {
|
||||||
|
keyImportBodyInput.text("");
|
||||||
|
keyImportForm.trigger("reset");
|
||||||
|
});
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -36,9 +36,6 @@
|
|||||||
<script>
|
<script>
|
||||||
const loginModal = $("#login-modal");
|
const loginModal = $("#login-modal");
|
||||||
const loginForm = $("#login-form");
|
const loginForm = $("#login-form");
|
||||||
loginModal.on("hidden.bs.modal", () => {
|
|
||||||
loginForm.trigger("reset");
|
|
||||||
});
|
|
||||||
|
|
||||||
const loginPasswordInput = $("#login-password");
|
const loginPasswordInput = $("#login-password");
|
||||||
const loginUsernameInput = $("#login-username");
|
const loginUsernameInput = $("#login-username");
|
||||||
@ -77,4 +74,10 @@
|
|||||||
showHidePasswordButton.addClass("bi-eye");
|
showHidePasswordButton.addClass("bi-eye");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$(() => {
|
||||||
|
loginModal.on("hidden.bs.modal", () => {
|
||||||
|
loginForm.trigger("reset");
|
||||||
|
});
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -43,41 +43,10 @@
|
|||||||
<script>
|
<script>
|
||||||
const packageAddModal = $("#package-add-modal");
|
const packageAddModal = $("#package-add-modal");
|
||||||
const packageAddForm = $("#package-add-form");
|
const packageAddForm = $("#package-add-form");
|
||||||
packageAddModal.on("shown.bs.modal", () => {
|
|
||||||
$(`#package-add-repository-input option[value="${repository.architecture}-${repository.repository}"]`).prop("selected", true);
|
|
||||||
});
|
|
||||||
packageAddModal.on("hidden.bs.modal", () => {
|
|
||||||
packageAddVariablesDiv.empty();
|
|
||||||
packageAddForm.trigger("reset");
|
|
||||||
});
|
|
||||||
|
|
||||||
const packageAddInput = $("#package-add-input");
|
const packageAddInput = $("#package-add-input");
|
||||||
const packageAddRepositoryInput = $("#package-add-repository-input");
|
const packageAddRepositoryInput = $("#package-add-repository-input");
|
||||||
const packageAddKnownPackagesList = $("#package-add-known-packages-dlist");
|
const packageAddKnownPackagesList = $("#package-add-known-packages-dlist");
|
||||||
packageAddInput.keyup(() => {
|
|
||||||
clearTimeout(packageAddInput.data("timeout"));
|
|
||||||
packageAddInput.data("timeout", setTimeout($.proxy(() => {
|
|
||||||
const value = packageAddInput.val();
|
|
||||||
|
|
||||||
if (value.length >= 3) {
|
|
||||||
$.ajax({
|
|
||||||
url: "/api/v1/service/search",
|
|
||||||
data: {"for": value},
|
|
||||||
type: "GET",
|
|
||||||
dataType: "json",
|
|
||||||
success: response => {
|
|
||||||
const options = response.map(pkg => {
|
|
||||||
const option = document.createElement("option");
|
|
||||||
option.value = pkg.package;
|
|
||||||
option.innerText = `${pkg.package} (${pkg.description})`;
|
|
||||||
return option;
|
|
||||||
});
|
|
||||||
packageAddKnownPackagesList.empty().append(options);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, this), 500));
|
|
||||||
});
|
|
||||||
|
|
||||||
const packageAddVariablesDiv = $("#package-add-variables-div");
|
const packageAddVariablesDiv = $("#package-add-variables-div");
|
||||||
|
|
||||||
@ -156,4 +125,39 @@
|
|||||||
doPackageAction("/api/v1/service/request", [packages], repository, onSuccess, onFailure, patches);
|
doPackageAction("/api/v1/service/request", [packages], repository, onSuccess, onFailure, patches);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$(() => {
|
||||||
|
packageAddModal.on("shown.bs.modal", () => {
|
||||||
|
$(`#package-add-repository-input option[value="${repository.architecture}-${repository.repository}"]`).prop("selected", true);
|
||||||
|
});
|
||||||
|
packageAddModal.on("hidden.bs.modal", () => {
|
||||||
|
packageAddVariablesDiv.empty();
|
||||||
|
packageAddForm.trigger("reset");
|
||||||
|
});
|
||||||
|
|
||||||
|
packageAddInput.keyup(() => {
|
||||||
|
clearTimeout(packageAddInput.data("timeout"));
|
||||||
|
packageAddInput.data("timeout", setTimeout($.proxy(() => {
|
||||||
|
const value = packageAddInput.val();
|
||||||
|
|
||||||
|
if (value.length >= 3) {
|
||||||
|
$.ajax({
|
||||||
|
url: "/api/v1/service/search",
|
||||||
|
data: {"for": value},
|
||||||
|
type: "GET",
|
||||||
|
dataType: "json",
|
||||||
|
success: response => {
|
||||||
|
const options = response.map(pkg => {
|
||||||
|
const option = document.createElement("option");
|
||||||
|
option.value = pkg.package;
|
||||||
|
option.innerText = `${pkg.package} (${pkg.description})`;
|
||||||
|
return option;
|
||||||
|
});
|
||||||
|
packageAddKnownPackagesList.empty().append(options);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, this), 500));
|
||||||
|
});
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -72,26 +72,6 @@
|
|||||||
const packageInfoModal = $("#package-info-modal");
|
const packageInfoModal = $("#package-info-modal");
|
||||||
const packageInfoModalHeader = $("#package-info-modal-header");
|
const packageInfoModalHeader = $("#package-info-modal-header");
|
||||||
const packageInfo = $("#package-info");
|
const packageInfo = $("#package-info");
|
||||||
packageInfoModal.on("hidden.bs.modal", () => {
|
|
||||||
packageInfoAurUrl.empty();
|
|
||||||
packageInfoDepends.empty();
|
|
||||||
packageInfoGroups.empty();
|
|
||||||
packageInfoLicenses.empty();
|
|
||||||
packageInfoPackager.empty();
|
|
||||||
packageInfoPackages.empty();
|
|
||||||
packageInfoUpstreamUrl.empty();
|
|
||||||
packageInfoVersion.empty();
|
|
||||||
|
|
||||||
packageInfoVariablesBlock.attr("hidden", true);
|
|
||||||
packageInfoVariablesDiv.empty();
|
|
||||||
|
|
||||||
packageInfoLogsInput.empty();
|
|
||||||
packageInfoChangesInput.empty();
|
|
||||||
|
|
||||||
packageInfoModal.trigger("reset");
|
|
||||||
|
|
||||||
hideInfoControls(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
const packageInfoLogsInput = $("#package-info-logs-input");
|
const packageInfoLogsInput = $("#package-info-logs-input");
|
||||||
const packageInfoLogsCopyButton = $("#package-info-logs-copy-button");
|
const packageInfoLogsCopyButton = $("#package-info-logs-copy-button");
|
||||||
@ -309,4 +289,27 @@
|
|||||||
|
|
||||||
if (isPackageBaseSet) packageInfoModal.modal("show");
|
if (isPackageBaseSet) packageInfoModal.modal("show");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$(() => {
|
||||||
|
packageInfoModal.on("hidden.bs.modal", () => {
|
||||||
|
packageInfoAurUrl.empty();
|
||||||
|
packageInfoDepends.empty();
|
||||||
|
packageInfoGroups.empty();
|
||||||
|
packageInfoLicenses.empty();
|
||||||
|
packageInfoPackager.empty();
|
||||||
|
packageInfoPackages.empty();
|
||||||
|
packageInfoUpstreamUrl.empty();
|
||||||
|
packageInfoVersion.empty();
|
||||||
|
|
||||||
|
packageInfoVariablesBlock.attr("hidden", true);
|
||||||
|
packageInfoVariablesDiv.empty();
|
||||||
|
|
||||||
|
packageInfoLogsInput.empty();
|
||||||
|
packageInfoChangesInput.empty();
|
||||||
|
|
||||||
|
packageInfoModal.trigger("reset");
|
||||||
|
|
||||||
|
hideInfoControls(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -35,11 +35,6 @@
|
|||||||
<script>
|
<script>
|
||||||
const packageRebuildModal = $("#package-rebuild-modal");
|
const packageRebuildModal = $("#package-rebuild-modal");
|
||||||
const packageRebuildForm = $("#package-rebuild-form");
|
const packageRebuildForm = $("#package-rebuild-form");
|
||||||
packageRebuildModal.on("shown.bs.modal", () => {
|
|
||||||
$(`#package-rebuild-repository-input option[value="${repository.architecture}-${repository.repository}"]`).prop("selected", true);
|
|
||||||
|
|
||||||
});
|
|
||||||
packageRebuildModal.on("hidden.bs.modal", () => { packageRebuildForm.trigger("reset"); });
|
|
||||||
|
|
||||||
const packageRebuildDependencyInput = $("#package-rebuild-dependency-input");
|
const packageRebuildDependencyInput = $("#package-rebuild-dependency-input");
|
||||||
const packageRebuildRepositoryInput = $("#package-rebuild-repository-input");
|
const packageRebuildRepositoryInput = $("#package-rebuild-repository-input");
|
||||||
@ -54,4 +49,12 @@
|
|||||||
doPackageAction("/api/v1/service/rebuild", [packages], repository, onSuccess, onFailure);
|
doPackageAction("/api/v1/service/rebuild", [packages], repository, onSuccess, onFailure);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$(() => {
|
||||||
|
packageRebuildModal.on("shown.bs.modal", () => {
|
||||||
|
$(`#package-rebuild-repository-input option[value="${repository.architecture}-${repository.repository}"]`).prop("selected", true);
|
||||||
|
|
||||||
|
});
|
||||||
|
packageRebuildModal.on("hidden.bs.modal", () => { packageRebuildForm.trigger("reset"); });
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -9,46 +9,8 @@
|
|||||||
const packageInfoUpdateButton = $("#package-info-update-button");
|
const packageInfoUpdateButton = $("#package-info-update-button");
|
||||||
|
|
||||||
let repository = null;
|
let repository = null;
|
||||||
$("#repositories a").on("click", (event) => {
|
|
||||||
const element = event.target;
|
|
||||||
repository = {
|
|
||||||
architecture: element.dataset.architecture,
|
|
||||||
repository: element.dataset.repository,
|
|
||||||
};
|
|
||||||
packageUpdateButton.html(`<i class="bi bi-play"></i> update<span class="d-none d-sm-inline"> ${safe(repository.repository)} (${safe(repository.architecture)})</span>`);
|
|
||||||
$(`#${element.id}`).tab("show");
|
|
||||||
reload();
|
|
||||||
});
|
|
||||||
|
|
||||||
const table = $("#packages");
|
const table = $("#packages");
|
||||||
table.on("check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table", () => {
|
|
||||||
packageRemoveButton.prop("disabled", !table.bootstrapTable("getSelections").length);
|
|
||||||
});
|
|
||||||
table.on("click-row.bs.table", (self, data, row, cell) => {
|
|
||||||
if (0 === cell || "base" === cell) {
|
|
||||||
const method = data[0] === true ? "uncheckBy" : "checkBy"; // fck javascript
|
|
||||||
table.bootstrapTable(method, {field: "id", values: [data.id]});
|
|
||||||
} else showPackageInfo(data.id);
|
|
||||||
});
|
|
||||||
table.on("created-controls.bs.table", () => {
|
|
||||||
const pickerInput = $(".bootstrap-table-filter-control-timestamp");
|
|
||||||
pickerInput.daterangepicker({
|
|
||||||
autoUpdateInput: false,
|
|
||||||
locale: {
|
|
||||||
cancelLabel: "Clear",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
pickerInput.on("apply.daterangepicker", (event, picker) => {
|
|
||||||
pickerInput.val(`${picker.startDate.format("YYYY-MM-DD")} - ${picker.endDate.format("YYYY-MM-DD")}`);
|
|
||||||
table.bootstrapTable("triggerSearch");
|
|
||||||
});
|
|
||||||
|
|
||||||
pickerInput.on("cancel.daterangepicker", () => {
|
|
||||||
pickerInput.val("");
|
|
||||||
table.bootstrapTable("triggerSearch");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const statusBadge = $("#badge-status");
|
const statusBadge = $("#badge-status");
|
||||||
const versionBadge = $("#badge-version");
|
const versionBadge = $("#badge-version");
|
||||||
@ -221,6 +183,46 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
$(() => {
|
$(() => {
|
||||||
|
$("#repositories a").on("click", event => {
|
||||||
|
const element = event.target;
|
||||||
|
repository = {
|
||||||
|
architecture: element.dataset.architecture,
|
||||||
|
repository: element.dataset.repository,
|
||||||
|
};
|
||||||
|
packageUpdateButton.html(`<i class="bi bi-play"></i> update<span class="d-none d-sm-inline"> ${safe(repository.repository)} (${safe(repository.architecture)})</span>`);
|
||||||
|
$(`#${element.id}`).tab("show");
|
||||||
|
reload();
|
||||||
|
});
|
||||||
|
|
||||||
|
table.on("check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table", () => {
|
||||||
|
packageRemoveButton.prop("disabled", !table.bootstrapTable("getSelections").length);
|
||||||
|
});
|
||||||
|
table.on("click-row.bs.table", (self, data, row, cell) => {
|
||||||
|
if (0 === cell || "base" === cell) {
|
||||||
|
const method = data[0] === true ? "uncheckBy" : "checkBy"; // fck javascript
|
||||||
|
table.bootstrapTable(method, {field: "id", values: [data.id]});
|
||||||
|
} else showPackageInfo(data.id);
|
||||||
|
});
|
||||||
|
table.on("created-controls.bs.table", () => {
|
||||||
|
const pickerInput = $(".bootstrap-table-filter-control-timestamp");
|
||||||
|
pickerInput.daterangepicker({
|
||||||
|
autoUpdateInput: false,
|
||||||
|
locale: {
|
||||||
|
cancelLabel: "Clear",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
pickerInput.on("apply.daterangepicker", (event, picker) => {
|
||||||
|
pickerInput.val(`${picker.startDate.format("YYYY-MM-DD")} - ${picker.endDate.format("YYYY-MM-DD")}`);
|
||||||
|
table.bootstrapTable("triggerSearch");
|
||||||
|
});
|
||||||
|
|
||||||
|
pickerInput.on("cancel.daterangepicker", () => {
|
||||||
|
pickerInput.val("");
|
||||||
|
table.bootstrapTable("triggerSearch");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
table.bootstrapTable({});
|
table.bootstrapTable({});
|
||||||
statusBadge.popover();
|
statusBadge.popover();
|
||||||
selectRepository();
|
selectRepository();
|
||||||
|
@ -102,25 +102,6 @@ SigLevel = Database{% if has_repo_signed %}Required{% else %}Never{% endif %} Pa
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
const table = $("#packages");
|
const table = $("#packages");
|
||||||
table.on("created-controls.bs.table", () => {
|
|
||||||
const pickerInput = $(".bootstrap-table-filter-control-timestamp");
|
|
||||||
pickerInput.daterangepicker({
|
|
||||||
autoUpdateInput: false,
|
|
||||||
locale: {
|
|
||||||
cancelLabel: "Clear",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
pickerInput.on("apply.daterangepicker", (event, picker) => {
|
|
||||||
pickerInput.val(`${picker.startDate.format("YYYY-MM-DD")} - ${picker.endDate.format("YYYY-MM-DD")}`);
|
|
||||||
table.bootstrapTable("triggerSearch");
|
|
||||||
});
|
|
||||||
|
|
||||||
pickerInput.on("cancel.daterangepicker", () => {
|
|
||||||
pickerInput.val("");
|
|
||||||
table.bootstrapTable("triggerSearch");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const pacmanConf = $("#pacman-conf");
|
const pacmanConf = $("#pacman-conf");
|
||||||
const pacmanConfCopyButton = $("#copy-btn");
|
const pacmanConfCopyButton = $("#copy-btn");
|
||||||
@ -141,6 +122,28 @@ SigLevel = Database{% if has_repo_signed %}Required{% else %}Never{% endif %} Pa
|
|||||||
function filterListLicenses() {
|
function filterListLicenses() {
|
||||||
return extractDataList(table.bootstrapTable("getData"), "licenses");
|
return extractDataList(table.bootstrapTable("getData"), "licenses");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$(() => {
|
||||||
|
table.on("created-controls.bs.table", () => {
|
||||||
|
const pickerInput = $(".bootstrap-table-filter-control-timestamp");
|
||||||
|
pickerInput.daterangepicker({
|
||||||
|
autoUpdateInput: false,
|
||||||
|
locale: {
|
||||||
|
cancelLabel: "Clear",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
pickerInput.on("apply.daterangepicker", (event, picker) => {
|
||||||
|
pickerInput.val(`${picker.startDate.format("YYYY-MM-DD")} - ${picker.endDate.format("YYYY-MM-DD")}`);
|
||||||
|
table.bootstrapTable("triggerSearch");
|
||||||
|
});
|
||||||
|
|
||||||
|
pickerInput.on("cancel.daterangepicker", () => {
|
||||||
|
pickerInput.val("");
|
||||||
|
table.bootstrapTable("triggerSearch");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
@ -584,7 +584,7 @@ _set_new_action() {
|
|||||||
current_action_nargs=1
|
current_action_nargs=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
current_action_args_start_index=$(( $word_index + 1 ))
|
current_action_args_start_index=$(( $word_index + 1 - $pos_only ))
|
||||||
|
|
||||||
current_action_is_positional=$2
|
current_action_is_positional=$2
|
||||||
}
|
}
|
||||||
@ -611,6 +611,7 @@ _shtab_ahriman() {
|
|||||||
|
|
||||||
local prefix=_shtab_ahriman
|
local prefix=_shtab_ahriman
|
||||||
local word_index=0
|
local word_index=0
|
||||||
|
local pos_only=0 # "--" delimeter not encountered yet
|
||||||
_set_parser_defaults
|
_set_parser_defaults
|
||||||
word_index=1
|
word_index=1
|
||||||
|
|
||||||
@ -619,26 +620,30 @@ _shtab_ahriman() {
|
|||||||
while [ $word_index -ne $COMP_CWORD ]; do
|
while [ $word_index -ne $COMP_CWORD ]; do
|
||||||
local this_word="${COMP_WORDS[$word_index]}"
|
local this_word="${COMP_WORDS[$word_index]}"
|
||||||
|
|
||||||
if [[ -n $sub_parsers && " ${sub_parsers[@]} " == *" ${this_word} "* ]]; then
|
if [[ $pos_only = 1 || " $this_word " != " -- " ]]; then
|
||||||
# valid subcommand: add it to the prefix & reset the current action
|
if [[ -n $sub_parsers && " ${sub_parsers[@]} " == *" ${this_word} "* ]]; then
|
||||||
prefix="${prefix}_$(_shtab_replace_nonword $this_word)"
|
# valid subcommand: add it to the prefix & reset the current action
|
||||||
_set_parser_defaults
|
prefix="${prefix}_$(_shtab_replace_nonword $this_word)"
|
||||||
fi
|
_set_parser_defaults
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ " ${current_option_strings[@]} " == *" ${this_word} "* ]]; then
|
if [[ " ${current_option_strings[@]} " == *" ${this_word} "* ]]; then
|
||||||
# a new action should be acquired (due to recognised option string or
|
# a new action should be acquired (due to recognised option string or
|
||||||
# no more input expected from current action);
|
# no more input expected from current action);
|
||||||
# the next positional action can fill in here
|
# the next positional action can fill in here
|
||||||
_set_new_action $this_word false
|
_set_new_action $this_word false
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$current_action_nargs" != "*" ]] && \
|
if [[ "$current_action_nargs" != "*" ]] && \
|
||||||
[[ "$current_action_nargs" != "+" ]] && \
|
[[ "$current_action_nargs" != "+" ]] && \
|
||||||
[[ "$current_action_nargs" != *"..." ]] && \
|
[[ "$current_action_nargs" != *"..." ]] && \
|
||||||
(( $word_index + 1 - $current_action_args_start_index >= \
|
(( $word_index + 1 - $current_action_args_start_index - $pos_only >= \
|
||||||
$current_action_nargs )); then
|
$current_action_nargs )); then
|
||||||
$current_action_is_positional && let "completed_positional_actions += 1"
|
$current_action_is_positional && let "completed_positional_actions += 1"
|
||||||
_set_new_action "pos_${completed_positional_actions}" true
|
_set_new_action "pos_${completed_positional_actions}" true
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
pos_only=1 # "--" delimeter encountered
|
||||||
fi
|
fi
|
||||||
|
|
||||||
let "word_index+=1"
|
let "word_index+=1"
|
||||||
@ -646,7 +651,7 @@ _shtab_ahriman() {
|
|||||||
|
|
||||||
# Generate the completions
|
# Generate the completions
|
||||||
|
|
||||||
if [[ "${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}") )
|
||||||
else
|
else
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
.TH AHRIMAN "1" "2024\-02\-09" "ahriman" "Generated Python Manual"
|
.TH AHRIMAN "1" "2024\-04\-04" "ahriman" "Generated Python Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
ahriman
|
ahriman
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -736,4 +736,12 @@ _shtab_ahriman() {
|
|||||||
|
|
||||||
|
|
||||||
typeset -A opt_args
|
typeset -A opt_args
|
||||||
_shtab_ahriman "$@"
|
|
||||||
|
if [[ $zsh_eval_context[-1] == eval ]]; then
|
||||||
|
# eval/source/. command, register function for later
|
||||||
|
compdef _shtab_ahriman -N ahriman
|
||||||
|
else
|
||||||
|
# autoload from fpath, call function directly
|
||||||
|
_shtab_ahriman "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
@ -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.13.4"
|
__version__ = "2.13.5"
|
||||||
|
@ -68,7 +68,7 @@ class Repo(LazyLogging):
|
|||||||
path(Path): path to archive to add
|
path(Path): path to archive to add
|
||||||
"""
|
"""
|
||||||
check_output(
|
check_output(
|
||||||
"repo-add", *self.sign_args, "-R", str(self.repo_path), str(path),
|
"repo-add", *self.sign_args, "--remove", str(self.repo_path), str(path),
|
||||||
exception=BuildError.from_process(path.name),
|
exception=BuildError.from_process(path.name),
|
||||||
cwd=self.paths.repository,
|
cwd=self.paths.repository,
|
||||||
logger=self.logger,
|
logger=self.logger,
|
||||||
@ -78,8 +78,13 @@ class Repo(LazyLogging):
|
|||||||
"""
|
"""
|
||||||
create empty repository database. It just calls add with empty arguments
|
create empty repository database. It just calls add with empty arguments
|
||||||
"""
|
"""
|
||||||
check_output("repo-add", *self.sign_args, str(self.repo_path),
|
# since pacman-6.1.0 repo-add doesn't create empty database in case if no packages supplied
|
||||||
cwd=self.paths.repository, logger=self.logger, user=self.uid)
|
# this code creates empty files instead
|
||||||
|
if self.repo_path.exists():
|
||||||
|
return # database is already created, skip this part
|
||||||
|
|
||||||
|
self.repo_path.touch(exist_ok=True)
|
||||||
|
(self.paths.repository / f"{self.name}.db").symlink_to(self.repo_path)
|
||||||
|
|
||||||
def remove(self, package: str, filename: Path) -> None:
|
def remove(self, package: str, filename: Path) -> None:
|
||||||
"""
|
"""
|
||||||
|
@ -38,6 +38,7 @@ class Task(LazyLogging):
|
|||||||
archbuild_flags(list[str]): command flags for archbuild command
|
archbuild_flags(list[str]): command flags for archbuild command
|
||||||
architecture(str): repository architecture
|
architecture(str): repository architecture
|
||||||
build_command(str): build command
|
build_command(str): build command
|
||||||
|
include_debug_packages(bool): whether to include debug packages or not
|
||||||
makechrootpkg_flags(list[str]): command flags for makechrootpkg command
|
makechrootpkg_flags(list[str]): command flags for makechrootpkg command
|
||||||
makepkg_flags(list[str]): command flags for makepkg command
|
makepkg_flags(list[str]): command flags for makepkg command
|
||||||
package(Package): package definitions
|
package(Package): package definitions
|
||||||
@ -63,6 +64,7 @@ class Task(LazyLogging):
|
|||||||
|
|
||||||
self.archbuild_flags = configuration.getlist("build", "archbuild_flags", fallback=[])
|
self.archbuild_flags = configuration.getlist("build", "archbuild_flags", fallback=[])
|
||||||
self.build_command = configuration.get("build", "build_command")
|
self.build_command = configuration.get("build", "build_command")
|
||||||
|
self.include_debug_packages = configuration.getboolean("build", "include_debug_packages", fallback=True)
|
||||||
self.makepkg_flags = configuration.getlist("build", "makepkg_flags", fallback=[])
|
self.makepkg_flags = configuration.getlist("build", "makepkg_flags", fallback=[])
|
||||||
self.makechrootpkg_flags = configuration.getlist("build", "makechrootpkg_flags", fallback=[])
|
self.makechrootpkg_flags = configuration.getlist("build", "makechrootpkg_flags", fallback=[])
|
||||||
|
|
||||||
@ -99,9 +101,11 @@ class Task(LazyLogging):
|
|||||||
environment=environment,
|
environment=environment,
|
||||||
)
|
)
|
||||||
|
|
||||||
# well it is not actually correct, but we can deal with it
|
package_list_command = ["makepkg", "--packagelist"]
|
||||||
|
if not self.include_debug_packages:
|
||||||
|
package_list_command.append("OPTIONS=(!debug)") # disable debug flag manually
|
||||||
packages = check_output(
|
packages = check_output(
|
||||||
"makepkg", "--packagelist",
|
*package_list_command,
|
||||||
exception=BuildError.from_process(self.package.base),
|
exception=BuildError.from_process(self.package.base),
|
||||||
cwd=sources_dir,
|
cwd=sources_dir,
|
||||||
logger=self.logger,
|
logger=self.logger,
|
||||||
|
@ -176,6 +176,10 @@ CONFIGURATION_SCHEMA: ConfigurationSchema = {
|
|||||||
"empty": False,
|
"empty": False,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"include_debug_packages": {
|
||||||
|
"type": "boolean",
|
||||||
|
"coerce": "boolean",
|
||||||
|
},
|
||||||
"makepkg_flags": {
|
"makepkg_flags": {
|
||||||
"type": "list",
|
"type": "list",
|
||||||
"coerce": "list",
|
"coerce": "list",
|
||||||
|
@ -26,13 +26,28 @@ def test_repo_add(repo: Repo, mocker: MockerFixture) -> None:
|
|||||||
|
|
||||||
def test_repo_init(repo: Repo, mocker: MockerFixture) -> None:
|
def test_repo_init(repo: Repo, mocker: MockerFixture) -> None:
|
||||||
"""
|
"""
|
||||||
must call repo-add with empty package list on repo initializing
|
must create empty database files
|
||||||
"""
|
"""
|
||||||
check_output_mock = mocker.patch("ahriman.core.alpm.repo.check_output")
|
mocker.patch("pathlib.Path.exists", return_value=False)
|
||||||
|
touch_mock = mocker.patch("pathlib.Path.touch")
|
||||||
|
symlink_mock = mocker.patch("pathlib.Path.symlink_to")
|
||||||
|
|
||||||
repo.init()
|
repo.init()
|
||||||
check_output_mock.assert_called_once() # it will be checked later
|
touch_mock.assert_called_once_with(exist_ok=True)
|
||||||
assert check_output_mock.call_args[0][0] == "repo-add"
|
symlink_mock.assert_called_once_with(repo.repo_path)
|
||||||
|
|
||||||
|
|
||||||
|
def test_repo_init_skip(repo: Repo, mocker: MockerFixture) -> None:
|
||||||
|
"""
|
||||||
|
must do not create files if database already exists
|
||||||
|
"""
|
||||||
|
mocker.patch("pathlib.Path.exists", return_value=True)
|
||||||
|
touch_mock = mocker.patch("pathlib.Path.touch")
|
||||||
|
symlink_mock = mocker.patch("pathlib.Path.symlink_to")
|
||||||
|
|
||||||
|
repo.init()
|
||||||
|
touch_mock.assert_not_called()
|
||||||
|
symlink_mock.assert_not_called()
|
||||||
|
|
||||||
|
|
||||||
def test_repo_remove(repo: Repo, mocker: MockerFixture) -> None:
|
def test_repo_remove(repo: Repo, mocker: MockerFixture) -> None:
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from pytest_mock import MockerFixture
|
from pytest_mock import MockerFixture
|
||||||
|
from unittest.mock import call as MockCall
|
||||||
|
|
||||||
from ahriman.core.build_tools.task import Task
|
from ahriman.core.build_tools.task import Task
|
||||||
from ahriman.core.database import SQLite
|
from ahriman.core.database import SQLite
|
||||||
@ -9,9 +12,83 @@ def test_build(task_ahriman: Task, mocker: MockerFixture) -> None:
|
|||||||
"""
|
"""
|
||||||
must build package
|
must build package
|
||||||
"""
|
"""
|
||||||
|
local = Path("local")
|
||||||
check_output_mock = mocker.patch("ahriman.core.build_tools.task.check_output")
|
check_output_mock = mocker.patch("ahriman.core.build_tools.task.check_output")
|
||||||
task_ahriman.build(Path("ahriman"))
|
|
||||||
check_output_mock.assert_called()
|
task_ahriman.build(local)
|
||||||
|
check_output_mock.assert_has_calls([
|
||||||
|
MockCall(
|
||||||
|
"extra-x86_64-build", "-r", str(task_ahriman.paths.chroot), "--", "--", "--skippgpcheck",
|
||||||
|
exception=pytest.helpers.anyvar(int),
|
||||||
|
cwd=local,
|
||||||
|
logger=task_ahriman.logger,
|
||||||
|
user=task_ahriman.uid,
|
||||||
|
environment={},
|
||||||
|
),
|
||||||
|
MockCall(
|
||||||
|
"makepkg", "--packagelist",
|
||||||
|
exception=pytest.helpers.anyvar(int),
|
||||||
|
cwd=local,
|
||||||
|
logger=task_ahriman.logger,
|
||||||
|
environment={},
|
||||||
|
),
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
def test_build_environment(task_ahriman: Task, mocker: MockerFixture) -> None:
|
||||||
|
"""
|
||||||
|
must build package with environment variables set
|
||||||
|
"""
|
||||||
|
local = Path("local")
|
||||||
|
check_output_mock = mocker.patch("ahriman.core.build_tools.task.check_output")
|
||||||
|
environment = {"variable": "value"}
|
||||||
|
|
||||||
|
task_ahriman.build(local, **environment, empty=None)
|
||||||
|
check_output_mock.assert_has_calls([
|
||||||
|
MockCall(
|
||||||
|
"extra-x86_64-build", "-r", str(task_ahriman.paths.chroot), "--", "--", "--skippgpcheck",
|
||||||
|
exception=pytest.helpers.anyvar(int),
|
||||||
|
cwd=local,
|
||||||
|
logger=task_ahriman.logger,
|
||||||
|
user=task_ahriman.uid,
|
||||||
|
environment=environment,
|
||||||
|
),
|
||||||
|
MockCall(
|
||||||
|
"makepkg", "--packagelist",
|
||||||
|
exception=pytest.helpers.anyvar(int),
|
||||||
|
cwd=local,
|
||||||
|
logger=task_ahriman.logger,
|
||||||
|
environment=environment,
|
||||||
|
),
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
def test_build_no_debug(task_ahriman: Task, mocker: MockerFixture) -> None:
|
||||||
|
"""
|
||||||
|
must filter debug packages from result
|
||||||
|
"""
|
||||||
|
local = Path("local")
|
||||||
|
check_output_mock = mocker.patch("ahriman.core.build_tools.task.check_output")
|
||||||
|
task_ahriman.include_debug_packages = False
|
||||||
|
|
||||||
|
task_ahriman.build(local)
|
||||||
|
check_output_mock.assert_has_calls([
|
||||||
|
MockCall(
|
||||||
|
"extra-x86_64-build", "-r", str(task_ahriman.paths.chroot), "--", "--", "--skippgpcheck",
|
||||||
|
exception=pytest.helpers.anyvar(int),
|
||||||
|
cwd=local,
|
||||||
|
logger=task_ahriman.logger,
|
||||||
|
user=task_ahriman.uid,
|
||||||
|
environment={},
|
||||||
|
),
|
||||||
|
MockCall(
|
||||||
|
"makepkg", "--packagelist", "OPTIONS=(!debug)",
|
||||||
|
exception=pytest.helpers.anyvar(int),
|
||||||
|
cwd=local,
|
||||||
|
logger=task_ahriman.logger,
|
||||||
|
environment={},
|
||||||
|
),
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
def test_init(task_ahriman: Task, database: SQLite, mocker: MockerFixture) -> None:
|
def test_init(task_ahriman: Task, database: SQLite, mocker: MockerFixture) -> None:
|
||||||
|
Reference in New Issue
Block a user