mirror of
https://git.pleroma.social/pleroma/pleroma.git
synced 2024-06-10 09:19:34 +00:00
frontends dir
This commit is contained in:
parent
bf95bf3492
commit
19ad944056
|
@ -233,6 +233,7 @@ config :pleroma, :instance,
|
||||||
quarantined_instances: [],
|
quarantined_instances: [],
|
||||||
managed_config: true,
|
managed_config: true,
|
||||||
static_dir: "instance/static/",
|
static_dir: "instance/static/",
|
||||||
|
frontends_dir: "instance/frontends/",
|
||||||
allowed_post_formats: [
|
allowed_post_formats: [
|
||||||
"text/plain",
|
"text/plain",
|
||||||
"text/html",
|
"text/html",
|
||||||
|
|
|
@ -732,6 +732,14 @@ config :pleroma, :config_description, [
|
||||||
"instance/static/"
|
"instance/static/"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
%{
|
||||||
|
key: :frontends_dir,
|
||||||
|
type: :string,
|
||||||
|
description: "Instance frontends directory",
|
||||||
|
suggestions: [
|
||||||
|
"instance/frontends/"
|
||||||
|
]
|
||||||
|
},
|
||||||
%{
|
%{
|
||||||
key: :allowed_post_formats,
|
key: :allowed_post_formats,
|
||||||
type: {:list, :string},
|
type: {:list, :string},
|
||||||
|
|
|
@ -33,7 +33,8 @@ config :pleroma, :instance,
|
||||||
skip_thread_containment: false,
|
skip_thread_containment: false,
|
||||||
federating: false,
|
federating: false,
|
||||||
external_user_synchronization: false,
|
external_user_synchronization: false,
|
||||||
static_dir: "test/instance_static/"
|
static_dir: "test/instance_static/",
|
||||||
|
frontends_dir: "test/instance_static/frontends"
|
||||||
|
|
||||||
config :pleroma, :activitypub, sign_object_fetches: false
|
config :pleroma, :activitypub, sign_object_fetches: false
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
## Download the latest frontend
|
## Download the latest frontend
|
||||||
|
|
||||||
This downloads a snapshot of the latest Pleroma-FE for a given reference and writes it to the `static_dir`. In a default setup, this means that this snapshot will be served as the frontend by the backend.
|
This downloads a snapshot of the latest Pleroma-FE for a given reference and writes it to the `frontends_dir`. In a default setup, this means that this snapshot will be served as the frontend by the backend.
|
||||||
|
|
||||||
```sh tab="OTP"
|
```sh tab="OTP"
|
||||||
./bin/pleroma_ctl pleroma.frontend download [<options>]
|
./bin/pleroma_ctl pleroma.frontend download [<options>]
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
defmodule Mix.Tasks.Pleroma.Frontend do
|
defmodule Mix.Tasks.Pleroma.Frontend do
|
||||||
use Mix.Task
|
use Mix.Task
|
||||||
alias __MODULE__.Fetcher
|
import Mix.Pleroma
|
||||||
|
|
||||||
@shortdoc "Manages the Pleroma frontends"
|
@shortdoc "Manages the Pleroma frontends"
|
||||||
@moduledoc File.read!("docs/administration/CLI_tasks/frontend.md")
|
@moduledoc File.read!("docs/administration/CLI_tasks/frontend.md")
|
||||||
|
@ -15,21 +15,36 @@ defmodule Mix.Tasks.Pleroma.Frontend do
|
||||||
rest,
|
rest,
|
||||||
strict: [
|
strict: [
|
||||||
reference: :string
|
reference: :string
|
||||||
]
|
],
|
||||||
|
aliases: [r: :reference]
|
||||||
)
|
)
|
||||||
|
|
||||||
reference = options[:reference] || "master"
|
reference = options[:reference] || "master"
|
||||||
|
|
||||||
IO.puts("Downloading reference #{reference}")
|
shell_info("Downloading reference #{reference}")
|
||||||
|
|
||||||
url =
|
url =
|
||||||
"https://git.pleroma.social/pleroma/pleroma-fe/-/jobs/artifacts/#{reference}/download?job=build"
|
"https://git.pleroma.social/pleroma/pleroma-fe/-/jobs/artifacts/#{reference}/download?job=build"
|
||||||
|
|
||||||
sd = Pleroma.Config.get([:instance, :static_dir]) |> Path.expand()
|
sd =
|
||||||
|
Pleroma.Config.get([:instance, :frontends_dir], "instance/frontends")
|
||||||
|
|> Path.join("pleroma-fe")
|
||||||
|
|> Path.expand()
|
||||||
|
|
||||||
with {_, {:ok, %{status: 200, body: body}}} <- {:fetch, Fetcher.get(url)},
|
adapter =
|
||||||
{_, {:ok, results}} <- {:unzip, :zip.unzip(body, [:memory])} do
|
if Pleroma.Config.get(:env) == :test do
|
||||||
IO.puts("Writing to #{sd}")
|
Tesla.Mock
|
||||||
|
else
|
||||||
|
Tesla.Adapter.Httpc
|
||||||
|
end
|
||||||
|
|
||||||
|
client = Tesla.client([Tesla.Middleware.FollowRedirects], adapter)
|
||||||
|
|
||||||
|
with {_, {:ok, %{status: 200, body: body}}} <- {:fetch, Tesla.get(client, url)},
|
||||||
|
{_, {:ok, results}} <- {:unzip, :zip.unzip(body, [:memory])},
|
||||||
|
shell_info("Cleaning #{sd}"),
|
||||||
|
{_, {:ok, _}} <- {:clean_up, File.rm_rf(sd)} do
|
||||||
|
shell_info("Writing to #{sd}")
|
||||||
|
|
||||||
results
|
results
|
||||||
|> Enum.each(fn {path, contents} ->
|
|> Enum.each(fn {path, contents} ->
|
||||||
|
@ -39,16 +54,9 @@ defmodule Mix.Tasks.Pleroma.Frontend do
|
||||||
File.write!(path, contents)
|
File.write!(path, contents)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
IO.puts("Successfully downloaded and unpacked the frontend")
|
shell_info("Successfully downloaded and unpacked the frontend")
|
||||||
else
|
else
|
||||||
{error, _} -> IO.puts("Step failed: #{error}")
|
{error, _} -> shell_error("Step failed: #{error}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defmodule Mix.Tasks.Pleroma.Frontend.Fetcher do
|
|
||||||
use Tesla
|
|
||||||
plug(Tesla.Middleware.FollowRedirects)
|
|
||||||
|
|
||||||
adapter(Tesla.Adapter.Httpc)
|
|
||||||
end
|
|
||||||
|
|
|
@ -10,19 +10,25 @@ defmodule Pleroma.Plugs.InstanceStatic do
|
||||||
"""
|
"""
|
||||||
@behaviour Plug
|
@behaviour Plug
|
||||||
|
|
||||||
def file_path(path) do
|
alias Pleroma.Config
|
||||||
instance_path =
|
|
||||||
Path.join(Pleroma.Config.get([:instance, :static_dir], "instance/static/"), path)
|
|
||||||
|
|
||||||
if File.exists?(instance_path) do
|
def file_path(path) do
|
||||||
instance_path
|
instance_path = Path.join(Config.get([:instance, :static_dir], "instance/static/"), path)
|
||||||
else
|
|
||||||
Path.join(Application.app_dir(:pleroma, "priv/static/"), path)
|
frontends_path =
|
||||||
|
Config.get([:instance, :frontends_dir], "instance/frontends/")
|
||||||
|
|> Path.join("pleroma-fe")
|
||||||
|
|> Path.join(path)
|
||||||
|
|
||||||
|
cond do
|
||||||
|
File.exists?(instance_path) -> instance_path
|
||||||
|
File.exists?(frontends_path) -> frontends_path
|
||||||
|
true -> Path.join(Application.app_dir(:pleroma, "priv/static/"), path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@only ~w(index.html robots.txt static emoji packs sounds images instance favicon.png sw.js
|
@only ~w(index.html robots.txt static emoji packs sounds images instance favicon.png sw.js
|
||||||
sw-pleroma.js)
|
sw-pleroma.js fontello)
|
||||||
|
|
||||||
def init(opts) do
|
def init(opts) do
|
||||||
opts
|
opts
|
||||||
|
@ -38,8 +44,7 @@ defmodule Pleroma.Plugs.InstanceStatic do
|
||||||
call_static(
|
call_static(
|
||||||
conn,
|
conn,
|
||||||
opts,
|
opts,
|
||||||
unquote(at),
|
unquote(at)
|
||||||
Pleroma.Config.get([:instance, :static_dir], "instance/static")
|
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -48,7 +53,20 @@ defmodule Pleroma.Plugs.InstanceStatic do
|
||||||
conn
|
conn
|
||||||
end
|
end
|
||||||
|
|
||||||
defp call_static(conn, opts, at, from) do
|
defp call_static(conn, opts, at) do
|
||||||
|
static_dir = Config.get([:instance, :static_dir], "instance/static/")
|
||||||
|
|
||||||
|
frontend_dir =
|
||||||
|
Config.get([:instance, :frontends_dir], "instance/frontends/")
|
||||||
|
|> Path.join("pleroma-fe")
|
||||||
|
|
||||||
|
from =
|
||||||
|
if File.exists?(Path.join(static_dir, conn.request_path)) do
|
||||||
|
static_dir
|
||||||
|
else
|
||||||
|
frontend_dir
|
||||||
|
end
|
||||||
|
|
||||||
opts =
|
opts =
|
||||||
opts
|
opts
|
||||||
|> Map.put(:from, from)
|
|> Map.put(:from, from)
|
||||||
|
|
BIN
test/instance_static/dist.zip
Normal file
BIN
test/instance_static/dist.zip
Normal file
Binary file not shown.
60
test/tasks/frontend_test.exs
Normal file
60
test/tasks/frontend_test.exs
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
defmodule Mix.Tasks.Pleroma.FrontendTest do
|
||||||
|
use ExUnit.Case
|
||||||
|
|
||||||
|
import Tesla.Mock
|
||||||
|
|
||||||
|
@path Pleroma.Config.get([:instance, :frontends_dir])
|
||||||
|
|
||||||
|
setup do
|
||||||
|
Mix.shell(Mix.Shell.Process)
|
||||||
|
|
||||||
|
mock(fn
|
||||||
|
%{
|
||||||
|
method: :get,
|
||||||
|
url:
|
||||||
|
"https://git.pleroma.social/pleroma/pleroma-fe/-/jobs/artifacts/master/download?job=build"
|
||||||
|
} ->
|
||||||
|
%Tesla.Env{status: 200, body: File.read!("test/instance_static/dist.zip")}
|
||||||
|
|
||||||
|
%{
|
||||||
|
method: :get,
|
||||||
|
url:
|
||||||
|
"https://git.pleroma.social/pleroma/pleroma-fe/-/jobs/artifacts/develop/download?job=build"
|
||||||
|
} ->
|
||||||
|
%Tesla.Env{status: 200, body: File.read!("test/instance_static/dist.zip")}
|
||||||
|
end)
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Mix.shell(Mix.Shell.IO)
|
||||||
|
{:ok, _} = File.rm_rf(@path)
|
||||||
|
end)
|
||||||
|
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
test "downloads pleroma-fe and master by default" do
|
||||||
|
Mix.Tasks.Pleroma.Frontend.run(["download"])
|
||||||
|
|
||||||
|
@path |> Path.expand() |> Path.join("pleroma-fe") |> check_assertions("master")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "download special fe with reference" do
|
||||||
|
ref = "develop"
|
||||||
|
Mix.Tasks.Pleroma.Frontend.run(["download", "-r", ref])
|
||||||
|
|
||||||
|
@path |> Path.expand() |> Path.join("pleroma-fe") |> check_assertions(ref)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp check_assertions(path, ref) do
|
||||||
|
assert_receive {:mix_shell, :info, [message]}
|
||||||
|
assert message == "Downloading reference #{ref}"
|
||||||
|
assert_receive {:mix_shell, :info, [message]}
|
||||||
|
assert message == "Cleaning #{path}"
|
||||||
|
assert_receive {:mix_shell, :info, [message]}
|
||||||
|
assert message == "Writing to #{path}"
|
||||||
|
assert_receive {:mix_shell, :info, ["Successfully downloaded and unpacked the frontend"]}
|
||||||
|
assert File.exists?(path <> "/1.png")
|
||||||
|
assert File.exists?(path <> "/2.css")
|
||||||
|
assert File.exists?(path <> "/3.js")
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue