Compare commits

..

1 commit

Author SHA1 Message Date
89ba59bc6b
ilot/nextcloud: new aport
Some checks failed
/ lint (pull_request) Failing after 27s
/ deploy-x86_64 (pull_request) Has been skipped
/ build-x86_64 (pull_request) Failing after 41s
/ deploy-aarch64 (pull_request) Has been skipped
/ build-aarch64 (pull_request) Failing after 1m11s
2024-11-05 10:13:57 -05:00
86 changed files with 4299 additions and 1603 deletions

View file

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# expects: # expects:
# env variable ISSUE_TOKEN # env variable FORGEJO_TOKEN
# file out_of_date # file out_of_date
IFS=' IFS='
@ -20,7 +20,7 @@ does_it_exist() {
result="$(curl --silent -X 'GET' \ result="$(curl --silent -X 'GET' \
"$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \
-H 'accept: application/json' \ -H 'accept: application/json' \
-H "Authorization: token $ISSUE_TOKEN" -H "authorization: Basic $FORGEJO_TOKEN"
)" )"
if [ "$result" == "[]" ]; then if [ "$result" == "[]" ]; then
@ -40,7 +40,7 @@ is_it_old() {
result="$(curl --silent -X 'GET' \ result="$(curl --silent -X 'GET' \
"$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \
-H 'accept: application/json' \ -H 'accept: application/json' \
-H "authorization: token $ISSUE_TOKEN" -H "authorization: Basic $FORGEJO_TOKEN"
)" )"
result_title="$(echo $result | jq -r '.[].title' )" result_title="$(echo $result | jq -r '.[].title' )"
@ -64,7 +64,7 @@ update_title() {
result=$(curl --silent -X 'PATCH' \ result=$(curl --silent -X 'PATCH' \
"$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$id" \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$id" \
-H 'accept: application/json' \ -H 'accept: application/json' \
-H "authorization: token $ISSUE_TOKEN" \ -H "authorization: Basic $FORGEJO_TOKEN" \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
-d "{ -d "{
\"title\": \"$repo/$name: upgrade to $upstream_version\" \"title\": \"$repo/$name: upgrade to $upstream_version\"
@ -83,7 +83,7 @@ create_issue() {
result=$(curl --silent -X 'POST' \ result=$(curl --silent -X 'POST' \
"$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \
-H 'accept: application/json' \ -H 'accept: application/json' \
-H "authorization: token $ISSUE_TOKEN" \ -H "authorization: Basic $FORGEJO_TOKEN" \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
-d "{ -d "{
\"title\": \"$repo/$name: upgrade to $upstream_version\", \"title\": \"$repo/$name: upgrade to $upstream_version\",
@ -131,7 +131,7 @@ if [ -f not_in_anitya ]; then
result="$(curl --silent -X 'GET' \ result="$(curl --silent -X 'GET' \
"$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues?state=open&q=$query&type=issues" \
-H 'accept: application/json' \ -H 'accept: application/json' \
-H "authorization: token $ISSUE_TOKEN" -H "authorization: Basic $FORGEJO_TOKEN"
)" )"
if [ "$result" == "[]" ]; then if [ "$result" == "[]" ]; then
@ -139,7 +139,7 @@ if [ -f not_in_anitya ]; then
result=$(curl --silent -X 'POST' \ result=$(curl --silent -X 'POST' \
"$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues" \
-H 'accept: application/json' \ -H 'accept: application/json' \
-H "authorization: token $ISSUE_TOKEN" \ -H "authorization: Basic $FORGEJO_TOKEN" \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
-d "{ -d "{
\"title\": \"Add missing $repo packages to anitya\", \"title\": \"Add missing $repo packages to anitya\",
@ -155,7 +155,7 @@ if [ -f not_in_anitya ]; then
result=$(curl --silent -X 'PATCH' \ result=$(curl --silent -X 'PATCH' \
"$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$result_id" \ "$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/issues/$result_id" \
-H 'accept: application/json' \ -H 'accept: application/json' \
-H "authorization: token $ISSUE_TOKEN" \ -H "authorization: Basic $FORGEJO_TOKEN" \
-H 'Content-Type: application/json' \ -H 'Content-Type: application/json' \
-d "{ -d "{
\"body\": \"- [ ] $(sed '{:q;N;s/\n/\\n- [ ] /g;t q}' not_in_anitya)\" \"body\": \"- [ ] $(sed '{:q;N;s/\n/\\n- [ ] /g;t q}' not_in_anitya)\"

View file

@ -11,8 +11,8 @@ jobs:
container: container:
image: alpine:latest image: alpine:latest
env: env:
downstream: https://forge.ilot.io/api/packages/ilot/alpine/v3.21/ilot downstream: https://forge.ilot.io/api/packages/ilot/alpine/v3.20/ilot
ISSUE_TOKEN: ${{ secrets.issue_token }} FORGEJO_TOKEN: ${{ secrets.forgejo_token }}
LABEL_NUMBER: 8 LABEL_NUMBER: 8
steps: steps:
- name: Environment setup - name: Environment setup

View file

@ -2,9 +2,9 @@
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net> # Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=mastodon pkgname=mastodon
_pkgname=$pkgname _pkgname=$pkgname
pkgver=4.2.20 pkgver=4.2.10
_gittag=v$pkgver _gittag=v$pkgver
pkgrel=0 pkgrel=1
pkgdesc="Self-hosted social media and network server based on ActivityPub and OStatus" pkgdesc="Self-hosted social media and network server based on ActivityPub and OStatus"
arch="x86_64" arch="x86_64"
url="https://github.com/mastodon/mastodon" url="https://github.com/mastodon/mastodon"
@ -192,7 +192,7 @@ assets() {
} }
sha512sums=" sha512sums="
132df11b54bf0f900e2ee6e149ddb730706a67fc6130ead63b327028fa590944f21a19bcba07d859885717208b6abc005d0aee7675fd8e0fb09ad8d6f8f631b7 mastodon-v4.2.20.tar.gz 1fe5417136bc020a83b83eaccef7f1f46c13fc8318681f12ba556b1b6b03e25ef7b6335c28f4e6722101e97b63020cbd0d3fbacdaf9b3b5a4b73c3cf3e230813 mastodon-v4.2.10.tar.gz
d49fea9451c97ccefe5e35b68e4274aeb427f9d1e910b89c1f6c810489c3bec1ccff72952fdaef95abf944b8aff0da84a52347540d36ff1fba5ccc19e1d935c6 mastodon.initd d49fea9451c97ccefe5e35b68e4274aeb427f9d1e910b89c1f6c810489c3bec1ccff72952fdaef95abf944b8aff0da84a52347540d36ff1fba5ccc19e1d935c6 mastodon.initd
eefe12a31268245f802222c0001dac884e03adb0d301e53a1512a3cd204836ca03ad083908cd14d146cf0dce99e3a4366570efd0e40a9a490ccd381d4c63c32f mastodon.web.initd eefe12a31268245f802222c0001dac884e03adb0d301e53a1512a3cd204836ca03ad083908cd14d146cf0dce99e3a4366570efd0e40a9a490ccd381d4c63c32f mastodon.web.initd
8fc9249c01693bb02b8d1a6177288d5d3549addde8c03eb35cc7a32dde669171872ebc2b5deb8019dc7a12970098f1af707171fa41129be31b04e1dc1651a777 mastodon.sidekiq.initd 8fc9249c01693bb02b8d1a6177288d5d3549addde8c03eb35cc7a32dde669171872ebc2b5deb8019dc7a12970098f1af707171fa41129be31b04e1dc1651a777 mastodon.sidekiq.initd

View file

@ -3,10 +3,6 @@
# Maintainer: Jakub Jirutka <jakub@jirutka.cz> # Maintainer: Jakub Jirutka <jakub@jirutka.cz>
# #
# secfixes: # secfixes:
# 3.2.4-r0:
# - CVE-2024-27282
# - CVE-2024-27281
# - CVE-2024-27280
# 3.1.4-r0: # 3.1.4-r0:
# - CVE-2023-28755 # - CVE-2023-28755
# - CVE-2023-28756 # - CVE-2023-28756
@ -62,7 +58,7 @@ pkgname=ruby3.2
# When upgrading, upgrade also each ruby-<name> aport listed in file # When upgrading, upgrade also each ruby-<name> aport listed in file
# gems/bundled_gems. If some aport is missing or not in the main repo, # gems/bundled_gems. If some aport is missing or not in the main repo,
# create/move it. # create/move it.
pkgver=3.2.6 pkgver=3.2.2
_abiver="${pkgver%.*}.0" _abiver="${pkgver%.*}.0"
pkgrel=0 pkgrel=0
pkgdesc="An object-oriented language for quick and easy programming" pkgdesc="An object-oriented language for quick and easy programming"
@ -77,7 +73,6 @@ depends_dev="
libucontext-dev libucontext-dev
" "
makedepends="$depends_dev makedepends="$depends_dev
cargo
autoconf autoconf
gdbm-dev gdbm-dev
libffi-dev libffi-dev
@ -250,7 +245,7 @@ full() {
} }
sha512sums=" sha512sums="
26ae9439043cf40e5eddde6b92ae51c9e1fa4e89c8ec6da36732c59c14873b022c683fb3007950d372f35de9b62a4fabbbc3ef1f4ef58cd53058bd56e1552cbe ruby-3.2.6.tar.gz bcc68f3f24c1c8987d9c80b57332e5791f25b935ba38daf5addf60dbfe3a05f9dcaf21909681b88e862c67c6ed103150f73259c6e35c564f13a00f432e3c1e46 ruby-3.2.2.tar.gz
16fc1f35aee327d1ecac420b091beaa53c675e0504d5a6932004f17ca68a2c38f57b053b0a3903696f2232c5add160d363e3972a962f7f7bcb52e4e998c7315d test_insns-lower-recursion-depth.patch 16fc1f35aee327d1ecac420b091beaa53c675e0504d5a6932004f17ca68a2c38f57b053b0a3903696f2232c5add160d363e3972a962f7f7bcb52e4e998c7315d test_insns-lower-recursion-depth.patch
42cd45c1db089a1ae57834684479a502e357ddba82ead5fa34e64c13971e7ab7ad2919ddd60a104a817864dd3e2e35bdbedb679210eb41d82cab36a0687e43d4 fix-get_main_stack.patch 42cd45c1db089a1ae57834684479a502e357ddba82ead5fa34e64c13971e7ab7ad2919ddd60a104a817864dd3e2e35bdbedb679210eb41d82cab36a0687e43d4 fix-get_main_stack.patch
a77da5e5eb7d60caf3f1cabb81e09b88dc505ddd746e34efd1908c0096621156d81cc65095b846ba9bdb66028891aefce883a43ddec6b56b5beb4aac5e4ee33f dont-install-bundled-gems.patch a77da5e5eb7d60caf3f1cabb81e09b88dc505ddd746e34efd1908c0096621156d81cc65095b846ba9bdb66028891aefce883a43ddec6b56b5beb4aac5e4ee33f dont-install-bundled-gems.patch

View file

@ -0,0 +1,47 @@
# Contributor: Patrycja Rosa <alpine@ptrcnull.me>
# Maintainer: Patrycja Rosa <alpine@ptrcnull.me>
pkgname=forgejo-runner
pkgver=3.5.0
pkgrel=2
pkgdesc="CI/CD job runner for Forgejo"
url="https://code.forgejo.org/forgejo/runner"
arch="all"
license="MIT"
makedepends="go"
install="$pkgname.pre-install $pkgname.pre-upgrade"
subpackages="$pkgname-openrc"
source="$pkgname-$pkgver.tar.gz::https://code.forgejo.org/forgejo/runner/archive/v$pkgver.tar.gz
forgejo-runner.logrotate
forgejo-runner.initd
forgejo-runner.confd
"
builddir="$srcdir/runner"
options="!check" # tests require running forgejo
build() {
go build \
-o forgejo-runner \
-ldflags "-X gitea.com/gitea/act_runner/internal/pkg/ver.version=$pkgver"
./forgejo-runner generate-config > config.example.yaml
}
check() {
go test ./...
}
package() {
install -Dm755 forgejo-runner -t "$pkgdir"/usr/bin/
install -Dm644 config.example.yaml -t "$pkgdir"/etc/forgejo-runner/
install -Dm755 "$srcdir"/forgejo-runner.initd "$pkgdir"/etc/init.d/forgejo-runner
install -Dm644 "$srcdir"/forgejo-runner.confd "$pkgdir"/etc/conf.d/forgejo-runner
install -Dm644 "$srcdir"/forgejo-runner.logrotate "$pkgdir"/etc/logrotate.d/forgejo-runner
}
sha512sums="
e78968a5f9b6e797fb759a5c8cbf46a5c2fef2083dabc88599c9017729faface963576c63a948b0add424cb267902e864fb1a1b619202660296976d93e670713 forgejo-runner-3.5.0.tar.gz
a3c7238b0c63053325d31e09277edd88690ef5260854517f82d9042d6173fb5d24ebfe36e1d7363673dd8801972638a6e69b6af8ad43debb6057515c73655236 forgejo-runner.logrotate
bb0c6fbe90109c77f9ef9cb0d35d20b8033be0e4b7a60839b596aa5528dfa24309ec894d8c04066bf8fb30143e63a5fd8cc6fc89aac364422b583e0f840e2da6 forgejo-runner.initd
e11eab27f88f1181112389befa7de3aa0bac7c26841861918707ede53335535425c805e6682e25704e9c8a6aecba3dc13e20900a99df1183762b012b62f26d5f forgejo-runner.confd
"

View file

@ -0,0 +1,17 @@
# Configuration for /etc/init.d/forgejo-runner
# Path to the config file (--config).
#cfgfile="/etc/forgejo-runner/config.yaml"
# Path to the working directory (--working-directory).
#datadir="/var/lib/forgejo-runner"
# Path to the log file where stdout/stderr will be redirected.
# Leave empty/commented out to use syslog instead.
#output_log="/var/log/forgejo-runner.log"
# You may change this to root, e.g. to run jobs in LXC
#command_user="forgejo-runner"
# Comment out to run without process supervisor.
supervisor=supervise-daemon

View file

@ -0,0 +1,38 @@
#!/sbin/openrc-run
description="Forgejo CI Runner"
name="Forgejo Runner"
: ${cfgfile:="/etc/forgejo-runner/config.yaml"}
: ${datadir:="/var/lib/forgejo-runner"}
: ${command_user:="forgejo-runner"}
command="/usr/bin/forgejo-runner"
command_args="daemon --config $cfgfile"
command_background="yes"
directory="$datadir"
pidfile="/run/$RC_SVCNAME.pid"
depend() {
need net
use dns logger
}
start_pre() {
checkpath -d -o "$command_user" /etc/forgejo-runner
checkpath -d -o "$command_user" "$datadir"
if ! [ -e "$cfgfile" ]; then
eerror "Config file $cfgfile doesn't exist."
eerror "You can generate it with: forgejo-runner generate-config,"
eerror "or use the auto-generated one in /etc/forgejo-runner/config.example.yaml"
return 1
fi
if [ "$error_log" ]; then
output_log="$error_log"
else
output_logger="logger -t '${RC_SVCNAME}' -p daemon.info"
error_logger="logger -t '${RC_SVCNAME}' -p daemon.error"
fi
}

View file

@ -0,0 +1,5 @@
/var/log/forgejo-runner.log {
copytruncate
missingok
notifempty
}

View file

@ -0,0 +1,14 @@
#!/bin/sh
addgroup -S forgejo-runner 2>/dev/null
adduser -S -D -H -h /var/lib/forgejo-runner -s /sbin/nologin -G forgejo-runner -g forgejo-runner forgejo-runner 2>/dev/null
cat >&2 <<EOF
* In order to setup the runner, create a config file
* in /etc/forgejo-runner/config.yaml (either from .example.yaml,
* or generating your own with 'forgejo-runner generate-config'),
* then register it with 'doas -u forgejo-runner forgejo-runner register'
* ran in the /var/lib/forgejo-runner directory.
EOF
exit 0

View file

@ -0,0 +1 @@
forgejo-runner.pre-install

View file

@ -1,7 +1,7 @@
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net> # Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net> # Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=authentik pkgname=authentik
pkgver=2025.2.4 pkgver=2024.8.4
pkgrel=0 pkgrel=0
pkgdesc="An open-source Identity Provider focused on flexibility and versatility" pkgdesc="An open-source Identity Provider focused on flexibility and versatility"
url="https://github.com/goauthentik/authentik" url="https://github.com/goauthentik/authentik"
@ -10,9 +10,6 @@ url="https://github.com/goauthentik/authentik"
# ppc64le: not supported by Rollup build # ppc64le: not supported by Rollup build
arch="aarch64 x86_64" arch="aarch64 x86_64"
license="MIT" license="MIT"
# following depends aren't direct dependencies, but are needed:
# py3-asn1crypto, py3-cbor2, py3-email-validator, py3-websockets
# py3-openssl, py3-uvloop, py3-httptools
depends=" depends="
bash bash
libcap-setcap libcap-setcap
@ -20,94 +17,150 @@ depends="
postgresql postgresql
procps procps
pwgen pwgen
py3-aiohttp
py3-aiosignal
py3-amqp
py3-anyio
py3-asgiref
py3-asn1
py3-asn1crypto py3-asn1crypto
py3-async-timeout
py3-attrs
py3-autobahn
py3-automat
py3-bcrypt
py3-billiard
py3-cachetools
py3-cbor2 py3-cbor2
py3-celery py3-celery
py3-certifi
py3-cffi py3-cffi
py3-channels py3-channels
py3-channels_redis py3-channels_redis
py3-charset-normalizer
py3-click
py3-click-didyoumean
py3-click-plugins
py3-click-repl
py3-codespell
py3-colorama
py3-constantly
py3-cparser
py3-cryptography py3-cryptography
py3-dacite py3-dacite
py3-daphne py3-daphne
py3-dateutil
py3-deepmerge py3-deepmerge
py3-defusedxml py3-defusedxml
py3-docker-py py3-deprecated
py3-dnspython
py3-django py3-django
py3-django-countries py3-django-countries
py3-django-cte py3-django-cte
py3-django-filter py3-django-filter
py3-django-guardian py3-django-guardian
py3-django-model-utils py3-django-model-utils
py3-django-otp
py3-django-prometheus py3-django-prometheus
py3-django-pglock py3-django-pglock
py3-django-redis py3-django-redis
py3-django-rest-framework~3.14.0 py3-django-rest-framework~=3.14.0
py3-django-rest-framework-guardian py3-django-rest-framework-guardian
py3-django-storages py3-django-storages
py3-django-tenants py3-django-tenants
py3-django-tenant-schemas
py3-docker-py
py3-dotenv
py3-dumb-init py3-dumb-init
py3-duo-client py3-duo_client
py3-drf-orjson-renderer py3-drf-orjson-renderer
py3-drf-spectacular py3-drf-spectacular
py3-email-validator py3-email-validator
py3-fido2 py3-fido2
py3-flower py3-flower
py3-frozenlist
py3-geoip2 py3-geoip2
py3-geopy py3-google-auth
py3-google-api-python-client py3-google-api-python-client
py3-gunicorn py3-gunicorn
py3-h11
py3-httptools py3-httptools
py3-humanize
py3-hyperlink
py3-idna
py3-incremental
py3-inflection
py3-jsonschema
py3-jsonpatch py3-jsonpatch
py3-jwt py3-jwt
py3-jwcrypto py3-kombu
py3-kadmin-rs
py3-kubernetes py3-kubernetes
py3-ldap3 py3-ldap3
py3-lxml py3-lxml
py3-maxminddb py3-maxminddb
py3-msgpack py3-msgpack
py3-msgraph-sdk py3-msgraph-sdk
py3-multidict
py3-oauthlib
py3-opencontainers py3-opencontainers
py3-openssl py3-openssl
py3-packaging
py3-paramiko py3-paramiko
py3-parsing
py3-prometheus-client
py3-prompt_toolkit
py3-psycopg py3-psycopg
py3-psycopg-c py3-psycopg-c
py3-pydantic
py3-pydantic-scim py3-pydantic-scim
py3-pynacl
py3-pyrsistent
py3-pyrad py3-pyrad
py3-python-gssapi py3-python-jwt
py3-redis
py3-requests
py3-requests-oauthlib py3-requests-oauthlib
py3-rsa
py3-scim2-filter-parser py3-scim2-filter-parser
py3-setproctitle py3-setproctitle
py3-sentry-sdk py3-sentry-sdk
py3-service_identity py3-service_identity
py3-setuptools
py3-six py3-six
py3-sniffio py3-sniffio
py3-sqlparse py3-sqlparse
py3-structlog py3-structlog
py3-swagger-spec-validator py3-swagger-spec-validator
py3-tornado
py3-twilio py3-twilio
py3-txaio
py3-tenant-schemas-celery py3-tenant-schemas-celery
py3-typing-extensions
py3-tz
py3-ua-parser py3-ua-parser
py3-unidecode py3-uritemplate
py3-urllib3-secure-extra py3-urllib3-secure-extra
py3-uvloop py3-uvloop
py3-vine
py3-watchdog py3-watchdog
py3-watchfiles
py3-wcwidth
py3-webauthn py3-webauthn
py3-websocket-client
py3-websockets py3-websockets
py3-wrapt
py3-wsproto py3-wsproto
py3-xmlsec py3-xmlsec
py3-yaml py3-yaml
py3-yarl
py3-zope-interface
py3-zxcvbn py3-zxcvbn
valkey valkey
uvicorn uvicorn
" "
makedepends="go npm py3-packaging" makedepends="go npm"
checkdepends=" checkdepends="
py3-pip py3-pip
py3-coverage py3-coverage
py3-codespell
py3-colorama
py3-pytest py3-pytest
py3-pytest-django py3-pytest-django
py3-pytest-randomly py3-pytest-randomly
@ -115,7 +168,6 @@ checkdepends="
py3-freezegun py3-freezegun
py3-boto3 py3-boto3
py3-requests-mock py3-requests-mock
py3-k5test
" "
install="$pkgname.post-install $pkgname.post-upgrade $pkgname.pre-install" install="$pkgname.post-install $pkgname.post-upgrade $pkgname.pre-install"
source=" source="
@ -160,9 +212,6 @@ build() {
npm run build npm run build
} }
# test failure neutralized due to:
# relation authentik_core_user_pb_groups_id_seq does not exist
check() { check() {
msg "Setting up test environments" msg "Setting up test environments"
export POSTGRES_DB=authentik export POSTGRES_DB=authentik
@ -202,7 +251,7 @@ with open(\"local.env.yml\", \"w\") as _config:
pip install selenium drf_jsonschema_serializer pdoc --break-system-packages pip install selenium drf_jsonschema_serializer pdoc --break-system-packages
msg "Starting tests" msg "Starting tests"
make test || true make test
# TODO: Fix go-tests # TODO: Fix go-tests
# make go-test # make go-test
@ -284,13 +333,13 @@ pyc() {
} }
sha512sums=" sha512sums="
75928b3ab9ae126f3cbe88ff1256de8adba7add099b0d93615abb8c91a2b7f275e83664a232e8c5393c5031bd9757af2f20fdb9d0153dacdf9a482b6b4bb8b00 authentik-2025.2.4.tar.gz 63548adc1ff93f603d133f1a23357ac1fedd975e790b81e1ad1ce17c7b32a58197c2fe49e6199362d3e90f873cd010b14b2e83b254f81b0198663657a2532e91 authentik-2024.8.4.tar.gz
4defb4fe3a4230f4aa517fbecd5e5b8bcef2a64e1b40615660ae9eec33597310a09df5e126f4d39ce7764bd1716c0a7040637699135c103cbc1879593c6c06f1 authentik.openrc 4defb4fe3a4230f4aa517fbecd5e5b8bcef2a64e1b40615660ae9eec33597310a09df5e126f4d39ce7764bd1716c0a7040637699135c103cbc1879593c6c06f1 authentik.openrc
6cb03b9b69df39bb4539fe05c966536314d766b2e9307a92d87070ba5f5b7e7ab70f1b5ee1ab3c0c50c23454f9c5a4caec29e63fdf411bbb7a124ad687569b89 authentik-worker.openrc 6cb03b9b69df39bb4539fe05c966536314d766b2e9307a92d87070ba5f5b7e7ab70f1b5ee1ab3c0c50c23454f9c5a4caec29e63fdf411bbb7a124ad687569b89 authentik-worker.openrc
351e6920d987861f8bf0d7ab2f942db716a8dbdad1f690ac662a6ef29ac0fd46cf817cf557de08f1c024703503d36bc8b46f0d9eb1ecaeb399dce4c3bb527d17 authentik-ldap.openrc 351e6920d987861f8bf0d7ab2f942db716a8dbdad1f690ac662a6ef29ac0fd46cf817cf557de08f1c024703503d36bc8b46f0d9eb1ecaeb399dce4c3bb527d17 authentik-ldap.openrc
89ee5f0ffdade1c153f3a56ff75b25a7104aa81d8c7a97802a8f4b0eab34850cee39f874dabe0f3c6da3f71d6a0f938f5e8904169e8cdd34d407c8984adee6b0 authentik-ldap.conf 89ee5f0ffdade1c153f3a56ff75b25a7104aa81d8c7a97802a8f4b0eab34850cee39f874dabe0f3c6da3f71d6a0f938f5e8904169e8cdd34d407c8984adee6b0 authentik-ldap.conf
f1a3cb215b6210fa7d857a452a9f2bc4dc0520e49b9fa7027547cff093d740a7e2548f1bf1f8831f7d5ccb80c8e523ee0c8bafcc4dc42d2788725f2137d21bee authentik-manage.sh f1a3cb215b6210fa7d857a452a9f2bc4dc0520e49b9fa7027547cff093d740a7e2548f1bf1f8831f7d5ccb80c8e523ee0c8bafcc4dc42d2788725f2137d21bee authentik-manage.sh
3d38076606d18a438a2d76cdd2067774d5471bb832e641050630726b4d7bd8b8c2218d25d7e987a1fb46ee6a4a81d13e899145f015b3c94204cece039c7fb182 fix-ak-bash.patch 3e47db684a3f353dcecdb7bab8836b9d5198766735d77f676a51d952141a0cf9903fcb92e6306c48d2522d7a1f3028b37247fdc1dc74d4d6e043da7eb4f36d49 fix-ak-bash.patch
5c60e54b6a7829d611af66f5cb8184a002b5ae927efbd024c054a7c176fcb9efcfbe5685279ffcf0390b0f0abb3bb03e02782c6867c2b38d1ad2d508aae83fa0 root-settings-csrf_trusted_origins.patch 5c60e54b6a7829d611af66f5cb8184a002b5ae927efbd024c054a7c176fcb9efcfbe5685279ffcf0390b0f0abb3bb03e02782c6867c2b38d1ad2d508aae83fa0 root-settings-csrf_trusted_origins.patch
badff70b19aad79cf16046bd46cb62db25c2a8b85b2673ce7c44c42eb60d42f6fcb1b9a7a7236c00f24803b25d3c66a4d64423f7ce14a59763b8415db292a5b9 go-downgrade-1.22.patch badff70b19aad79cf16046bd46cb62db25c2a8b85b2673ce7c44c42eb60d42f6fcb1b9a7a7236c00f24803b25d3c66a4d64423f7ce14a59763b8415db292a5b9 go-downgrade-1.22.patch
" "

View file

@ -1,10 +1,10 @@
diff --git a/lifecycle/ak.orig b/lifecycle/ak diff --git a/lifecycle/ak.orig b/lifecycle/ak
index 44dc480..49a0cef 100755 index 615bfe9..1646274 100755
--- a/lifecycle/ak.orig --- a/lifecycle/ak.orig
+++ b/lifecycle/ak +++ b/lifecycle/ak
@@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
-#!/usr/bin/env -S bash -#!/usr/bin/env -S bash -e
+#!/usr/bin/env bash +#!/usr/bin/env bash
set -e -o pipefail
MODE_FILE="${TMPDIR}/authentik-mode" MODE_FILE="${TMPDIR}/authentik-mode"
function log {

View file

@ -1,49 +0,0 @@
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=codeberg-pages-server
pkgver=6.2.1
pkgrel=1
pkgdesc="The Codeberg Pages Server with custom domain support, per-repo pages using the pages branch, caching and more."
url="https://codeberg.org/Codeberg/pages-server"
arch="all"
license="EUPL-1.2"
depends="libcap-setcap nginx"
makedepends="go just"
install="$pkgname.post-install"
# tests disabled for now
options="!check"
source="
$pkgname-$pkgver.tar.gz::https://codeberg.org/Codeberg/pages-server/archive/v$pkgver.tar.gz
codeberg-pages-server.openrc
downgrade-go.patch
"
builddir="$srcdir/"pages-server
subpackages="$pkgname-openrc"
pkgusers="git"
pkggroups="www-data"
export GOPATH=$srcdir/go
export GOCACHE=$srcdir/go-build
export GOTMPDIR=$srcdir
build() {
just build
}
package() {
msg "Packaging $pkgname"
install -Dm755 "$builddir"/build/codeberg-pages-server \
"$pkgdir"/usr/bin/codeberg-pages-server
install -Dm755 "$srcdir"/$pkgname.openrc \
"$pkgdir"/etc/init.d/$pkgname
install -Dm600 "$builddir"/example_config.toml \
"$pkgdir"/etc/codeberg-pages-server/pages.conf
}
sha512sums="
87992a244a580ef109fa891fd4e4ab5bf8320076f396c63e23b83e2c49e3c34fed2d6562283fc57dd89ebc13596dd7b8cbdfa7202eee43cbbd86b6a7f3b52c26 codeberg-pages-server-6.2.1.tar.gz
4808057de5d539fd9ad3db67b650d45ed60c53e07eff840115af09729ac198791b465b61da547eac1dffd0633e5855c348aa7663d6f6cb5984f7fc999be08589 codeberg-pages-server.openrc
1f02e3e9a6f0aab9b516fa7ffaaeb92da3ab839fbcf07f672398063d784c8c0ca373edc0f9a26132d40a60345c4894a5f757c13bf7500f5753f5ffcdf10c52db downgrade-go.patch
"

View file

@ -1,23 +0,0 @@
#!/sbin/openrc-run
: ${config:=/etc/codeberg-pages-server/pages.conf}
name="$RC_SVCNAME"
cfgfile="/etc/conf.d/$RC_SVCNAME.conf"
pidfile="/run/$RC_SVCNAME.pid"
working_directory="/var/lib/codeberg-pages-server"
command="/usr/bin/codeberg-pages-server"
command_args="--config-file $config"
command_user="nginx"
command_group="nginx"
start_stop_daemon_args=""
command_background="yes"
output_log="/var/log/codeberg-pages-server/$RC_SVCNAME.log"
error_log="/var/log/codeberg-pages-server/$RC_SVCNAME.err"
start_pre() {
checkpath --directory --owner $command_user:$command_group --mode 0775 \
/var/log/codeberg-pages-server \
/var/lib/codeberg-pages-server
cd "$working_directory"
}

View file

@ -1,10 +0,0 @@
#!/bin/sh
set -eu
setcap 'cap_net_bind_service=+ep' /usr/bin/codeberg-pages-server
cat >&2 <<-EOF
*
* 1. Adjust settings in /etc/codeberg-pages-server/pages.conf
*
EOF

View file

@ -1,12 +0,0 @@
diff --git a/go.mod.orig b/go.mod
index bff6b77..2b9f2e4 100644
--- a/go.mod.orig
+++ b/go.mod
@@ -1,6 +1,6 @@
module codeberg.org/codeberg/pages
-go 1.24.0
+go 1.23.6
require (
code.gitea.io/sdk/gitea v0.20.0

View file

@ -4,14 +4,14 @@
# Contributor: Patrycja Rosa <alpine@ptrcnull.me> # Contributor: Patrycja Rosa <alpine@ptrcnull.me>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net> # Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=forgejo-aneksajo pkgname=forgejo-aneksajo
pkgver=10.0.3_git0 pkgver=8.0.3_git1
_gittag=v${pkgver/_git/-git-annex} _gittag=v${pkgver/_git/-git-annex}
pkgrel=0 pkgrel=2
pkgdesc="Self-hosted Git service written in Go with git-annex support" pkgdesc="Self-hosted Git service written in Go with git-annex support"
url="https://forgejo.org" url="https://forgejo.org"
# riscv64: builds fail https://codeberg.org/forgejo/forgejo/issues/3025 # riscv64: builds fail https://codeberg.org/forgejo/forgejo/issues/3025
arch="all !riscv64" arch="all !riscv64"
license="GPL-3.0-or-later" license="MIT"
depends="git git-lfs gnupg" depends="git git-lfs gnupg"
makedepends="go nodejs npm" makedepends="go nodejs npm"
checkdepends="bash openssh openssh-keygen sqlite tzdata" checkdepends="bash openssh openssh-keygen sqlite tzdata"
@ -55,7 +55,7 @@ build() {
# XXX: LARGEFILE64 # XXX: LARGEFILE64
export CGO_CFLAGS="$CFLAGS -O2 -D_LARGEFILE64_SOURCE" export CGO_CFLAGS="$CFLAGS -O2 -D_LARGEFILE64_SOURCE"
export TAGS="bindata sqlite sqlite_unlock_notify" export TAGS="bindata sqlite sqlite_unlock_notify"
export GITEA_VERSION="${pkgver/_git/-git-annex}" export GITEA_VERSION="$pkgver"
export EXTRA_GOFLAGS="$GOFLAGS" export EXTRA_GOFLAGS="$GOFLAGS"
export CGO_LDFLAGS="$LDFLAGS" export CGO_LDFLAGS="$LDFLAGS"
unset LDFLAGS unset LDFLAGS
@ -106,7 +106,7 @@ package() {
} }
sha512sums=" sha512sums="
e32c919228df167374e8f3099e2e59bfab610aac6c87465318efe1cac446d014535e270f57b0bf8b2a7eb3843c5dcb189eac4dad2e230b57acd9096ead647eca forgejo-aneksajo-v10.0.3-git-annex0.tar.gz 4f57aea8ab86dc0c68eaacc3b5da00a0fe5cf94d27305a5dde5af2226ceec3a7e622d93bedfa51558b04d1610f1b223e8ba3e9d5ecd81f3e161a226c3b496c64 forgejo-aneksajo-v8.0.3-git-annex1.tar.gz
497d8575f2eb5ac43baf82452e76007ef85e22cca2cc769f1cf55ffd03d7ce4d50ac4dc2b013e23086b7a5577fc6de5a4c7e5ec7c287f0e3528e908aaa2982aa forgejo-aneksajo.initd eb93a9f6c8f204de5c813f58727015f53f9feaab546589e016c60743131559f04fc1518f487b6d2a0e7fa8fab6d4a67cd0cd9713a7ccd9dec767a8c1ddebe129 forgejo-aneksajo.initd
b537b41b6b3a945274a6028800f39787b48c318425a37cf5d40ace0d1b305444fd07f17b4acafcd31a629bedd7d008b0bb3e30f82ffeb3d7e7e947bdbe0ff4f3 forgejo-aneksajo.ini b537b41b6b3a945274a6028800f39787b48c318425a37cf5d40ace0d1b305444fd07f17b4acafcd31a629bedd7d008b0bb3e30f82ffeb3d7e7e947bdbe0ff4f3 forgejo-aneksajo.ini
" "

View file

@ -1,21 +1,12 @@
#!/sbin/openrc-run #!/sbin/openrc-run
: ${command_user:="forgejo:www-data"} supervisor=supervise-daemon
: ${cfgfile:="/etc/forgejo/app.ini"}
: ${directory:="/var/lib/forgejo"}
: ${output_log="/var/log/forgejo/http.log"}
: ${error_log="/var/log/forgejo/http.log"}
: ${supervisor="supervise-daemon"}
name=forgejo name=forgejo
command="/usr/bin/forgejo" command="/usr/bin/forgejo"
command_args="web --config '$cfgfile' $command_args" command_user="${FORGEJO_USER:-forgejo}:www-data"
command_background="yes" command_args="web --config '${FORGEJO_CONF:-/etc/forgejo/app.ini}'"
pidfile="/run/$RC_SVCNAME.pid" supervise_daemon_args="--env FORGEJO_WORK_DIR='${FORGEJO_WORK_DIR:-/var/lib/forgejo}' --chdir '${FORGEJO_WORK_DIR:-/var/lib/forgejo}' --stdout '${FORGEJO_LOG_FILE:-/var/log/forgejo/http.log}' --stderr '${FORGEJO_LOG_FILE:-/var/log/forgejo/http.log}'"
pidfile="/run/forgejo.pid"
required_files="$cfgfile"
export FORGEJO_WORK_DIR="$directory"
depend() { depend() {
use logger dns use logger dns

View file

@ -1,7 +1,7 @@
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net> # Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net> # Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=freescout pkgname=freescout
pkgver=1.8.174 pkgver=1.8.152
pkgrel=0 pkgrel=0
pkgdesc="Free self-hosted help desk & shared mailbox" pkgdesc="Free self-hosted help desk & shared mailbox"
arch="noarch" arch="noarch"
@ -9,7 +9,7 @@ url="freescout.net"
license="AGPL-3.0" license="AGPL-3.0"
_php=php83 _php=php83
_php_mods="-fpm -mbstring -xml -imap -zip -gd -curl -intl -tokenizer -pdo_pgsql -openssl -session -iconv -fileinfo -dom -pcntl" _php_mods="-fpm -mbstring -xml -imap -zip -gd -curl -intl -tokenizer -pdo_pgsql -openssl -session -iconv -fileinfo -dom -pcntl"
depends="$_php ${_php_mods//-/$_php-} nginx postgresql pwgen bash" depends="$_php ${_php_mods//-/$_php-} nginx postgresql pwgen"
makedepends="composer pcre" makedepends="composer pcre"
install="$pkgname.post-install $pkgname.post-upgrade $pkgname.pre-install" install="$pkgname.post-install $pkgname.post-upgrade $pkgname.pre-install"
source=" source="
@ -17,7 +17,6 @@ source="
freescout.nginx freescout.nginx
freescout-manage.sh freescout-manage.sh
rename-client-to-membre-fr-en.patch rename-client-to-membre-fr-en.patch
fix-laravel-log-viewer.patch
" "
pkgusers="freescout" pkgusers="freescout"
pkggroups="freescout" pkggroups="freescout"
@ -76,9 +75,8 @@ package() {
install -m755 -D "$srcdir"/freescout-manage.sh "$pkgdir"/usr/bin/freescout-manage install -m755 -D "$srcdir"/freescout-manage.sh "$pkgdir"/usr/bin/freescout-manage
} }
sha512sums=" sha512sums="
c5ec40b3dd7f6f593a950d96632e69d8e0a43e17f566f3d83b52aa44e2aac8ef98c536e9408faa834051d7fb3f07e003642f5e6e2a25a69ea51cf7b96290fb1d freescout-1.8.174.tar.gz 0e4d6d4a1aaeba2d39db8678e436f3c46c1a1fd79ea2b37c9ac95cbb319306b818991981987f6ac7dc8100a084d4189fa12f7639b24e2744705fa409ac349864 freescout-1.8.152.tar.gz
e4af6c85dc12f694bef2a02e4664e31ed50b2c109914d7ffad5001c2bbd764ef25b17ecaa59ff55ef41bccf17169bf910d1a08888364bdedd0ecc54d310e661f freescout.nginx e4af6c85dc12f694bef2a02e4664e31ed50b2c109914d7ffad5001c2bbd764ef25b17ecaa59ff55ef41bccf17169bf910d1a08888364bdedd0ecc54d310e661f freescout.nginx
7ce9b3ee3a979db44f5e6d7daa69431e04a5281f364ae7be23e5a0a0547f96abc858d2a8010346be2fb99bd2355fb529e7030ed20d54f310249e61ed5db4d0ba freescout-manage.sh 7ce9b3ee3a979db44f5e6d7daa69431e04a5281f364ae7be23e5a0a0547f96abc858d2a8010346be2fb99bd2355fb529e7030ed20d54f310249e61ed5db4d0ba freescout-manage.sh
0cba00b7d945ce84f72a2812d40028a073a5278856f610e46dbfe0ac78deff6bf5eba7643635fa4bc64d070c4d49eb47d24ea0a05ba1e6ea76690bfd77906366 rename-client-to-membre-fr-en.patch 3416da98d71aea5a7093913ea34e783e21ff05dca90bdc5ff3d00c548db5889f6d0ec98441cd65ab9f590be5cd59fdd0d7f1c98b5deef7bb3adbc8db435ec9bf rename-client-to-membre-fr-en.patch
2c651db6adac6d53597ba36965d0c65e005293f9b030e6be167853e4089384920524737aa947c5066877ee8caefb46741ccba797f653e7c2678556063540d261 fix-laravel-log-viewer.patch
" "

View file

@ -1,13 +0,0 @@
diff --git a/vendor/composer/installed.json.orig b/vendor/composer/installed.json
index 0b826f5..9d14ec8 100644
--- a/vendor/composer/installed.json.orig
+++ b/vendor/composer/installed.json
@@ -4494,7 +4494,7 @@
"installation-source": "dist",
"autoload": {
"classmap": [
- "src/controllers"
+ "src/"
],
"psr-0": {
"Rap2hpoutre\\LaravelLogViewer\\": "src/"

View file

@ -38,7 +38,7 @@ index 00000000..82d26052
+} +}
\ No newline at end of file \ No newline at end of file
diff --git a/resources/lang/fr.json.orig b/resources/lang/fr.json diff --git a/resources/lang/fr.json.orig b/resources/lang/fr.json
index 6264973..8a7037e 100644 index ff8d9d4..98d158f 100644
--- a/resources/lang/fr.json.orig --- a/resources/lang/fr.json.orig
+++ b/resources/lang/fr.json +++ b/resources/lang/fr.json
@@ -26,8 +26,8 @@ @@ -26,8 +26,8 @@
@ -201,8 +201,8 @@ index 6264973..8a7037e 100644
- "This number is not visible to customers. It is only used to track conversations within :app_name": "Ce numéro n'est pas visible pour les clients. Il est uniquement utilisé pour suivre les conversations dans :app_name", - "This number is not visible to customers. It is only used to track conversations within :app_name": "Ce numéro n'est pas visible pour les clients. Il est uniquement utilisé pour suivre les conversations dans :app_name",
+ "This number is not visible to customers. It is only used to track conversations within :app_name": "Ce numéro n'est pas visible pour les membres. Il est uniquement utilisé pour suivre les conversations dans :app_name", + "This number is not visible to customers. It is only used to track conversations within :app_name": "Ce numéro n'est pas visible pour les membres. Il est uniquement utilisé pour suivre les conversations dans :app_name",
"This password is incorrect.": "Ce mot de passe est incorrect.", "This password is incorrect.": "Ce mot de passe est incorrect.",
- "This reply will go to the customer. :%switch_start%Switch to a note:%switch_end% if you are replying to :user_name.": "Cette réponse ira au client. :%switch_start%Passez à une note:%switch_end% si vous répondez à :user_name.", - "This reply will go to the customer. :%switch_start%Switch to a note:switch_end if you are replying to :user_name.": "Cette réponse ira au client. :%switch_start%Passez à une note:switch_end si vous répondez à :user_name.",
+ "This reply will go to the customer. :%switch_start%Switch to a note:%switch_end% if you are replying to :user_name.": "Cette réponse ira au membre. :%switch_start%Passez à une note:%switch_end% si vous répondez à :user_name.", + "This reply will go to the customer. :%switch_start%Switch to a note:switch_end if you are replying to :user_name.": "Cette réponse ira au membre. :%switch_start%Passez à une note:switch_end si vous répondez à :user_name.",
"This setting gives you control over what page loads after you perform an action (send a reply, add a note, change conversation status or assignee).": "Ce paramètre vous permet de contrôler la page qui se charge après avoir effectué une action (envoyer une réponse, ajouter une note, etc.).", "This setting gives you control over what page loads after you perform an action (send a reply, add a note, change conversation status or assignee).": "Ce paramètre vous permet de contrôler la page qui se charge après avoir effectué une action (envoyer une réponse, ajouter une note, etc.).",
- "This text will be added to the beginning of each email reply sent to a customer.": "Ce texte sera ajouté au début de chaque réponse par e-mail envoyée à un client.", - "This text will be added to the beginning of each email reply sent to a customer.": "Ce texte sera ajouté au début de chaque réponse par e-mail envoyée à un client.",
+ "This text will be added to the beginning of each email reply sent to a customer.": "Ce texte sera ajouté au début de chaque réponse par e-mail envoyée à un membre.", + "This text will be added to the beginning of each email reply sent to a customer.": "Ce texte sera ajouté au début de chaque réponse par e-mail envoyée à un membre.",

View file

@ -1,7 +1,7 @@
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net> # Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net> # Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=listmonk pkgname=listmonk
pkgver=4.1.0 pkgver=4.0.1
pkgrel=0 pkgrel=0
pkgdesc='Self-hosted newsletter and mailing list manager with a modern dashboard' pkgdesc='Self-hosted newsletter and mailing list manager with a modern dashboard'
arch="all" arch="all"
@ -67,7 +67,7 @@ package() {
ln -s /etc/listmonk/config.toml "$pkgdir"/usr/share/webapps/listmonk/config.toml ln -s /etc/listmonk/config.toml "$pkgdir"/usr/share/webapps/listmonk/config.toml
} }
sha512sums=" sha512sums="
936b33d6de1d69ee4e7f768810116ac997c516754aace0371089bc8106bebee944197864afc11b7bc5725afa9a4f195d6629957bfcdd37c847e3780aa34558ec listmonk-4.1.0.tar.gz ae5c338b756bb9d84739ab8b04b591e33ee7f6a579725083ec95e2609dbff55adbd1f2a11c0487b971aa030a3a35347cf54966820e1320b4144351935b2497d8 listmonk-4.0.1.tar.gz
939450af4b23708e3d23a5a88fad4c24b957090bdd21351a6dd520959e52e45e5fcac117a3eafa280d9506616dae39ad3943589571f008cac5abe1ffd8062424 listmonk.sh 939450af4b23708e3d23a5a88fad4c24b957090bdd21351a6dd520959e52e45e5fcac117a3eafa280d9506616dae39ad3943589571f008cac5abe1ffd8062424 listmonk.sh
8e9c0b1f335c295fb741418246eb17c7566e5e4200a284c6483433e8ddbf5250aa692435211cf062ad1dfcdce3fae9148def28f03f2492d33fe5e66cbeebd4bd listmonk.openrc 8e9c0b1f335c295fb741418246eb17c7566e5e4200a284c6483433e8ddbf5250aa692435211cf062ad1dfcdce3fae9148def28f03f2492d33fe5e66cbeebd4bd listmonk.openrc
" "

View file

@ -2,11 +2,11 @@
# Contributor: jahway603 <jahway603@protonmail.com> # Contributor: jahway603 <jahway603@protonmail.com>
# Maintainer: Leonardo Arena <rnalrd@alpinelinux.org> # Maintainer: Leonardo Arena <rnalrd@alpinelinux.org>
_pkgname=nextcloud _pkgname=nextcloud
pkgver=30.0.8 pkgver=29.0.8
pkgrel=0 pkgrel=0
is_latest=true is_latest=false
_pkgvermaj=${pkgver%%.*} _pkgvermaj=${pkgver%%.*}
pkgname=nextcloud$_pkgvermaj pkgname=nextcloud
_replaced_ver=$(( _pkgvermaj - 1 )) _replaced_ver=$(( _pkgvermaj - 1 ))
pkgdesc="A safe home for all your data" pkgdesc="A safe home for all your data"
url="https://nextcloud.com/" url="https://nextcloud.com/"
@ -47,12 +47,10 @@ $is_latest && provides="$_pkgname=$pkgver-r$pkgrel
$pkgname-settings=$pkgver-r$pkgrel $pkgname-settings=$pkgver-r$pkgrel
$_pkgname-theming=$pkgver-r$pkgrel $_pkgname-theming=$pkgver-r$pkgrel
$pkgname-theming=$pkgver-r$pkgrel $pkgname-theming=$pkgver-r$pkgrel
$_pkgname-twofactor_backupcodes=$pkgver-r$pkgrel
$pkgname-twofactor_backupcodes=$pkgver-r$pkgrel
$_pkgname-twofactor_nextcloud_notification=$pkgver-r$pkgrel
$pkgname-twofactor_nextcloud_notification=$pkgver-r$pkgrel
$_pkgname-twofactor_totp=$pkgver-r$pkgrel $_pkgname-twofactor_totp=$pkgver-r$pkgrel
$pkgname-twofactor_totp=$pkgver-r$pkgrel $pkgname-twofactor_totp=$pkgver-r$pkgrel
$_pkgname-twofactor_backupcodes=$pkgver-r$pkgrel
$pkgname-twofactor_backupcodes=$pkgver-r$pkgrel
$_pkgname-viewer=$pkgver-r$pkgrel $_pkgname-viewer=$pkgver-r$pkgrel
$pkgname-viewer=$pkgver-r$pkgrel $pkgname-viewer=$pkgver-r$pkgrel
$_pkgname-workflowengine=$pkgver-r$pkgrel $_pkgname-workflowengine=$pkgver-r$pkgrel
@ -71,9 +69,8 @@ $is_latest && provides="$_pkgname=$pkgver-r$pkgrel
$pkgname-related_resources=$pkgver-r$pkgrel $pkgname-related_resources=$pkgver-r$pkgrel
$pkgname-settings=$pkgver-r$pkgrel $pkgname-settings=$pkgver-r$pkgrel
$pkgname-theming=$pkgver-r$pkgrel $pkgname-theming=$pkgver-r$pkgrel
$pkgname-twofactor_backupcodes=$pkgver-r$pkgrel
$pkgname-twofactor_nextcloud_notification=$pkgver-r$pkgrel
$pkgname-twofactor_totp=$pkgver-r$pkgrel $pkgname-twofactor_totp=$pkgver-r$pkgrel
$pkgname-twofactor_backupcodes=$pkgver-r$pkgrel
$pkgname-viewer=$pkgver-r$pkgrel $pkgname-viewer=$pkgver-r$pkgrel
$pkgname-workflowengine=$pkgver-r$pkgrel $pkgname-workflowengine=$pkgver-r$pkgrel
" "
@ -106,8 +103,7 @@ builddir="$srcdir"/$_pkgname
# "cloud_federation_api", "dav", "files", # "cloud_federation_api", "dav", "files",
# "federatedfilesharing", "lookup_server_connector", "provisioning_api", # "federatedfilesharing", "lookup_server_connector", "provisioning_api",
# "oauth2", "settings", "twofactor_backupcodes", "twofactor_totp", # "oauth2", "settings", "twofactor_backupcodes", "twofactor_totp",
# "twofactor_nextcloud_notification", "theming", "viewer", # "theming", "viewer", "workflowengine", "related_resources"
# "workflowengine", "related_resources"
# here, these should be always installed. # here, these should be always installed.
_apps="activity _apps="activity
admin_audit admin_audit
@ -116,7 +112,6 @@ _apps="activity
dashboard dashboard
encryption encryption
federation federation
files_downloadlimit
files_external files_external
files_pdfviewer files_pdfviewer
files_reminders files_reminders
@ -141,7 +136,6 @@ _apps="activity
user_ldap user_ldap
user_status user_status
weather_status weather_status
webhook_listeners
" "
for _i in $_apps; do for _i in $_apps; do
subpackages="$subpackages $pkgname-$_i:_package_app" subpackages="$subpackages $pkgname-$_i:_package_app"
@ -310,8 +304,8 @@ _package_app() {
} }
sha512sums=" sha512sums="
0bca2f42ccfb7db4befdd2aeeb1df72d2f9acad88907706f8524ced55bd0213b30b687a5e4c623615e59f22246562e195fd74bbb409c4f60b713482e1237d755 nextcloud-30.0.8.tar.bz2 ec99d5efc6a573627cae9b42f7f34e3c8ee7ba9bc3bfe1bb032c9e8fcef2831ce32f7dcb72c3303582b205de390619bd7f892a7bc4415c0826e02f73496714b0 nextcloud-29.0.8.tar.bz2
daeabeaa315bb908cc1e49612cce4b2debd71d17acb84b5d14e15fe124c907884b72d54e9aa669ec209eee1b1934d0bc242d72a28d8db7339cfb08383f66fd5c nextcloud-dont-chmod.patch aea0adb2c3a48ec6af2958c6ccfe13adff86316a56084e763b7e6df9e21aa3435b13305b7c15cc2b795e83c9388b05006862f6465c29e3dc2c1fbd8eb8befcb9 nextcloud-dont-chmod.patch
12f4a39aef0f81a0115c81bf2b345cc194537a7e8300748b800b0e35bc07928091296074b23c2019c17aced69854a11d1ed7225f67eefd27cf00c3969a75c5b0 dont-update-htaccess.patch 12f4a39aef0f81a0115c81bf2b345cc194537a7e8300748b800b0e35bc07928091296074b23c2019c17aced69854a11d1ed7225f67eefd27cf00c3969a75c5b0 dont-update-htaccess.patch
cb04252d01407c7030e87dd54616c621ea0f85ef0212674b1161288182538cae0fb31c67e7cc07c66f9607075774c64e386009cc66365b1f1b155f6ad4f83ac0 disable-integrity-check-as-default.patch cb04252d01407c7030e87dd54616c621ea0f85ef0212674b1161288182538cae0fb31c67e7cc07c66f9607075774c64e386009cc66365b1f1b155f6ad4f83ac0 disable-integrity-check-as-default.patch
c0a9b7c31c8beaca711f8e97d98441007b3dca7fb3d316d2eacd28a73b5233def6f846c02d98202f75efb9cb248b8787a80e20b07c32d1c7534a0e54bb20feab use-external-docs-if-local-not-avail.patch c0a9b7c31c8beaca711f8e97d98441007b3dca7fb3d316d2eacd28a73b5233def6f846c02d98202f75efb9cb248b8787a80e20b07c32d1c7534a0e54bb20feab use-external-docs-if-local-not-avail.patch

View file

@ -32,6 +32,18 @@ index 9e9abb11..7db25286 100644
if ($handle) { if ($handle) {
fwrite($handle, $entry."\n"); fwrite($handle, $entry."\n");
fclose($handle); fclose($handle);
diff --git a/lib/private/TempManager.php b/lib/private/TempManager.php
index 49d4ee94..b0943843 100644
--- a/lib/private/TempManager.php
+++ b/lib/private/TempManager.php
@@ -96,7 +96,6 @@ class TempManager implements ITempManager {
if ($postFix !== '') {
$fileNameWithPostfix = $this->buildFileNameWithSuffix($file, $postFix);
touch($fileNameWithPostfix);
- chmod($fileNameWithPostfix, 0600);
$this->current[] = $fileNameWithPostfix;
return $fileNameWithPostfix;
}
diff --git a/lib/private/legacy/OC_Util.php b/lib/private/legacy/OC_Util.php diff --git a/lib/private/legacy/OC_Util.php b/lib/private/legacy/OC_Util.php
index 71f6edba..216abdf8 100644 index 71f6edba..216abdf8 100644
--- a/lib/private/legacy/OC_Util.php --- a/lib/private/legacy/OC_Util.php

View file

@ -3,7 +3,7 @@
pkgname=py3-azure-core pkgname=py3-azure-core
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=azure-core _pkgreal=azure-core
pkgver=1.32.0 pkgver=1.31.0
pkgrel=0 pkgrel=0
pkgdesc="Microsoft Azure Core Library for Python" pkgdesc="Microsoft Azure Core Library for Python"
url="https://pypi.python.org/project/microsoft-kiota-authentication-azure" url="https://pypi.python.org/project/microsoft-kiota-authentication-azure"
@ -35,5 +35,5 @@ package() {
} }
sha512sums=" sha512sums="
d258a2ca3bc2c9514dec91bf2dbb19c0ee4c0c0bec73a4301b47fb43be768be836f32621b70a8cdb0e39f1491a522191a82a00f318ee7c901e8861a62439e934 py3-azure-core-1.32.0.tar.gz be2fc27610034ee5c345ed11f59233ec81d8ad628c4b732531a24e0d54720b81f22d855e5a4d9214c6a8234e479da059b37a40c7ad15e738e2dd46fb4755dad6 py3-azure-core-1.31.0.tar.gz
" "

View file

@ -3,7 +3,8 @@
pkgname=py3-azure-identity pkgname=py3-azure-identity
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=azure-identity _pkgreal=azure-identity
pkgver=1.19.0 pkgver=1.18.0
_pkgver=${pkgver}b2
pkgrel=0 pkgrel=0
pkgdesc="Microsoft Azure Identity Library for Python" pkgdesc="Microsoft Azure Identity Library for Python"
url="https://pypi.org/project/azure-identity/" url="https://pypi.org/project/azure-identity/"
@ -18,8 +19,8 @@ depends="
checkdepends="py3-pytest" checkdepends="py3-pytest"
makedepends="py3-setuptools py3-gpep517 py3-wheel py3-flit" makedepends="py3-setuptools py3-gpep517 py3-wheel py3-flit"
options="!check" #todo options="!check" #todo
source="$pkgname-$pkgver.tar.gz::https://github.com/Azure/azure-sdk-for-python/archive/refs/tags/azure-identity_$pkgver.tar.gz" source="$pkgname-$pkgver.tar.gz::https://github.com/Azure/azure-sdk-for-python/archive/refs/tags/azure-identity_$_pkgver.tar.gz"
builddir="$srcdir"/azure-sdk-for-python-azure-identity_$pkgver/sdk/identity/azure-identity builddir="$srcdir"/azure-sdk-for-python-azure-identity_$_pkgver/sdk/identity/azure-identity
subpackages="$pkgname-pyc" subpackages="$pkgname-pyc"
build() { build() {
@ -40,5 +41,5 @@ package() {
} }
sha512sums=" sha512sums="
090aed812a7a72c649ded2574dc0a05dd7d9db41675e3d86921ab0555f8af7c83999cb879a2f2e0984880874b3b6dfead6b8de0563d8a99d81775715640a9e01 py3-azure-identity-1.19.0.tar.gz 84defc19db3aea614b13dbf2d24ee3ea13c210a05460a4ae2968b01d34f136c81eb9d77b7ce1f0c4590e6f36af0b6fe114787fc7897ffa0f2d8093a9bcb48bf4 py3-azure-identity-1.18.0.tar.gz
" "

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,43 @@
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=py3-django-tenants
#_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=django-tenants
pkgver=3.6.1
pkgrel=5
pkgdesc="Tenant support for Django using PostgreSQL schemas."
url="https://pypi.python.org/project/django-tenants"
arch="noarch"
license="MIT"
depends="py3-django py3-psycopg py3-gunicorn py3-coverage"
checkdepends="python3-dev py3-pytest"
makedepends="py3-setuptools py3-gpep517 py3-wheel"
source="
$pkgname-$pkgver.tar.gz::https://codeload.github.com/django-tenants/django-tenants/tar.gz/refs/tags/v$pkgver
997_update-from-pgclone-schema.patch
"
builddir="$srcdir/$_pkgreal-$pkgver"
options="!check" # Requires setting up test database
subpackages="$pkgname-pyc"
build() {
gpep517 build-wheel \
--wheel-dir .dist \
--output-fd 3 3>&1 >&2
}
check() {
python3 -m venv --clear --without-pip --system-site-packages .testenv
.testenv/bin/python3 -m installer .dist/*.whl
DJANGO_SETTINGS_MODULE=tests.settings .testenv/bin/python3 -m pytest -v
}
package() {
python3 -m installer -d "$pkgdir" \
.dist/*.whl
}
sha512sums="
b18afce81ccc89e49fcc4ebe85d90be602415ca898c1660a4e71e2bef6a3ed2e8c724e94b61d8c6f48f3fb19eb2a87d6a6f5bbf449b3e2f661f87e4b5638eafb py3-django-tenants-3.6.1.tar.gz
f2424bb188db2e3c7d13c15e5bdf0959c6f794e68dbc677c8b876d4faa321f78aded5565539f1bfd97583c6df0fcc19ec05abe203b08407e4446dd7194756825 997_update-from-pgclone-schema.patch
"

View file

@ -0,0 +1,39 @@
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=py3-drf-orjson-renderer
#_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=drf_orjson_renderer
pkgver=1.7.3
_gittag=9a59352f82e262bd78ccc0228361bcb321a33623
pkgrel=0
pkgdesc="Django RestFramework JSON Renderer Backed by orjson"
url="https://pypi.python.org/project/drf-orjson-renderer"
arch="noarch"
license="MIT"
depends="py3-django-rest-framework py3-orjson"
checkdepends="py3-pytest-django py3-numpy"
makedepends="py3-setuptools py3-gpep517 py3-wheel"
source="$pkgname-$pkgver.tar.gz::https://github.com/brianjbuck/drf_orjson_renderer/archive/$_gittag.tar.gz"
builddir="$srcdir/$_pkgreal-$_gittag"
subpackages="$pkgname-pyc"
build() {
gpep517 build-wheel \
--wheel-dir .dist \
--output-fd 3 3>&1 >&2
}
check() {
python3 -m venv --clear --without-pip --system-site-packages .testenv
.testenv/bin/python3 -m installer .dist/*.whl
.testenv/bin/python3 -m pytest -v
}
package() {
python3 -m installer -d "$pkgdir" \
.dist/*.whl
}
sha512sums="
7870aebf6bcc249228b1620f4b50124eef54e251dcac236e23be4287284461617d630b073d2e9122f66779a908dfd69c5e16b486b23de0114b06b3df6b468e95 py3-drf-orjson-renderer-1.7.3.tar.gz
"

View file

@ -1,56 +0,0 @@
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=py3-kadmin-rs
pkgver=0.5.3
pkgrel=0
pkgdesc="Rust and Python interfaces to the Kerberos administration interface (kadm5)"
url="https://github.com/authentik-community/kadmin-rs"
arch="all"
license="MIT"
checkdepends="py3-pytest py3-k5test"
makedepends="
cargo
cargo-auditable
clang-libclang
py3-setuptools
py3-setuptools-rust
py3-gpep517
py3-wheel
poetry
python3-dev
sccache
"
source="$pkgname-$pkgver.tar.gz::https://github.com/authentik-community/kadmin-rs/archive/refs/tags/kadmin/version/$pkgver.tar.gz"
builddir="$srcdir"/kadmin-rs-kadmin-version-$pkgver
subpackages="$pkgname-pyc"
prepare() {
default_prepare
cargo fetch --target="$CTARGET" --locked
}
build() {
cargo auditable build --release --locked
gpep517 build-wheel \
--wheel-dir .dist \
--output-fd 3 3>&1 >&2
}
check() {
cargo test --locked
python3 -m venv --clear --without-pip --system-site-packages .testenv
.testenv/bin/python3 -m installer .dist/*.whl
.testenv/bin/python3 -m unittest python/tests/test_*.py
}
package() {
python3 -m installer -d "$pkgdir" \
.dist/*.whl
}
sha512sums="
61d3ddfe619827cef83af944b2281f2cf6966d95c3d4a5883b82169bf1f34e6b7173cfa086198e3e0f9a227590a497dcb1c9b209cd4d0c6d361fdfce9b98eec0 py3-kadmin-rs-0.5.3.tar.gz
"

View file

@ -3,23 +3,21 @@
pkgname=py3-microsoft-kiota-abstractions pkgname=py3-microsoft-kiota-abstractions
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=microsoft-kiota-abstractions _pkgreal=microsoft-kiota-abstractions
pkgver=1.6.8 pkgver=1.3.3
pkgrel=0 pkgrel=0
pkgdesc="Abstractions library for Kiota generated Python clients" pkgdesc="Abstractions library for Kiota generated Python clients"
url="https://pypi.python.org/project/microsoft-kiota-abstractions" url="https://pypi.python.org/project/microsoft-kiota-abstractions"
arch="noarch" arch="noarch"
license="MIT" license="MIT"
depends=" depends="
py3-std-uritemplate<2.0.0 py3-std-uritemplate
py3-opentelemetry-sdk py3-opentelemetry-sdk
py3-importlib-metadata py3-importlib-metadata
" "
checkdepends="py3-pytest py3-pytest-asyncio" checkdepends="py3-pytest"
makedepends="poetry py3-gpep517 py3-wheel py3-flit" makedepends="py3-setuptools py3-gpep517 py3-wheel py3-flit"
source=" source="$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-abstractions-python/archive/refs/tags/v$pkgver.tar.gz"
$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-python/archive/refs/tags/microsoft-kiota-abstractions-v$pkgver.tar.gz builddir="$srcdir/kiota-abstractions-python-$pkgver"
"
builddir="$srcdir/kiota-python-microsoft-kiota-abstractions-v$pkgver/packages/abstractions"
subpackages="$pkgname-pyc" subpackages="$pkgname-pyc"
build() { build() {
@ -40,5 +38,5 @@ package() {
} }
sha512sums=" sha512sums="
55341b1ff3fb1a516ceb84817db991d6e6aa83b01326f64cf21690dee1ab84e9c9c4f7162f9f71ec1261b4e0380b73b13284128bd786b80da29faf968720b355 py3-microsoft-kiota-abstractions-1.6.8.tar.gz b416b14cc68dab4eb99d8abc2378c8691781c984f453c7328eefe5bc10788d8244bdc0e3c98d4c2cdbad60d5f672893da4eeed99037d4e361849bcef458547e1 py3-microsoft-kiota-abstractions-1.3.3.tar.gz
" "

View file

@ -3,7 +3,7 @@
pkgname=py3-microsoft-kiota-authentication-azure pkgname=py3-microsoft-kiota-authentication-azure
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=microsoft-kiota-authentication-azure _pkgreal=microsoft-kiota-authentication-azure
pkgver=1.6.8 pkgver=1.1.0
pkgrel=0 pkgrel=0
pkgdesc="Authentication provider for Kiota using Azure Identity" pkgdesc="Authentication provider for Kiota using Azure Identity"
url="https://pypi.python.org/project/microsoft-kiota-authentication-azure" url="https://pypi.python.org/project/microsoft-kiota-authentication-azure"
@ -15,12 +15,10 @@ depends="
py3-importlib-metadata py3-importlib-metadata
" "
checkdepends="py3-pytest" checkdepends="py3-pytest"
makedepends="poetry py3-gpep517 py3-wheel py3-flit" makedepends="py3-setuptools py3-gpep517 py3-wheel py3-flit"
source="
$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-python/archive/refs/tags/microsoft-kiota-authentication-azure-v$pkgver.tar.gz
"
options="!check" # TODO options="!check" # TODO
builddir="$srcdir/kiota-python-microsoft-kiota-authentication-azure-v$pkgver/packages/authentication/azure" source="$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-authentication-azure-python/archive/refs/tags/v$pkgver.tar.gz"
builddir="$srcdir/kiota-authentication-azure-python-$pkgver"
subpackages="$pkgname-pyc" subpackages="$pkgname-pyc"
build() { build() {
@ -41,5 +39,5 @@ package() {
} }
sha512sums=" sha512sums="
d661d379f036b45bf356e349e28d3478f4a10b351dfde2d1b11a429c0f2160cde9696990cc18d72a224cfd3cc4c90bdc2e6f07d9e4763bd126cd9f66a09b9bec py3-microsoft-kiota-authentication-azure-1.6.8.tar.gz 4a58a49c027951dd856bc24b03c6ba44b448949bcd3210237d2574e3ceec32eefb403057720e4d517027494d6f977874dd48abbfb5cf856399eb5d1c895376fc py3-microsoft-kiota-authentication-azure-1.1.0.tar.gz
" "

View file

@ -3,7 +3,7 @@
pkgname=py3-microsoft-kiota-http pkgname=py3-microsoft-kiota-http
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=microsoft-kiota-http _pkgreal=microsoft-kiota-http
pkgver=1.6.8 pkgver=1.3.3
pkgrel=0 pkgrel=0
pkgdesc="Kiota http request adapter implementation for httpx library" pkgdesc="Kiota http request adapter implementation for httpx library"
url="https://pypi.python.org/project/microsoft-kiota-http" url="https://pypi.python.org/project/microsoft-kiota-http"
@ -14,12 +14,10 @@ depends="
py3-httpx py3-httpx
" "
checkdepends="py3-pytest" checkdepends="py3-pytest"
makedepends="poetry py3-gpep517 py3-wheel py3-flit" makedepends="py3-setuptools py3-gpep517 py3-wheel py3-flit"
source=" source="$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-http-python/archive/refs/tags/v$pkgver.tar.gz"
$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-python/archive/refs/tags/microsoft-kiota-http-v$pkgver.tar.gz
"
options="!check" # TODO options="!check" # TODO
builddir="$srcdir/kiota-python-microsoft-kiota-http-v$pkgver/packages/http/httpx" builddir="$srcdir/kiota-http-python-$pkgver"
subpackages="$pkgname-pyc" subpackages="$pkgname-pyc"
build() { build() {
@ -40,5 +38,5 @@ package() {
} }
sha512sums=" sha512sums="
c453c89d31cc062f2d8be4a28bda0666dbde6b5a8e42855892cda72e5d104e6bb5516db01d9feb7f619b8fa77237c9e3badd24b29326f627f95b69210835321d py3-microsoft-kiota-http-1.6.8.tar.gz fff2dc37a0e379ad5689ff9532b43e6ee62ca97589b2feed39898c17a45c5cdb17c20bd714c46cd6ae6e2522de695b6c747aaf5fb0ef96dfd504cd37a6169a87 py3-microsoft-kiota-http-1.3.3.tar.gz
" "

View file

@ -3,7 +3,7 @@
pkgname=py3-microsoft-kiota-serialization-form pkgname=py3-microsoft-kiota-serialization-form
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=microsoft-kiota-serialization-form _pkgreal=microsoft-kiota-serialization-form
pkgver=1.6.8 pkgver=0.1.1
pkgrel=0 pkgrel=0
pkgdesc="Kiota Form encoded serialization implementation for Python" pkgdesc="Kiota Form encoded serialization implementation for Python"
url="https://pypi.python.org/project/microsoft-kiota-serialization-form" url="https://pypi.python.org/project/microsoft-kiota-serialization-form"
@ -14,11 +14,9 @@ depends="
py3-pendulum py3-pendulum
" "
checkdepends="py3-pytest" checkdepends="py3-pytest"
makedepends="poetry py3-gpep517 py3-wheel py3-flit" makedepends="py3-setuptools py3-gpep517 py3-wheel py3-flit"
source=" source="$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-serialization-form-python/archive/refs/tags/v$pkgver.tar.gz"
$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-python/archive/refs/tags/microsoft-kiota-serialization-form-v$pkgver.tar.gz builddir="$srcdir/kiota-serialization-form-python-$pkgver"
"
builddir="$srcdir/kiota-python-microsoft-kiota-serialization-form-v$pkgver/packages/serialization/form"
subpackages="$pkgname-pyc" subpackages="$pkgname-pyc"
build() { build() {
@ -39,5 +37,5 @@ package() {
} }
sha512sums=" sha512sums="
0e4fabe18980612ca3f55fd7350148d2393da3f35dc79cd4fe56b01f50bc2af147bde5e294580d83b97b4a549d77e6581ece8ddb19ea09ee92fd6cbfead0d3db py3-microsoft-kiota-serialization-form-1.6.8.tar.gz 0afb2b3f0f7d325e630b8a11d17a98b2c42446cb803384e36406074c62ade2be994e29b9d7cb098d9de55609dda28c339eed6397ec373375caaf158b139a5449 py3-microsoft-kiota-serialization-form-0.1.1.tar.gz
" "

View file

@ -3,7 +3,7 @@
pkgname=py3-microsoft-kiota-serialization-json pkgname=py3-microsoft-kiota-serialization-json
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=microsoft-kiota-serialization-json _pkgreal=microsoft-kiota-serialization-json
pkgver=1.6.8 pkgver=1.3.2
pkgrel=0 pkgrel=0
pkgdesc="JSON serialization implementation for Kiota clients in Python" pkgdesc="JSON serialization implementation for Kiota clients in Python"
url="https://pypi.python.org/project/microsoft-kiota-serialization-json" url="https://pypi.python.org/project/microsoft-kiota-serialization-json"
@ -14,12 +14,10 @@ depends="
py3-pendulum py3-pendulum
" "
checkdepends="py3-pytest" checkdepends="py3-pytest"
makedepends="poetry py3-gpep517 py3-wheel py3-flit" makedepends="py3-setuptools py3-gpep517 py3-wheel py3-flit"
source=" source="$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-serialization-json-python/archive/refs/tags/v$pkgver.tar.gz"
$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-python/archive/refs/tags/microsoft-kiota-serialization-json-v$pkgver.tar.gz
"
options="!check" # TODO options="!check" # TODO
builddir="$srcdir/kiota-python-microsoft-kiota-serialization-json-v$pkgver/packages/serialization/json" builddir="$srcdir/kiota-serialization-json-python-$pkgver"
subpackages="$pkgname-pyc" subpackages="$pkgname-pyc"
build() { build() {
@ -40,5 +38,5 @@ package() {
} }
sha512sums=" sha512sums="
42b8e1d2bfb175e52876314a598647de7b70acb8140cefbfb20d0f8de241bbb03a1cfe6c7108a56047f2a8e3f8f781a23fe54d5612d68a5966340279ff0eb8bc py3-microsoft-kiota-serialization-json-1.6.8.tar.gz bdf2a42d4509b7a6f093295c8f5d661e771d040965ebdd7fb7772503482fbc6d449c5ac7b16f5f497d9005018d463d3a68650b4b4da0f1a7fbcb0ad3377d12b5 py3-microsoft-kiota-serialization-json-1.3.2.tar.gz
" "

View file

@ -3,7 +3,7 @@
pkgname=py3-microsoft-kiota-serialization-multipart pkgname=py3-microsoft-kiota-serialization-multipart
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=microsoft-kiota-serialization-multipart _pkgreal=microsoft-kiota-serialization-multipart
pkgver=1.6.8 pkgver=0.1.0
pkgrel=0 pkgrel=0
pkgdesc="Multipart serialization implementation for python based kiota clients" pkgdesc="Multipart serialization implementation for python based kiota clients"
url="https://pypi.python.org/project/microsoft-kiota-serialization-multipart" url="https://pypi.python.org/project/microsoft-kiota-serialization-multipart"
@ -11,11 +11,9 @@ arch="noarch"
license="MIT" license="MIT"
depends="py3-microsoft-kiota-abstractions py3-microsoft-kiota-serialization-json" depends="py3-microsoft-kiota-abstractions py3-microsoft-kiota-serialization-json"
checkdepends="py3-pytest" checkdepends="py3-pytest"
makedepends="poetry py3-gpep517 py3-wheel py3-flit" makedepends="py3-setuptools py3-gpep517 py3-wheel py3-flit"
source=" source="$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-serialization-multipart-python/archive/refs/tags/v$pkgver.tar.gz"
$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-python/archive/refs/tags/microsoft-kiota-serialization-multipart-v$pkgver.tar.gz builddir="$srcdir/kiota-serialization-multipart-python-$pkgver"
"
builddir="$srcdir/kiota-python-microsoft-kiota-serialization-multipart-v$pkgver/packages/serialization/multipart"
subpackages="$pkgname-pyc" subpackages="$pkgname-pyc"
build() { build() {
@ -36,5 +34,5 @@ package() {
} }
sha512sums=" sha512sums="
d6d6d36fe55f4aa595d380e43f93f3de7674633edba676aec16fc26254a12e4f700427fedf1bedfddde30a7f708c93ccbbe586bb0e6950748a2debe609bf44c1 py3-microsoft-kiota-serialization-multipart-1.6.8.tar.gz a402f4fc891a70789c8ac6cb16ae30f2059e6aed4013c7601a33f37b959446067cbf0abc630f15aadeb4c85eb04703cead3c19fbbff628332efdebce3c4badb8 py3-microsoft-kiota-serialization-multipart-0.1.0.tar.gz
" "

View file

@ -3,7 +3,7 @@
pkgname=py3-microsoft-kiota-serialization-text pkgname=py3-microsoft-kiota-serialization-text
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=microsoft-kiota-serialization-text _pkgreal=microsoft-kiota-serialization-text
pkgver=1.6.8 pkgver=1.0.0
pkgrel=0 pkgrel=0
pkgdesc="Text serialization implementation for Kiota generated clients in Python" pkgdesc="Text serialization implementation for Kiota generated clients in Python"
url="https://pypi.python.org/project/microsoft-kiota-abstractions" url="https://pypi.python.org/project/microsoft-kiota-abstractions"
@ -14,11 +14,9 @@ depends="
py3-dateutil py3-dateutil
" "
checkdepends="py3-pytest" checkdepends="py3-pytest"
makedepends="poetry py3-gpep517 py3-wheel py3-flit" makedepends="py3-setuptools py3-gpep517 py3-wheel py3-flit"
source=" source="$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-serialization-text-python/archive/refs/tags/v$pkgver.tar.gz"
$pkgname-$pkgver.tar.gz::https://github.com/microsoft/kiota-python/archive/refs/tags/microsoft-kiota-serialization-text-v$pkgver.tar.gz builddir="$srcdir/kiota-serialization-text-python-$pkgver"
"
builddir="$srcdir/kiota-python-microsoft-kiota-serialization-text-v$pkgver/packages/serialization/text"
subpackages="$pkgname-pyc" subpackages="$pkgname-pyc"
build() { build() {
@ -39,5 +37,5 @@ package() {
} }
sha512sums=" sha512sums="
55dbc87253819f496e2f25de2bf24b170761f335117da414bb35c6db9008e9ca8c6fd13d5e429914c322a850a57858d9abdee7dc209ad55e469182995290d568 py3-microsoft-kiota-serialization-text-1.6.8.tar.gz b3b0d0a7e69c70c14ed606f70179a49107f6df6f2ba577e9bacbdb15b3071062a180d2e6b77a43d82fe7a67264ad24aa685c71695042ffd54ea4406f9b990208 py3-microsoft-kiota-serialization-text-1.0.0.tar.gz
" "

View file

@ -3,7 +3,7 @@
pkgname=py3-msal pkgname=py3-msal
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=msal _pkgreal=msal
pkgver=1.31.1 pkgver=1.31.0
pkgrel=0 pkgrel=0
pkgdesc="Microsoft Authentication Library (MSAL) for Python" pkgdesc="Microsoft Authentication Library (MSAL) for Python"
url="https://pypi.org/project/msal" url="https://pypi.org/project/msal"
@ -39,5 +39,5 @@ package() {
} }
sha512sums=" sha512sums="
f75541337f09ba29d4de13206346ad7793b3f2bdbdbf8fcb050ee7976b397ca666d61aee21121a4efdd7c150c9d2f87f75812e7b8aa96a5f8ac5219e7a946af2 py3-msal-1.31.1.tar.gz 712342167c7cc958c16c45d9c21a58d83efd9ff3dccf4494d7c83fb226678ed944fef1751a4002fcb292450884c682f1b5d00cdca248d1def54d6f884cdb5dc2 py3-msal-1.31.0.tar.gz
" "

View file

@ -3,7 +3,7 @@
pkgname=py3-msgraph-core pkgname=py3-msgraph-core
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=msgraph-core _pkgreal=msgraph-core
pkgver=1.1.8 pkgver=1.1.3
pkgrel=0 pkgrel=0
pkgdesc="The Microsoft Graph Python SDK" pkgdesc="The Microsoft Graph Python SDK"
url="https://pypi.python.org/project/msgraph-core" url="https://pypi.python.org/project/msgraph-core"
@ -39,5 +39,5 @@ package() {
} }
sha512sums=" sha512sums="
0cae6f76cb1373d1ef76448e47b9951e5076a144140c19edc14186f7bfd92930e50c9f6c459170e3362ef267903cdf261d1897566983a7302beab205f9d61389 py3-msgraph-core-1.1.8.tar.gz 48b47b5b02062fe05f9f917d1c6461f539f9ff6dfbafb4a2dcfbe91237725eb7427b2673aec7eb994f733fab109879d96e06e122d72ecab69ff77a1f76fafe49 py3-msgraph-core-1.1.3.tar.gz
" "

View file

@ -3,7 +3,7 @@
pkgname=py3-msgraph-sdk pkgname=py3-msgraph-sdk
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=msgraph-sdk _pkgreal=msgraph-sdk
pkgver=1.16.0 pkgver=1.8.0
pkgrel=0 pkgrel=0
pkgdesc="The Microsoft Graph Python SDK" pkgdesc="The Microsoft Graph Python SDK"
url="https://pypi.python.org/project/msgraph-sdk" url="https://pypi.python.org/project/msgraph-sdk"
@ -40,5 +40,5 @@ package() {
} }
sha512sums=" sha512sums="
af930e5e470f6ac78724650885f70cf447482a53f90043d326b3e00dc7572fd0d476658ebb1677118010e38b54f1e4e609dcfb5fcef5664f05b25062786d11af py3-msgraph-sdk-1.16.0.tar.gz e7d93a4b0f29023dcce0529b54a397b568f44ff40b1efe52e1c060b4552dd055e6a62e0ebcb72cbf3c1babe00440c41e6f897e86a01c3e261a8b88b23cd3af2c py3-msgraph-sdk-1.8.0.tar.gz
" "

View file

@ -3,7 +3,7 @@
pkgname=py3-opentelemetry-sdk pkgname=py3-opentelemetry-sdk
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=opentelemetry-sdk _pkgreal=opentelemetry-sdk
pkgver=1.29.0 pkgver=1.27.0
pkgrel=0 pkgrel=0
pkgdesc="OpenTelemetry Python SDK" pkgdesc="OpenTelemetry Python SDK"
url="https://github.com/open-telemetry/opentelemetry-python/tree/main" url="https://github.com/open-telemetry/opentelemetry-python/tree/main"
@ -71,5 +71,5 @@ proto() {
} }
sha512sums=" sha512sums="
92c90e6a684d8cfab3bba4d72612ccf53ae54cdd9784e3434b25adc3730fe114f21fd7aa21da80edf6e0e7c80b39c64ee31fb16f68b04809289bbf5d49d4ca2e py3-opentelemetry-sdk-1.29.0.tar.gz d8b5a617c7e804b4e6e1b508395e87481a3dcc3b375573110750830a1cf6037cfeb5c09dba3e7cfa472e385dbf619afedd79b1c31c5bfe4e87d44ea65f4d2f0b py3-opentelemetry-sdk-1.27.0.tar.gz
" "

39
ilot/py3-pyrad/APKBUILD Normal file
View file

@ -0,0 +1,39 @@
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=py3-pyrad
#_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=pyrad
pkgver=2.4
pkgrel=0
pkgdesc="Python RADIUS Implementation"
url="https://pypi.python.org/project/pyrad"
arch="noarch"
license="BSD-3-Clause"
depends="py3-netaddr"
checkdepends="py3-pytest"
makedepends="py3-setuptools py3-gpep517 py3-wheel poetry"
source="$pkgname-$pkgver.tar.gz::https://github.com/pyradius/pyrad/archive/refs/tags/$pkgver.tar.gz"
options="!check" # TODO
builddir="$srcdir/$_pkgreal-$pkgver"
subpackages="$pkgname-pyc"
build() {
gpep517 build-wheel \
--wheel-dir .dist \
--output-fd 3 3>&1 >&2
}
check() {
python3 -m venv --clear --without-pip --system-site-packages .testenv
.testenv/bin/python3 -m installer .dist/*.whl
.testenv/bin/python3 -m pytest -v
}
package() {
python3 -m installer -d "$pkgdir" \
.dist/*.whl
}
sha512sums="
e4f4c687596bd226cf2cdb409a8d940c7b665fb7f722d09113dd9a1b05ab176ce8f920b235918ec01695f262930d13b4057b199cf6aac72afa54950c1fb59166 py3-pyrad-2.4.tar.gz
"

View file

@ -3,7 +3,7 @@
pkgname=py3-std-uritemplate pkgname=py3-std-uritemplate
#_pkgreal is used by apkbuild-pypi to find modules at PyPI #_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=std-uritemplate _pkgreal=std-uritemplate
pkgver=2.0.1 pkgver=1.0.6
pkgrel=0 pkgrel=0
pkgdesc="A complete and maintained cross-language implementation of the Uri Template specification RFC 6570 Level 4" pkgdesc="A complete and maintained cross-language implementation of the Uri Template specification RFC 6570 Level 4"
url="https://pypi.python.org/project/std-uritemplate" url="https://pypi.python.org/project/std-uritemplate"
@ -37,5 +37,5 @@ package() {
} }
sha512sums=" sha512sums="
e073a1204d65bb639cc93480b0f68e1edfe5ac3cff607b72c8da8916b7660eea2b2b246b5db02979cd5c856087958c84dc3bc5e9d76a9540f2ac2a7da8cd18df py3-std-uritemplate-2.0.1.tar.gz 4873ce356170aea1b45479d5ded0b596265782c097d3fd9d1bb4cc8ad902067bab654057173a2e2b1da37e5ac36ebee024feca43b0e4298b103dc979f97e7c1c py3-std-uritemplate-1.0.6.tar.gz
" "

View file

@ -0,0 +1,41 @@
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=py3-tenant-schemas-celery
#_pkgreal is used by apkbuild-pypi to find modules at PyPI
_pkgreal=tenant-schemas-celery
pkgver=2.2.0
pkgrel=2
pkgdesc="Celery integration for django-tenant-schemas and django-tenants"
url="https://pypi.python.org/project/tenant-schemas-celery"
arch="noarch"
license="MIT"
depends="py3-django-tenants py3-celery"
checkdepends="python3-dev py3-pytest"
makedepends="py3-setuptools py3-gpep517 py3-wheel"
source="
$pkgname-$pkgver.tar.gz::https://codeload.github.com/maciej-gol/tenant-schemas-celery/tar.gz/refs/tags/$pkgver
"
options="!check" # Test suite wants docker
builddir="$srcdir/$_pkgreal-$pkgver"
subpackages="$pkgname-pyc"
build() {
gpep517 build-wheel \
--wheel-dir .dist \
--output-fd 3 3>&1 >&2
}
check() {
python3 -m venv --clear --without-pip --system-site-packages .testenv
.testenv/bin/python3 -m installer .dist/*.whl
DJANGO_SETTINGS_MODULE=tests.settings .testenv/bin/python3 -m pytest -v
}
package() {
python3 -m installer -d "$pkgdir" \
.dist/*.whl
}
sha512sums="
dad71011306936dc84d966797b113008780750e9e973513092bec892be0d1468e0a0e7e8e2fcca9765309a27767e1c72bdaad7c8aca16353ae1eef783c239148 py3-tenant-schemas-celery-2.2.0.tar.gz
"

View file

@ -1,7 +1,7 @@
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net> # Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net> # Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=uptime-kuma pkgname=uptime-kuma
pkgver=1.23.16 pkgver=1.23.15
pkgrel=0 pkgrel=0
pkgdesc='A fancy self-hosted monitoring tool' pkgdesc='A fancy self-hosted monitoring tool'
arch="all" arch="all"
@ -43,7 +43,7 @@ package() {
mv "$pkgdir"/usr/share/webapps/uptime-kuma/LICENSE "$pkgdir"/usr/share/licenses/uptime-kuma/. mv "$pkgdir"/usr/share/webapps/uptime-kuma/LICENSE "$pkgdir"/usr/share/licenses/uptime-kuma/.
} }
sha512sums=" sha512sums="
a132d1cd796fbd868782627edfd45d2a6bd3d2fadece23e0bbf000e6a30482659062a43c4590c98e390cac9b8c1926efd8ff01c5b358b7ccea4438259b86f24e uptime-kuma-1.23.16.tar.gz eb2210ac27a375e4e7116282436cc98e8c24c9f290e20af69dcb8069bdeca79457e9eb3971982c552b856dc22643a8c9f551723aade18d28cbf93881e3e1b182 uptime-kuma-1.23.15.tar.gz
0ceddb98a6f318029b8bd8b5a49b55c883e77a5f8fffe2b9b271c9abf0ac52dc7a6ea4dbb4a881124a7857f1e43040f18755c1c2a034479e6a94d2b65a73d847 uptime-kuma.openrc 0ceddb98a6f318029b8bd8b5a49b55c883e77a5f8fffe2b9b271c9abf0ac52dc7a6ea4dbb4a881124a7857f1e43040f18755c1c2a034479e6a94d2b65a73d847 uptime-kuma.openrc
1dbae536b23e3624e139155abbff383bba3209ff2219983da2616b4376b1a5041df812d1e5164716fc6e967a8446d94baae3b96ee575d400813cc6fdc2cc274e uptime-kuma.conf 1dbae536b23e3624e139155abbff383bba3209ff2219983da2616b4376b1a5041df812d1e5164716fc6e967a8446d94baae3b96ee575d400813cc6fdc2cc274e uptime-kuma.conf
" "

View file

@ -1,618 +0,0 @@
diff --git a/docs/deployment.md b/docs/deployment.md
index d69fcf8..99dfbf3 100644
--- a/docs/deployment.md
+++ b/docs/deployment.md
@@ -60,7 +60,7 @@ Options:
--loop [auto|asyncio|uvloop] Event loop implementation. [default: auto]
--http [auto|h11|httptools] HTTP protocol implementation. [default:
auto]
- --ws [auto|none|websockets|wsproto]
+ --ws [auto|none|websockets|websockets-sansio|wsproto]
WebSocket protocol implementation.
[default: auto]
--ws-max-size INTEGER WebSocket max size message in bytes
diff --git a/docs/index.md b/docs/index.md
index bb6fc32..50e2ab9 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -130,7 +130,7 @@ Options:
--loop [auto|asyncio|uvloop] Event loop implementation. [default: auto]
--http [auto|h11|httptools] HTTP protocol implementation. [default:
auto]
- --ws [auto|none|websockets|wsproto]
+ --ws [auto|none|websockets|websockets-sansio|wsproto]
WebSocket protocol implementation.
[default: auto]
--ws-max-size INTEGER WebSocket max size message in bytes
diff --git a/pyproject.toml b/pyproject.toml
index 0a89966..8771bfb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -92,6 +92,10 @@ filterwarnings = [
"ignore:Uvicorn's native WSGI implementation is deprecated.*:DeprecationWarning",
"ignore: 'cgi' is deprecated and slated for removal in Python 3.13:DeprecationWarning",
"ignore: remove second argument of ws_handler:DeprecationWarning:websockets",
+ "ignore: websockets.legacy is deprecated.*:DeprecationWarning",
+ "ignore: websockets.server.WebSocketServerProtocol is deprecated.*:DeprecationWarning",
+ "ignore: websockets.client.connect is deprecated.*:DeprecationWarning",
+ "ignore: websockets.exceptions.InvalidStatusCode is deprecated",
]
[tool.coverage.run]
diff --git a/tests/conftest.py b/tests/conftest.py
index 1b0c0e8..7061a14 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -233,9 +233,9 @@ def unused_tcp_port() -> int:
marks=pytest.mark.skipif(not importlib.util.find_spec("wsproto"), reason="wsproto not installed."),
id="wsproto",
),
+ pytest.param("uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol", id="websockets"),
pytest.param(
- "uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol",
- id="websockets",
+ "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketsSansIOProtocol", id="websockets-sansio"
),
]
)
diff --git a/tests/middleware/test_logging.py b/tests/middleware/test_logging.py
index f27633a..63d7daf 100644
--- a/tests/middleware/test_logging.py
+++ b/tests/middleware/test_logging.py
@@ -49,7 +49,9 @@ async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable
await send({"type": "http.response.body", "body": b"", "more_body": False})
-async def test_trace_logging(caplog: pytest.LogCaptureFixture, logging_config, unused_tcp_port: int):
+async def test_trace_logging(
+ caplog: pytest.LogCaptureFixture, logging_config: dict[str, typing.Any], unused_tcp_port: int
+):
config = Config(
app=app,
log_level="trace",
@@ -91,8 +93,8 @@ async def test_trace_logging_on_http_protocol(http_protocol_cls, caplog, logging
async def test_trace_logging_on_ws_protocol(
ws_protocol_cls: WSProtocol,
- caplog,
- logging_config,
+ caplog: pytest.LogCaptureFixture,
+ logging_config: dict[str, typing.Any],
unused_tcp_port: int,
):
async def websocket_app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable):
@@ -104,7 +106,7 @@ async def test_trace_logging_on_ws_protocol(
elif message["type"] == "websocket.disconnect":
break
- async def open_connection(url):
+ async def open_connection(url: str):
async with websockets.client.connect(url) as websocket:
return websocket.open
diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py
index 0ade974..d300c45 100644
--- a/tests/middleware/test_proxy_headers.py
+++ b/tests/middleware/test_proxy_headers.py
@@ -465,6 +465,7 @@ async def test_proxy_headers_websocket_x_forwarded_proto(
host, port = scope["client"]
await send({"type": "websocket.accept"})
await send({"type": "websocket.send", "text": f"{scheme}://{host}:{port}"})
+ await send({"type": "websocket.close"})
app_with_middleware = ProxyHeadersMiddleware(websocket_app, trusted_hosts="*")
config = Config(
diff --git a/tests/protocols/test_websocket.py b/tests/protocols/test_websocket.py
index 15ccfdd..e728544 100644
--- a/tests/protocols/test_websocket.py
+++ b/tests/protocols/test_websocket.py
@@ -7,6 +7,8 @@ from copy import deepcopy
import httpx
import pytest
import websockets
+import websockets.asyncio
+import websockets.asyncio.client
import websockets.client
import websockets.exceptions
from typing_extensions import TypedDict
@@ -601,12 +603,9 @@ async def test_connection_lost_before_handshake_complete(
await send_accept_task.wait()
disconnect_message = await receive() # type: ignore
- response: httpx.Response | None = None
-
async def websocket_session(uri: str):
- nonlocal response
async with httpx.AsyncClient() as client:
- response = await client.get(
+ await client.get(
f"http://127.0.0.1:{unused_tcp_port}",
headers={
"upgrade": "websocket",
@@ -623,9 +622,6 @@ async def test_connection_lost_before_handshake_complete(
send_accept_task.set()
await asyncio.sleep(0.1)
- assert response is not None
- assert response.status_code == 500, response.text
- assert response.text == "Internal Server Error"
assert disconnect_message == {"type": "websocket.disconnect", "code": 1006}
await task
@@ -920,6 +916,9 @@ async def test_server_reject_connection_with_body_nolength(
async def test_server_reject_connection_with_invalid_msg(
ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int
):
+ if ws_protocol_cls.__name__ == "WebSocketsSansIOProtocol":
+ pytest.skip("WebSocketsSansIOProtocol sends both start and body messages in one message.")
+
async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable):
assert scope["type"] == "websocket"
assert "extensions" in scope and "websocket.http.response" in scope["extensions"]
@@ -951,6 +950,9 @@ async def test_server_reject_connection_with_invalid_msg(
async def test_server_reject_connection_with_missing_body(
ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int
):
+ if ws_protocol_cls.__name__ == "WebSocketsSansIOProtocol":
+ pytest.skip("WebSocketsSansIOProtocol sends both start and body messages in one message.")
+
async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable):
assert scope["type"] == "websocket"
assert "extensions" in scope and "websocket.http.response" in scope["extensions"]
@@ -986,6 +988,8 @@ async def test_server_multiple_websocket_http_response_start_events(
The server should raise an exception if it sends multiple
websocket.http.response.start events.
"""
+ if ws_protocol_cls.__name__ == "WebSocketsSansIOProtocol":
+ pytest.skip("WebSocketsSansIOProtocol sends both start and body messages in one message.")
exception_message: str | None = None
async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable):
diff --git a/uvicorn/config.py b/uvicorn/config.py
index 664d191..cbfeea6 100644
--- a/uvicorn/config.py
+++ b/uvicorn/config.py
@@ -25,7 +25,7 @@ from uvicorn.middleware.proxy_headers import ProxyHeadersMiddleware
from uvicorn.middleware.wsgi import WSGIMiddleware
HTTPProtocolType = Literal["auto", "h11", "httptools"]
-WSProtocolType = Literal["auto", "none", "websockets", "wsproto"]
+WSProtocolType = Literal["auto", "none", "websockets", "websockets-sansio", "wsproto"]
LifespanType = Literal["auto", "on", "off"]
LoopSetupType = Literal["none", "auto", "asyncio", "uvloop"]
InterfaceType = Literal["auto", "asgi3", "asgi2", "wsgi"]
@@ -47,6 +47,7 @@ WS_PROTOCOLS: dict[WSProtocolType, str | None] = {
"auto": "uvicorn.protocols.websockets.auto:AutoWebSocketsProtocol",
"none": None,
"websockets": "uvicorn.protocols.websockets.websockets_impl:WebSocketProtocol",
+ "websockets-sansio": "uvicorn.protocols.websockets.websockets_sansio_impl:WebSocketsSansIOProtocol",
"wsproto": "uvicorn.protocols.websockets.wsproto_impl:WSProtocol",
}
LIFESPAN: dict[LifespanType, str] = {
diff --git a/uvicorn/protocols/websockets/websockets_sansio_impl.py b/uvicorn/protocols/websockets/websockets_sansio_impl.py
new file mode 100644
index 0000000..994af07
--- /dev/null
+++ b/uvicorn/protocols/websockets/websockets_sansio_impl.py
@@ -0,0 +1,405 @@
+from __future__ import annotations
+
+import asyncio
+import logging
+from asyncio.transports import BaseTransport, Transport
+from http import HTTPStatus
+from typing import Any, Literal, cast
+from urllib.parse import unquote
+
+from websockets import InvalidState
+from websockets.extensions.permessage_deflate import ServerPerMessageDeflateFactory
+from websockets.frames import Frame, Opcode
+from websockets.http11 import Request
+from websockets.server import ServerProtocol
+
+from uvicorn._types import (
+ ASGIReceiveEvent,
+ ASGISendEvent,
+ WebSocketAcceptEvent,
+ WebSocketCloseEvent,
+ WebSocketDisconnectEvent,
+ WebSocketReceiveEvent,
+ WebSocketResponseBodyEvent,
+ WebSocketResponseStartEvent,
+ WebSocketScope,
+ WebSocketSendEvent,
+)
+from uvicorn.config import Config
+from uvicorn.logging import TRACE_LOG_LEVEL
+from uvicorn.protocols.utils import (
+ ClientDisconnected,
+ get_local_addr,
+ get_path_with_query_string,
+ get_remote_addr,
+ is_ssl,
+)
+from uvicorn.server import ServerState
+
+
+class WebSocketsSansIOProtocol(asyncio.Protocol):
+ def __init__(
+ self,
+ config: Config,
+ server_state: ServerState,
+ app_state: dict[str, Any],
+ _loop: asyncio.AbstractEventLoop | None = None,
+ ) -> None:
+ if not config.loaded:
+ config.load() # pragma: no cover
+
+ self.config = config
+ self.app = config.loaded_app
+ self.loop = _loop or asyncio.get_event_loop()
+ self.logger = logging.getLogger("uvicorn.error")
+ self.root_path = config.root_path
+ self.app_state = app_state
+
+ # Shared server state
+ self.connections = server_state.connections
+ self.tasks = server_state.tasks
+ self.default_headers = server_state.default_headers
+
+ # Connection state
+ self.transport: asyncio.Transport = None # type: ignore[assignment]
+ self.server: tuple[str, int] | None = None
+ self.client: tuple[str, int] | None = None
+ self.scheme: Literal["wss", "ws"] = None # type: ignore[assignment]
+
+ # WebSocket state
+ self.queue: asyncio.Queue[ASGIReceiveEvent] = asyncio.Queue()
+ self.handshake_initiated = False
+ self.handshake_complete = False
+ self.close_sent = False
+ self.initial_response: tuple[int, list[tuple[str, str]], bytes] | None = None
+
+ extensions = []
+ if self.config.ws_per_message_deflate:
+ extensions = [ServerPerMessageDeflateFactory()]
+ self.conn = ServerProtocol(
+ extensions=extensions,
+ max_size=self.config.ws_max_size,
+ logger=logging.getLogger("uvicorn.error"),
+ )
+
+ self.read_paused = False
+ self.writable = asyncio.Event()
+ self.writable.set()
+
+ # Buffers
+ self.bytes = b""
+
+ def connection_made(self, transport: BaseTransport) -> None:
+ """Called when a connection is made."""
+ transport = cast(Transport, transport)
+ self.connections.add(self)
+ self.transport = transport
+ self.server = get_local_addr(transport)
+ self.client = get_remote_addr(transport)
+ self.scheme = "wss" if is_ssl(transport) else "ws"
+
+ if self.logger.level <= TRACE_LOG_LEVEL:
+ prefix = "%s:%d - " % self.client if self.client else ""
+ self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection made", prefix)
+
+ def connection_lost(self, exc: Exception | None) -> None:
+ code = 1005 if self.handshake_complete else 1006
+ self.queue.put_nowait({"type": "websocket.disconnect", "code": code})
+ self.connections.remove(self)
+
+ if self.logger.level <= TRACE_LOG_LEVEL:
+ prefix = "%s:%d - " % self.client if self.client else ""
+ self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection lost", prefix)
+
+ self.handshake_complete = True
+ if exc is None:
+ self.transport.close()
+
+ def eof_received(self) -> None:
+ pass
+
+ def shutdown(self) -> None:
+ if self.handshake_complete:
+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012})
+ self.conn.send_close(1012)
+ output = self.conn.data_to_send()
+ self.transport.write(b"".join(output))
+ else:
+ self.send_500_response()
+ self.transport.close()
+
+ def data_received(self, data: bytes) -> None:
+ self.conn.receive_data(data)
+ parser_exc = self.conn.parser_exc
+ if parser_exc is not None:
+ self.handle_parser_exception()
+ return
+ self.handle_events()
+
+ def handle_events(self) -> None:
+ for event in self.conn.events_received():
+ if isinstance(event, Request):
+ self.handle_connect(event)
+ if isinstance(event, Frame):
+ if event.opcode == Opcode.CONT:
+ self.handle_cont(event)
+ elif event.opcode == Opcode.TEXT:
+ self.handle_text(event)
+ elif event.opcode == Opcode.BINARY:
+ self.handle_bytes(event)
+ elif event.opcode == Opcode.PING:
+ self.handle_ping(event)
+ elif event.opcode == Opcode.CLOSE:
+ self.handle_close(event)
+
+ # Event handlers
+
+ def handle_connect(self, event: Request) -> None:
+ self.request = event
+ self.response = self.conn.accept(event)
+ self.handshake_initiated = True
+ if self.response.status_code != 101:
+ self.handshake_complete = True
+ self.close_sent = True
+ self.conn.send_response(self.response)
+ output = self.conn.data_to_send()
+ self.transport.write(b"".join(output))
+ self.transport.close()
+ return
+
+ headers = [
+ (key.encode("ascii"), value.encode("ascii", errors="surrogateescape"))
+ for key, value in event.headers.raw_items()
+ ]
+ raw_path, _, query_string = event.path.partition("?")
+ self.scope: WebSocketScope = {
+ "type": "websocket",
+ "asgi": {"version": self.config.asgi_version, "spec_version": "2.3"},
+ "http_version": "1.1",
+ "scheme": self.scheme,
+ "server": self.server,
+ "client": self.client,
+ "root_path": self.root_path,
+ "path": unquote(raw_path),
+ "raw_path": raw_path.encode("ascii"),
+ "query_string": query_string.encode("ascii"),
+ "headers": headers,
+ "subprotocols": event.headers.get_all("Sec-WebSocket-Protocol"),
+ "state": self.app_state.copy(),
+ "extensions": {"websocket.http.response": {}},
+ }
+ self.queue.put_nowait({"type": "websocket.connect"})
+ task = self.loop.create_task(self.run_asgi())
+ task.add_done_callback(self.on_task_complete)
+ self.tasks.add(task)
+
+ def handle_cont(self, event: Frame) -> None:
+ self.bytes += event.data
+ if event.fin:
+ self.send_receive_event_to_app()
+
+ def handle_text(self, event: Frame) -> None:
+ self.bytes = event.data
+ self.curr_msg_data_type: Literal["text", "bytes"] = "text"
+ if event.fin:
+ self.send_receive_event_to_app()
+
+ def handle_bytes(self, event: Frame) -> None:
+ self.bytes = event.data
+ self.curr_msg_data_type = "bytes"
+ if event.fin:
+ self.send_receive_event_to_app()
+
+ def send_receive_event_to_app(self) -> None:
+ data_type = self.curr_msg_data_type
+ msg: WebSocketReceiveEvent
+ if data_type == "text":
+ msg = {"type": "websocket.receive", data_type: self.bytes.decode()}
+ else:
+ msg = {"type": "websocket.receive", data_type: self.bytes}
+ self.queue.put_nowait(msg)
+ if not self.read_paused:
+ self.read_paused = True
+ self.transport.pause_reading()
+
+ def handle_ping(self, event: Frame) -> None:
+ output = self.conn.data_to_send()
+ self.transport.write(b"".join(output))
+
+ def handle_close(self, event: Frame) -> None:
+ if not self.close_sent and not self.transport.is_closing():
+ disconnect_event: WebSocketDisconnectEvent = {
+ "type": "websocket.disconnect",
+ "code": self.conn.close_rcvd.code, # type: ignore[union-attr]
+ "reason": self.conn.close_rcvd.reason, # type: ignore[union-attr]
+ }
+ self.queue.put_nowait(disconnect_event)
+ output = self.conn.data_to_send()
+ self.transport.write(b"".join(output))
+ self.transport.close()
+
+ def handle_parser_exception(self) -> None:
+ disconnect_event: WebSocketDisconnectEvent = {
+ "type": "websocket.disconnect",
+ "code": self.conn.close_sent.code, # type: ignore[union-attr]
+ "reason": self.conn.close_sent.reason, # type: ignore[union-attr]
+ }
+ self.queue.put_nowait(disconnect_event)
+ output = self.conn.data_to_send()
+ self.transport.write(b"".join(output))
+ self.close_sent = True
+ self.transport.close()
+
+ def on_task_complete(self, task: asyncio.Task[None]) -> None:
+ self.tasks.discard(task)
+
+ async def run_asgi(self) -> None:
+ try:
+ result = await self.app(self.scope, self.receive, self.send)
+ except ClientDisconnected:
+ self.transport.close()
+ except BaseException:
+ self.logger.exception("Exception in ASGI application\n")
+ self.send_500_response()
+ self.transport.close()
+ else:
+ if not self.handshake_complete:
+ msg = "ASGI callable returned without completing handshake."
+ self.logger.error(msg)
+ self.send_500_response()
+ self.transport.close()
+ elif result is not None:
+ msg = "ASGI callable should return None, but returned '%s'."
+ self.logger.error(msg, result)
+ self.transport.close()
+
+ def send_500_response(self) -> None:
+ if self.initial_response or self.handshake_complete:
+ return
+ response = self.conn.reject(500, "Internal Server Error")
+ self.conn.send_response(response)
+ output = self.conn.data_to_send()
+ self.transport.write(b"".join(output))
+
+ async def send(self, message: ASGISendEvent) -> None:
+ await self.writable.wait()
+
+ message_type = message["type"]
+
+ if not self.handshake_complete and self.initial_response is None:
+ if message_type == "websocket.accept":
+ message = cast(WebSocketAcceptEvent, message)
+ self.logger.info(
+ '%s - "WebSocket %s" [accepted]',
+ self.scope["client"],
+ get_path_with_query_string(self.scope),
+ )
+ headers = [
+ (name.decode("latin-1").lower(), value.decode("latin-1").lower())
+ for name, value in (self.default_headers + list(message.get("headers", [])))
+ ]
+ accepted_subprotocol = message.get("subprotocol")
+ if accepted_subprotocol:
+ headers.append(("Sec-WebSocket-Protocol", accepted_subprotocol))
+ self.response.headers.update(headers)
+
+ if not self.transport.is_closing():
+ self.handshake_complete = True
+ self.conn.send_response(self.response)
+ output = self.conn.data_to_send()
+ self.transport.write(b"".join(output))
+
+ elif message_type == "websocket.close":
+ message = cast(WebSocketCloseEvent, message)
+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006})
+ self.logger.info(
+ '%s - "WebSocket %s" 403',
+ self.scope["client"],
+ get_path_with_query_string(self.scope),
+ )
+ response = self.conn.reject(HTTPStatus.FORBIDDEN, "")
+ self.conn.send_response(response)
+ output = self.conn.data_to_send()
+ self.close_sent = True
+ self.handshake_complete = True
+ self.transport.write(b"".join(output))
+ self.transport.close()
+ elif message_type == "websocket.http.response.start" and self.initial_response is None:
+ message = cast(WebSocketResponseStartEvent, message)
+ if not (100 <= message["status"] < 600):
+ raise RuntimeError("Invalid HTTP status code '%d' in response." % message["status"])
+ self.logger.info(
+ '%s - "WebSocket %s" %d',
+ self.scope["client"],
+ get_path_with_query_string(self.scope),
+ message["status"],
+ )
+ headers = [
+ (name.decode("latin-1"), value.decode("latin-1"))
+ for name, value in list(message.get("headers", []))
+ ]
+ self.initial_response = (message["status"], headers, b"")
+ else:
+ msg = (
+ "Expected ASGI message 'websocket.accept', 'websocket.close' "
+ "or 'websocket.http.response.start' "
+ "but got '%s'."
+ )
+ raise RuntimeError(msg % message_type)
+
+ elif not self.close_sent and self.initial_response is None:
+ try:
+ if message_type == "websocket.send":
+ message = cast(WebSocketSendEvent, message)
+ bytes_data = message.get("bytes")
+ text_data = message.get("text")
+ if text_data:
+ self.conn.send_text(text_data.encode())
+ elif bytes_data:
+ self.conn.send_binary(bytes_data)
+ output = self.conn.data_to_send()
+ self.transport.write(b"".join(output))
+
+ elif message_type == "websocket.close" and not self.transport.is_closing():
+ message = cast(WebSocketCloseEvent, message)
+ code = message.get("code", 1000)
+ reason = message.get("reason", "") or ""
+ self.queue.put_nowait({"type": "websocket.disconnect", "code": code})
+ self.conn.send_close(code, reason)
+ output = self.conn.data_to_send()
+ self.transport.write(b"".join(output))
+ self.close_sent = True
+ self.transport.close()
+ else:
+ msg = "Expected ASGI message 'websocket.send' or 'websocket.close'," " but got '%s'."
+ raise RuntimeError(msg % message_type)
+ except InvalidState:
+ raise ClientDisconnected()
+ elif self.initial_response is not None:
+ if message_type == "websocket.http.response.body":
+ message = cast(WebSocketResponseBodyEvent, message)
+ body = self.initial_response[2] + message["body"]
+ self.initial_response = self.initial_response[:2] + (body,)
+ if not message.get("more_body", False):
+ response = self.conn.reject(self.initial_response[0], body.decode())
+ response.headers.update(self.initial_response[1])
+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1006})
+ self.conn.send_response(response)
+ output = self.conn.data_to_send()
+ self.close_sent = True
+ self.transport.write(b"".join(output))
+ self.transport.close()
+ else:
+ msg = "Expected ASGI message 'websocket.http.response.body' " "but got '%s'."
+ raise RuntimeError(msg % message_type)
+
+ else:
+ msg = "Unexpected ASGI message '%s', after sending 'websocket.close'."
+ raise RuntimeError(msg % message_type)
+
+ async def receive(self) -> ASGIReceiveEvent:
+ message = await self.queue.get()
+ if self.read_paused and self.queue.empty():
+ self.read_paused = False
+ self.transport.resume_reading()
+ return message
diff --git a/uvicorn/server.py b/uvicorn/server.py
index cca2e85..50c5ed2 100644
--- a/uvicorn/server.py
+++ b/uvicorn/server.py
@@ -23,9 +23,10 @@ if TYPE_CHECKING:
from uvicorn.protocols.http.h11_impl import H11Protocol
from uvicorn.protocols.http.httptools_impl import HttpToolsProtocol
from uvicorn.protocols.websockets.websockets_impl import WebSocketProtocol
+ from uvicorn.protocols.websockets.websockets_sansio_impl import WebSocketsSansIOProtocol
from uvicorn.protocols.websockets.wsproto_impl import WSProtocol
- Protocols = Union[H11Protocol, HttpToolsProtocol, WSProtocol, WebSocketProtocol]
+ Protocols = Union[H11Protocol, HttpToolsProtocol, WSProtocol, WebSocketProtocol, WebSocketsSansIOProtocol]
HANDLED_SIGNALS = (
signal.SIGINT, # Unix signal 2. Sent by Ctrl+C.

View file

@ -1,567 +0,0 @@
diff --git a/requirements.txt b/requirements.txt
index e26e6b3..b16569f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,7 +7,7 @@ h11 @ git+https://github.com/python-hyper/h11.git@master
# Explicit optionals
a2wsgi==1.10.7
wsproto==1.2.0
-websockets==13.1
+websockets==14.1
# Packaging
build==1.2.2.post1
diff --git a/tests/middleware/test_logging.py b/tests/middleware/test_logging.py
index 63d7daf..5aef174 100644
--- a/tests/middleware/test_logging.py
+++ b/tests/middleware/test_logging.py
@@ -8,8 +8,7 @@ import typing
import httpx
import pytest
-import websockets
-import websockets.client
+from websockets.asyncio.client import connect
from tests.utils import run_server
from uvicorn import Config
@@ -107,8 +106,8 @@ async def test_trace_logging_on_ws_protocol(
break
async def open_connection(url: str):
- async with websockets.client.connect(url) as websocket:
- return websocket.open
+ async with connect(url):
+ return True
config = Config(
app=websocket_app,
diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py
index d300c45..4b5f195 100644
--- a/tests/middleware/test_proxy_headers.py
+++ b/tests/middleware/test_proxy_headers.py
@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING
import httpx
import httpx._transports.asgi
import pytest
-import websockets.client
+from websockets.asyncio.client import connect
from tests.response import Response
from tests.utils import run_server
@@ -479,7 +479,7 @@ async def test_proxy_headers_websocket_x_forwarded_proto(
async with run_server(config):
url = f"ws://127.0.0.1:{unused_tcp_port}"
headers = {X_FORWARDED_FOR: "1.2.3.4", X_FORWARDED_PROTO: forwarded_proto}
- async with websockets.client.connect(url, extra_headers=headers) as websocket:
+ async with connect(url, additional_headers=headers) as websocket:
data = await websocket.recv()
assert data == expected
diff --git a/tests/protocols/test_websocket.py b/tests/protocols/test_websocket.py
index e728544..b9035ec 100644
--- a/tests/protocols/test_websocket.py
+++ b/tests/protocols/test_websocket.py
@@ -12,6 +12,8 @@ import websockets.asyncio.client
import websockets.client
import websockets.exceptions
from typing_extensions import TypedDict
+from websockets.asyncio.client import ClientConnection, connect
+from websockets.exceptions import ConnectionClosed, ConnectionClosedError, InvalidHandshake, InvalidStatus
from websockets.extensions.permessage_deflate import ClientPerMessageDeflateFactory
from websockets.typing import Subprotocol
@@ -130,8 +132,8 @@ async def test_accept_connection(ws_protocol_cls: WSProtocol, http_protocol_cls:
await self.send({"type": "websocket.accept"})
async def open_connection(url: str):
- async with websockets.client.connect(url) as websocket:
- return websocket.open
+ async with connect(url):
+ return True
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
@@ -146,7 +148,7 @@ async def test_shutdown(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProt
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config) as server:
- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}"):
+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}"):
# Attempt shutdown while connection is still open
await server.shutdown()
@@ -160,8 +162,8 @@ async def test_supports_permessage_deflate_extension(
async def open_connection(url: str):
extension_factories = [ClientPerMessageDeflateFactory()]
- async with websockets.client.connect(url, extensions=extension_factories) as websocket:
- return [extension.name for extension in websocket.extensions]
+ async with connect(url, extensions=extension_factories) as websocket:
+ return [extension.name for extension in websocket.protocol.extensions]
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
@@ -180,8 +182,8 @@ async def test_can_disable_permessage_deflate_extension(
# enable per-message deflate on the client, so that we can check the server
# won't support it when it's disabled.
extension_factories = [ClientPerMessageDeflateFactory()]
- async with websockets.client.connect(url, extensions=extension_factories) as websocket:
- return [extension.name for extension in websocket.extensions]
+ async with connect(url, extensions=extension_factories) as websocket:
+ return [extension.name for extension in websocket.protocol.extensions]
config = Config(
app=App,
@@ -203,8 +205,8 @@ async def test_close_connection(ws_protocol_cls: WSProtocol, http_protocol_cls:
async def open_connection(url: str):
try:
- await websockets.client.connect(url)
- except websockets.exceptions.InvalidHandshake:
+ await connect(url)
+ except InvalidHandshake:
return False
return True # pragma: no cover
@@ -224,8 +226,8 @@ async def test_headers(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProto
await self.send({"type": "websocket.accept"})
async def open_connection(url: str):
- async with websockets.client.connect(url, extra_headers=[("username", "abraão")]) as websocket:
- return websocket.open
+ async with connect(url, additional_headers=[("username", "abraão")]):
+ return True
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
@@ -239,8 +241,9 @@ async def test_extra_headers(ws_protocol_cls: WSProtocol, http_protocol_cls: HTT
await self.send({"type": "websocket.accept", "headers": [(b"extra", b"header")]})
async def open_connection(url: str):
- async with websockets.client.connect(url) as websocket:
- return websocket.response_headers
+ async with connect(url) as websocket:
+ assert websocket.response
+ return websocket.response.headers
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
@@ -258,8 +261,8 @@ async def test_path_and_raw_path(ws_protocol_cls: WSProtocol, http_protocol_cls:
await self.send({"type": "websocket.accept"})
async def open_connection(url: str):
- async with websockets.client.connect(url) as websocket:
- return websocket.open
+ async with connect(url):
+ return True
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
@@ -276,7 +279,7 @@ async def test_send_text_data_to_client(
await self.send({"type": "websocket.send", "text": "123"})
async def get_data(url: str):
- async with websockets.client.connect(url) as websocket:
+ async with connect(url) as websocket:
return await websocket.recv()
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
@@ -294,7 +297,7 @@ async def test_send_binary_data_to_client(
await self.send({"type": "websocket.send", "bytes": b"123"})
async def get_data(url: str):
- async with websockets.client.connect(url) as websocket:
+ async with connect(url) as websocket:
return await websocket.recv()
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
@@ -313,7 +316,7 @@ async def test_send_and_close_connection(
await self.send({"type": "websocket.close"})
async def get_data(url: str):
- async with websockets.client.connect(url) as websocket:
+ async with connect(url) as websocket:
data = await websocket.recv()
is_open = True
try:
@@ -342,7 +345,7 @@ async def test_send_text_data_to_server(
await self.send({"type": "websocket.send", "text": _text})
async def send_text(url: str):
- async with websockets.client.connect(url) as websocket:
+ async with connect(url) as websocket:
await websocket.send("abc")
return await websocket.recv()
@@ -365,7 +368,7 @@ async def test_send_binary_data_to_server(
await self.send({"type": "websocket.send", "bytes": _bytes})
async def send_text(url: str):
- async with websockets.client.connect(url) as websocket:
+ async with connect(url) as websocket:
await websocket.send(b"abc")
return await websocket.recv()
@@ -387,7 +390,7 @@ async def test_send_after_protocol_close(
await self.send({"type": "websocket.send", "text": "123"})
async def get_data(url: str):
- async with websockets.client.connect(url) as websocket:
+ async with connect(url) as websocket:
data = await websocket.recv()
is_open = True
try:
@@ -407,14 +410,14 @@ async def test_missing_handshake(ws_protocol_cls: WSProtocol, http_protocol_cls:
async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable):
pass
- async def connect(url: str):
- await websockets.client.connect(url)
+ async def open_connection(url: str):
+ await connect(url)
config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info:
- await connect(f"ws://127.0.0.1:{unused_tcp_port}")
- assert exc_info.value.status_code == 500
+ with pytest.raises(InvalidStatus) as exc_info:
+ await open_connection(f"ws://127.0.0.1:{unused_tcp_port}")
+ assert exc_info.value.response.status_code == 500
async def test_send_before_handshake(
@@ -423,14 +426,14 @@ async def test_send_before_handshake(
async def app(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable):
await send({"type": "websocket.send", "text": "123"})
- async def connect(url: str):
- await websockets.client.connect(url)
+ async def open_connection(url: str):
+ await connect(url)
config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info:
- await connect(f"ws://127.0.0.1:{unused_tcp_port}")
- assert exc_info.value.status_code == 500
+ with pytest.raises(InvalidStatus) as exc_info:
+ await open_connection(f"ws://127.0.0.1:{unused_tcp_port}")
+ assert exc_info.value.response.status_code == 500
async def test_duplicate_handshake(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int):
@@ -440,10 +443,10 @@ async def test_duplicate_handshake(ws_protocol_cls: WSProtocol, http_protocol_cl
config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket:
- with pytest.raises(websockets.exceptions.ConnectionClosed):
+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket:
+ with pytest.raises(ConnectionClosed):
_ = await websocket.recv()
- assert websocket.close_code == 1006
+ assert websocket.protocol.close_code == 1006
async def test_asgi_return_value(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int):
@@ -458,10 +461,10 @@ async def test_asgi_return_value(ws_protocol_cls: WSProtocol, http_protocol_cls:
config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket:
- with pytest.raises(websockets.exceptions.ConnectionClosed):
+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket:
+ with pytest.raises(ConnectionClosed):
_ = await websocket.recv()
- assert websocket.close_code == 1006
+ assert websocket.protocol.close_code == 1006
@pytest.mark.parametrize("code", [None, 1000, 1001])
@@ -493,13 +496,13 @@ async def test_app_close(
config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket:
+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket:
await websocket.ping()
await websocket.send("abc")
- with pytest.raises(websockets.exceptions.ConnectionClosed):
+ with pytest.raises(ConnectionClosed):
await websocket.recv()
- assert websocket.close_code == (code or 1000)
- assert websocket.close_reason == (reason or "")
+ assert websocket.protocol.close_code == (code or 1000)
+ assert websocket.protocol.close_reason == (reason or "")
async def test_client_close(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTPProtocol, unused_tcp_port: int):
@@ -518,7 +521,7 @@ async def test_client_close(ws_protocol_cls: WSProtocol, http_protocol_cls: HTTP
break
async def websocket_session(url: str):
- async with websockets.client.connect(url) as websocket:
+ async with connect(url) as websocket:
await websocket.ping()
await websocket.send("abc")
await websocket.close(code=1001, reason="custom reason")
@@ -555,7 +558,7 @@ async def test_client_connection_lost(
port=unused_tcp_port,
)
async with run_server(config):
- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket:
+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket:
websocket.transport.close()
await asyncio.sleep(0.1)
got_disconnect_event_before_shutdown = got_disconnect_event
@@ -583,7 +586,7 @@ async def test_client_connection_lost_on_send(
config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
url = f"ws://127.0.0.1:{unused_tcp_port}"
- async with websockets.client.connect(url):
+ async with connect(url):
await asyncio.sleep(0.1)
disconnect.set()
@@ -642,11 +645,11 @@ async def test_send_close_on_server_shutdown(
disconnect_message = message
break
- websocket: websockets.client.WebSocketClientProtocol | None = None
+ websocket: ClientConnection | None = None
async def websocket_session(uri: str):
nonlocal websocket
- async with websockets.client.connect(uri) as ws_connection:
+ async with connect(uri) as ws_connection:
websocket = ws_connection
await server_shutdown_event.wait()
@@ -676,9 +679,7 @@ async def test_subprotocols(
await self.send({"type": "websocket.accept", "subprotocol": subprotocol})
async def get_subprotocol(url: str):
- async with websockets.client.connect(
- url, subprotocols=[Subprotocol("proto1"), Subprotocol("proto2")]
- ) as websocket:
+ async with connect(url, subprotocols=[Subprotocol("proto1"), Subprotocol("proto2")]) as websocket:
return websocket.subprotocol
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
@@ -688,7 +689,7 @@ async def test_subprotocols(
MAX_WS_BYTES = 1024 * 1024 * 16
-MAX_WS_BYTES_PLUS1 = MAX_WS_BYTES + 1
+MAX_WS_BYTES_PLUS1 = MAX_WS_BYTES + 10
@pytest.mark.parametrize(
@@ -731,15 +732,15 @@ async def test_send_binary_data_to_server_bigger_than_default_on_websockets(
port=unused_tcp_port,
)
async with run_server(config):
- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}", max_size=client_size_sent) as ws:
+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}", max_size=client_size_sent) as ws:
await ws.send(b"\x01" * client_size_sent)
if expected_result == 0:
data = await ws.recv()
assert data == b"\x01" * client_size_sent
else:
- with pytest.raises(websockets.exceptions.ConnectionClosedError):
+ with pytest.raises(ConnectionClosedError):
await ws.recv()
- assert ws.close_code == expected_result
+ assert ws.protocol.close_code == expected_result
async def test_server_reject_connection(
@@ -764,10 +765,10 @@ async def test_server_reject_connection(
disconnected_message = await receive()
async def websocket_session(url: str):
- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info:
- async with websockets.client.connect(url):
+ with pytest.raises(InvalidStatus) as exc_info:
+ async with connect(url):
pass # pragma: no cover
- assert exc_info.value.status_code == 403
+ assert exc_info.value.response.status_code == 403
config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
@@ -937,10 +938,10 @@ async def test_server_reject_connection_with_invalid_msg(
await send(message)
async def websocket_session(url: str):
- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info:
- async with websockets.client.connect(url):
+ with pytest.raises(InvalidStatus) as exc_info:
+ async with connect(url):
pass # pragma: no cover
- assert exc_info.value.status_code == 404
+ assert exc_info.value.response.status_code == 404
config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
@@ -971,10 +972,10 @@ async def test_server_reject_connection_with_missing_body(
# no further message
async def websocket_session(url: str):
- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info:
- async with websockets.client.connect(url):
+ with pytest.raises(InvalidStatus) as exc_info:
+ async with connect(url):
pass # pragma: no cover
- assert exc_info.value.status_code == 404
+ assert exc_info.value.response.status_code == 404
config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
@@ -1014,17 +1015,17 @@ async def test_server_multiple_websocket_http_response_start_events(
exception_message = str(exc)
async def websocket_session(url: str):
- with pytest.raises(websockets.exceptions.InvalidStatusCode) as exc_info:
- async with websockets.client.connect(url):
+ with pytest.raises(InvalidStatus) as exc_info:
+ async with connect(url):
pass # pragma: no cover
- assert exc_info.value.status_code == 404
+ assert exc_info.value.response.status_code == 404
config = Config(app=app, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
await websocket_session(f"ws://127.0.0.1:{unused_tcp_port}")
assert exception_message == (
- "Expected ASGI message 'websocket.http.response.body' but got " "'websocket.http.response.start'."
+ "Expected ASGI message 'websocket.http.response.body' but got 'websocket.http.response.start'."
)
@@ -1053,7 +1054,7 @@ async def test_server_can_read_messages_in_buffer_after_close(
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
- async with websockets.client.connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket:
+ async with connect(f"ws://127.0.0.1:{unused_tcp_port}") as websocket:
await websocket.send(b"abc")
await websocket.send(b"abc")
await websocket.send(b"abc")
@@ -1070,8 +1071,9 @@ async def test_default_server_headers(
await self.send({"type": "websocket.accept"})
async def open_connection(url: str):
- async with websockets.client.connect(url) as websocket:
- return websocket.response_headers
+ async with connect(url) as websocket:
+ assert websocket.response
+ return websocket.response.headers
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
@@ -1085,8 +1087,9 @@ async def test_no_server_headers(ws_protocol_cls: WSProtocol, http_protocol_cls:
await self.send({"type": "websocket.accept"})
async def open_connection(url: str):
- async with websockets.client.connect(url) as websocket:
- return websocket.response_headers
+ async with connect(url) as websocket:
+ assert websocket.response
+ return websocket.response.headers
config = Config(
app=App,
@@ -1108,8 +1111,9 @@ async def test_no_date_header_on_wsproto(http_protocol_cls: HTTPProtocol, unused
await self.send({"type": "websocket.accept"})
async def open_connection(url: str):
- async with websockets.client.connect(url) as websocket:
- return websocket.response_headers
+ async with connect(url) as websocket:
+ assert websocket.response
+ return websocket.response.headers
config = Config(
app=App,
@@ -1140,8 +1144,9 @@ async def test_multiple_server_header(
)
async def open_connection(url: str):
- async with websockets.client.connect(url) as websocket:
- return websocket.response_headers
+ async with connect(url) as websocket:
+ assert websocket.response
+ return websocket.response.headers
config = Config(app=App, ws=ws_protocol_cls, http=http_protocol_cls, lifespan="off", port=unused_tcp_port)
async with run_server(config):
@@ -1176,8 +1181,8 @@ async def test_lifespan_state(ws_protocol_cls: WSProtocol, http_protocol_cls: HT
await self.send({"type": "websocket.accept"})
async def open_connection(url: str):
- async with websockets.client.connect(url) as websocket:
- return websocket.open
+ async with connect(url):
+ return True
async def app_wrapper(scope: Scope, receive: ASGIReceiveCallable, send: ASGISendCallable):
if scope["type"] == "lifespan":
diff --git a/uvicorn/protocols/websockets/websockets_impl.py b/uvicorn/protocols/websockets/websockets_impl.py
index cd6c54f..685d6b6 100644
--- a/uvicorn/protocols/websockets/websockets_impl.py
+++ b/uvicorn/protocols/websockets/websockets_impl.py
@@ -13,8 +13,7 @@ from websockets.datastructures import Headers
from websockets.exceptions import ConnectionClosed
from websockets.extensions.base import ServerExtensionFactory
from websockets.extensions.permessage_deflate import ServerPerMessageDeflateFactory
-from websockets.legacy.server import HTTPResponse
-from websockets.server import WebSocketServerProtocol
+from websockets.legacy.server import HTTPResponse, WebSocketServerProtocol
from websockets.typing import Subprotocol
from uvicorn._types import (
diff --git a/uvicorn/protocols/websockets/wsproto_impl.py b/uvicorn/protocols/websockets/wsproto_impl.py
index 828afe5..5d84bff 100644
--- a/uvicorn/protocols/websockets/wsproto_impl.py
+++ b/uvicorn/protocols/websockets/wsproto_impl.py
@@ -149,12 +149,13 @@ class WSProtocol(asyncio.Protocol):
self.writable.set() # pragma: full coverage
def shutdown(self) -> None:
- if self.handshake_complete:
- self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012})
- output = self.conn.send(wsproto.events.CloseConnection(code=1012))
- self.transport.write(output)
- else:
- self.send_500_response()
+ if not self.response_started:
+ if self.handshake_complete:
+ self.queue.put_nowait({"type": "websocket.disconnect", "code": 1012})
+ output = self.conn.send(wsproto.events.CloseConnection(code=1012))
+ self.transport.write(output)
+ else:
+ self.send_500_response()
self.transport.close()
def on_task_complete(self, task: asyncio.Task[None]) -> None:
@@ -221,13 +222,15 @@ class WSProtocol(asyncio.Protocol):
def send_500_response(self) -> None:
if self.response_started or self.handshake_complete:
return # we cannot send responses anymore
+ reject_data = b"Internal Server Error"
headers: list[tuple[bytes, bytes]] = [
(b"content-type", b"text/plain; charset=utf-8"),
+ (b"content-length", str(len(reject_data)).encode()),
(b"connection", b"close"),
(b"content-length", b"21"),
]
output = self.conn.send(wsproto.events.RejectConnection(status_code=500, headers=headers, has_body=True))
- output += self.conn.send(wsproto.events.RejectData(data=b"Internal Server Error"))
+ output += self.conn.send(wsproto.events.RejectData(data=reject_data))
self.transport.write(output)
async def run_asgi(self) -> None:

View file

@ -1,59 +0,0 @@
maintainer="Michał Polański <michal@polanski.me>"
pkgname=uvicorn
pkgver=0.34.0
pkgrel=0
pkgdesc="Lightning-fast ASGI server"
url="https://www.uvicorn.org/"
license="BSD-3-Clause"
# disable due to lack of support for websockets 14
# https://gitlab.alpinelinux.org/alpine/aports/-/issues/16646
arch="noarch"
depends="py3-click py3-h11"
makedepends="py3-gpep517 py3-hatchling"
checkdepends="
py3-a2wsgi
py3-dotenv
py3-httptools
py3-httpx
py3-pytest
py3-pytest-mock
py3-trustme
py3-typing-extensions
py3-watchfiles
py3-websockets
py3-wsproto
py3-yaml
"
subpackages="$pkgname-pyc"
source="https://github.com/encode/uvicorn/archive/$pkgver/uvicorn-$pkgver.tar.gz
test_multiprocess.patch
2540_add-websocketssansioprotocol.patch
2541_bump-wesockets-on-requirements.patch
fix-test-wsgi.patch
"
build() {
gpep517 build-wheel \
--wheel-dir .dist \
--output-fd 3 3>&1 >&2
}
check() {
python3 -m venv --clear --without-pip --system-site-packages .testenv
.testenv/bin/python3 -m installer .dist/*.whl
.testenv/bin/python3 -m pytest \
-k "not test_close_connection_with_multiple_requests" # a known issue
}
package() {
python3 -m installer -d "$pkgdir" \
.dist/uvicorn-$pkgver-py3-none-any.whl
}
sha512sums="
260782e385a2934049da8c474750958826afe1bfe23b38fe2f6420f355af7a537563f8fe6ac3830814c7469203703d10f4f9f3d6e53e79113bfd2fd34f7a7c72 uvicorn-0.34.0.tar.gz
cfad91dd84f8974362f52d754d7a29f09d07927a46acaa0eb490b6115a5729d84d6df94fead10ccd4cce7f5ea376f1348b0f59daede661dd8373a3851c313c46 test_multiprocess.patch
858e9a7baaf1c12e076aecd81aaaf622b35a59dcaabea4ee1bfc4cda704c9fe271b1cc616a5910d845393717e4989cecb3b04be249cb5d0df1001ec5224c293f 2540_add-websocketssansioprotocol.patch
f8a8c190981b9070232ea985880685bc801947cc7f673d59abf73d3e68bc2e13515ad200232a1de2af0808bc85da48a341f57d47caf87bcc190bfdc3c45718e0 2541_bump-wesockets-on-requirements.patch
379963f9ccbda013e4a0bc3441eee70a581c91f60206aedc15df6a8737950824b7cb8d867774fc415763449bb3e0bba66601e8551101bfc1741098acd035f0cc fix-test-wsgi.patch
"

View file

@ -1,13 +0,0 @@
diff --git a/tests/middleware/test_wsgi.py.orig b/tests/middleware/test_wsgi.py
index 6003f27..2750487 100644
--- a/tests/middleware/test_wsgi.py.orig
+++ b/tests/middleware/test_wsgi.py
@@ -73,7 +73,7 @@ async def test_wsgi_post(wsgi_middleware: Callable) -> None:
async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
response = await client.post("/", json={"example": 123})
assert response.status_code == 200
- assert response.text == '{"example":123}'
+ assert response.text == '{"example": 123}'
@pytest.mark.anyio

View file

@ -1,14 +0,0 @@
Wait a bit longer, otherwise the workers might
not have time to finish restarting.
--- a/tests/supervisors/test_multiprocess.py
+++ b/tests/supervisors/test_multiprocess.py
@@ -132,7 +132,7 @@ def test_multiprocess_sighup() -> None:
time.sleep(1)
pids = [p.pid for p in supervisor.processes]
supervisor.signal_queue.append(signal.SIGHUP)
- time.sleep(1)
+ time.sleep(3)
assert pids != [p.pid for p in supervisor.processes]
supervisor.signal_queue.append(signal.SIGINT)
supervisor.join_all()

View file

@ -1,7 +1,7 @@
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net> # Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net> # Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=wikijs pkgname=wikijs
pkgver=2.5.307 pkgver=2.5.305
pkgrel=0 pkgrel=0
pkgdesc="Wiki.js | A modern, lightweight and powerful wiki app built on Node.js" pkgdesc="Wiki.js | A modern, lightweight and powerful wiki app built on Node.js"
license="AGPL-3.0" license="AGPL-3.0"
@ -49,14 +49,11 @@ package() {
install -Dm644 "$builddir"/package.json -t "$pkgdir"/usr/lib/bundles/wikijs install -Dm644 "$builddir"/package.json -t "$pkgdir"/usr/lib/bundles/wikijs
cp -aR "$builddir"/assets "$builddir"/server "$builddir"/node_modules "$pkgdir"/usr/lib/bundles/wikijs cp -aR "$builddir"/assets "$builddir"/server "$builddir"/node_modules "$pkgdir"/usr/lib/bundles/wikijs
# remove prebuilts
rm -Rf "$pkgdir"/usr/lib/bundles/wikijs/node_modules/*/prebuilds
mkdir -p "$pkgdir"/var/lib/wikijs mkdir -p "$pkgdir"/var/lib/wikijs
chown 5494:5494 "$pkgdir"/var/lib/wikijs chown 5494:5494 "$pkgdir"/var/lib/wikijs
} }
sha512sums=" sha512sums="
8bf22ae87a9e3b8dd6f7114d0cf59913ad2cb05a2ed0e9bb7ac302b546d71f34a14de64cbe6e0f8b887d5df65e9d2b065ca18fe4493d3939895b8fa7076dd567 wikijs-2.5.307.tar.gz e715e2d93fd176dc93676b3dd97d8dd745589552a7d67971fce0c1097f607fa44a3147534709a82b3ad13dda95d7c5833bc30ec37538c6cdef54ac309e6b44d1 wikijs-2.5.305.tar.gz
355131ee5617348b82681cb8543c784eea59689990a268ecd3b77d44fe9abcca9c86fb8b047f0a8faeba079c650faa7790c5dd65418d313cd7561f38bb590c03 wikijs.initd 355131ee5617348b82681cb8543c784eea59689990a268ecd3b77d44fe9abcca9c86fb8b047f0a8faeba079c650faa7790c5dd65418d313cd7561f38bb590c03 wikijs.initd
07b536c20e370d2a926038165f0e953283259c213a80a8648419565f5359ab05f528ac310e81606914013da212270df6feddb22e514cbcb2464c8274c956e4af config.sample.yml.patch 07b536c20e370d2a926038165f0e953283259c213a80a8648419565f5359ab05f528ac310e81606914013da212270df6feddb22e514cbcb2464c8274c956e4af config.sample.yml.patch
" "