From 96ef2e0de97f7a99ac64ae3a1f18c5f976a78bac Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Jun 2021 15:32:27 +0200 Subject: [PATCH 01/10] Add ynh_add_config --- check_process | 14 ++----- conf/hub_config | 4 +- conf/settings.py | 10 ++--- conf/uwsgi.ini | 2 +- doc/screenshots/BigScreenshot.png | Bin 0 -> 52698 bytes scripts/install | 44 +++++----------------- scripts/upgrade | 60 +++--------------------------- 7 files changed, 28 insertions(+), 106 deletions(-) create mode 100644 doc/screenshots/BigScreenshot.png diff --git a/check_process b/check_process index f34e813..470ce69 100644 --- a/check_process +++ b/check_process @@ -1,15 +1,10 @@ -# See here for more informations -# https://github.com/YunoHost/package_check#syntax-check_process-file - -# Move this file from check_process.default to check_process when you have filled it. - ;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin="john" (USER) + domain="domain.tld" + path="/path" + admin="john" password="randompass" - is_public=1 (PUBLIC|public=1|private=0) + is_public=1 github_account="myaccount" github_token="myoauthtoken" ; Checks @@ -23,7 +18,6 @@ upgrade=1 from_commit=cef22ac5634565cecd2d8545229efe3fe79d85bc backup_restore=1 multi_instance=1 - port_already_use=0 change_url=1 ;;; Options Email= diff --git a/conf/hub_config b/conf/hub_config index 289ab03..99df3d0 100644 --- a/conf/hub_config +++ b/conf/hub_config @@ -1,4 +1,4 @@ github.com: -- user: __GITHUBUSER__ - oauth_token: __GITHUBTOKEN__ +- user: __GITHUB_ACCOUNT__ + oauth_token: __GITHUB_TOKEN__ protocol: https diff --git a/conf/settings.py b/conf/settings.py index e15e977..1d8ced6 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -42,7 +42,7 @@ from logging.handlers import SysLogHandler DEBUG = False ADMINS = ( - ('__ADMIN__', '__ADMINMAIL__'), + ('__ADMIN__', '__ADMIN_MAIL__'), ) MANAGERS = ADMINS @@ -52,9 +52,9 @@ DATABASES = { # Use "postgresql" or "mysql". "ENGINE": "django.db.backends.postgresql", # Database name. - "NAME": "__NAME__", + "NAME": "__APP__", # Database user. - "USER": "__NAME__", + "USER": "__APP__", # Name of role to alter to set parameters in PostgreSQL, # use in case role name is different than user used for authentication. # "ALTER_ROLE": "weblate", @@ -221,8 +221,8 @@ TEMPLATES = [ # GitHub username and token for sending pull requests. # Please see the documentation for more details. -GITHUB_USERNAME = "__GITHUBUSER__" -GITHUB_TOKEN = "__GITHUBTOKEN__" +GITHUB_USERNAME = "__GITHUB_ACCOUNT__" +GITHUB_TOKEN = "__GITHUB_TOKEN__" # GitLab username and token for sending merge requests. # Please see the documentation for more details. diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index 31a67b9..3a9e12f 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -5,7 +5,7 @@ protocol = uwsgi socket = /var/run/__APP__/socket # http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info -mount = __PATH__=__FINALPATH__/venv/lib/__PYTHONPATH__/site-packages/weblate/wsgi.py +mount = __PATH__=__FINALPATH__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py # Add path to Weblate checkout if you did not install # Weblate by pip diff --git a/doc/screenshots/BigScreenshot.png b/doc/screenshots/BigScreenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b2bf4d991e261063b132b94c5b2c3788eb2d5c14 GIT binary patch literal 52698 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 h0vI3)!Hf!YImR%_b7x(&)q6lDd%F6$taD0e0su "$final_path/.bashrc" eval "$(hub alias -s /bin/bash)" @@ -147,25 +145,10 @@ db_pwd=$(ynh_app_setting_get --app="$app" --key=psqlpwd) admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) key=$(ynh_string_random --length=50) redis_db=$(ynh_redis_get_free_db) - +path_url="${path_url%/}" settings="$final_path/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" -cp "../conf/settings.py" "$settings" -ynh_replace_string --match_string="__NAME__" --replace_string="$app" --target_file="$settings" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$settings" -ynh_replace_string --match_string="__ADMIN__" --replace_string="$admin" --target_file="$settings" -ynh_replace_string --match_string="__ADMINMAIL__" --replace_string="$admin_mail" --target_file="$settings" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$settings" -ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$settings" -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$settings" -ynh_replace_string --match_string="__GITHUBUSER__" --replace_string="$github_account" --target_file="$settings" -ynh_replace_string --match_string="__GITHUBTOKEN__" --replace_string="$github_token" --target_file="$settings" -ynh_replace_string --match_string="__REDIS_DB__" --replace_string="$redis_db" --target_file="$settings" -ynh_replace_string --match_string="__PYTHONPATH__" --replace_string="$weblate_pypath" --target_file="$settings" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$settings" - -# remove last "/" of $path_url -ynh_replace_string --match_string="__PATHURL__" --replace_string="${path_url%/}" --target_file="$settings" +ynh_add_config --template="../conf/settings.py" --destination="$settings" ynh_app_setting_set --app="$app" --key=redis_db --value="$redis_db" @@ -211,16 +194,9 @@ ynh_store_file_checksum --file="$settings" #================================================= ynh_script_progression --message="Configure uwsgi..." - finaluwsgiini="/etc/uwsgi/apps-available/$app.ini" -cp ../conf/uwsgi.ini "$finaluwsgiini" -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$finaluwsgiini" -ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$finaluwsgiini" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$finaluwsgiini" -ynh_replace_string --match_string="__PYTHONPATH__" --replace_string="$weblate_pypath" --target_file="$finaluwsgiini" - -ynh_store_file_checksum --file="$finaluwsgiini" +ynh_add_config --template="../conf/uwsgi.ini" --destination="$finaluwsgiini" #================================================= # SETUP SYSTEMD @@ -235,10 +211,8 @@ ynh_add_systemd_config --service="$app" --template="weblate.service" ynh_script_progression --message="Configure celery..." celeryconf="$final_path/celery-weblate" -cp ../conf/celery-weblate "$celeryconf" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$celeryconf" -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$celeryconf" +ynh_add_config --template="../conf/celery-weblate" --destination="$celeryconf" ynh_add_systemd_config --service="$app-celery" --template="celery-weblate.service" @@ -276,9 +250,7 @@ yunohost service add "$app-celery" --log "/var/log/$app/weblate-celery-w1.log" #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring SSOwat..." - - +ynh_script_progression --message="Configuring permissions..." # Make app public if necessary if [ "$is_public" -eq 1 ] @@ -312,4 +284,8 @@ If you facing an issue or want to improve this app, please open a new issue in t ynh_send_readme_to_admin "$message" "$admin" +#================================================= +# END OF SCRIPT +#================================================= + ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/upgrade b/scripts/upgrade index 9763411..7e59937 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -58,15 +58,6 @@ fi #================================================= ynh_script_progression --message="Ensuring downward compatibility..." -# Fix is_public as a boolean value -if [ "$is_public" = "Yes" ]; then - ynh_app_setting_set --app=$app --key=is_public --value=1 - is_public=1 -elif [ "$is_public" = "No" ]; then - ynh_app_setting_set --app=$app --key=is_public --value=0 - is_public=0 -fi - if [[ -d "$final_path/bin/" ]] then ynh_secure_remove --file="$final_path/bin/" @@ -122,9 +113,7 @@ ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell ynh_script_progression --message="Configure hub..." mkdir -p "$final_path/.config/" -cp ../conf/hub_config "$final_path/.config/hub" -ynh_replace_string --match_string="__GITHUBUSER__" --replace_string="$github_account" --target_file="$final_path/.config/hub" -ynh_replace_string --match_string="__GITHUBTOKEN__" --replace_string="$github_token" --target_file="$final_path/.config/hub" +ynh_add_config --template="../conf/hub_config" --destination="$final_path/.config/hub" cat < "$final_path/.bashrc" eval "$(hub alias -s /bin/bash)" @@ -136,15 +125,8 @@ EOF ynh_script_progression --message="Configure uwsgi..." finaluwsgiini="/etc/uwsgi/apps-available/$app.ini" -ynh_backup_if_checksum_is_different --file="$finaluwsgiini" -cp ../conf/uwsgi.ini "$finaluwsgiini" -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$finaluwsgiini" -ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="$finaluwsgiini" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$finaluwsgiini" -ynh_replace_string --match_string="__PYTHONPATH__" --replace_string="$weblate_pypath" --target_file="$finaluwsgiini" - -ynh_store_file_checksum --file="$finaluwsgiini" +ynh_add_config --template="../conf/uwsgi.ini" --destination="$finaluwsgiini" #================================================= # SETUP SYSTEMD @@ -159,10 +141,8 @@ ynh_add_systemd_config --service="$app" --template="weblate.service" ynh_script_progression --message="Configure celery..." celeryconf="$final_path/celery-weblate" -cp ../conf/celery-weblate "$celeryconf" -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$celeryconf" -ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$celeryconf" +ynh_add_config --template="../conf/celery-weblate" --destination="$celeryconf" ynh_add_systemd_config --service="$app-celery" --template="celery-weblate.service" @@ -205,25 +185,9 @@ upgrade() { ynh_script_progression --message="Create weblate configuration file..." # save old settings file settings="$final_path/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" + path_url="${path_url%/}" - ynh_backup_if_checksum_is_different --file="$settings" - cp "$settings_template" "$settings" - - ynh_replace_string --match_string="__NAME__" --replace_string="$app" --target_file="$settings" - ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$settings" - ynh_replace_string --match_string="__ADMIN__" --replace_string="$admin" --target_file="$settings" - ynh_replace_string --match_string="__ADMINMAIL__" --replace_string="$admin_mail" --target_file="$settings" - ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$settings" - ynh_replace_string --match_string="__KEY__" --replace_string="$key" --target_file="$settings" - ynh_replace_string --match_string="__FINALPATH__" --replace_string="$final_path" --target_file="$settings" - ynh_replace_string --match_string="__GITHUBUSER__" --replace_string="$github_account" --target_file="$settings" - ynh_replace_string --match_string="__GITHUBTOKEN__" --replace_string="$github_token" --target_file="$settings" - ynh_replace_string --match_string="__REDIS_DB__" --replace_string="$redis_db" --target_file="$settings" - ynh_replace_string --match_string="__PYTHONPATH__" --replace_string="$weblate_pypath" --target_file="$settings" - ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$settings" - - # remove last "/" of $path_url - ynh_replace_string --match_string="__PATHURL__" --replace_string="${path_url%/}" --target_file="$settings" + ynh_add_config --template="../conf/settings.py" --destination="$settings" ynh_app_setting_set --app="$app" --key=redis_db --value="$redis_db" @@ -322,18 +286,6 @@ ynh_script_progression --message="Starting systemd services..." --weight=5 ynh_systemd_action --service_name="$app" --action="start" ynh_systemd_action --service_name="$app-celery" --action="start" -#================================================= -# SETUP SSOWAT -#================================================= -ynh_script_progression --message="Upgrading SSOwat configuration..." - -# Make app public if necessary -if [ "$is_public" -eq 1 ] -then - # unprotected_uris allows SSO credentials to be passed anyway. - ynh_app_setting_set --app="$app" --key=unprotected_uris --value="/" -fi - #================================================= # RELOAD NGINX #================================================= @@ -345,4 +297,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of $app completed" --last \ No newline at end of file +ynh_script_progression --message="Upgrade of $app completed" --last From ee856f54c5ee1c6000f3e297e8c195424a2fa456 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Jun 2021 17:56:18 +0200 Subject: [PATCH 02/10] Update settings.4.1.1.py --- conf/settings.4.1.1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/settings.4.1.1.py b/conf/settings.4.1.1.py index 52fe16b..3174475 100644 --- a/conf/settings.4.1.1.py +++ b/conf/settings.4.1.1.py @@ -136,7 +136,7 @@ USE_L10N = True USE_TZ = True # URL prefix to use, please see documentation for more details -URL_PREFIX = "__PATHURL__" +URL_PREFIX = "__PATH_URL__" # Absolute filesystem path to the directory that will hold user-uploaded files. MEDIA_ROOT = os.path.join(DATA_DIR, "media") From 7d1f1adf602cb3361ba5b949768f6130c318cee5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Jun 2021 18:07:21 +0200 Subject: [PATCH 03/10] Update upgrade --- scripts/upgrade | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 7e59937..565d240 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -16,7 +16,6 @@ ynh_script_progression --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME path_url=$(ynh_app_setting_get --app="$app" --key=path) -is_public=$(ynh_app_setting_get --app="$app" --key=is_public) final_path=$(ynh_app_setting_get --app="$app" --key=final_path) db_name=$(ynh_app_setting_get --app="$app" --key=db_name) db_user=$db_name From 95ce7293997e73f0ea6eac02b4f6cc8eb6caf01e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Jun 2021 18:24:51 +0200 Subject: [PATCH 04/10] Fix --- doc/DISCLAIMER.md | 17 +++++++++++++++++ doc/DISCLAIMER_fr.md | 17 +++++++++++++++++ manifest.json | 14 +++++++++++--- scripts/change_url | 10 +++++----- scripts/install | 28 ++++++++++++++-------------- scripts/remove | 16 ++++++++-------- scripts/restore | 16 ++++++++-------- scripts/upgrade | 26 +++++++++++++------------- 8 files changed, 93 insertions(+), 51 deletions(-) create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/DISCLAIMER_fr.md diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..fa73e74 --- /dev/null +++ b/doc/DISCLAIMER.md @@ -0,0 +1,17 @@ +## GitHub + +You'll need to give Weblate a GitHub user and a token. Please read [GitHub's documentation about token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/). +This user will only be used to open the pull-request, each translation keep his author. + +**SSH keys**, you will have to go in administration, and generate a public key for Weblate and add github.com so Weblate knows the fingerprint. Please note if your account already have a public key (ssh-rsa), you will have to manually add the Weblate's one to your GitHub account. + +## Settings and upgrades + +Almost everything related to Weblate's configuration is handled in a `settings.py` file. +You can edit the file `$final_path/local_settings.py` to enable or disable features. + +# Miscellaneous + +## LDAP connexion + +It doesn't work yet, but while [it looks doable](https://docs.weblate.org/en/latest/admin/auth.html?highlight=LDAP#ldap-authentication), I'm unsure it is a good idea to connect this kind of tools to your LDAP. diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md new file mode 100644 index 0000000..ffab432 --- /dev/null +++ b/doc/DISCLAIMER_fr.md @@ -0,0 +1,17 @@ +## GitHub + +Vous devrez donner à Weblate un utilisateur GitHub et un jeton. Veuillez lire [la documentation de GitHub sur le jeton](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/). +Cet utilisateur ne sera utilisé que pour ouvrir la pull-request, chaque traduction garde son auteur. + +**Clés SSH**, vous devrez vous rendre dans l'administration, générer une clé publique pour Weblate et ajouter github.com pour que Weblate connaisse l'empreinte digitale. Veuillez noter que si votre compte possède déjà une clé publique (ssh-rsa), vous devrez ajouter manuellement celle de Weblate à votre compte GitHub. + +## Paramètres et mises à niveau + +Presque tout ce qui concerne la configuration de Weblate est géré dans un fichier `settings.py`. +Vous pouvez éditer le fichier `$final_path/local_settings.py` pour activer ou désactiver des fonctionnalités. + +# Divers + +## Connexion LDAP + +Cela ne fonctionne pas encore, mais bien que [cela semble faisable](https://docs.weblate.org/en/latest/admin/auth.html?highlight=LDAP#ldap-authentication), je ne suis pas sûr que ce soit le cas une bonne idée de connecter ce genre d'outils à votre LDAP. \ No newline at end of file diff --git a/manifest.json b/manifest.json index 6722699..e50c69d 100644 --- a/manifest.json +++ b/manifest.json @@ -3,11 +3,19 @@ "id": "weblate", "packaging_format": 1, "description": { - "en": "A translation platform using Git and Python", - "fr": "Une plateforme de traduction utilisant Git et Python" + "en": "Translation platform using Git and Python", + "fr": "Plateforme de traduction utilisant Git et Python" }, "version": "4.7~ynh1", "url": "https://weblate.org", + "upstream": { + "license": "AGPL-3.0", + "website": "https://weblate.org", + "demo": "https://translate.yunohost.org", + "admindoc": "https://docs.weblate.org/", + "userdoc": "https://yunohost.org/apps", + "code": "https://github.com/WeblateOrg/weblate" + }, "license": "AGPL-3.0", "maintainer": { "name": "", @@ -18,7 +26,7 @@ "email": "jean-baptiste@holcroft.fr" }], "requirements": { - "yunohost": ">= 4.1.0" + "yunohost": ">= 4.2.0" }, "multi_instance": true, "services": [ diff --git a/scripts/change_url b/scripts/change_url index 47a73ca..4da5110 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -24,7 +24,7 @@ app=$YNH_APP_INSTANCE_NAME #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." --weight=1 final_path=$(ynh_app_setting_get --app="$app" --key=final_path) is_public=$(ynh_app_setting_get --app="$app" --key=is_public) @@ -67,7 +67,7 @@ fi #================================================= # STOP SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Stopping systemd services..." +ynh_script_progression --message="Stopping systemd services..." --weight=1 ynh_systemd_action --service_name="$app" --action="stop" ynh_systemd_action --service_name="$app-celery" --action="stop" @@ -77,7 +77,7 @@ ynh_systemd_action --service_name="$app-celery" --action="stop" #================================================= # MODIFY URL IN NGINX CONF #================================================= -ynh_script_progression --message="Updating nginx web server configuration..." +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf @@ -108,7 +108,7 @@ fi #================================================= # MODIFY SETTINGS #================================================= -ynh_script_progression --message="Modify weblate's config file..." +ynh_script_progression --message="Modify weblate's config file..." --weight=1 settings="$final_path/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" ynh_backup_if_checksum_is_different --file="$settings" @@ -160,7 +160,7 @@ ynh_systemd_action --service_name="$app-celery" --action="start" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/install b/scripts/install index 5a561e4..61d19c1 100755 --- a/scripts/install +++ b/scripts/install @@ -33,7 +33,7 @@ app=$YNH_APP_INSTANCE_NAME #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= -ynh_script_progression --message="Validating installation parameters..." +ynh_script_progression --message="Validating installation parameters..." --weight=1 final_path=/var/www/$app test ! -e "$final_path" || ynh_die --message="This path already contains a folder" @@ -46,7 +46,7 @@ mkdir -p "$final_path" #================================================= # STORE SETTINGS FROM MANIFEST #================================================= -ynh_script_progression --message="Storing installation settings..." +ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app="$app" --key=domain --value="$domain" ynh_app_setting_set --app="$app" --key=path --value="$path_url" @@ -67,7 +67,7 @@ ynh_exec_warn_less ynh_install_app_dependencies "$pkg_dependencies" #================================================= # CREATE A PostgreSQL DATABASE #================================================= -ynh_script_progression --message="Creating a PostgreSQL database..." +ynh_script_progression --message="Creating a PostgreSQL database..." --weight=2 db_name=$(ynh_sanitize_dbid --db_name="$app") db_user=$db_name @@ -81,7 +81,7 @@ ynh_psql_setup_db --db_user="$db_user" --db_name="$db_name" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring nginx web server..." +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 # Create a dedicated nginx config ynh_add_nginx_config @@ -89,7 +89,7 @@ ynh_add_nginx_config #================================================= # CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Configuring system user..." +ynh_script_progression --message="Configuring system user..." --weight=1 # Hub needs a home directory with a config file ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell @@ -97,7 +97,7 @@ ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell #================================================= # CONFIGURE HUB #================================================= -ynh_script_progression --message="Configure hub..." +ynh_script_progression --message="Configure hub..." --weight=1 mkdir "$final_path/.config/" ynh_add_config --template="../conf/hub_config" --destination="$final_path/.config/hub" @@ -139,7 +139,7 @@ chown -R "$app": "$final_path" # https://docs.weblate.org/en/latest/admin/install.html#installation # TODO: use --extra-search-dir=/path/to/dists #================================================= -ynh_script_progression --message="Create weblate configuration file..." +ynh_script_progression --message="Create weblate configuration file..." --weight=1 db_pwd=$(ynh_app_setting_get --app="$app" --key=psqlpwd) admin_mail=$(ynh_user_get_info --username="$admin" --key=mail) @@ -192,7 +192,7 @@ ynh_store_file_checksum --file="$settings" #================================================= # SPECIFIC SETUP UWSGI #================================================= -ynh_script_progression --message="Configure uwsgi..." +ynh_script_progression --message="Configure uwsgi..." --weight=1 finaluwsgiini="/etc/uwsgi/apps-available/$app.ini" @@ -201,14 +201,14 @@ ynh_add_config --template="../conf/uwsgi.ini" --destination="$finaluwsgiini" #================================================= # SETUP SYSTEMD #================================================= -ynh_script_progression --message="Configuring a systemd service..." +ynh_script_progression --message="Configuring a systemd service..." --weight=2 ynh_add_systemd_config --service="$app" --template="weblate.service" #================================================= # ACTIVATE CELERY #================================================= -ynh_script_progression --message="Configure celery..." +ynh_script_progression --message="Configure celery..." --weight=1 celeryconf="$final_path/celery-weblate" @@ -234,7 +234,7 @@ chmod -R o-rwx "$final_path" #================================================= # SETUP LOGROTATE #================================================= -ynh_script_progression --message="Configuring log rotation..." +ynh_script_progression --message="Configuring log rotation..." --weight=1 # Use logrotate to manage application logfile(s) ynh_use_logrotate --non-append @@ -242,7 +242,7 @@ ynh_use_logrotate --non-append #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." +ynh_script_progression --message="Integrating service in YunoHost..." --weight=3 yunohost service add "$app" --log "/var/log/$app/weblate.log" yunohost service add "$app-celery" --log "/var/log/$app/weblate-celery-w1.log" @@ -250,7 +250,7 @@ yunohost service add "$app-celery" --log "/var/log/$app/weblate-celery-w1.log" #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring permissions..." +ynh_script_progression --message="Configuring permissions..." --weight=1 # Make app public if necessary if [ "$is_public" -eq 1 ] @@ -269,7 +269,7 @@ ynh_systemd_action --service_name="$app-celery" --action="start" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name="nginx" --action="reload" diff --git a/scripts/remove b/scripts/remove index a490614..3db18e2 100755 --- a/scripts/remove +++ b/scripts/remove @@ -12,7 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app="$app" --key=domain) @@ -29,14 +29,14 @@ final_path=$(ynh_app_setting_get --app="$app" --key=final_path) # Remove a service from the admin panel, added by `yunohost service add` if yunohost service status "$app" >/dev/null 2>&1 then - ynh_script_progression --message="Removing $app service integration..." + ynh_script_progression --message="Removing $app service integration..." --weight=1 yunohost service remove "$app" fi # Remove a service from the admin panel, added by `yunohost service add` if yunohost service status "$app-celery" >/dev/null 2>&1 then - ynh_script_progression --message="Removing $app-celery service integration..." + ynh_script_progression --message="Removing $app-celery service integration..." --weight=1 yunohost service remove "$app-celery" fi @@ -51,7 +51,7 @@ ynh_remove_systemd_config --service="$app-celery" #================================================= # REMOVE THE PostgreSQL DATABASE #================================================= -ynh_script_progression --message="Removing the PostgreSQL database..." +ynh_script_progression --message="Removing the PostgreSQL database..." --weight=1 # Remove a database if it exists, along with the associated user ynh_psql_remove_db --db_user=$db_user --db_name=$db_name @@ -75,7 +75,7 @@ ynh_exec_warn_less ynh_remove_app_dependencies #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing app main directory..." +ynh_script_progression --message="Removing app main directory..." --weight=2 # Remove the app directory securely ynh_secure_remove --file="$final_path" @@ -83,7 +83,7 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing nginx web server configuration..." +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 # Remove the dedicated nginx config ynh_remove_nginx_config @@ -91,7 +91,7 @@ ynh_remove_nginx_config #================================================= # REMOVE LOGROTATE CONFIGURATION #================================================= -ynh_script_progression --message="Removing logrotate configuration..." +ynh_script_progression --message="Removing logrotate configuration..." --weight=1 # Remove the app-specific logrotate config ynh_remove_logrotate @@ -109,7 +109,7 @@ ynh_secure_remove --file="/var/run/$app-celery" #================================================= # REMOVE DEDICATED USER #================================================= -ynh_script_progression --message="Removing the dedicated system user..." +ynh_script_progression --message="Removing the dedicated system user..." --weight=1 # Delete a system user ynh_system_user_delete --username="$app" diff --git a/scripts/restore b/scripts/restore index b590397..2389760 100755 --- a/scripts/restore +++ b/scripts/restore @@ -18,7 +18,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading settings..." +ynh_script_progression --message="Loading settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -32,7 +32,7 @@ db_pwd=$(ynh_app_setting_get --app="$app" --key=psqlpwd) #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= -ynh_script_progression --message="Validating restoration parameters..." +ynh_script_progression --message="Validating restoration parameters..." --weight=1 ynh_webpath_available --domain=$domain --path_url=$path_url \ || ynh_die --message="Path not available: ${domain}${path_url}" @@ -50,7 +50,7 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring the app main directory..." +ynh_script_progression --message="Restoring the app main directory..." --weight=4 ynh_restore_file --origin_path="$final_path" @@ -60,7 +60,7 @@ ln -sf "$final_path/local_settings.py" "$final_path/venv/lib/$weblate_pypath/sit #================================================= # RECREATE THE DEDICATED USER #================================================= -ynh_script_progression --message="Recreating the dedicated system user..." +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 # Create the dedicated user (if not existing) ynh_system_user_create --username=$app --home_dir="$final_path" --use_shell @@ -100,7 +100,7 @@ ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./d #================================================= # RESTORE SYSTEMD #================================================= -ynh_script_progression --message="Restoring the systemd configuration..." +ynh_script_progression --message="Restoring the systemd configuration..." --weight=4 ynh_restore_file --origin_path="/etc/systemd/system/$app.service" systemctl enable $app.service --quiet @@ -110,14 +110,14 @@ systemctl enable "$app-celery" --quiet #================================================= # RESTORE UWSGI #================================================= -ynh_script_progression --message="Restoring uwsgi configurations..." +ynh_script_progression --message="Restoring uwsgi configurations..." --weight=1 ynh_restore_file --origin_path="/etc/uwsgi/apps-available/$app.ini" #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." +ynh_script_progression --message="Integrating service in YunoHost..." --weight=3 yunohost service add "$app" --log "/var/log/$app/weblate.log" yunohost service add "$app-celery" --log "/var/log/$app/weblate-celery-w1.log" @@ -142,7 +142,7 @@ ynh_systemd_action --service_name="$app-celery" --action="start" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name="nginx" --action="reload" diff --git a/scripts/upgrade b/scripts/upgrade index 565d240..91b1115 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -11,7 +11,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -55,7 +55,7 @@ fi #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_script_progression --message="Ensuring downward compatibility..." +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 if [[ -d "$final_path/bin/" ]] then @@ -84,7 +84,7 @@ ynh_systemd_action --service_name="$app-celery" --action="stop" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading nginx web server configuration..." +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=3 # Create a dedicated nginx config ynh_add_nginx_config @@ -94,14 +94,14 @@ ynh_add_nginx_config #================================================= # Update dependencies #================================================= -ynh_script_progression --message="Upgrading dependencies..." +ynh_script_progression --message="Upgrading dependencies..." --weight=5 ynh_exec_warn_less ynh_install_app_dependencies "$pkg_dependencies" #================================================= # CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 # Create a system user ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell @@ -109,7 +109,7 @@ ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell #================================================= # CONFIGURE HUB #================================================= -ynh_script_progression --message="Configure hub..." +ynh_script_progression --message="Configure hub..." --weight=2 mkdir -p "$final_path/.config/" ynh_add_config --template="../conf/hub_config" --destination="$final_path/.config/hub" @@ -121,7 +121,7 @@ EOF #================================================= # SPECIFIC SETUP UWSGI #================================================= -ynh_script_progression --message="Configure uwsgi..." +ynh_script_progression --message="Configure uwsgi..." --weight=2 finaluwsgiini="/etc/uwsgi/apps-available/$app.ini" @@ -130,14 +130,14 @@ ynh_add_config --template="../conf/uwsgi.ini" --destination="$finaluwsgiini" #================================================= # SETUP SYSTEMD #================================================= -ynh_script_progression --message="Configuring a systemd service..." +ynh_script_progression --message="Configuring a systemd service..." --weight=3 ynh_add_systemd_config --service="$app" --template="weblate.service" #================================================= # ACTIVATE CELERY #================================================= -ynh_script_progression --message="Configure celery..." +ynh_script_progression --message="Configure celery..." --weight=2 celeryconf="$final_path/celery-weblate" @@ -181,7 +181,7 @@ upgrade() { #================================================= # MODIFY A CONFIG FILE #================================================= - ynh_script_progression --message="Create weblate configuration file..." + ynh_script_progression --message="Create weblate configuration file..." --weight=2 # save old settings file settings="$final_path/venv/lib/$weblate_pypath/site-packages/weblate/settings.py" path_url="${path_url%/}" @@ -249,7 +249,7 @@ upgrade $weblate_version "../conf/settings.py" #================================================= # SETUP LOGROTATE #================================================= -ynh_script_progression --message="Upgrading logrotate configuration..." +ynh_script_progression --message="Upgrading logrotate configuration..." --weight=1 # Use logrotate to manage app-specific logfile(s) ynh_use_logrotate --non-append @@ -257,7 +257,7 @@ ynh_use_logrotate --non-append #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." +ynh_script_progression --message="Integrating service in YunoHost..." --weight=2 yunohost service add "$app" --log "/var/log/$app/weblate.log" yunohost service add "$app-celery" --log "/var/log/$app/weblate-celery-w1.log" @@ -288,7 +288,7 @@ ynh_systemd_action --service_name="$app-celery" --action="start" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload From 421a405b46aa69cc3cb794de44c00c254069d9a3 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Mon, 28 Jun 2021 16:24:58 +0000 Subject: [PATCH 05/10] Auto-update README --- README.md | 54 ++++++++++++++++++++------------------------ README_fr.md | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 30 deletions(-) create mode 100644 README_fr.md diff --git a/README.md b/README.md index 9423af3..670fba4 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,31 @@ + + # Weblate for YunoHost [![Integration level](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) [![Install Weblate with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate) -> *This package allows you to install Weblate quickly and simply on a YunoHost server. +*[Lire ce readme en français.](./README_fr.md)* + +> *This package allows you to install Weblate quickly and simply on a YunoHost server. If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* ## Overview -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. +Translation platform using Git and Python -**Shipped version:** 4.7 +**Shipped version:** 4.7~ynh1 + +**Demo:** https://translate.yunohost.org ## Screenshots -![](https://weblate.org/static/img/BigScreenshot.png) +![](./doc/screenshots/BigScreenshot.png) -## Demo - -* [YunoHost project uses Weblate for translations](https://translate.yunohost.org) +## Disclaimers / important information ## GitHub @@ -38,31 +45,16 @@ You can edit the file `$final_path/local_settings.py` to enable or disable featu It doesn't work yet, but while [it looks doable](https://docs.weblate.org/en/latest/admin/auth.html?highlight=LDAP#ldap-authentication), I'm unsure it is a good idea to connect this kind of tools to your LDAP. -#### Supported architectures +## Documentation and resources -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/weblate%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/weblate/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/weblate%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/weblate/) +* Official app website: https://weblate.org +* Official user documentation: https://yunohost.org/apps +* Official admin documentation: https://docs.weblate.org/ +* Upstream app code repository: https://github.com/WeblateOrg/weblate +* YunoHost documentation for this app: https://yunohost.org/app_weblate +* Report a bug: https://github.com/YunoHost-Apps/weblate_ynh/issues -## Limitations - -* Any known limitations. - -## Additional information - -* Other info you would like to add about this app. - -## Links - - * Report a bug about this package: https://github.com/YunoHost-Apps/weblate_ynh - * Report a bug about Weblate itself: https://github.com/WeblateOrg/weblate - * Documentation: https://docs.weblate.org/ - * Weblate website: https://weblate.org/ - * YunoHost website: https://yunohost.org/ - ---- - -Developer info ----------------- +## Developer info Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/weblate_ynh/tree/testing). @@ -72,3 +64,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/weblate_ynh/tree/test or sudo yunohost app upgrade weblate -u https://github.com/YunoHost-Apps/weblate_ynh/tree/testing --debug ``` + +**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..087c86c --- /dev/null +++ b/README_fr.md @@ -0,0 +1,63 @@ +# Weblate pour YunoHost + +[![Niveau d'intégration](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) +[![Installer Weblate avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=weblate) + +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* + +> *Ce package vous permet d'installer Weblate rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.* + +## Vue d'ensemble + +Plateforme de traduction utilisant Git et Python + +**Version incluse :** 4.7~ynh1 + +**Démo :** https://translate.yunohost.org + +## Captures d'écran + +![](./doc/screenshots/BigScreenshot.png) + +## Avertissements / informations importantes + +## GitHub + +Vous devrez donner à Weblate un utilisateur GitHub et un jeton. Veuillez lire [la documentation de GitHub sur le jeton](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/). +Cet utilisateur ne sera utilisé que pour ouvrir la pull-request, chaque traduction garde son auteur. + +**Clés SSH**, vous devrez vous rendre dans l'administration, générer une clé publique pour Weblate et ajouter github.com pour que Weblate connaisse l'empreinte digitale. Veuillez noter que si votre compte possède déjà une clé publique (ssh-rsa), vous devrez ajouter manuellement celle de Weblate à votre compte GitHub. + +## Paramètres et mises à niveau + +Presque tout ce qui concerne la configuration de Weblate est géré dans un fichier `settings.py`. +Vous pouvez éditer le fichier `$final_path/local_settings.py` pour activer ou désactiver des fonctionnalités. + +# Divers + +## Connexion LDAP + +Cela ne fonctionne pas encore, mais bien que [cela semble faisable](https://docs.weblate.org/en/latest/admin/auth.html?highlight=LDAP#ldap-authentication), je ne suis pas sûr que ce soit le cas une bonne idée de connecter ce genre d'outils à votre LDAP. +## Documentations et ressources + +* Site officiel de l'app : https://weblate.org +* Documentation officielle utilisateur : https://yunohost.org/apps +* Documentation officielle de l'admin : https://docs.weblate.org/ +* Dépôt de code officiel de l'app : https://github.com/WeblateOrg/weblate +* Documentation YunoHost pour cette app : https://yunohost.org/app_weblate +* Signaler un bug : https://github.com/YunoHost-Apps/weblate_ynh/issues + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/weblate_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/weblate_ynh/tree/testing --debug +ou +sudo yunohost app upgrade weblate -u https://github.com/YunoHost-Apps/weblate_ynh/tree/testing --debug +``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From b3b0c83d789171c88c5422e04216fefc2888d71e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Jun 2021 18:25:51 +0200 Subject: [PATCH 06/10] Update settings.py --- conf/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/settings.py b/conf/settings.py index 1d8ced6..b750bd9 100644 --- a/conf/settings.py +++ b/conf/settings.py @@ -158,7 +158,7 @@ USE_TZ = True DEFAULT_AUTO_FIELD = "django.db.models.AutoField" # URL prefix to use, please see documentation for more details -URL_PREFIX = "__PATHURL__" +URL_PREFIX = "__PATH_URL__" # Absolute filesystem path to the directory that will hold user-uploaded files. MEDIA_ROOT = os.path.join(DATA_DIR, "media") From 1ed8472e5d30687950db187f7a8d2134a7b99f9c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Jun 2021 18:39:05 +0200 Subject: [PATCH 07/10] Update uwsgi.ini --- conf/uwsgi.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index 3a9e12f..bbabbad 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -5,7 +5,7 @@ protocol = uwsgi socket = /var/run/__APP__/socket # http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info -mount = __PATH__=__FINALPATH__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py +mount = __PATH_URL__=__FINALPATH__/venv/lib/__WEBLATE_PYPATH__/site-packages/weblate/wsgi.py # Add path to Weblate checkout if you did not install # Weblate by pip From a9a28eb80dd51b60e69406ff4242d56d9836249c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Jun 2021 22:40:47 +0200 Subject: [PATCH 08/10] Update check_process --- check_process | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/check_process b/check_process index 470ce69..f02b20f 100644 --- a/check_process +++ b/check_process @@ -1,3 +1,4 @@ + ;; Test complet ; Manifest domain="domain.tld" @@ -15,7 +16,10 @@ setup_private=1 setup_public=1 upgrade=1 - upgrade=1 from_commit=cef22ac5634565cecd2d8545229efe3fe79d85bc + #4.4 + upgrade=1 from_commit=66eb909e771d11b092dfff2acf50ff63fa6f6ec6 + #4.6.1 + upgrade=1 from_commit=3f8363cdc588e609a775cb8b78b9d080f96405d9 backup_restore=1 multi_instance=1 change_url=1 @@ -23,6 +27,8 @@ Email= Notification=all ;;; Upgrade options - ; commit=cef22ac5634565cecd2d8545229efe3fe79d85bc - name=Upgrade from 3.11.3 + ; commit=66eb909e771d11b092dfff2acf50ff63fa6f6ec6 + name=Upgrade from 4.4 + ; commit=3f8363cdc588e609a775cb8b78b9d080f96405d9 + name=Upgrade from 4.6.1 manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=1&github_account=fake&github_token=fake From 164a07ef036dc26421b2b986a01116a8b9cf1307 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Jun 2021 22:42:59 +0200 Subject: [PATCH 09/10] Update _common.sh --- scripts/_common.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 063e018..16256ea 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -14,7 +14,6 @@ pkg_dependencies="libxml2-dev libxslt-dev libfreetype6-dev libjpeg-dev libz-dev # Weblate's version for PIP and settings file weblate_version="4.7" - debian_maj_version=$(sed 's/\..*//' /etc/debian_version) if [ "$debian_maj_version" -eq 9 ] ; then @@ -138,5 +137,3 @@ ynh_redis_remove_db() { #================================================= # EXPERIMENTAL HELPERS #================================================= - - From 87eb2a2e453769fd69534ceb6c0b75fcf44390a2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 29 Jun 2021 08:46:44 +0200 Subject: [PATCH 10/10] Update manifest.json --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index e50c69d..03310a6 100644 --- a/manifest.json +++ b/manifest.json @@ -18,8 +18,8 @@ }, "license": "AGPL-3.0", "maintainer": { - "name": "", - "email": "" + "name": "YunoHost Contributors", + "email": "apps@yunohost.org" }, "previous_maintainers": [{ "name": "Jean-Baptiste Holcroft",