From aa077dc5d275594816621d6351c62f1e7f965ac6 Mon Sep 17 00:00:00 2001
From: rubicon <5662-rubicon@users.gitlab.alpinelinux.org>
Date: Sat, 25 Jun 2022 11:58:22 +0800
Subject: [PATCH] testing/ejabberd: fix and upgrade vendored elixir

it no longer conflicts with community/elixir, upgraded version
no longer complains about get_stacktrace being removed, fixes
the crash in Elixir.Logger.App, and the missing plugins warnings
at compilation are reduced by compiling rebar_elixir_plugin earlier
---
 testing/ejabberd/APKBUILD                  | 28 +++++++++++++++++--
 testing/ejabberd/elixir-mix.sh             | 16 +++++++++++
 testing/ejabberd/elixir-rebar.config       | 21 ++++++++++++++
 testing/ejabberd/elixir.app.src            | 11 ++++++++
 testing/ejabberd/fix-elixir-dirs.patch     | 28 +++++++++++++++++++
 testing/ejabberd/fix-missing-plugins.patch | 32 ++++++++++++++++++++++
 6 files changed, 134 insertions(+), 2 deletions(-)
 create mode 100644 testing/ejabberd/elixir-mix.sh
 create mode 100644 testing/ejabberd/elixir-rebar.config
 create mode 100644 testing/ejabberd/elixir.app.src
 create mode 100644 testing/ejabberd/fix-elixir-dirs.patch
 create mode 100644 testing/ejabberd/fix-missing-plugins.patch

diff --git a/testing/ejabberd/APKBUILD b/testing/ejabberd/APKBUILD
index 1fb0ca053307..d5b29f10b5b0 100644
--- a/testing/ejabberd/APKBUILD
+++ b/testing/ejabberd/APKBUILD
@@ -9,7 +9,7 @@ _base64url=1.0.1
 _cache_tab=1.0.30
 _eimp=1.0.22
 _ejabberd_po=9849703c3664e43452eae3245016a1c187f3edc4
-_elixir=1.4.4
+_elixir=1.12.3
 _epam=1.0.12
 _eredis=1.2.0
 _esip=1.0.47
@@ -54,6 +54,7 @@ source="$pkgname-$pkgver.tar.gz::https://github.com/processone/ejabberd/archive/
 	eimp-$_eimp.tar.gz::https://github.com/processone/eimp/archive/refs/tags/$_eimp.tar.gz
 	ejabberd_po-$_ejabberd_po.tar.gz::https://github.com/processone/ejabberd-po/archive/$_ejabberd_po.tar.gz
 	elixir-$_elixir.tar.gz::https://github.com/elixir-lang/elixir/archive/refs/tags/v$_elixir.tar.gz
+	elixir.app.src elixir-mix.sh elixir-rebar.config
 	epam-$_epam.tar.gz::https://github.com/processone/epam/archive/refs/tags/$_epam.tar.gz
 	eredis-$_eredis.tar.gz::https://github.com/wooga/eredis/archive/refs/tags/v$_eredis.tar.gz
 	esip-$_esip.tar.gz::https://github.com/processone/esip/archive/refs/tags/$_esip.tar.gz
@@ -87,6 +88,8 @@ source="$pkgname-$pkgver.tar.gz::https://github.com/processone/ejabberd/archive/
 	ejabberd.confd
 
 	dont-leak-destdir.patch
+	fix-elixir-dirs.patch
+	fix-missing-plugins.patch
 	"
 
 prepare() {
@@ -126,7 +129,20 @@ prepare() {
 	mv "$srcdir"/erlang-sqlite3-$_sqlite3 "$builddir"/deps/sqlite3
 	mv "$srcdir"/erlang-idna-$_idna "$builddir"/deps/idna
 	mv "$srcdir"/erlang-jose-$_jose  "$builddir"/deps/jose
+
+	install -Dm755 "$srcdir"/elixir-mix.sh \
+		"$builddir"/deps/elixir/bin/mix
+	install -Dm644 "$srcdir"/elixir-rebar.config \
+		"$builddir"/deps/elixir/rebar.config
+	install -Dm644 "$srcdir"/elixir.app.src \
+		-t "$builddir"/deps/elixir/src/
+	sed -i "s/@ELIXIR_VERSION@/$_elixir/" \
+		"$builddir"/deps/elixir/src/elixir.app.src
+	cp -a "$builddir"/deps/elixir/bin/elixir \
+		"$builddir"/deps/elixir/bin/elixir-install
+
 	default_prepare
+	sed -i "s/@ELIXIR_VERSION@/$_elixir/" Makefile.in
 	GIT_DIR=. sh ./autogen.sh
 }
 
@@ -167,6 +183,9 @@ package() {
 	chgrp ejabberd "$pkgdir"/etc/ejabberd/ejabberd.yml \
 		"$pkgdir"/etc/ejabberd/ejabberdctl.cfg "$pkgdir"/etc/ejabberd
 
+	sed -i "s|/usr/bin/iex|/usr/lib/ejabberd/ejabberd-$pkgver/priv/bin/iex|" \
+		"$pkgdir"/usr/sbin/ejabberdctl
+
 	cd "$pkgdir"/usr/lib/ejabberd/ejabberd-$pkgver/priv/bin/
 	rm -f captcha.sh
 	ln -sf ../../../*/priv/bin/* .
@@ -178,7 +197,10 @@ sha512sums="
 bc8aaacea404d8a8b9a8fb14bc1eec9ec0c07ba4fac910287f448be66b0b3475b3913297dfce8d9de9fc208d9eb413dd8bf154cd1bd6edf86ee40100629e4553  cache_tab-1.0.30.tar.gz
 5426df9a00d5b614ebb236729e2b397d5e72e12e68cbed32550a074b1b86557e1dee6585b917166e5ebf2fc41297329574c181471885638236c82a66a29d2232  eimp-1.0.22.tar.gz
 ee70d9fcd28b5b1b43206ead9283b848f1d526a242b323ccc4e1211759683d914ad8ce9e33d4b864490b1a6e3f0542956eb1fa4fc8e1502a0a36587f41c3aab9  ejabberd_po-9849703c3664e43452eae3245016a1c187f3edc4.tar.gz
-e339a27e1b31c7783077fc336703c30066d18af990c26741508caa16f15d33d71c56ca7884ed27d046b310db5e051adc428fc51535abecb06992225c6d2d274d  elixir-1.4.4.tar.gz
+945e33ca9c3e50015531f87630c1bc1b9966acc64bbf7d01c8c4f8cfc104ee1e08113f572f0ad6a9f5e8ee37e33144e58b2ac33dc0a2b01e1355fc5f8b1b9329  elixir-1.12.3.tar.gz
+ffb1ed8db363f008bc08af2871d6defa89f197347e488c739218c80143e217c71a7fd7579ba4949ce21f15027221038a78fc33803264502be8fa0b0a475ccf13  elixir.app.src
+29ac3d68b3a69c720ed94194c24702cb1ceb2cafd47ad1dd52a7a74a29557fe06a31d671612c4e4d03c60b15be7208d0d993fec22cc1334dcc04ab6c34a79b58  elixir-mix.sh
+4b10f66bdfe044b71849499127c68891185b1d3ec05efae5b5f9c7969cd364deea0d7635a9c918a0791ce84001470c267c087a41c647bed67c9aae1648e6d447  elixir-rebar.config
 61a1d49c3316fb7f8fcc8b7d7c1ab0b5dd87fa31cecac679a850d191fe9171f7e01473b9979f8107c1c4567836e07ced67336dd5133dfdc5d4680cb3b6c3b270  epam-1.0.12.tar.gz
 c72ae291389e47d1ac4c1de69dccb6121f4f9195283665d490904226b2ea15cb7671b48bb08db507a5e62c6bced62d890a9ecb9752da6e0aad24a28da137907c  eredis-1.2.0.tar.gz
 68be1c8cf507180e73f3a16dfd8ca44ffad825c40df0d1874888afa41f3cb89b445b033036d041af29ec3fdbdab7acc68f770124171ba4af73abd0775a03c0ba  esip-1.0.47.tar.gz
@@ -210,4 +232,6 @@ ee5bc1600ea00ad9c1d9f1565d04d073dd357c6f69c0728e770e17f7e4f1a07c2d2883d05e344d33
 47fd2cfd9177c4e978a9799a153ba74392a9891822221af8194686a40f6bf01f38644833e1e1f5416c6357e0bfb7ca3dae96f55a4fcd7cd629ec798d85a72807  ejabberd.logrotate
 96a571c0ab2be366e931bda423a61ef920cbaba2107e61ddbc501472ce3efe2804418cc6579c99310b902a9a99aaecb9284cf2420c071dbca2f670efb4034135  ejabberd.confd
 7b6debff487880dfacd8e882c03a9d948178dfd450c336657e11442a51b62574e9bd41c0af131b6b4f3b1b0f450c442c2eff04ad3f13439540685740295bf71e  dont-leak-destdir.patch
+e1efee3ef1535febfe9a9d10b1ba1ecf798d1b17d14accc43b2c77536b93a956ae6c4c71c135f7e6d03bf2cd4f61bb0c12d27ef69576db71c3a915dc7c61c103  fix-elixir-dirs.patch
+b6e23b16a8f931a2da9f052333dedc2b37667cf9265b84174590ac9a72e5f16d9dcd4c7153532bf45def7f94a71ce012dbb9d3227b7c7449b105fd711d085d59  fix-missing-plugins.patch
 "
diff --git a/testing/ejabberd/elixir-mix.sh b/testing/ejabberd/elixir-mix.sh
new file mode 100644
index 000000000000..d6c342c8b34a
--- /dev/null
+++ b/testing/ejabberd/elixir-mix.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+set -e
+
+readlink_f () {
+  cd "$(dirname "$1")" > /dev/null
+  filename="$(basename "$1")"
+  if [ -h "$filename" ]; then
+    readlink_f "$(readlink "$filename")"
+  else
+    echo "$(pwd -P)/$filename"
+  fi
+}
+
+SELF=$(readlink_f "$0")
+SCRIPT_PATH=$(dirname "$SELF")
+exec "$SCRIPT_PATH"/elixir -e "Mix.start(); Mix.CLI.main()" -- "$@"
diff --git a/testing/ejabberd/elixir-rebar.config b/testing/ejabberd/elixir-rebar.config
new file mode 100644
index 000000000000..9154464fa23e
--- /dev/null
+++ b/testing/ejabberd/elixir-rebar.config
@@ -0,0 +1,21 @@
+%% Using Elixir as a Rebar dependency
+
+%% This configuration file only exists so Elixir can be used
+%% as a Rebar dependency, the same happens for the file
+%% src/elixir.app.src.
+
+%% In practice, Elixir is structured as OTP where many applications
+%% are placed in the lib directory. Since this structure is not
+%% supported by default by Rebar, after adding Elixir as a dependency
+%% you need to explicitly add it to lib_dirs:
+%%
+%%   {lib_dirs, [
+%%     "deps/elixir/lib"
+%%   ]}.
+%%
+
+%% Run "make" as the proper compilation step
+{post_hooks, [{compile, "make compile"}]}.
+
+%% This prevents rebar_elixir_plugin from recompiling Elixir
+{ex_opts, [{src_dirs, [".PHONY"]}]}.
diff --git a/testing/ejabberd/elixir.app.src b/testing/ejabberd/elixir.app.src
new file mode 100644
index 000000000000..2855dfcbe1eb
--- /dev/null
+++ b/testing/ejabberd/elixir.app.src
@@ -0,0 +1,11 @@
+{application, elixir,
+[{description, "elixir"},
+ {vsn, "@ELIXIR_VERSION@"},
+ {modules, [
+	elixir
+  ]},
+ {registered, [elixir_config, elixir_code_server]},
+ {applications, [kernel,stdlib,compiler]},
+ {mod, {elixir,[]}},
+ {env, [{ansi_enabled, false}]}
+]}.
diff --git a/testing/ejabberd/fix-elixir-dirs.patch b/testing/ejabberd/fix-elixir-dirs.patch
new file mode 100644
index 000000000000..38ba556966d9
--- /dev/null
+++ b/testing/ejabberd/fix-elixir-dirs.patch
@@ -0,0 +1,28 @@
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -324,10 +324,10 @@
+ 	[ -d $(DESTDIR)$(SBINDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(SBINDIR)
+ 	$(INSTALL) -m 550 $(G_USER) ejabberdctl.example $(DESTDIR)$(SBINDIR)/ejabberdctl
+ 	# Elixir binaries
+-	[ -d $(DESTDIR)$(BINDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)
+-	[ -f $(DEPSDIR)/elixir/bin/iex ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/iex $(DESTDIR)$(BINDIR)/iex || true
+-	[ -f $(DEPSDIR)/elixir/bin/elixir ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/elixir $(DESTDIR)$(BINDIR)/elixir || true
+-	[ -f $(DEPSDIR)/elixir/bin/mix ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/mix $(DESTDIR)$(BINDIR)/mix || true
++	[ -f $(DEPSDIR)/elixir/bin/iex ] && $(INSTALL) -Dm 550 $(G_USER) $(DEPSDIR)/elixir/bin/iex -t $(DESTDIR)$(LIBDIR)/elixir-@ELIXIR_VERSION@/priv/bin/ || true
++	[ -f $(DEPSDIR)/elixir/bin/elixir-install ] && $(INSTALL) -Dm 550 $(G_USER) $(DEPSDIR)/elixir/bin/elixir-install $(DESTDIR)$(LIBDIR)/elixir-@ELIXIR_VERSION@/priv/bin/elixir || true
++	[ -f $(DEPSDIR)/elixir/bin/elixirc ] && $(INSTALL) -Dm 550 $(G_USER) $(DEPSDIR)/elixir/bin/elixirc -t $(DESTDIR)$(LIBDIR)/elixir-@ELIXIR_VERSION@/priv/bin/ || true
++	[ -f $(DEPSDIR)/elixir/bin/mix ] && $(INSTALL) -Dm 550 $(G_USER) $(DEPSDIR)/elixir/bin/mix -t $(DESTDIR)$(LIBDIR)/elixir-@ELIXIR_VERSION@/priv/bin/ || true
+ 	#
+ 	# Init script
+ 	$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \
+--- a/deps/elixir/bin/elixir-install
++++ b/deps/elixir/bin/elixir-install
+@@ -211,7 +211,7 @@
+ fi
+ 
+ ERTS_BIN=
+-set -- "$ERTS_BIN$ERL_EXEC" -pa "$SCRIPT_PATH"/../lib/*/ebin $ELIXIR_ERL_OPTIONS $ERL "$@"
++set -- "$ERTS_BIN$ERL_EXEC" -pa "$SCRIPT_PATH"/../../../*/ebin $ELIXIR_ERL_OPTIONS $ERL "$@"
+ 
+ if [ -n "$RUN_ERL_PIPE" ]; then
+   ESCAPED=""
diff --git a/testing/ejabberd/fix-missing-plugins.patch b/testing/ejabberd/fix-missing-plugins.patch
new file mode 100644
index 000000000000..014fd4fa9cf8
--- /dev/null
+++ b/testing/ejabberd/fix-missing-plugins.patch
@@ -0,0 +1,32 @@
+--- a/rebar.config
++++ b/rebar.config
+@@ -18,13 +18,16 @@
+ %%%
+ %%%----------------------------------------------------------------------
+ 
+-{deps, [{base64url, ".*", {git, "https://github.com/dvv/base64url", {tag, "1.0.1"}}},
++{deps, [{if_not_rebar3, %% Needed because modules are not fully migrated to new structure and mix
++         {if_var_true, elixir,
++          {rebar_elixir_plugin, ".*", {git, "https://github.com/processone/rebar_elixir_plugin", "0.1.0"}}}},
++        {if_var_true, elixir,
++         {elixir, ".*", {git, "https://github.com/elixir-lang/elixir", {tag, "v1.4.4"}}}},
++        {base64url, ".*", {git, "https://github.com/dvv/base64url", {tag, "1.0.1"}}},
+         {cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.30"}}},
+         {eimp, ".*", {git, "https://github.com/processone/eimp", {tag, "1.0.22"}}},
+         {if_var_true, tools,
+          {ejabberd_po, ".*", {git, "https://github.com/processone/ejabberd-po", {branch, "main"}}}},
+-        {if_var_true, elixir,
+-         {elixir, ".*", {git, "https://github.com/elixir-lang/elixir", {tag, "v1.4.4"}}}},
+         {if_var_true, pam,
+          {epam, ".*", {git, "https://github.com/processone/epam", {tag, "1.0.12"}}}},
+         {if_var_true, redis,
+@@ -62,9 +65,6 @@
+          {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.18"}}}},
+         {p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.25"}}},
+         {pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.9"}}},
+-        {if_not_rebar3, %% Needed because modules are not fully migrated to new structure and mix
+-         {if_var_true, elixir,
+-          {rebar_elixir_plugin, ".*", {git, "https://github.com/processone/rebar_elixir_plugin", "0.1.0"}}}},
+         {if_var_true, sqlite,
+          {sqlite3, ".*", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.13"}}}},
+         {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.28"}}},
-- 
GitLab