From a2bc8c4f386b790389e274122dbc96530c97684f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= <felix@piedallu.me>
Date: Thu, 28 Sep 2023 17:31:55 +0200
Subject: [PATCH 1/4] Create versionned directories of the helpers

---
 debian/install                                |  2 +-
 helpers/helpers                               | 38 +++++++++++++++++++
 helpers/{ => helpers.v1.d}/apps               |  0
 helpers/{ => helpers.v1.d}/apt                |  0
 helpers/{ => helpers.v1.d}/backup             |  0
 helpers/{ => helpers.v1.d}/config             |  0
 helpers/{ => helpers.v1.d}/fail2ban           |  0
 helpers/{ => helpers.v1.d}/getopts            |  0
 helpers/{ => helpers.v1.d}/go                 |  0
 helpers/{ => helpers.v1.d}/hardware           |  0
 helpers/{ => helpers.v1.d}/logging            |  0
 helpers/{ => helpers.v1.d}/logrotate          |  0
 helpers/{ => helpers.v1.d}/mongodb            |  0
 helpers/{ => helpers.v1.d}/multimedia         |  0
 helpers/{ => helpers.v1.d}/mysql              |  0
 helpers/{ => helpers.v1.d}/network            |  0
 helpers/{ => helpers.v1.d}/nginx              |  0
 helpers/{ => helpers.v1.d}/nodejs             |  2 +-
 helpers/{ => helpers.v1.d}/permission         |  0
 helpers/{ => helpers.v1.d}/php                |  0
 helpers/{ => helpers.v1.d}/postgresql         |  0
 helpers/{ => helpers.v1.d}/redis              |  0
 helpers/{ => helpers.v1.d}/ruby               |  0
 helpers/{ => helpers.v1.d}/setting            |  0
 helpers/{ => helpers.v1.d}/string             |  0
 helpers/{ => helpers.v1.d}/systemd            |  0
 helpers/{ => helpers.v1.d}/user               |  0
 helpers/{ => helpers.v1.d}/utils              |  2 +-
 .../vendor/docker-image-extract/LICENSE       |  0
 .../vendor/docker-image-extract/README.md     |  0
 .../docker-image-extract/docker-image-extract |  0
 helpers/{ => helpers.v1.d}/vendor/n/LICENSE   |  0
 helpers/{ => helpers.v1.d}/vendor/n/README.md |  0
 helpers/{ => helpers.v1.d}/vendor/n/n         |  0
 share/helpers                                 |  8 ----
 35 files changed, 41 insertions(+), 11 deletions(-)
 create mode 100644 helpers/helpers
 rename helpers/{ => helpers.v1.d}/apps (100%)
 rename helpers/{ => helpers.v1.d}/apt (100%)
 rename helpers/{ => helpers.v1.d}/backup (100%)
 rename helpers/{ => helpers.v1.d}/config (100%)
 rename helpers/{ => helpers.v1.d}/fail2ban (100%)
 rename helpers/{ => helpers.v1.d}/getopts (100%)
 rename helpers/{ => helpers.v1.d}/go (100%)
 rename helpers/{ => helpers.v1.d}/hardware (100%)
 rename helpers/{ => helpers.v1.d}/logging (100%)
 rename helpers/{ => helpers.v1.d}/logrotate (100%)
 rename helpers/{ => helpers.v1.d}/mongodb (100%)
 rename helpers/{ => helpers.v1.d}/multimedia (100%)
 rename helpers/{ => helpers.v1.d}/mysql (100%)
 rename helpers/{ => helpers.v1.d}/network (100%)
 rename helpers/{ => helpers.v1.d}/nginx (100%)
 rename helpers/{ => helpers.v1.d}/nodejs (99%)
 rename helpers/{ => helpers.v1.d}/permission (100%)
 rename helpers/{ => helpers.v1.d}/php (100%)
 rename helpers/{ => helpers.v1.d}/postgresql (100%)
 rename helpers/{ => helpers.v1.d}/redis (100%)
 rename helpers/{ => helpers.v1.d}/ruby (100%)
 rename helpers/{ => helpers.v1.d}/setting (100%)
 rename helpers/{ => helpers.v1.d}/string (100%)
 rename helpers/{ => helpers.v1.d}/systemd (100%)
 rename helpers/{ => helpers.v1.d}/user (100%)
 rename helpers/{ => helpers.v1.d}/utils (99%)
 rename helpers/{ => helpers.v1.d}/vendor/docker-image-extract/LICENSE (100%)
 rename helpers/{ => helpers.v1.d}/vendor/docker-image-extract/README.md (100%)
 rename helpers/{ => helpers.v1.d}/vendor/docker-image-extract/docker-image-extract (100%)
 rename helpers/{ => helpers.v1.d}/vendor/n/LICENSE (100%)
 rename helpers/{ => helpers.v1.d}/vendor/n/README.md (100%)
 rename helpers/{ => helpers.v1.d}/vendor/n/n (100%)
 delete mode 100644 share/helpers

diff --git a/debian/install b/debian/install
index 5169d0b62..86636fa93 100644
--- a/debian/install
+++ b/debian/install
@@ -1,7 +1,7 @@
 bin/* /usr/bin/
 share/* /usr/share/yunohost/
 hooks/* /usr/share/yunohost/hooks/
-helpers/* /usr/share/yunohost/helpers.d/
+helpers/* /usr/share/yunohost/
 conf/* /usr/share/yunohost/conf/
 locales/* /usr/share/yunohost/locales/
 doc/yunohost.8.gz /usr/share/man/man8/
diff --git a/helpers/helpers b/helpers/helpers
new file mode 100644
index 000000000..311a7c478
--- /dev/null
+++ b/helpers/helpers
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+# Entrypoint for the helpers scripts
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+
+
+if [[ -n "${1:-}" ]]; then
+    # helpers version can be passed as first when sourcing.
+    YNH_APP_HELPERS_VERSION="$1"
+elif [[ -n "${YNH_APP_HELPERS_VERSION:-}" ]]; then
+    # ...or as environment variable set from manifest
+    :
+elif [[ -n "${YNH_APP_PACKAGING_FORMAT:-}" ]]; then
+    # ...or default to packaging format version.
+    YNH_APP_HELPERS_VERSION="$YNH_APP_PACKAGING_FORMAT"
+else
+    # ...or default to 1
+    YNH_APP_HELPERS_VERSION=1
+fi
+
+
+YNH_APP_HELPERS_DIR="$SCRIPT_DIR/helpers.v${YNH_APP_HELPERS_VERSION}.d"
+if [[ ! -d "$YNH_APP_HELPERS_DIR" ]]; then
+    echo "Helpers are not available in version '$YNH_APP_HELPERS_VERSION'." >&2
+    exit 1
+fi
+
+
+# This is a trick to later only restore set -x if it was set when calling this script
+readonly XTRACE_ENABLE=$(set +o | grep xtrace)
+set +x
+
+readarray -t HELPERS < <(find "$YNH_APP_HELPERS_DIR" -mindepth 1 -maxdepth 1 -type f)
+
+for helper in "${HELPERS[@]}"; do
+    [ -r "$helper" ] && source "$helper"
+done
+
+eval "$XTRACE_ENABLE"
diff --git a/helpers/apps b/helpers/helpers.v1.d/apps
similarity index 100%
rename from helpers/apps
rename to helpers/helpers.v1.d/apps
diff --git a/helpers/apt b/helpers/helpers.v1.d/apt
similarity index 100%
rename from helpers/apt
rename to helpers/helpers.v1.d/apt
diff --git a/helpers/backup b/helpers/helpers.v1.d/backup
similarity index 100%
rename from helpers/backup
rename to helpers/helpers.v1.d/backup
diff --git a/helpers/config b/helpers/helpers.v1.d/config
similarity index 100%
rename from helpers/config
rename to helpers/helpers.v1.d/config
diff --git a/helpers/fail2ban b/helpers/helpers.v1.d/fail2ban
similarity index 100%
rename from helpers/fail2ban
rename to helpers/helpers.v1.d/fail2ban
diff --git a/helpers/getopts b/helpers/helpers.v1.d/getopts
similarity index 100%
rename from helpers/getopts
rename to helpers/helpers.v1.d/getopts
diff --git a/helpers/go b/helpers/helpers.v1.d/go
similarity index 100%
rename from helpers/go
rename to helpers/helpers.v1.d/go
diff --git a/helpers/hardware b/helpers/helpers.v1.d/hardware
similarity index 100%
rename from helpers/hardware
rename to helpers/helpers.v1.d/hardware
diff --git a/helpers/logging b/helpers/helpers.v1.d/logging
similarity index 100%
rename from helpers/logging
rename to helpers/helpers.v1.d/logging
diff --git a/helpers/logrotate b/helpers/helpers.v1.d/logrotate
similarity index 100%
rename from helpers/logrotate
rename to helpers/helpers.v1.d/logrotate
diff --git a/helpers/mongodb b/helpers/helpers.v1.d/mongodb
similarity index 100%
rename from helpers/mongodb
rename to helpers/helpers.v1.d/mongodb
diff --git a/helpers/multimedia b/helpers/helpers.v1.d/multimedia
similarity index 100%
rename from helpers/multimedia
rename to helpers/helpers.v1.d/multimedia
diff --git a/helpers/mysql b/helpers/helpers.v1.d/mysql
similarity index 100%
rename from helpers/mysql
rename to helpers/helpers.v1.d/mysql
diff --git a/helpers/network b/helpers/helpers.v1.d/network
similarity index 100%
rename from helpers/network
rename to helpers/helpers.v1.d/network
diff --git a/helpers/nginx b/helpers/helpers.v1.d/nginx
similarity index 100%
rename from helpers/nginx
rename to helpers/helpers.v1.d/nginx
diff --git a/helpers/nodejs b/helpers/helpers.v1.d/nodejs
similarity index 99%
rename from helpers/nodejs
rename to helpers/helpers.v1.d/nodejs
index 9401fc875..bb879853b 100644
--- a/helpers/nodejs
+++ b/helpers/helpers.v1.d/nodejs
@@ -115,7 +115,7 @@ ynh_install_nodejs() {
 
     # Install (or update if YunoHost vendor/ folder updated since last install) n
     mkdir -p $n_install_dir/bin/
-    cp /usr/share/yunohost/helpers.d/vendor/n/n $n_install_dir/bin/n
+    cp "$YNH_APP_HELPERS_DIR/vendor/n/n" $n_install_dir/bin/n
     # Tweak for n to understand it's installed in $N_PREFIX
     ynh_replace_string --match_string="^N_PREFIX=\${N_PREFIX-.*}$" --replace_string="N_PREFIX=\${N_PREFIX-$N_PREFIX}" --target_file="$n_install_dir/bin/n"
 
diff --git a/helpers/permission b/helpers/helpers.v1.d/permission
similarity index 100%
rename from helpers/permission
rename to helpers/helpers.v1.d/permission
diff --git a/helpers/php b/helpers/helpers.v1.d/php
similarity index 100%
rename from helpers/php
rename to helpers/helpers.v1.d/php
diff --git a/helpers/postgresql b/helpers/helpers.v1.d/postgresql
similarity index 100%
rename from helpers/postgresql
rename to helpers/helpers.v1.d/postgresql
diff --git a/helpers/redis b/helpers/helpers.v1.d/redis
similarity index 100%
rename from helpers/redis
rename to helpers/helpers.v1.d/redis
diff --git a/helpers/ruby b/helpers/helpers.v1.d/ruby
similarity index 100%
rename from helpers/ruby
rename to helpers/helpers.v1.d/ruby
diff --git a/helpers/setting b/helpers/helpers.v1.d/setting
similarity index 100%
rename from helpers/setting
rename to helpers/helpers.v1.d/setting
diff --git a/helpers/string b/helpers/helpers.v1.d/string
similarity index 100%
rename from helpers/string
rename to helpers/helpers.v1.d/string
diff --git a/helpers/systemd b/helpers/helpers.v1.d/systemd
similarity index 100%
rename from helpers/systemd
rename to helpers/helpers.v1.d/systemd
diff --git a/helpers/user b/helpers/helpers.v1.d/user
similarity index 100%
rename from helpers/user
rename to helpers/helpers.v1.d/user
diff --git a/helpers/utils b/helpers/helpers.v1.d/utils
similarity index 99%
rename from helpers/utils
rename to helpers/helpers.v1.d/utils
index f182fee38..bec3d4972 100644
--- a/helpers/utils
+++ b/helpers/helpers.v1.d/utils
@@ -318,7 +318,7 @@ ynh_setup_source() {
             mv $src_filename $dest_dir/$src_rename
         fi
     elif [[ "$src_format" == "docker" ]]; then
-        /usr/share/yunohost/helpers.d/vendor/docker-image-extract/docker-image-extract -p $src_platform -o $dest_dir $src_url 2>&1
+        "$YNH_APP_HELPERS_DIR/vendor/docker-image-extract/docker-image-extract" -p $src_platform -o $dest_dir $src_url 2>&1
     elif [[ "$src_format" == "zip" ]]; then
         # Zip format
         # Using of a temp directory, because unzip doesn't manage --strip-components
diff --git a/helpers/vendor/docker-image-extract/LICENSE b/helpers/helpers.v1.d/vendor/docker-image-extract/LICENSE
similarity index 100%
rename from helpers/vendor/docker-image-extract/LICENSE
rename to helpers/helpers.v1.d/vendor/docker-image-extract/LICENSE
diff --git a/helpers/vendor/docker-image-extract/README.md b/helpers/helpers.v1.d/vendor/docker-image-extract/README.md
similarity index 100%
rename from helpers/vendor/docker-image-extract/README.md
rename to helpers/helpers.v1.d/vendor/docker-image-extract/README.md
diff --git a/helpers/vendor/docker-image-extract/docker-image-extract b/helpers/helpers.v1.d/vendor/docker-image-extract/docker-image-extract
similarity index 100%
rename from helpers/vendor/docker-image-extract/docker-image-extract
rename to helpers/helpers.v1.d/vendor/docker-image-extract/docker-image-extract
diff --git a/helpers/vendor/n/LICENSE b/helpers/helpers.v1.d/vendor/n/LICENSE
similarity index 100%
rename from helpers/vendor/n/LICENSE
rename to helpers/helpers.v1.d/vendor/n/LICENSE
diff --git a/helpers/vendor/n/README.md b/helpers/helpers.v1.d/vendor/n/README.md
similarity index 100%
rename from helpers/vendor/n/README.md
rename to helpers/helpers.v1.d/vendor/n/README.md
diff --git a/helpers/vendor/n/n b/helpers/helpers.v1.d/vendor/n/n
similarity index 100%
rename from helpers/vendor/n/n
rename to helpers/helpers.v1.d/vendor/n/n
diff --git a/share/helpers b/share/helpers
deleted file mode 100644
index 04f7b538c..000000000
--- a/share/helpers
+++ /dev/null
@@ -1,8 +0,0 @@
-# -*- shell-script -*-
-
-readonly XTRACE_ENABLE=$(set +o | grep xtrace) # This is a trick to later only restore set -x if it was set when calling this script
-set +x
-for helper in $(run-parts --list /usr/share/yunohost/helpers.d 2>/dev/null) ; do
-    [ -r $helper ] && . $helper || true
-done
-eval "$XTRACE_ENABLE"

From 5d3131b494d2fd8c6c06091044de97d487121f77 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= <felix@piedallu.me>
Date: Sun, 26 May 2024 19:45:56 +0200
Subject: [PATCH 2/4] rework top-level helpers

---
 helpers/helpers | 28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)

diff --git a/helpers/helpers b/helpers/helpers
index 311a7c478..1a5e269de 100644
--- a/helpers/helpers
+++ b/helpers/helpers
@@ -9,30 +9,26 @@ if [[ -n "${1:-}" ]]; then
 elif [[ -n "${YNH_APP_HELPERS_VERSION:-}" ]]; then
     # ...or as environment variable set from manifest
     :
-elif [[ -n "${YNH_APP_PACKAGING_FORMAT:-}" ]]; then
-    # ...or default to packaging format version.
-    YNH_APP_HELPERS_VERSION="$YNH_APP_PACKAGING_FORMAT"
 else
     # ...or default to 1
     YNH_APP_HELPERS_VERSION=1
 fi
 
-
-YNH_APP_HELPERS_DIR="$SCRIPT_DIR/helpers.v${YNH_APP_HELPERS_VERSION}.d"
-if [[ ! -d "$YNH_APP_HELPERS_DIR" ]]; then
-    echo "Helpers are not available in version '$YNH_APP_HELPERS_VERSION'." >&2
-    exit 1
-fi
-
-
 # This is a trick to later only restore set -x if it was set when calling this script
 readonly XTRACE_ENABLE=$(set +o | grep xtrace)
 set +x
 
-readarray -t HELPERS < <(find "$YNH_APP_HELPERS_DIR" -mindepth 1 -maxdepth 1 -type f)
-
-for helper in "${HELPERS[@]}"; do
-    [ -r "$helper" ] && source "$helper"
-done
+YNH_APP_HELPERS_DIR="$SCRIPT_DIR/helpers.v${YNH_APP_HELPERS_VERSION}.d"
+case "$YNH_APP_HELPERS_VERSION" in
+    1)
+        readarray -t HELPERS < <(find "$YNH_APP_HELPERS_DIR" -mindepth 1 -maxdepth 1 -type f)
+        for helper in "${HELPERS[@]}"; do
+            [ -r "$helper" ] && source "$helper"
+        done
+        ;;
+    *)
+        echo "Helpers are not available in version '$YNH_APP_HELPERS_VERSION'." >&2
+        exit 1
+esac
 
 eval "$XTRACE_ENABLE"

From 7011b1c879f7290a0f07d73205a13c991046ad5a Mon Sep 17 00:00:00 2001
From: Alexandre Aubin <alex.aubin@mailoo.org>
Date: Mon, 27 May 2024 16:35:38 +0200
Subject: [PATCH 3/4] YNH_APP_HELPERS_DIR -> YNH_HELPERS_DIR

---
 helpers/helpers             | 17 +++++++----------
 helpers/helpers.v1.d/nodejs |  2 +-
 helpers/helpers.v1.d/utils  |  2 +-
 3 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/helpers/helpers b/helpers/helpers
index 1a5e269de..a0d0fb3a9 100644
--- a/helpers/helpers
+++ b/helpers/helpers
@@ -2,32 +2,29 @@
 # Entrypoint for the helpers scripts
 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
 
-
 if [[ -n "${1:-}" ]]; then
     # helpers version can be passed as first when sourcing.
-    YNH_APP_HELPERS_VERSION="$1"
-elif [[ -n "${YNH_APP_HELPERS_VERSION:-}" ]]; then
-    # ...or as environment variable set from manifest
-    :
+    YNH_HELPERS_VERSION="$1"
 else
+    # ...or as environment variable set from manifest
     # ...or default to 1
-    YNH_APP_HELPERS_VERSION=1
+    YNH_HELPERS_VERSION=${YNH_HELPERS_VERSION:-1}
 fi
 
 # This is a trick to later only restore set -x if it was set when calling this script
 readonly XTRACE_ENABLE=$(set +o | grep xtrace)
 set +x
 
-YNH_APP_HELPERS_DIR="$SCRIPT_DIR/helpers.v${YNH_APP_HELPERS_VERSION}.d"
-case "$YNH_APP_HELPERS_VERSION" in
+YNH_HELPERS_DIR="$SCRIPT_DIR/helpers.v${YNH_HELPERS_VERSION}.d"
+case "$YNH_HELPERS_VERSION" in
     1)
-        readarray -t HELPERS < <(find "$YNH_APP_HELPERS_DIR" -mindepth 1 -maxdepth 1 -type f)
+        readarray -t HELPERS < <(find "$YNH_HELPERS_DIR" -mindepth 1 -maxdepth 1 -type f)
         for helper in "${HELPERS[@]}"; do
             [ -r "$helper" ] && source "$helper"
         done
         ;;
     *)
-        echo "Helpers are not available in version '$YNH_APP_HELPERS_VERSION'." >&2
+        echo "Helpers are not available in version '$YNH_HELPERS_VERSION'." >&2
         exit 1
 esac
 
diff --git a/helpers/helpers.v1.d/nodejs b/helpers/helpers.v1.d/nodejs
index bb879853b..779f077d0 100644
--- a/helpers/helpers.v1.d/nodejs
+++ b/helpers/helpers.v1.d/nodejs
@@ -115,7 +115,7 @@ ynh_install_nodejs() {
 
     # Install (or update if YunoHost vendor/ folder updated since last install) n
     mkdir -p $n_install_dir/bin/
-    cp "$YNH_APP_HELPERS_DIR/vendor/n/n" $n_install_dir/bin/n
+    cp "$YNH_HELPERS_DIR/vendor/n/n" $n_install_dir/bin/n
     # Tweak for n to understand it's installed in $N_PREFIX
     ynh_replace_string --match_string="^N_PREFIX=\${N_PREFIX-.*}$" --replace_string="N_PREFIX=\${N_PREFIX-$N_PREFIX}" --target_file="$n_install_dir/bin/n"
 
diff --git a/helpers/helpers.v1.d/utils b/helpers/helpers.v1.d/utils
index bec3d4972..631e154e2 100644
--- a/helpers/helpers.v1.d/utils
+++ b/helpers/helpers.v1.d/utils
@@ -318,7 +318,7 @@ ynh_setup_source() {
             mv $src_filename $dest_dir/$src_rename
         fi
     elif [[ "$src_format" == "docker" ]]; then
-        "$YNH_APP_HELPERS_DIR/vendor/docker-image-extract/docker-image-extract" -p $src_platform -o $dest_dir $src_url 2>&1
+        "$YNH_HELPERS_DIR/vendor/docker-image-extract/docker-image-extract" -p $src_platform -o $dest_dir $src_url 2>&1
     elif [[ "$src_format" == "zip" ]]; then
         # Zip format
         # Using of a temp directory, because unzip doesn't manage --strip-components

From 1e47a1438bde5efeb33d108d2de68b671646c10c Mon Sep 17 00:00:00 2001
From: Alexandre Aubin <alex.aubin@mailoo.org>
Date: Mon, 27 May 2024 16:38:09 +0200
Subject: [PATCH 4/4] apps: auto-define YNH_HELPERS_VERSION from a new
 'helpers_version' key in the manifest's [integration] section, or fallback to
 the 'packaging_format' info

---
 src/app.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/app.py b/src/app.py
index 018c339e7..4eab81a99 100644
--- a/src/app.py
+++ b/src/app.py
@@ -2968,6 +2968,7 @@ def _make_environment_for_app_script(
         "YNH_APP_INSTANCE_NUMBER": str(app_instance_nb),
         "YNH_APP_MANIFEST_VERSION": manifest.get("version", "?"),
         "YNH_APP_PACKAGING_FORMAT": str(manifest["packaging_format"]),
+        "YNH_HELPERS_VERSION": manifest.get("integration", {}).get("helpers_version") or manifest["packaging_format"],
         "YNH_ARCH": system_arch(),
         "YNH_DEBIAN_VERSION": debian_version(),
     }