fix(fs): handle File.mkdir_p errors and remove bang variants in sidecars and release packaging (CSM-030)
This commit is contained in:
@@ -106,7 +106,7 @@ defmodule BDS.Media do
|
||||
|> Repo.insert!()
|
||||
end) do
|
||||
{:ok, media} ->
|
||||
:ok = write_sidecar(project, media)
|
||||
log_sidecar_error(write_sidecar(project, media), media.id)
|
||||
log_thumbnail_error(ensure_thumbnails(project, media), media.id)
|
||||
:ok = Search.sync_media(media)
|
||||
{:ok, media}
|
||||
@@ -148,7 +148,7 @@ defmodule BDS.Media do
|
||||
|> Repo.update!()
|
||||
end) do
|
||||
{:ok, updated_media} ->
|
||||
:ok = write_sidecar(project, updated_media)
|
||||
log_sidecar_error(write_sidecar(project, updated_media), updated_media.id)
|
||||
:ok = Search.sync_media(updated_media)
|
||||
{:ok, updated_media}
|
||||
|
||||
@@ -240,7 +240,7 @@ defmodule BDS.Media do
|
||||
|> Repo.insert_or_update!()
|
||||
end) do
|
||||
{:ok, updated_translation} ->
|
||||
:ok = write_translation_sidecar(project, media, updated_translation)
|
||||
log_sidecar_error(write_translation_sidecar(project, media, updated_translation), media.id)
|
||||
:ok = Search.sync_media(media.id)
|
||||
{:ok, updated_translation}
|
||||
|
||||
@@ -275,7 +275,7 @@ defmodule BDS.Media do
|
||||
)
|
||||
|
||||
:ok = Search.sync_media(media)
|
||||
:ok = write_sidecar(project, media)
|
||||
log_sidecar_error(write_sidecar(project, media), media.id)
|
||||
{:ok, true}
|
||||
|
||||
{:error, changeset} ->
|
||||
@@ -322,7 +322,7 @@ defmodule BDS.Media do
|
||||
end) do
|
||||
{:ok, updated_media} ->
|
||||
_ = File.rm(previous_destination_backup)
|
||||
:ok = write_sidecar(project, updated_media)
|
||||
log_sidecar_error(write_sidecar(project, updated_media), updated_media.id)
|
||||
log_thumbnail_error(ensure_thumbnails(project, updated_media), updated_media.id)
|
||||
:ok = Search.sync_media(updated_media)
|
||||
{:ok, updated_media}
|
||||
@@ -350,4 +350,10 @@ defmodule BDS.Media do
|
||||
defp log_thumbnail_error({:error, reason}, media_id) do
|
||||
Logger.warning("Thumbnail generation failed for media #{media_id}: #{inspect(reason)}")
|
||||
end
|
||||
|
||||
defp log_sidecar_error(:ok, _media_id), do: :ok
|
||||
|
||||
defp log_sidecar_error({:error, reason}, media_id) do
|
||||
Logger.warning("Sidecar write failed for media #{media_id}: #{inspect(reason)}")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
defmodule BDS.Media.Linking do
|
||||
@moduledoc false
|
||||
|
||||
require Logger
|
||||
|
||||
import Ecto.Query
|
||||
|
||||
alias BDS.Media.Media
|
||||
@@ -64,7 +66,7 @@ defmodule BDS.Media.Linking do
|
||||
end
|
||||
end) do
|
||||
{:ok, _result} ->
|
||||
:ok = Sidecars.write_sidecar(project, media)
|
||||
log_sidecar_error(Sidecars.write_sidecar(project, media), media.id)
|
||||
{:ok, :linked}
|
||||
|
||||
{:error, reason} ->
|
||||
@@ -93,7 +95,7 @@ defmodule BDS.Media.Linking do
|
||||
:ok
|
||||
end) do
|
||||
{:ok, :ok} ->
|
||||
:ok = Sidecars.write_sidecar(project, media)
|
||||
log_sidecar_error(Sidecars.write_sidecar(project, media), media.id)
|
||||
{:ok, :unlinked}
|
||||
|
||||
{:error, reason} ->
|
||||
@@ -112,6 +114,12 @@ defmodule BDS.Media.Linking do
|
||||
)
|
||||
end
|
||||
|
||||
defp log_sidecar_error(:ok, _media_id), do: :ok
|
||||
|
||||
defp log_sidecar_error({:error, reason}, media_id) do
|
||||
Logger.warning("Sidecar write failed for media #{media_id}: #{inspect(reason)}")
|
||||
end
|
||||
|
||||
defp next_sort_order(media_id) do
|
||||
case Repo.one(
|
||||
from pm in PostMedia,
|
||||
|
||||
@@ -18,10 +18,9 @@ defmodule BDS.Media.Sidecars do
|
||||
alias BDS.Search
|
||||
alias BDS.Sidecar
|
||||
|
||||
@spec write_sidecar(BDS.Projects.Project.t(), Media.t()) :: :ok
|
||||
@spec write_sidecar(BDS.Projects.Project.t(), Media.t()) :: :ok | {:error, File.posix()}
|
||||
def write_sidecar(project, media) do
|
||||
path = Path.join(Projects.project_data_dir(project), media.sidecar_path)
|
||||
:ok = File.mkdir_p(Path.dirname(path))
|
||||
|
||||
atomic_write(
|
||||
path,
|
||||
@@ -45,7 +44,8 @@ defmodule BDS.Media.Sidecars do
|
||||
)
|
||||
end
|
||||
|
||||
@spec write_translation_sidecar(BDS.Projects.Project.t(), Media.t(), Translation.t()) :: :ok
|
||||
@spec write_translation_sidecar(BDS.Projects.Project.t(), Media.t(), Translation.t()) ::
|
||||
:ok | {:error, File.posix()}
|
||||
def write_translation_sidecar(project, media, translation) do
|
||||
path =
|
||||
Path.join(
|
||||
@@ -53,8 +53,6 @@ defmodule BDS.Media.Sidecars do
|
||||
translation_sidecar_path(media, translation.language)
|
||||
)
|
||||
|
||||
:ok = File.mkdir_p(Path.dirname(path))
|
||||
|
||||
atomic_write(
|
||||
path,
|
||||
Sidecar.serialize_document([
|
||||
@@ -189,8 +187,7 @@ defmodule BDS.Media.Sidecars do
|
||||
|
||||
media ->
|
||||
project = Projects.get_project!(media.project_id)
|
||||
:ok = write_sidecar(project, media)
|
||||
:ok
|
||||
write_sidecar(project, media)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -224,8 +221,11 @@ defmodule BDS.Media.Sidecars do
|
||||
%Translation{} = translation ->
|
||||
media = Repo.get!(Media, translation.translation_for)
|
||||
project = Projects.get_project!(media.project_id)
|
||||
:ok = write_translation_sidecar(project, media, translation)
|
||||
{:ok, translation}
|
||||
|
||||
case write_translation_sidecar(project, media, translation) do
|
||||
:ok -> {:ok, translation}
|
||||
{:error, reason} -> {:error, reason}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -77,16 +77,15 @@ defmodule BDS.ReleasePackaging do
|
||||
defp reset_output(metadata) do
|
||||
File.rm_rf!(metadata.payload_root)
|
||||
File.rm_rf!(metadata.archive_path)
|
||||
File.mkdir_p!(metadata.output_dir)
|
||||
:ok
|
||||
File.mkdir_p(metadata.output_dir)
|
||||
end
|
||||
|
||||
defp copy_release(source, destination) do
|
||||
File.mkdir_p!(Path.dirname(destination))
|
||||
|
||||
case File.cp_r(source, destination) do
|
||||
{:ok, _files} -> :ok
|
||||
{:error, reason, _file} -> {:error, reason}
|
||||
with :ok <- File.mkdir_p(Path.dirname(destination)) do
|
||||
case File.cp_r(source, destination) do
|
||||
{:ok, _files} -> :ok
|
||||
{:error, reason, _file} -> {:error, reason}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -102,8 +101,7 @@ defmodule BDS.ReleasePackaging do
|
||||
}
|
||||
|
||||
manifest_path = Path.join(metadata.payload_root, "manifest.json")
|
||||
File.write!(manifest_path, Jason.encode!(manifest, pretty: true))
|
||||
:ok
|
||||
File.write(manifest_path, Jason.encode!(manifest, pretty: true))
|
||||
end
|
||||
|
||||
defp create_archive(%Metadata{platform: :windows} = metadata) do
|
||||
|
||||
Reference in New Issue
Block a user