defmodule Plausible.File do @moduledoc """ File helpers for Plausible. """ @doc """ Moves a file from one location to another. Tries renaming first, and falls back to copying and deleting the original. """ @spec mv!(Path.t(), Path.t()) :: :ok def mv!(source, destination) do File.rename!(source, destination) rescue e in File.RenameError -> try do case e.reason do # fallback to cp/rm for cross-device moves # https://github.com/plausible/analytics/issues/4638 :exdev -> File.cp!(source, destination) _ -> reraise(e, __STACKTRACE__) end after File.rm(source) end end end