From bec058f79aee9adb666be49d5faf8a53431c26ba Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 7 Aug 2019 16:43:14 +0300 Subject: [PATCH] Add a polyfill for Application.put_all_env/2 --- lib/mix/tasks/pleroma/instance.ex | 19 +++++++++++-------- lib/pleroma/polyfill.ex | 19 +++++++++++++++++++ lib/pleroma/polyfill/application.ex | 23 +++++++++++++++++++++++ test/tasks/instance_test.exs | 3 ++- 4 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 lib/pleroma/polyfill.ex create mode 100644 lib/pleroma/polyfill/application.ex diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 374d8b601..61cbd51bf 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -5,6 +5,7 @@ defmodule Mix.Tasks.Pleroma.Instance do use Mix.Task import Mix.Pleroma + alias Pleroma.Polyfill @shortdoc "Manages Pleroma instance" @moduledoc """ @@ -226,15 +227,17 @@ defmodule Mix.Tasks.Pleroma.Instance do shell_info("Writing the postgres script to #{psql_path}.") File.write(psql_path, result_psql) - Config.Reader.read!(config_path) - |> Enum.map(fn {application, config} -> - config = - Application.get_all_env(application) - |> Config.Reader.merge(config) + new_config = + Config.Reader.read!(config_path) + |> Enum.map(fn {application, config} -> + config = + Application.get_all_env(application) + |> Config.Reader.merge(config) - {application, config} - end) - |> Application.put_all_env() + {application, config} + end) + + Polyfill.apply_or_fallback(Application, :put_all_env, [new_config]) write_robots_txt(indexable, template_dir) diff --git a/lib/pleroma/polyfill.ex b/lib/pleroma/polyfill.ex new file mode 100644 index 000000000..80bd0ee89 --- /dev/null +++ b/lib/pleroma/polyfill.ex @@ -0,0 +1,19 @@ +defmodule Pleroma.Polyfill do + @doc "Provides fallbacks for features not available on Elixir versions supported" + + def apply_or_fallback(module, function_name, args) do + if function_exported?(module, function_name, length(args)) do + apply(module, function_name, args) + else + if fallback_available?(module, function_name, length(args)) do + apply(Module.concat(__MODULE__, module), function_name, args) + else + raise "No fallback for #{module}.#{to_string(function_name)} found!" + end + end + end + + def fallback_available?(module, function_name, arity) do + function_exported?(Module.concat(__MODULE__, module), function_name, arity) + end +end diff --git a/lib/pleroma/polyfill/application.ex b/lib/pleroma/polyfill/application.ex new file mode 100644 index 000000000..48f594d22 --- /dev/null +++ b/lib/pleroma/polyfill/application.ex @@ -0,0 +1,23 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Polyfill.Application do + # Taken from https://github.com/elixir-lang/elixir/blob/b50e0f4ea7d1d6860bc8d9081f5dbe16047375ef/lib/elixir/lib/application.ex + # Copyright 2012 Plataformatec + def put_all_env(config, opts \\ []) when is_list(config) and is_list(opts) do + if function_exported?(:application, :set_env, 2) do + # Directly calling it would result in a compilation warning on OTP <22 + apply(:application, :set_env, [config, opts]) + else + for app_keyword <- config, + {app, keyword} = app_keyword, + key_value <- keyword, + {key, value} = key_value do + :application.set_env(app, key, value, opts) + end + + :ok + end + end +end diff --git a/test/tasks/instance_test.exs b/test/tasks/instance_test.exs index 696238407..6f256d5ff 100644 --- a/test/tasks/instance_test.exs +++ b/test/tasks/instance_test.exs @@ -4,6 +4,7 @@ defmodule Pleroma.InstanceTest do use ExUnit.Case, async: true + alias Pleroma.Polyfill setup do File.mkdir_p!(tmp_path()) @@ -16,7 +17,7 @@ defmodule Pleroma.InstanceTest do on_exit(fn -> File.rm_rf(tmp_path()) - Application.put_all_env(config) + Polyfill.apply_or_fallback(Application, :put_all_env, [config]) end) :ok