Packages
nerves
1.7.13
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/artifact/cache.ex
defmodule Nerves.Artifact.Cache do
alias Nerves.Artifact
@checksum "CHECKSUM"
def get(pkg) do
path = path(pkg)
if valid?(pkg) do
path
else
nil
end
end
def put(pkg, path) do
ext = Artifact.ext(pkg)
dest = path(pkg)
File.rm_rf(dest)
if String.ends_with?(path, ext) do
File.mkdir_p!(dest)
:ok = Nerves.Utils.File.untar(path, dest)
else
Path.dirname(dest)
|> File.mkdir_p!()
File.ln_s!(path, dest)
end
Path.join(dest, @checksum)
|> File.write(Artifact.checksum(pkg))
end
def delete(pkg) do
path(pkg)
|> File.rm_rf()
end
def valid?(pkg) do
path = checksum_path(pkg)
case read_checksum(path) do
nil ->
try_link(pkg)
checksum ->
valid_checksum?(pkg, checksum)
end
end
def path(pkg) do
Artifact.base_dir()
|> Path.join(Artifact.name(pkg))
|> Path.expand()
end
def checksum_path(pkg) do
path(pkg)
|> Path.join(@checksum)
end
defp read_checksum(path) do
case File.read(path) do
{:ok, checksum} ->
String.trim(checksum)
{:error, _reason} ->
nil
end
end
defp valid_checksum?(_pkg, nil), do: false
defp valid_checksum?(pkg, checksum) do
pkg
|> Artifact.checksum()
|> String.equivalent?(checksum)
end
defp try_link(pkg) do
build_path_link = Artifact.build_path_link(pkg)
checksum_path = Path.join(build_path_link, @checksum)
checksum = read_checksum(checksum_path)
if valid_checksum?(pkg, checksum) do
dest = path(pkg)
File.mkdir_p!(Artifact.base_dir())
File.rm_rf!(dest)
File.ln_s!(build_path_link, dest)
true
else
false
end
end
end