1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/weblate_ynh.git synced 2024-10-01 13:35:04 +02:00
This commit is contained in:
Thomas 2024-10-01 05:39:44 +00:00 committed by GitHub
commit c42c426961
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 365 additions and 297 deletions

3
.gitignore vendored
View file

@ -99,3 +99,6 @@ ENV/
# mypy # mypy
.mypy_cache/ .mypy_cache/
*~
*.sw[op]
.DS_Store

View file

@ -5,4 +5,7 @@
- [Irakurri README euskaraz](README_eu.md) - [Irakurri README euskaraz](README_eu.md)
- [Lire le README en français](README_fr.md) - [Lire le README en français](README_fr.md)
- [Le o README en galego](README_gl.md) - [Le o README en galego](README_gl.md)
- [Baca README dalam bahasa bahasa Indonesia](README_id.md)
- [Lees de README in het Nederlands](README_nl.md)
- [Прочитать README на русский](README_ru.md)
- [阅读中文(简体)的 README](README_zh_Hans.md) - [阅读中文(简体)的 README](README_zh_Hans.md)

View file

@ -5,7 +5,7 @@ It shall NOT be edited by hand.
# Weblate for YunoHost # Weblate for YunoHost
[![Integration level](https://dash.yunohost.org/integration/weblate.svg)](https://dash.yunohost.org/appci/app/weblate) ![Working status](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg) [![Integration level](https://dash.yunohost.org/integration/weblate.svg)](https://ci-apps.yunohost.org/ci/apps/weblate/) ![Working status](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg)
[![Install Weblate with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate) [![Install Weblate with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate)
@ -18,7 +18,7 @@ It shall NOT be edited by hand.
Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files. Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files.
**Shipped version:** 5.4.3~ynh1 **Shipped version:** 5.5.3~ynh1
**Demo:** <https://hosted.weblate.org/> **Demo:** <https://hosted.weblate.org/>

View file

@ -5,7 +5,7 @@ No se debe editar a mano.
# Weblate para Yunohost # Weblate para Yunohost
[![Nivel de integración](https://dash.yunohost.org/integration/weblate.svg)](https://dash.yunohost.org/appci/app/weblate) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg) [![Nivel de integración](https://dash.yunohost.org/integration/weblate.svg)](https://ci-apps.yunohost.org/ci/apps/weblate/) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg)
[![Instalar Weblate con Yunhost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate) [![Instalar Weblate con Yunhost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate)
@ -18,7 +18,7 @@ No se debe editar a mano.
Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files. Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files.
**Versión actual:** 5.4.3~ynh1 **Versión actual:** 5.5.3~ynh1
**Demo:** <https://hosted.weblate.org/> **Demo:** <https://hosted.weblate.org/>
@ -37,7 +37,7 @@ Weblate is a libre web-based translation tool with tight version control integra
## Información para desarrolladores ## Información para desarrolladores
Por favor enviar sus correcciones a la [`branch testing`](https://github.com/YunoHost-Apps/weblate_ynh/tree/testing Por favor enviar sus correcciones a la [rama `testing`](https://github.com/YunoHost-Apps/weblate_ynh/tree/testing).
Para probar la rama `testing`, sigue asÍ: Para probar la rama `testing`, sigue asÍ:

View file

@ -5,7 +5,7 @@ EZ editatu eskuz.
# Weblate YunoHost-erako # Weblate YunoHost-erako
[![Integrazio maila](https://dash.yunohost.org/integration/weblate.svg)](https://dash.yunohost.org/appci/app/weblate) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg) [![Integrazio maila](https://dash.yunohost.org/integration/weblate.svg)](https://ci-apps.yunohost.org/ci/apps/weblate/) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg)
[![Instalatu Weblate YunoHost-ekin](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate) [![Instalatu Weblate YunoHost-ekin](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate)
@ -18,7 +18,7 @@ EZ editatu eskuz.
Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files. Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files.
**Paketatutako bertsioa:** 5.4.3~ynh1 **Paketatutako bertsioa:** 5.5.3~ynh1
**Demoa:** <https://hosted.weblate.org/> **Demoa:** <https://hosted.weblate.org/>

View file

@ -5,7 +5,7 @@ Il NE doit PAS être modifié à la main.
# Weblate pour YunoHost # Weblate pour YunoHost
[![Niveau dintégration](https://dash.yunohost.org/integration/weblate.svg)](https://dash.yunohost.org/appci/app/weblate) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg) [![Niveau dintégration](https://dash.yunohost.org/integration/weblate.svg)](https://ci-apps.yunohost.org/ci/apps/weblate/) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg)
[![Installer Weblate avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate) [![Installer Weblate avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate)
@ -18,7 +18,7 @@ Il NE doit PAS être modifié à la main.
Weblate est un outil de traduction libre avec une intégration étroite du contrôle de version. Il fournit deux interfaces utilisateur, la propagation des traductions entre les composants, les contrôles de qualité et la liaison automatique aux fichiers source. Weblate est un outil de traduction libre avec une intégration étroite du contrôle de version. Il fournit deux interfaces utilisateur, la propagation des traductions entre les composants, les contrôles de qualité et la liaison automatique aux fichiers source.
**Version incluse:** 5.4.3~ynh1 **Version incluse:** 5.5.3~ynh1
**Démo:** <https://hosted.weblate.org/> **Démo:** <https://hosted.weblate.org/>

View file

@ -5,7 +5,7 @@ NON debe editarse manualmente.
# Weblate para YunoHost # Weblate para YunoHost
[![Nivel de integración](https://dash.yunohost.org/integration/weblate.svg)](https://dash.yunohost.org/appci/app/weblate) ![Estado de funcionamento](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Estado de mantemento](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg) [![Nivel de integración](https://dash.yunohost.org/integration/weblate.svg)](https://ci-apps.yunohost.org/ci/apps/weblate/) ![Estado de funcionamento](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Estado de mantemento](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg)
[![Instalar Weblate con YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate) [![Instalar Weblate con YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate)
@ -18,7 +18,7 @@ NON debe editarse manualmente.
Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files. Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files.
**Versión proporcionada:** 5.4.3~ynh1 **Versión proporcionada:** 5.5.3~ynh1
**Demo:** <https://hosted.weblate.org/> **Demo:** <https://hosted.weblate.org/>

50
README_id.md Normal file
View file

@ -0,0 +1,50 @@
<!--
N.B.: README ini dibuat secara otomatis oleh <https://github.com/YunoHost/apps/tree/master/tools/readme_generator>
Ini TIDAK boleh diedit dengan tangan.
-->
# Weblate untuk YunoHost
[![Tingkat integrasi](https://dash.yunohost.org/integration/weblate.svg)](https://ci-apps.yunohost.org/ci/apps/weblate/) ![Status kerja](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Status pemeliharaan](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg)
[![Pasang Weblate dengan YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate)
*[Baca README ini dengan bahasa yang lain.](./ALL_README.md)*
> *Paket ini memperbolehkan Anda untuk memasang Weblate secara cepat dan mudah pada server YunoHost.*
> *Bila Anda tidak mempunyai YunoHost, silakan berkonsultasi dengan [panduan](https://yunohost.org/install) untuk mempelajari bagaimana untuk memasangnya.*
## Ringkasan
Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files.
**Versi terkirim:** 5.5.3~ynh1
**Demo:** <https://hosted.weblate.org/>
## Tangkapan Layar
![Tangkapan Layar pada Weblate](./doc/screenshots/BigScreenshot.png)
## Dokumentasi dan sumber daya
- Website aplikasi resmi: <https://weblate.org>
- Dokumentasi pengguna resmi: <https://docs.weblate.org/>
- Dokumentasi admin resmi: <https://docs.weblate.org/>
- Depot kode aplikasi hulu: <https://github.com/WeblateOrg/weblate>
- Gudang YunoHost: <https://apps.yunohost.org/app/weblate>
- Laporkan bug: <https://github.com/YunoHost-Apps/weblate_ynh/issues>
## Info developer
Silakan kirim pull request ke [`testing` branch](https://github.com/YunoHost-Apps/weblate_ynh/tree/testing).
Untuk mencoba branch `testing`, silakan dilanjutkan seperti:
```bash
sudo yunohost app install https://github.com/YunoHost-Apps/weblate_ynh/tree/testing --debug
atau
sudo yunohost app upgrade weblate -u https://github.com/YunoHost-Apps/weblate_ynh/tree/testing --debug
```
**Info lebih lanjut mengenai pemaketan aplikasi:** <https://yunohost.org/packaging_apps>

50
README_nl.md Normal file
View file

@ -0,0 +1,50 @@
<!--
NB: Deze README is automatisch gegenereerd door <https://github.com/YunoHost/apps/tree/master/tools/readme_generator>
Hij mag NIET handmatig aangepast worden.
-->
# Weblate voor Yunohost
[![Integratieniveau](https://dash.yunohost.org/integration/weblate.svg)](https://ci-apps.yunohost.org/ci/apps/weblate/) ![Mate van functioneren](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Onderhoudsstatus](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg)
[![Weblate met Yunohost installeren](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate)
*[Deze README in een andere taal lezen.](./ALL_README.md)*
> *Met dit pakket kun je Weblate snel en eenvoudig op een YunoHost-server installeren.*
> *Als je nog geen YunoHost hebt, lees dan [de installatiehandleiding](https://yunohost.org/install), om te zien hoe je 'm installeert.*
## Overzicht
Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files.
**Geleverde versie:** 5.5.3~ynh1
**Demo:** <https://hosted.weblate.org/>
## Schermafdrukken
![Schermafdrukken van Weblate](./doc/screenshots/BigScreenshot.png)
## Documentatie en bronnen
- Officiele website van de app: <https://weblate.org>
- Officiele gebruikersdocumentatie: <https://docs.weblate.org/>
- Officiele beheerdersdocumentatie: <https://docs.weblate.org/>
- Upstream app codedepot: <https://github.com/WeblateOrg/weblate>
- YunoHost-store: <https://apps.yunohost.org/app/weblate>
- Meld een bug: <https://github.com/YunoHost-Apps/weblate_ynh/issues>
## Ontwikkelaarsinformatie
Stuur je pull request alsjeblieft naar de [`testing`-branch](https://github.com/YunoHost-Apps/weblate_ynh/tree/testing).
Om de `testing`-branch uit te proberen, ga als volgt te werk:
```bash
sudo yunohost app install https://github.com/YunoHost-Apps/weblate_ynh/tree/testing --debug
of
sudo yunohost app upgrade weblate -u https://github.com/YunoHost-Apps/weblate_ynh/tree/testing --debug
```
**Verdere informatie over app-packaging:** <https://yunohost.org/packaging_apps>

50
README_ru.md Normal file
View file

@ -0,0 +1,50 @@
<!--
Важно: этот README был автоматически сгенерирован <https://github.com/YunoHost/apps/tree/master/tools/readme_generator>
Он НЕ ДОЛЖЕН редактироваться вручную.
-->
# Weblate для YunoHost
[![Уровень интеграции](https://dash.yunohost.org/integration/weblate.svg)](https://ci-apps.yunohost.org/ci/apps/weblate/) ![Состояние работы](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![Состояние сопровождения](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg)
[![Установите Weblate с YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate)
*[Прочтите этот README на других языках.](./ALL_README.md)*
> *Этот пакет позволяет Вам установить Weblate быстро и просто на YunoHost-сервер.*
> *Если у Вас нет YunoHost, пожалуйста, посмотрите [инструкцию](https://yunohost.org/install), чтобы узнать, как установить его.*
## Обзор
Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files.
**Поставляемая версия:** 5.5.3~ynh1
**Демо-версия:** <https://hosted.weblate.org/>
## Снимки экрана
![Снимок экрана Weblate](./doc/screenshots/BigScreenshot.png)
## Документация и ресурсы
- Официальный веб-сайт приложения: <https://weblate.org>
- Официальная документация пользователя: <https://docs.weblate.org/>
- Официальная документация администратора: <https://docs.weblate.org/>
- Репозиторий кода главной ветки приложения: <https://github.com/WeblateOrg/weblate>
- Магазин YunoHost: <https://apps.yunohost.org/app/weblate>
- Сообщите об ошибке: <https://github.com/YunoHost-Apps/weblate_ynh/issues>
## Информация для разработчиков
Пришлите Ваш запрос на слияние в [ветку `testing`](https://github.com/YunoHost-Apps/weblate_ynh/tree/testing).
Чтобы попробовать ветку `testing`, пожалуйста, сделайте что-то вроде этого:
```bash
sudo yunohost app install https://github.com/YunoHost-Apps/weblate_ynh/tree/testing --debug
или
sudo yunohost app upgrade weblate -u https://github.com/YunoHost-Apps/weblate_ynh/tree/testing --debug
```
**Больше информации о пакетировании приложений:** <https://yunohost.org/packaging_apps>

View file

@ -5,7 +5,7 @@
# YunoHost 上的 Weblate # YunoHost 上的 Weblate
[![集成程度](https://dash.yunohost.org/integration/weblate.svg)](https://dash.yunohost.org/appci/app/weblate) ![工作状态](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg) [![集成程度](https://dash.yunohost.org/integration/weblate.svg)](https://ci-apps.yunohost.org/ci/apps/weblate/) ![工作状态](https://ci-apps.yunohost.org/ci/badges/weblate.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/weblate.maintain.svg)
[![使用 YunoHost 安装 Weblate](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate) [![使用 YunoHost 安装 Weblate](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate)
@ -18,7 +18,7 @@
Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files. Weblate is a libre web-based translation tool with tight version control integration. It provides two user interfaces, propagation of translations across components, quality checks and automatic linking to source files.
**分发版本:** 5.4.3~ynh1 **分发版本:** 5.5.3~ynh1
**演示:** <https://hosted.weblate.org/> **演示:** <https://hosted.weblate.org/>

View file

@ -15,9 +15,7 @@
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
# Copyright © Michal Čihař <michal@weblate.org> # mypy: disable-error-code="var-annotated"
#
# SPDX-License-Identifier: GPL-3.0-or-later
import os import os
import platform import platform
@ -138,6 +136,7 @@ LANGUAGES = (
("sr", "Српски"), ("sr", "Српски"),
("sr-latn", "Srpski"), ("sr-latn", "Srpski"),
("sv", "Svenska"), ("sv", "Svenska"),
("ta", "தமிழ்"),
("th", "ไทย"), ("th", "ไทย"),
("tr", "Türkçe"), ("tr", "Türkçe"),
("uk", "Українська"), ("uk", "Українська"),
@ -158,7 +157,7 @@ USE_TZ = True
DEFAULT_AUTO_FIELD = "django.db.models.AutoField" DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
# URL prefix to use, please see documentation for more details # URL prefix to use, please see documentation for more details
# WARNING: this must be without trailing slash (this is why we set __PATH_NO_SLASH__ (cf. loaded settings in install and upgrade)) # YUNOHOST_WARNING: this must be without trailing slash (this is why we set __PATH_NO_SLASH__ (cf. loaded settings in install and upgrade))
URL_PREFIX = "__PATH_NO_SLASH__" URL_PREFIX = "__PATH_NO_SLASH__"
# Absolute filesystem path to the directory that will hold user-uploaded files. # Absolute filesystem path to the directory that will hold user-uploaded files.
@ -222,9 +221,6 @@ GITHUB_CREDENTIALS = {
"token": "__GITHUB_TOKEN__", "token": "__GITHUB_TOKEN__",
} }
} }
# Azure DevOps username and token for sending pull requests.
# Please see the documentation for more details.
AZURE_DEVOPS_CREDENTIALS = {}
# Azure DevOps username and token for sending pull requests. # Azure DevOps username and token for sending pull requests.
# Please see the documentation for more details. # Please see the documentation for more details.
@ -244,7 +240,7 @@ GITLAB_CREDENTIALS = {
BITBUCKETSERVER_CREDENTIALS = {} BITBUCKETSERVER_CREDENTIALS = {}
# Authentication configuration # Authentication configuration
AUTHENTICATION_BACKENDS = ( AUTHENTICATION_BACKENDS: tuple[str, ...] = (
"social_core.backends.email.EmailAuth", "social_core.backends.email.EmailAuth",
# "social_core.backends.google.GoogleOAuth2", # "social_core.backends.google.GoogleOAuth2",
# "social_core.backends.github.GithubOAuth2", # "social_core.backends.github.GithubOAuth2",
@ -431,7 +427,7 @@ INSTALLED_APPS = [
"django.contrib.sessions", "django.contrib.sessions",
"django.contrib.messages", "django.contrib.messages",
"django.contrib.staticfiles", "django.contrib.staticfiles",
"django.contrib.admin.apps.SimpleAdminConfig", "django.contrib.admin",
"django.contrib.admindocs", "django.contrib.admindocs",
"django.contrib.sitemaps", "django.contrib.sitemaps",
"django.contrib.humanize", "django.contrib.humanize",
@ -464,7 +460,7 @@ if platform.system() != "Windows":
# Since Python 3.7 connect failures are silently discarded, so # Since Python 3.7 connect failures are silently discarded, so
# the exception is almost never raised here. Instead we look whether the socket # the exception is almost never raised here. Instead we look whether the socket
# to syslog is open after init. # to syslog is open after init.
HAVE_SYSLOG = handler.socket.fileno() != -1 HAVE_SYSLOG = handler.socket.fileno() != -1 # type: ignore[attr-defined]
handler.close() handler.close()
except OSError: except OSError:
HAVE_SYSLOG = False HAVE_SYSLOG = False
@ -477,7 +473,7 @@ DEFAULT_LOGLEVEL = "DEBUG" if DEBUG else "INFO"
# the site admins on every HTTP 500 error when DEBUG=False. # the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/stable/topics/logging for # See http://docs.djangoproject.com/en/stable/topics/logging for
# more details on how to customize your logging configuration. # more details on how to customize your logging configuration.
LOGGING = { LOGGING: dict = {
"version": 1, "version": 1,
"disable_existing_loggers": True, "disable_existing_loggers": True,
"filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}}, "filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}},
@ -615,6 +611,10 @@ LOGOUT_URL = f"{URL_PREFIX}/accounts/logout/"
# Default location for login # Default location for login
LOGIN_REDIRECT_URL = f"{URL_PREFIX}/" LOGIN_REDIRECT_URL = f"{URL_PREFIX}/"
LOGOUT_REDIRECT_URL = f"{URL_PREFIX}/"
# Opt-in for Django 6.0 default
FORMS_URLFIELD_ASSUME_HTTPS = True
# Anonymous user name # Anonymous user name
ANONYMOUS_USER_NAME = "anonymous" ANONYMOUS_USER_NAME = "anonymous"
@ -657,6 +657,7 @@ CRISPY_TEMPLATE_PACK = "bootstrap3"
# "weblate.checks.chars.EndColonCheck", # "weblate.checks.chars.EndColonCheck",
# "weblate.checks.chars.EndQuestionCheck", # "weblate.checks.chars.EndQuestionCheck",
# "weblate.checks.chars.EndExclamationCheck", # "weblate.checks.chars.EndExclamationCheck",
# "weblate.checks.chars.EndInterrobangCheck",
# "weblate.checks.chars.EndEllipsisCheck", # "weblate.checks.chars.EndEllipsisCheck",
# "weblate.checks.chars.EndSemicolonCheck", # "weblate.checks.chars.EndSemicolonCheck",
# "weblate.checks.chars.MaxLengthCheck", # "weblate.checks.chars.MaxLengthCheck",
@ -824,6 +825,7 @@ REST_FRAMEWORK = {
"DEFAULT_PAGINATION_CLASS": "weblate.api.pagination.StandardPagination", "DEFAULT_PAGINATION_CLASS": "weblate.api.pagination.StandardPagination",
"PAGE_SIZE": 50, "PAGE_SIZE": 50,
"VIEW_DESCRIPTION_FUNCTION": "weblate.api.views.get_view_description", "VIEW_DESCRIPTION_FUNCTION": "weblate.api.views.get_view_description",
"EXCEPTION_HANDLER": "weblate.api.views.weblate_exception_handler",
"UNAUTHENTICATED_USER": "weblate.auth.models.get_anonymous", "UNAUTHENTICATED_USER": "weblate.auth.models.get_anonymous",
} }
@ -850,6 +852,7 @@ if REQUIRE_LOGIN:
# rf"{URL_PREFIX}/healthz/$", # Allowing public access to health check # rf"{URL_PREFIX}/healthz/$", # Allowing public access to health check
# rf"{URL_PREFIX}/api/(.*)$", # Allowing access to API # rf"{URL_PREFIX}/api/(.*)$", # Allowing access to API
# rf"{URL_PREFIX}/js/i18n/$", # JavaScript localization # rf"{URL_PREFIX}/js/i18n/$", # JavaScript localization
# rf"{URL_PREFIX}/css/custom\.css$", # Custom CSS support
# rf"{URL_PREFIX}/contact/$", # Optional for contact form # rf"{URL_PREFIX}/contact/$", # Optional for contact form
# rf"{URL_PREFIX}/legal/(.*)$", # Optional for legal app # rf"{URL_PREFIX}/legal/(.*)$", # Optional for legal app
# rf"{URL_PREFIX}/avatar/(.*)$", # Optional for avatars # rf"{URL_PREFIX}/avatar/(.*)$", # Optional for avatars
@ -869,7 +872,9 @@ SILENCED_SYSTEM_CHECKS = [
# Celery worker configuration for production # Celery worker configuration for production
CELERY_TASK_ALWAYS_EAGER = False CELERY_TASK_ALWAYS_EAGER = False
CELERY_BROKER_URL = "redis://127.0.0.1:6379/__REDIS_DB__" CELERY_BROKER_URL = "redis://127.0.0.1:6379/__REDIS_DB__"
CELERY_RESULT_BACKEND = CELERY_BROKER_URL CELERY_RESULT_BACKEND: str | None = CELERY_BROKER_URL
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True
CELERY_BROKER_CONNECTION_RETRY = True
# Celery settings, it is not recommended to change these # Celery settings, it is not recommended to change these
CELERY_WORKER_MAX_MEMORY_PER_CHILD = 200000 CELERY_WORKER_MAX_MEMORY_PER_CHILD = 200000
@ -887,7 +892,7 @@ CELERY_TASK_ROUTES = {
# CORS allowed origins # CORS allowed origins
CORS_ALLOWED_ORIGINS = [] CORS_ALLOWED_ORIGINS = []
CORS_URLS_REGEX = r"^/api/.*$" CORS_URLS_REGEX = rf"^{URL_PREFIX}/api/.*$"
# Enable plain database backups # Enable plain database backups
DATABASE_BACKUP = "plain" DATABASE_BACKUP = "plain"

View file

@ -7,7 +7,7 @@ name = "Weblate"
description.en = "Translation platform using Git and Python" description.en = "Translation platform using Git and Python"
description.fr = "Plateforme de traduction utilisant Git et Python" description.fr = "Plateforme de traduction utilisant Git et Python"
version = "5.4.3~ynh1" version = "5.5.3~ynh1"
maintainers = ["Thovi98"] maintainers = ["Thovi98"]
@ -22,7 +22,8 @@ cpe = "cpe:2.3:a:weblate:weblate"
fund = "https://weblate.org/fr/donate/" fund = "https://weblate.org/fr/donate/"
[integration] [integration]
yunohost = ">= 11.2.12" yunohost = ">= 12.0.0"
helpers_version = "2.1"
architectures = "all" architectures = "all"
multi_instance = true multi_instance = true
ldap = false ldap = false
@ -86,6 +87,7 @@ ram.runtime = "3G"
[resources.system_user] [resources.system_user]
[resources.install_dir] [resources.install_dir]
group = "www-data:r-x"
[resources.permissions] [resources.permissions]
main.url = "/" main.url = "/"
@ -94,11 +96,29 @@ ram.runtime = "3G"
main.default = 8080 main.default = 8080
[resources.apt] [resources.apt]
# §1 = weblate dependecies, §2 = borgbackup dependencies packages = [
packages = ["libxml2-dev", "libxslt-dev", "libfreetype6-dev", "libjpeg-dev", "libz-dev", "libyaml-dev", "libffi-dev", "libcairo-dev", "gir1.2-pango-1.0", "libgirepository1.0-dev", "libacl1-dev", "libssl-dev", "libpq-dev", "libjpeg62-turbo-dev", "build-essential", "python3-gdbm", "python3-dev", "python3-pip", "python3-venv", "python3-virtualenv", "virtualenv", "git", "uwsgi", "uwsgi-plugin-python3", "redis-server", "postgresql", "postgresql-contrib", "hub", # Weblate dependencies
"build-essential", "git",
"gir1.2-pango-1.0", "libacl1-dev", "libcairo-dev", "libffi-dev", "libfreetype6-dev",
"libacl1-dev", "libacl1", "libssl-dev", "liblz4-dev", "libzstd-dev", "libxxhash-dev", "build-essential", "pkg-config", "python3-pkgconfig"] "libgirepository1.0-dev", "libjpeg-dev", "libjpeg62-turbo-dev", "libpq-dev",
"libssl-dev", "libxml2-dev", "libxslt-dev", "libyaml-dev", "libz-dev", "librsvg2-dev",
"python3-gdbm",
"python3-dev",
"python3-pip",
"python3-venv",
"python3-virtualenv",
"virtualenv",
"uwsgi",
"uwsgi-plugin-python3",
"redis-server",
"postgresql",
"postgresql-contrib",
"hub",
"gettext",
# Borg backup dependencies
"pkg-config", "python3-pkgconfig",
"libacl1-dev", "libacl1", "libssl-dev", "liblz4-dev", "libzstd-dev", "libxxhash-dev",
]
[resources.database] [resources.database]
type = "postgresql" type = "postgresql"

View file

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
#================================================= #=================================================
# COMMON VARIABLES # COMMON VARIABLES AND CUSTOM HELPERS
#================================================= #=================================================
debian_maj_version=$(sed 's/\..*//' /etc/debian_version) debian_maj_version=$(sed 's/\..*//' /etc/debian_version)
@ -16,10 +16,6 @@ elif [ "$debian_maj_version" -eq 12 ] ; then
weblate_pypath="python3.11" weblate_pypath="python3.11"
fi fi
#=================================================
# PERSONAL HELPERS
#=================================================
set_forge_variables() { set_forge_variables() {
if [ $used_forge = "GitHub" ] ; then if [ $used_forge = "GitHub" ] ; then
github_username="$forge_username" github_username="$forge_username"
@ -33,11 +29,3 @@ set_forge_variables() {
gitlab_token="$forge_token" gitlab_token="$forge_token"
fi fi
} }
#=================================================
# EXPERIMENTAL HELPERS
#=================================================
#=================================================
# FUTURE OFFICIAL HELPERS
#=================================================

View file

@ -1,62 +1,38 @@
#!/bin/bash #!/bin/bash
#=================================================
# GENERIC START
#=================================================
# IMPORT GENERIC HELPERS
#=================================================
# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts
source ../settings/scripts/_common.sh source ../settings/scripts/_common.sh
source /usr/share/yunohost/helpers source /usr/share/yunohost/helpers
#================================================= ynh_print_info "Declaring files to be backed up..."
# DECLARE DATA AND CONF FILES TO BACKUP
#=================================================
ynh_print_info --message="Declaring files to be backed up..."
#================================================= #=================================================
# BACKUP THE APP MAIN DIR # BACKUP THE APP MAIN DIR
#================================================= #=================================================
ynh_backup --src_path="$install_dir" ynh_backup "$install_dir"
#================================================= #=================================================
# BACKUP THE NGINX CONFIGURATION # SYSTEM CONFIGURATION
#================================================= #=================================================
ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf"
#================================================= ynh_backup "/etc/logrotate.d/$app"
# SPECIFIC BACKUP
#=================================================
# BACKUP LOGROTATE
#=================================================
ynh_backup --src_path="/etc/logrotate.d/$app" ynh_backup "/etc/systemd/system/$app.service"
ynh_backup "/etc/systemd/system/$app-celery.service"
#================================================= ynh_backup "/etc/uwsgi/apps-available/$app.ini"
# BACKUP SYSTEMD
#=================================================
ynh_backup --src_path="/etc/systemd/system/$app.service"
ynh_backup --src_path="/etc/systemd/system/$app-celery.service"
#=================================================
# BACKUP VARIOUS FILES
#=================================================
ynh_backup --src_path="/etc/uwsgi/apps-available/$app.ini"
#================================================= #=================================================
# BACKUP THE POSTGRESQL DATABASE # BACKUP THE POSTGRESQL DATABASE
#================================================= #=================================================
ynh_print_info --message="Backing up the PostgreSQL database..." ynh_print_info "Backing up the PostgreSQL database..."
ynh_psql_dump_db --database="$db_name" > db.sql ynh_psql_dump_db > db.sql
#================================================= #=================================================
# END OF SCRIPT # END OF SCRIPT
#================================================= #=================================================
ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." ynh_print_info "Backup script completed for $app. (YunoHost will then actually copy those files to the archive)."

View file

@ -1,87 +1,75 @@
#!/bin/bash #!/bin/bash
#=================================================
# GENERIC STARTING
#=================================================
# IMPORT GENERIC HELPERS
#=================================================
source _common.sh source _common.sh
source /usr/share/yunohost/helpers source /usr/share/yunohost/helpers
#=================================================
# STANDARD MODIFICATIONS
#================================================= #=================================================
# STOP SYSTEMD SERVICE # STOP SYSTEMD SERVICE
#================================================= #=================================================
ynh_script_progression --message="Stopping systemd services..." --weight=1 ynh_script_progression "Stopping systemd services..."
ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/weblate.log" --line_match="goodbye to uWSGI" ynh_systemctl --service=$app --action="stop" --log_path="/var/log/$app/weblate.log" --wait_until="goodbye to uWSGI"
ynh_systemd_action --service_name="$app-celery" --action="stop" --log_path="systemd" ynh_systemctl --service="$app-celery" --action="stop" --log_path="systemd"
#================================================= #=================================================
# MODIFY URL IN NGINX CONF # MODIFY URL IN NGINX CONF
#================================================= #=================================================
ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 ynh_script_progression "Updating NGINX web server configuration..."
ynh_change_url_nginx_config ynh_config_change_url_nginx
#=================================================
# SPECIFIC MODIFICATIONS
#================================================= #=================================================
# MODIFY SETTINGS # MODIFY SETTINGS
#================================================= #=================================================
ynh_script_progression --message="Modify weblate's config file..." --weight=1 ynh_script_progression "Modify weblate's config file..."
settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py"
ynh_backup_if_checksum_is_different --file="$settings" ynh_backup_if_checksum_is_different "$settings"
# Change the path in the nginx config file # Change the path in the nginx config file
if [ $change_path -eq 1 ] if [ $change_path -eq 1 ]
then then
ynh_replace_string --match_string="URL_PREFIX = \"${old_path%/}\"" --replace_string="URL_PREFIX = \"${new_path%/}\"" --target_file="$settings" ynh_replace --match="URL_PREFIX = \"${old_path%/}\"" --replace="URL_PREFIX = \"${new_path%/}\"" --file="$settings"
fi fi
# Change the domain for nginx # Change the domain for nginx
if [ $change_domain -eq 1 ] if [ $change_domain -eq 1 ]
then then
# replace SERVER_EMAIL # replace SERVER_EMAIL
ynh_replace_string --match_string="noreply@$old_domain" --replace_string="noreply@$new_domain" --target_file="$settings" ynh_replace --match="noreply@$old_domain" --replace="noreply@$new_domain" --file="$settings"
# replace SITE_DOMAIN # replace SITE_DOMAIN
ynh_replace_string --match_string="SITE_DOMAIN = \"$old_domain\"" --replace_string="SITE_DOMAIN = \"$new_domain\"" --target_file="$settings" ynh_replace --match="SITE_DOMAIN = \"$old_domain\"" --replace="SITE_DOMAIN = \"$new_domain\"" --file="$settings"
# replace ALLOWED_HOSTS # replace ALLOWED_HOSTS
ynh_replace_string --match_string="ALLOWED_HOSTS = \[\"$old_domain\"\]" --replace_string="ALLOWED_HOSTS = \[\"$new_domain\"\]" --target_file="$settings" ynh_replace --match="ALLOWED_HOSTS = \[\"$old_domain\"\]" --replace="ALLOWED_HOSTS = \[\"$new_domain\"\]" --file="$settings"
fi fi
ynh_store_file_checksum --file="$settings" ynh_store_file_checksum "$settings"
#================================================= #=================================================
# MODIFY UWSGI # MODIFY UWSGI
#================================================= #=================================================
finaluwsgiini="/etc/uwsgi/apps-available/$app.ini" finaluwsgiini="/etc/uwsgi/apps-available/$app.ini"
ynh_backup_if_checksum_is_different --file="$finaluwsgiini" ynh_backup_if_checksum_is_different "$finaluwsgiini"
# Change the path in the nginx config file # Change the path in the nginx config file
if [ $change_path -eq 1 ] if [ $change_path -eq 1 ]
then then
ynh_replace_string --match_string="mount = $old_path=" --replace_string="mount = $new_path=" --target_file="$finaluwsgiini" ynh_replace --match="mount = $old_path=" --replace="mount = $new_path=" --file="$finaluwsgiini"
fi fi
ynh_store_file_checksum --file="$finaluwsgiini" ynh_store_file_checksum "$finaluwsgiini"
#=================================================
# GENERIC FINALISATION
#================================================= #=================================================
# START SYSTEMD SERVICE # START SYSTEMD SERVICE
#================================================= #=================================================
ynh_script_progression --message="Starting a systemd service..." --weight=5 ynh_script_progression "Starting $app's systemd service..."
ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" ynh_systemctl --service=$app --action="start" --log_path="/var/log/$app/weblate.log" --wait_until="spawned uWSGI"
ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" ynh_systemctl --service="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --wait_until="mingle: all alone"
#================================================= #=================================================
# END OF SCRIPT # END OF SCRIPT
#================================================= #=================================================
ynh_script_progression --message="Change of URL completed for $app" --last ynh_script_progression "Change of URL completed for $app"

View file

@ -1,11 +1,5 @@
#!/bin/bash #!/bin/bash
#=================================================
# GENERIC START
#=================================================
# IMPORT GENERIC HELPERS
#=================================================
source _common.sh source _common.sh
source /usr/share/yunohost/helpers source /usr/share/yunohost/helpers
@ -19,11 +13,11 @@ key=$(ynh_string_random --length=50)
#================================================= #=================================================
# STORE SETTINGS FROM MANIFEST # STORE SETTINGS FROM MANIFEST
#================================================= #=================================================
ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_script_progression "Storing installation settings..."
ynh_app_setting_set --app=$app --key=used_forge --value=$used_forge ynh_app_setting_set --key=used_forge --value=$used_forge
ynh_app_setting_set --app=$app --key=forge_username --value=$forge_username ynh_app_setting_set --key=forge_username --value=$forge_username
ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token ynh_app_setting_set --key=forge_token --value=$forge_token
# Remove trailing "/" from the path # Remove trailing "/" from the path
path_no_slash=${path%/} path_no_slash=${path%/}
@ -31,14 +25,14 @@ path_no_slash=${path%/}
#================================================= #=================================================
# CREATE A POSTGRESQL DATABASE # CREATE A POSTGRESQL DATABASE
#================================================= #=================================================
ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 ynh_script_progression "Creating a PostgreSQL database..."
ynh_psql_execute_as_root --sql="CREATE EXTENSION IF NOT EXISTS pg_trgm;" --database=$db_name ynh_psql_db_shell <<< "CREATE EXTENSION IF NOT EXISTS pg_trgm;"
#================================================= #=================================================
# DOWNLOAD, CHECK AND UNPACK SOURCE # DOWNLOAD, CHECK AND UNPACK SOURCE
#================================================= #=================================================
ynh_script_progression --message="Setting up source files..." ynh_script_progression "Setting up source files..."
mkdir -p "$install_dir/avatar-cache" mkdir -p "$install_dir/avatar-cache"
mkdir -p "$install_dir/data" mkdir -p "$install_dir/data"
@ -50,17 +44,14 @@ chown -R $app:www-data "$install_dir"
#================================================= #=================================================
# NGINX CONFIGURATION # NGINX CONFIGURATION
#================================================= #=================================================
ynh_script_progression --message="Configuring NGINX web server..." --weight=2 ynh_script_progression "Configuring NGINX web server..."
# Create a dedicated NGINX config ynh_config_add_nginx
ynh_add_nginx_config
#=================================================
# SPECIFIC SETUP
#================================================= #=================================================
# INSTALL XXHASH # INSTALL XXHASH
#================================================= #=================================================
ynh_script_progression --message="Installing xxHash..." ynh_script_progression "Installing xxHash..."
tempdir="$(mktemp -d)" tempdir="$(mktemp -d)"
ynh_setup_source --dest_dir=$tempdir --source_id="libxxhash" ynh_setup_source --dest_dir=$tempdir --source_id="libxxhash"
@ -68,17 +59,17 @@ pushd $tempdir
make make
make install make install
popd popd
ynh_secure_remove --file="$tempdir" ynh_safe_rm "$tempdir"
#================================================= #=================================================
# CONFIGURE HUB # CONFIGURE HUB
#================================================= #=================================================
if [ $used_forge = "GitHub" ] ; then if [ $used_forge = "GitHub" ] ; then
ynh_script_progression --message="Configure hub..." --weight=1 ynh_script_progression "Configure hub..."
mkdir "$install_dir/.config/" mkdir "$install_dir/.config/"
ynh_add_config --template="../conf/hub_config" --destination="$install_dir/.config/hub" ynh_config_add --template="hub_config" --destination="$install_dir/.config/hub"
cat <<EOF > "$install_dir/.bashrc" cat <<EOF > "$install_dir/.bashrc"
eval "$(hub alias -s /bin/bash)" eval "$(hub alias -s /bin/bash)"
@ -88,7 +79,7 @@ fi
#================================================= #=================================================
# PIP INSTALLATION # PIP INSTALLATION
#================================================= #=================================================
ynh_script_progression --message="Install weblate using PIP..." --weight=80 ynh_script_progression "Install weblate using PIP..."
virtualenv --python=python3 "${install_dir}/venv" virtualenv --python=python3 "${install_dir}/venv"
chown -R $app: "$install_dir" chown -R $app: "$install_dir"
@ -116,17 +107,20 @@ chown -R $app: "$install_dir"
#================================================= #=================================================
# ADD A CONFIGURATION # ADD A CONFIGURATION
#================================================= #=================================================
ynh_script_progression --message="Adding a configuration file..." --weight=1 ynh_script_progression "Adding $app's configuration..."
redis_db=$(ynh_redis_get_free_db) redis_db=$(ynh_redis_get_free_db)
ynh_app_setting_set --app=$app --key=redis_db --value="$redis_db" ynh_app_setting_set --key=redis_db --value="$redis_db"
settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py"
set_forge_variables set_forge_variables
ynh_add_config --template="../conf/settings.py" --destination="$settings" ynh_config_add --template="settings.py" --destination="$settings"
ynh_add_config --template="../conf/celery-weblate" --destination="$install_dir/celery-weblate" ynh_config_add --template="celery-weblate" --destination="$install_dir/celery-weblate"
ynh_add_config --template="../conf/uwsgi.ini" --destination="/etc/uwsgi/apps-available/$app.ini" ynh_config_add --template="uwsgi.ini" --destination="/etc/uwsgi/apps-available/$app.ini"
chmod 640 "/etc/uwsgi/apps-available/$app.ini"
chown $app:$app "/etc/uwsgi/apps-available/$app.ini"
touch "$install_dir/local_settings.py" touch "$install_dir/local_settings.py"
ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py"
@ -142,7 +136,7 @@ chown -R "$app:www-data" "$install_dir/data"
# SPECIFIC SETUP Filling up the database # SPECIFIC SETUP Filling up the database
# https://docs.weblate.org/en/latest/admin/install.html#filling-up-the-database # https://docs.weblate.org/en/latest/admin/install.html#filling-up-the-database
#========================================== #==========================================
ynh_script_progression --message="Filling up the database..." --weight=10 ynh_script_progression "Filling up the database..."
( (
set +o nounset set +o nounset
@ -152,46 +146,44 @@ ynh_script_progression --message="Filling up the database..." --weight=10
cd "${install_dir}" cd "${install_dir}"
# the user needs to be weblate for postgresql # the user needs to be weblate for postgresql
ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate migrate --noinput ynh_hide_warnings sudo --user=$app $install_dir/venv/bin/weblate migrate --noinput
ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate createadmin --no-color \ ynh_hide_warnings sudo --user=$app $install_dir/venv/bin/weblate createadmin --no-color \
--password "$password" \ --password "$password" \
--username "$admin" \ --username "$admin" \
--email "$admin_mail" --email "$admin_mail"
# generate static files # generate static files
ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput ynh_hide_warnings sudo --user=$app $install_dir/venv/bin/weblate collectstatic --noinput
# https://docs.weblate.org/en/latest/admin/install/venv-debian.html # https://docs.weblate.org/en/latest/admin/install/venv-debian.html
ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate compress ynh_hide_warnings sudo --user=$app $install_dir/venv/bin/weblate compress
# Check the configuration # Check the configuration
# This may fail in some cases with errors, etc., but the app works and the user can fix issues later. # This may fail in some cases with errors, etc., but the app works and the user can fix issues later.
ynh_exec_warn_less sudo --user=$app $install_dir/venv/bin/weblate check --deploy || true ynh_hide_warnings sudo --user=$app $install_dir/venv/bin/weblate check --deploy || true
) )
#================================================= #=================================================
# SETUP SYSTEMD # SETUP SYSTEMD
#================================================= #=================================================
ynh_script_progression --message="Configuring a systemd service..." --weight=3 ynh_script_progression "Configuring $app's systemd service..."
ynh_add_systemd_config --service=$app --template="weblate.service" ynh_config_add_systemd --template="weblate.service"
ynh_add_systemd_config --service="$app-celery" --template="celery-weblate.service" ynh_config_add_systemd --service="$app-celery" --template="celery-weblate.service"
#=================================================
# GENERIC FINALIZATION
#================================================= #=================================================
# SETUP LOGROTATE # SETUP LOGROTATE
#================================================= #=================================================
ynh_script_progression --message="Configuring log rotation..." --weight=1 ynh_script_progression "Configuring log rotation..."
# Use logrotate to manage application logfile(s) # Use logrotate to manage application logfile(s)
ynh_use_logrotate --non-append ynh_config_add_logrotate
#================================================= #=================================================
# INTEGRATE SERVICE IN YUNOHOST # INTEGRATE SERVICE IN YUNOHOST
#================================================= #=================================================
ynh_script_progression --message="Integrating service in YunoHost..." --weight=3 ynh_script_progression "Integrating service in YunoHost..."
yunohost service add $app --log="/var/log/$app/weblate.log" yunohost service add $app --log="/var/log/$app/weblate.log"
yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log"
@ -199,13 +191,13 @@ yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log"
#================================================= #=================================================
# START SYSTEMD SERVICE # START SYSTEMD SERVICE
#================================================= #=================================================
ynh_script_progression --message="Starting a systemd service..." --weight=5 ynh_script_progression "Starting $app's systemd service..."
ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" ynh_systemctl --service=$app --action="start" --log_path="/var/log/$app/weblate.log" --wait_until="spawned uWSGI"
ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" ynh_systemctl --service="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --wait_until="mingle: all alone"
#================================================= #=================================================
# END OF SCRIPT # END OF SCRIPT
#================================================= #=================================================
ynh_script_progression --message="Installation of $app completed" --last ynh_script_progression "Installation of $app completed"

View file

@ -1,63 +1,33 @@
#!/bin/bash #!/bin/bash
#=================================================
# GENERIC START
#=================================================
# IMPORT GENERIC HELPERS
#=================================================
source _common.sh source _common.sh
source /usr/share/yunohost/helpers source /usr/share/yunohost/helpers
#================================================= #=================================================
# STANDARD REMOVE # REMOVE SYSTEM CONFIGURATIONS
#=================================================
# REMOVE SERVICE INTEGRATION IN YUNOHOST
#================================================= #=================================================
ynh_script_progression "Removing system configurations related to $app..."
# Remove the service from the list of services known by YunoHost (added from `yunohost service add`) if ynh_hide_warnings yunohost service status $app >/dev/null; then
if ynh_exec_warn_less yunohost service status $app >/dev/null
then
ynh_script_progression --message="Removing $app service integration..." --weight=1
yunohost service remove $app yunohost service remove $app
fi fi
# Remove the service from the list of services known by YunoHost (added from `yunohost service add`) if ynh_hide_warnings yunohost service status "$app-celery" >/dev/null; then
if ynh_exec_warn_less yunohost service status "$app-celery" >/dev/null
then
ynh_script_progression --message="Removing $app-celery service integration..." --weight=1
yunohost service remove "$app-celery" yunohost service remove "$app-celery"
fi fi
#================================================= ynh_config_remove_systemd
# STOP AND REMOVE SERVICE
#=================================================
ynh_script_progression --message="Stopping and removing the systemd service..." --weight=5
# Remove the dedicated systemd config ynh_config_remove_systemd "$app-celery"
ynh_remove_systemd_config --service=$app
ynh_remove_systemd_config --service="$app-celery"
#================================================= ynh_config_remove_logrotate
# REMOVE LOGROTATE CONFIGURATION
#=================================================
ynh_script_progression --message="Removing logrotate configuration..." --weight=1
# Remove the app-specific logrotate config ynh_config_remove_nginx
ynh_remove_logrotate
#=================================================
# REMOVE NGINX CONFIGURATION
#=================================================
ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1
# Remove the dedicated NGINX config
ynh_remove_nginx_config
#================================================= #=================================================
# REMOVE XXHASH # REMOVE XXHASH
#================================================= #=================================================
ynh_script_progression --message="Removing xxHash..." ynh_script_progression "Removing xxHash..."
tempdir="$(mktemp -d)" tempdir="$(mktemp -d)"
ynh_setup_source --dest_dir=$tempdir --source_id="libxxhash" ynh_setup_source --dest_dir=$tempdir --source_id="libxxhash"
@ -65,18 +35,16 @@ pushd $tempdir
make make
make uninstall make uninstall
popd popd
ynh_secure_remove --file="$tempdir" ynh_safe_rm "$tempdir"
#=================================================
# SPECIFIC REMOVE
#================================================= #=================================================
# REMOVE VARIOUS FILES # REMOVE VARIOUS FILES
#================================================= #=================================================
ynh_script_progression --message="Removing various files..." ynh_script_progression "Removing various files..."
ynh_secure_remove --file="/etc/uwsgi/apps-available/$app.ini" ynh_safe_rm "/etc/uwsgi/apps-available/$app.ini"
ynh_secure_remove --file="/var/run/$app-celery" ynh_safe_rm "/var/run/$app-celery"
ynh_redis_remove_db ynh_redis_remove_db
@ -84,4 +52,4 @@ ynh_redis_remove_db
# END OF SCRIPT # END OF SCRIPT
#================================================= #=================================================
ynh_script_progression --message="Removal of $app completed" --last ynh_script_progression "Removal of $app completed"

View file

@ -1,21 +1,14 @@
#!/bin/bash #!/bin/bash
#=================================================
# GENERIC START
#=================================================
# IMPORT GENERIC HELPERS
#=================================================
# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts
source ../settings/scripts/_common.sh source ../settings/scripts/_common.sh
source /usr/share/yunohost/helpers source /usr/share/yunohost/helpers
#================================================= #=================================================
# RESTORE THE APP MAIN DIR # RESTORE THE APP MAIN DIR
#================================================= #=================================================
ynh_script_progression --message="Restoring the app main directory..." --weight=4 ynh_script_progression "Restoring the app main directory..."
ynh_restore_file --origin_path="$install_dir" ynh_restore "$install_dir"
touch "$install_dir/local_settings.py" touch "$install_dir/local_settings.py"
ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py"
@ -29,21 +22,21 @@ chown -R $app:www-data "$install_dir/data"
#================================================= #=================================================
# RESTORE THE NGINX CONFIGURATION # RESTORE THE NGINX CONFIGURATION
#================================================= #=================================================
ynh_script_progression --message="Restoring the NGINX web server configuration..." ynh_script_progression "Restoring the NGINX web server configuration..."
ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" ynh_restore "/etc/nginx/conf.d/$domain.d/$app.conf"
#================================================= #=================================================
# RESTORE THE POSTGRESQL DATABASE # RESTORE THE POSTGRESQL DATABASE
#================================================= #=================================================
ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=5 ynh_script_progression "Restoring the PostgreSQL database..."
ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql ynh_psql_db_shell < ./db.sql
#================================================= #=================================================
# INSTALL XXHASH # INSTALL XXHASH
#================================================= #=================================================
ynh_script_progression --message="Installing xxHash..." ynh_script_progression "Installing xxHash..."
tempdir="$(mktemp -d)" tempdir="$(mktemp -d)"
ynh_setup_source --dest_dir=$tempdir --source_id="libxxhash" ynh_setup_source --dest_dir=$tempdir --source_id="libxxhash"
@ -51,37 +44,37 @@ pushd $tempdir
make make
make install make install
popd popd
ynh_secure_remove --file="$tempdir" ynh_safe_rm "$tempdir"
#================================================= #=================================================
# RESTORE VARIOUS FILES # RESTORE VARIOUS FILES
#================================================= #=================================================
ynh_script_progression --message="Restoring various files..." --weight=1 ynh_script_progression "Restoring various files..."
ynh_restore_file --origin_path="/etc/uwsgi/apps-available/$app.ini" ynh_restore "/etc/uwsgi/apps-available/$app.ini"
#================================================= #=================================================
# RESTORE SYSTEMD # RESTORE SYSTEMD
#================================================= #=================================================
ynh_script_progression --message="Restoring the systemd configuration..." --weight=4 ynh_script_progression "Restoring $app's systemd service..."
ynh_restore_file --origin_path="/etc/systemd/system/$app.service" ynh_restore "/etc/systemd/system/$app.service"
systemctl enable $app.service --quiet systemctl enable $app.service --quiet
ynh_restore_file --origin_path="/etc/systemd/system/$app-celery.service" ynh_restore "/etc/systemd/system/$app-celery.service"
systemctl enable "$app-celery" --quiet systemctl enable "$app-celery" --quiet
#================================================= #=================================================
# RESTORE THE LOGROTATE CONFIGURATION # RESTORE THE LOGROTATE CONFIGURATION
#================================================= #=================================================
ynh_script_progression --message="Restoring the logrotate configuration..." ynh_script_progression "Restoring the logrotate configuration..."
mkdir -p "/var/log/$app" mkdir -p "/var/log/$app"
ynh_restore_file --origin_path="/etc/logrotate.d/$app" ynh_restore "/etc/logrotate.d/$app"
#================================================= #=================================================
# INTEGRATE SERVICE IN YUNOHOST # INTEGRATE SERVICE IN YUNOHOST
#================================================= #=================================================
ynh_script_progression --message="Integrating service in YunoHost..." --weight=3 ynh_script_progression "Integrating service in YunoHost..."
yunohost service add $app --log="/var/log/$app/weblate.log" yunohost service add $app --log="/var/log/$app/weblate.log"
yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log"
@ -89,22 +82,20 @@ yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log"
#================================================= #=================================================
# START SYSTEMD SERVICE # START SYSTEMD SERVICE
#================================================= #=================================================
ynh_script_progression --message="Starting a systemd service..." --weight=5 ynh_script_progression "Starting $app's systemd service..."
ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" ynh_systemctl --service=$app --action="start" --log_path="/var/log/$app/weblate.log" --wait_until="spawned uWSGI"
ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-w1.log" --line_match="mingle: all alone" ynh_systemctl --service="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-w1.log" --wait_until="mingle: all alone"
#=================================================
# GENERIC FINALIZATION
#================================================= #=================================================
# RELOAD NGINX # RELOAD NGINX
#================================================= #=================================================
ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_script_progression "Reloading NGINX web server..."
ynh_systemd_action --service_name=nginx --action=reload ynh_systemctl --service=nginx --action=reload
#================================================= #=================================================
# END OF SCRIPT # END OF SCRIPT
#================================================= #=================================================
ynh_script_progression --message="Restoration completed for $app" --last ynh_script_progression "Restoration completed for $app"

View file

@ -1,18 +1,12 @@
#!/bin/bash #!/bin/bash
#=================================================
# GENERIC START
#=================================================
# IMPORT GENERIC HELPERS
#=================================================
source _common.sh source _common.sh
source /usr/share/yunohost/helpers source /usr/share/yunohost/helpers
#================================================= #=================================================
# LOAD SETTINGS # LOAD SETTINGS
#================================================= #=================================================
ynh_script_progression --message="Loading installation settings..." --weight=1 ynh_script_progression "Loading installation settings..."
admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) admin_mail=$(ynh_user_get_info --username="$admin" --key=mail)
key=$(ynh_string_random --length=50) key=$(ynh_string_random --length=50)
@ -20,51 +14,41 @@ key=$(ynh_string_random --length=50)
# Remove trailing "/" from the path # Remove trailing "/" from the path
path_no_slash=${path%/} path_no_slash=${path%/}
#=================================================
# CHECK VERSION
#=================================================
upgrade_type=$(ynh_check_app_version_changed)
#=================================================
# STANDARD UPGRADE STEPS
#================================================= #=================================================
# STOP SYSTEMD SERVICE # STOP SYSTEMD SERVICE
#================================================= #=================================================
ynh_script_progression --message="Stopping systemd services..." --weight=5 ynh_script_progression "Stopping systemd services..."
ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/weblate.log" --line_match="goodbye to uWSGI" ynh_systemctl --service=$app --action="stop" --log_path="/var/log/$app/weblate.log" --wait_until="goodbye to uWSGI"
ynh_systemd_action --service_name="$app-celery" --action="stop" --log_path="systemd" ynh_systemctl --service="$app-celery" --action="stop" --log_path="systemd"
#================================================= #=================================================
# ENSURE DOWNWARD COMPATIBILITY # ENSURE DOWNWARD COMPATIBILITY
#================================================= #=================================================
ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 ynh_script_progression "Ensuring downward compatibility..."
# If used_forge, forge_username, forge_token don't exist, create them # If used_forge, forge_username, forge_token don't exist, create them
if [ -z "$used_forge" ]; then if [ -z "$used_forge" ]; then
used_forge="GitHub" used_forge="GitHub"
forge_username=$(ynh_app_setting_get --app=$app --key=github_account) forge_username=$(ynh_app_setting_get --key=github_account)
forge_token=$(ynh_app_setting_get --app=$app --key=github_token) forge_token=$(ynh_app_setting_get --key=github_token)
ynh_app_setting_set --app=$app --key=used_forge --value=$used_forge ynh_app_setting_set --key=used_forge --value=$used_forge
ynh_app_setting_set --app=$app --key=forge_username --value=$forge_username ynh_app_setting_set --key=forge_username --value=$forge_username
ynh_app_setting_set --app=$app --key=forge_token --value=$forge_token ynh_app_setting_set --key=forge_token --value=$forge_token
fi fi
#================================================= #=================================================
# NGINX CONFIGURATION # NGINX CONFIGURATION
#================================================= #=================================================
ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=3 ynh_script_progression "Upgrading NGINX web server configuration..."
# Create a dedicated NGINX config # Create a dedicated NGINX config
ynh_add_nginx_config ynh_config_add_nginx
#=================================================
# SPECIFIC UPGRADE
#================================================= #=================================================
# INSTALL XXHASH # INSTALL XXHASH
#================================================= #=================================================
ynh_script_progression --message="Installing xxHash..." ynh_script_progression "Installing xxHash..."
tempdir="$(mktemp -d)" tempdir="$(mktemp -d)"
ynh_setup_source --dest_dir=$tempdir --source_id="libxxhash" ynh_setup_source --dest_dir=$tempdir --source_id="libxxhash"
@ -72,17 +56,17 @@ pushd $tempdir
make make
make install make install
popd popd
ynh_secure_remove --file="$tempdir" ynh_safe_rm "$tempdir"
#================================================= #=================================================
# CONFIGURE HUB # CONFIGURE HUB
#================================================= #=================================================
if [ $used_forge = "GitHub" ] ; then if [ $used_forge = "GitHub" ] ; then
ynh_script_progression --message="Configure hub..." --weight=1 ynh_script_progression "Configure hub..."
#mkdir "$install_dir/.config/" #mkdir "$install_dir/.config/"
ynh_add_config --template="../conf/hub_config" --destination="$install_dir/.config/hub" ynh_config_add --template="hub_config" --destination="$install_dir/.config/hub"
cat <<EOF > "$install_dir/.bashrc" cat <<EOF > "$install_dir/.bashrc"
eval "$(hub alias -s /bin/bash)" eval "$(hub alias -s /bin/bash)"
@ -92,19 +76,20 @@ fi
#================================================= #=================================================
# UPDATE A CONFIG FILE # UPDATE A CONFIG FILE
#================================================= #=================================================
ynh_script_progression --message="Updating a configuration file..." --weight=2 ynh_script_progression "Updating configuration..."
ynh_add_config --template="../conf/uwsgi.ini" --destination="/etc/uwsgi/apps-available/$app.ini" ynh_config_add --template="uwsgi.ini" --destination="/etc/uwsgi/apps-available/$app.ini"
chmod 600 "/etc/uwsgi/apps-available/$app.ini"
ynh_add_config --template="../conf/celery-weblate" --destination="$install_dir/celery-weblate" ynh_config_add --template="celery-weblate" --destination="$install_dir/celery-weblate"
#================================================= #=================================================
# SETUP SYSTEMD # SETUP SYSTEMD
#================================================= #=================================================
ynh_script_progression --message="Configuring a systemd service..." --weight=3 ynh_script_progression "Configuring $app's systemd service..."
ynh_add_systemd_config --service=$app --template="weblate.service" ynh_config_add_systemd --template="weblate.service"
ynh_add_systemd_config --service="$app-celery" --template="celery-weblate.service" ynh_config_add_systemd --service="$app-celery" --template="celery-weblate.service"
#================================================= #=================================================
# UPGRADE WEBLATE # UPGRADE WEBLATE
@ -116,12 +101,11 @@ upgrade() {
#================================================= #=================================================
# PIP INSTALLATION # PIP INSTALLATION
#================================================= #=================================================
ynh_script_progression --message="Install weblate using PIP..." --weight=15 ynh_script_progression "Install weblate using PIP..."
ynh_secure_remove --file="${install_dir}/venv" ynh_safe_rm "${install_dir}/venv"
virtualenv --python=python3 "${install_dir}/venv" virtualenv --python=python3 "${install_dir}/venv"
chown -R $app: "$install_dir" chown -R $app: "$install_dir"
#run source in a 'sub shell' #run source in a 'sub shell'
( (
set +o nounset set +o nounset
@ -144,19 +128,20 @@ upgrade() {
#================================================= #=================================================
# MODIFY A CONFIG FILE # MODIFY A CONFIG FILE
#================================================= #=================================================
ynh_script_progression --message="Create weblate configuration file..." --weight=2 ynh_script_progression "Create weblate configuration file..."
# save old settings file # save old settings file
settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" settings="$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/settings.py"
path="${path%/}" path="${path%/}"
set_forge_variables set_forge_variables
ynh_add_config --template="../conf/settings.py" --destination="$settings" ynh_config_add --template="settings.py" --destination="$settings"
ynh_app_setting_set --app=$app --key=redis_db --value="$redis_db" ynh_app_setting_set --key=redis_db --value="$redis_db"
# Recalculate and store the config file checksum into the app settings # Recalculate and store the config file checksum into the app settings
ynh_store_file_checksum --file="$settings" ynh_store_file_checksum "$settings"
touch "$install_dir/local_settings.py" touch "$install_dir/local_settings.py"
ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py" ln -sf "$install_dir/local_settings.py" "$install_dir/venv/lib/$weblate_pypath/site-packages/weblate/local_settings.py"
@ -164,9 +149,9 @@ upgrade() {
#================================================= #=================================================
# MIGRATE WEBLATE # MIGRATE WEBLATE
#================================================= #=================================================
ynh_script_progression --message="Run migration scripts..." --weight=10 ynh_script_progression "Run migration scripts..."
ynh_systemd_action --service_name="$app-celery" --action="start" ynh_systemctl --service="$app-celery" --action="start"
( (
set +o nounset set +o nounset
@ -189,7 +174,7 @@ upgrade() {
fi fi
) )
ynh_systemd_action --service_name="$app-celery" --action="stop" ynh_systemctl --service="$app-celery" --action="stop"
} }
file_version="${install_dir}/venv/lib/$weblate_pypath/site-packages/weblate/__init__.py" file_version="${install_dir}/venv/lib/$weblate_pypath/site-packages/weblate/__init__.py"
@ -205,7 +190,7 @@ else
current_version=3 current_version=3
fi fi
ynh_psql_execute_as_root --sql="CREATE EXTENSION IF NOT EXISTS pg_trgm;" --database=$db_name ynh_psql_db_shell <<< "CREATE EXTENSION IF NOT EXISTS pg_trgm;"
if [ "$current_version" -lt "5" ] if [ "$current_version" -lt "5" ]
then then
@ -223,20 +208,18 @@ chown -R "$app:www-data" "$install_dir/data"
chmod 750 "$install_dir" chmod 750 "$install_dir"
chmod -R o-rwx "$install_dir" chmod -R o-rwx "$install_dir"
#=================================================
# GENERIC FINALIZATION
#================================================= #=================================================
# SETUP LOGROTATE # SETUP LOGROTATE
#================================================= #=================================================
ynh_script_progression --message="Upgrading logrotate configuration..." --weight=1 ynh_script_progression "Upgrading logrotate configuration..."
# Use logrotate to manage app-specific logfile(s) # Use logrotate to manage app-specific logfile(s)
ynh_use_logrotate --non-append ynh_config_add_logrotate
#================================================= #=================================================
# INTEGRATE SERVICE IN YUNOHOST # INTEGRATE SERVICE IN YUNOHOST
#================================================= #=================================================
ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 ynh_script_progression "Integrating service in YunoHost..."
yunohost service add $app --log="/var/log/$app/weblate.log" yunohost service add $app --log="/var/log/$app/weblate.log"
yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log" yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log"
@ -244,13 +227,13 @@ yunohost service add "$app-celery" --log="/var/log/$app/weblate-celery-w1.log"
#================================================= #=================================================
# START SYSTEMD SERVICES # START SYSTEMD SERVICES
#================================================= #=================================================
ynh_script_progression --message="Starting systemd services..." --weight=5 ynh_script_progression "Starting systemd services..."
ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/weblate.log" --line_match="spawned uWSGI" ynh_systemctl --service=$app --action="start" --log_path="/var/log/$app/weblate.log" --wait_until="spawned uWSGI"
ynh_systemd_action --service_name="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --line_match="mingle: all alone" ynh_systemctl --service="$app-celery" --action="start" --log_path="/var/log/$app/weblate-celery-celery.log" --wait_until="mingle: all alone"
#================================================= #=================================================
# END OF SCRIPT # END OF SCRIPT
#================================================= #=================================================
ynh_script_progression --message="Upgrade of $app completed" --last ynh_script_progression "Upgrade of $app completed"

View file

@ -27,4 +27,5 @@ test_format = 1.0
test_upgrade_from.52db1ab.name = "5.3.1-ynh2" test_upgrade_from.52db1ab.name = "5.3.1-ynh2"
test_upgrade_from.e075efc.name = "5.4.1" test_upgrade_from.e075efc.name = "5.4.1"
test_upgrade_from.40ff28f.name = "5.4.2" test_upgrade_from.40ff28f.name = "5.4.2"
test_upgrade_from.def94c9.name = "5.4.3"