Packages
nerves
1.15.0
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/mix/tasks/nerves.artifact.get.ex
# SPDX-FileCopyrightText: 2018 Justin Schneck
# SPDX-FileCopyrightText: 2018 Wojtek Mach
# SPDX-FileCopyrightText: 2021 Frank Hunleth
# SPDX-FileCopyrightText: 2022 Jon Carstens
#
# SPDX-License-Identifier: Apache-2.0
#
defmodule Mix.Tasks.Nerves.Artifact.Get do
@moduledoc false
use Mix.Task
alias Nerves.Artifact
alias Nerves.Artifact.Cache
alias Nerves.Artifact.Resolver
@impl Mix.Task
def run(_opts) do
Mix.shell().info("Checking for prebuilt Nerves artifacts...")
Nerves.Env.packages()
|> Enum.each(&get(&1.app))
end
@doc false
@spec get(atom()) :: :ok
def get(app) do
case Nerves.Env.package(app) do
%Nerves.Package{type: type} when type in [:toolchain_platform, :system_platform] ->
:ok
%Nerves.Package{} = pkg ->
# Check to see if the package path is set in the environment
cond do
Nerves.Artifact.env_var?(pkg) ->
path = System.get_env(Nerves.Artifact.env_var(pkg))
Nerves.Utils.Shell.success(" Env #{app}")
Nerves.Utils.Shell.success(" #{path}")
# Check the cache
cache_path = Artifact.Cache.get(pkg) ->
Nerves.Utils.Shell.success(" Found #{app} in cache")
Nerves.Utils.Shell.info(" #{cache_path}")
true ->
get_artifact(pkg)
end
_ ->
Nerves.Utils.Shell.warn(" Skipping #{app}")
end
end
defp get_artifact(pkg) do
archive = Artifact.download_path(pkg)
Nerves.Utils.Shell.success(" Checking #{pkg.app}...")
with true <- File.exists?(archive),
:ok <- Nerves.Artifact.Archive.validate(archive) do
Nerves.Utils.Shell.info(" => Trying #{archive}")
put_cache(pkg, archive)
else
_error ->
_ = File.rm(archive)
resolvers = Artifact.expand_sites(pkg)
get_artifact(pkg, resolvers)
end
end
defp get_artifact(pkg, []), do: Nerves.Utils.Shell.warn(" Skipping #{pkg.app}")
defp get_artifact(pkg, resolvers) do
case Resolver.get(resolvers, pkg) do
{:ok, archive} ->
put_cache(pkg, archive)
{:error, reason} ->
Nerves.Utils.Shell.error(" => Prebuilt #{pkg.app} not found (#{reason})")
end
end
defp put_cache(pkg, archive) do
checksum = Artifact.checksum(pkg)
if checksum == Nerves.Artifact.checksum(pkg) do
_ = Cache.put(pkg, archive)
Nerves.Utils.Shell.success(" => Success")
else
Nerves.Utils.Shell.error(" => Error: Checksums do not match")
end
end
end