defmodule Mix.Tasks.Stevedore.Inspect do
@shortdoc "Show a manifest without pulling layers"
@moduledoc """
Inspect the manifest of an image at any transport.
mix stevedore.inspect REF [options]
## Options
* `--raw` — print the raw manifest bytes
* `--scheme http|https` — registry scheme (default https)
"""
use Mix.Task
alias Stevedore.{CLI, Manifest}
alias Stevedore.Transport.Parse
@switches [raw: :boolean, scheme: :string]
@impl true
def run(argv) do
{opts, args, _} = OptionParser.parse(argv, switches: @switches)
case args do
[ref] ->
CLI.start_app()
{transport, tref} = CLI.unwrap!(Parse.parse(ref, Keyword.take(opts, [:scheme])))
fetched = CLI.unwrap!(Stevedore.Transport.get_manifest(transport, tref))
render(fetched, opts[:raw])
_ ->
Mix.raise("usage: mix stevedore.inspect REF [--raw]")
end
end
defp render(fetched, true), do: Mix.shell().info(fetched.raw)
defp render(fetched, _) do
Mix.shell().info("Media-Type: #{fetched.media_type}")
Mix.shell().info("Digest: #{fetched.digest}")
summarize(Manifest.parse(fetched.raw, fetched.media_type))
end
defp summarize({:ok, manifest}) do
case Manifest.kind(manifest) do
:index ->
{:ok, entries} = Manifest.manifests(manifest)
Mix.shell().info("Platforms: #{length(entries)}")
:manifest ->
{:ok, layers} = Manifest.layers(manifest)
Mix.shell().info("Layers: #{length(layers)}")
end
end
defp summarize(_), do: :ok
end