Packages
timber
2.8.0
3.1.2
3.1.1
3.1.0
3.0.0
3.0.0-alpha.3
3.0.0-alpha.2
3.0.0-alpha.1
2.8.4
2.8.3
2.8.2
2.8.1
2.8.0
2.7.0
2.6.1
2.6.0
2.5.6
2.5.5
2.5.4
2.5.3
2.5.2
2.5.1
2.5.0
2.4.5
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.1
2.3.0
2.2.1
2.2.0
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.2
2.0.1
2.0.0
2.0.0-rc7
2.0.0-rc6
2.0.0-rc5
2.0.0-rc4
2.0.0-rc3
2.0.0-rc2
2.0.0-rc1
1.1.18
1.1.17
1.1.16
1.1.15
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
🌲 Great Elixir Logging Made Easy. Official Timber.io Integration.
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/timber/install/file_helper.ex
defmodule Mix.Tasks.Timber.Install.FileHelper do
@moduledoc false
alias __MODULE__.{FileReadingError, FileReplacePatternError, FileWritingError}
alias Mix.Tasks.Timber.Install.{API, Config}
def append_once!(path, contents, contains_pattern, api) do
case Config.file_client().read(path) do
{:ok, current_contents} ->
if String.contains?(current_contents, contains_pattern) do
:ok
else
case Config.file_client().open(path, [:append]) do
{:ok, file} ->
result = Config.io_client().binwrite(file, contents)
Config.file_client().close(file)
API.event!(api, :file_written, %{path: path})
result
{:error, reason} -> raise(FileWritingError, path: path, reason: reason)
end
end
{:error, reason} -> raise(FileWritingError, path: path, reason: reason)
end
end
def dir?(path) do
Config.file_client().dir?(path)
end
def read!(path) do
case Config.file_client().read(path) do
{:ok, contents} -> contents
{:error, reason} -> raise(FileReadingError, path: path, reason: reason)
end
end
def remove_once!(contents, pattern) do
String.replace(contents, pattern, "")
end
def replace_once!(contents, pattern, replacement, contains_pattern) do
if String.contains?(contents, contains_pattern) do
contents
else
new_contents = String.replace(contents, pattern, replacement)
if String.contains?(new_contents, contains_pattern) do
new_contents
else
raise(FileReplacePatternError, pattern: contains_pattern)
end
end
end
def write!(path, contents, api) do
case Config.file_client().open(path, [:write]) do
{:ok, file} ->
result = Config.io_client().binwrite(file, contents)
Config.file_client().close(file)
case result do
:ok ->
API.event!(api, :file_written, %{path: path})
:ok
{:error, reason} -> raise(FileWritingError, path: path, reason: reason)
end
{:error, reason} -> raise(FileWritingError, path: path, reason: reason)
end
end
#
# Errors
#
defmodule FileReplacePatternError do
defexception [:message]
def exception(opts) do
pattern = Keyword.fetch!(opts, :pattern)
message =
"""
Uh oh! We had a problem updating a file. The pattern
#{pattern} was not found after writing!
"""
%__MODULE__{message: message}
end
end
defmodule FileReadingError do
defexception [:message]
def exception(opts) do
path = Keyword.fetch!(opts, :path)
reason = Keyword.fetch!(opts, :reason)
message =
"""
Uh oh! We had a problem reading #{path}:
#{reason}
"""
%__MODULE__{message: message}
end
end
defmodule FileWritingError do
defexception [:message]
def exception(opts) do
path = Keyword.fetch!(opts, :path)
reason = Keyword.fetch!(opts, :reason)
message =
"""
Uh oh! We had a problem writing to #{path}:
#{reason}
"""
%__MODULE__{message: message}
end
end
end