Packages
nerves
1.13.1
1.15.0
1.14.3
1.14.2
1.14.1
1.14.0
1.13.2
1.13.1
1.13.0
1.12.0
1.11.3
1.11.2
1.11.1
1.11.0
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.3
1.9.2
retired
1.9.1
1.9.0
1.8.0
1.7.17
1.7.16
1.7.15
1.7.14
retired
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
retired
1.7.1
retired
1.7.0
retired
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.11.0
0.10.1
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.2
0.8.1
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.8
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.4.0-rc.0
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
Craft and deploy bulletproof embedded software
Current section
Files
Jump to
Current section
Files
lib/nerves/utils/file.ex
# SPDX-FileCopyrightText: 2018 Justin Schneck
# SPDX-FileCopyrightText: 2018 Michael Schmidt
# SPDX-FileCopyrightText: 2022 Frank Hunleth
# SPDX-FileCopyrightText: 2022 Jon Carstens
#
# SPDX-License-Identifier: Apache-2.0
#
defmodule Nerves.Utils.File do
@moduledoc false
@spec untar(String.t(), String.t() | nil) :: :ok | {:error, any}
def untar(file, destination \\ nil) do
destination = destination || File.cwd!()
cmd("tar", ["xf", file, "--strip-components=1", "-C", destination])
|> result()
end
@doc """
Create a tar of the contents of the path and specified output file
"""
@spec tar(String.t(), String.t()) :: :ok | {:error, any}
def tar(path, file) do
working_dir = Path.dirname(path)
path = Path.basename(path)
cmd("tar", ["-czf", file, "-C", working_dir, path])
|> result()
end
@spec validate(String.t()) :: :ok | {:error, any}
def validate(file) do
Path.extname(file)
|> ext_cmd()
|> cmd(["-t", file])
|> result()
end
@doc false
@spec ext_cmd(String.t()) :: String.t()
def ext_cmd(".xz"), do: "xz"
def ext_cmd(".gz"), do: "gzip"
def ext_cmd(".tar"), do: "tar"
defp result({"", 0}), do: :ok
defp result({reason, _}), do: {:error, reason}
defp cmd(cmd, args) do
if System.find_executable(cmd) do
Nerves.Port.cmd(cmd, args, stderr_to_stdout: true)
else
raise "Could not find '#{cmd}'. See https://hexdocs.pm/nerves/installation.html for required packages."
end
end
end