mirror of
https://tangled.org/evan.jarrett.net/at-container-registry
synced 2026-04-21 00:50:29 +00:00
98 lines
5.0 KiB
HTML
98 lines
5.0 KiB
HTML
{{ define "diff" }}
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
{{ template "head" . }}
|
|
{{ template "meta" .Meta }}
|
|
</head>
|
|
<body>
|
|
{{ template "nav" . }}
|
|
|
|
<main id="main-content" class="container mx-auto px-4 py-8">
|
|
<div class="space-y-6">
|
|
<!-- Breadcrumb -->
|
|
<div class="text-sm breadcrumbs">
|
|
<ul>
|
|
<li><a href="/u/{{ .Owner.Handle }}" class="link link-primary">{{ .Owner.Handle }}</a></li>
|
|
<li><a href="/r/{{ .Owner.Handle }}/{{ .Repository }}" class="link link-primary">{{ .Repository }}</a></li>
|
|
<li>Comparing {{ .FromTag }} to {{ .ToTag }}</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Summary Card -->
|
|
<div class="card bg-base-200 shadow-sm border border-base-300 p-6">
|
|
<div class="flex flex-wrap items-center gap-2 mb-4">
|
|
<h1 class="text-xl font-bold">
|
|
<span class="font-mono">{{ .FromTag }}</span>
|
|
<span class="text-base-content/40 mx-1">→</span>
|
|
<span class="font-mono">{{ .ToTag }}</span>
|
|
</h1>
|
|
</div>
|
|
|
|
<div class="flex flex-wrap gap-4">
|
|
<!-- Size delta -->
|
|
<div class="stat bg-base-200/50 rounded-lg p-3">
|
|
<div class="stat-title text-xs">Size</div>
|
|
<div class="stat-value text-sm">{{ humanizeByteDelta .Summary.SizeDelta }}</div>
|
|
</div>
|
|
|
|
<!-- Layer count -->
|
|
<div class="stat bg-base-200/50 rounded-lg p-3">
|
|
<div class="stat-title text-xs">Layers</div>
|
|
<div class="stat-value text-sm">{{ .Summary.LayerCountFrom }} → {{ .Summary.LayerCountTo }}</div>
|
|
</div>
|
|
|
|
{{ if .HasVulnData }}
|
|
<!-- Vulns fixed -->
|
|
{{ if gt .Summary.VulnFixedCount 0 }}
|
|
<div class="stat bg-success/10 rounded-lg p-3">
|
|
<div class="stat-title text-xs">Fixed</div>
|
|
<div class="stat-value text-sm text-success">-{{ .Summary.VulnFixedCount }} vuln{{ if gt .Summary.VulnFixedCount 1 }}s{{ end }}</div>
|
|
<div class="stat-desc text-xs">
|
|
{{ if gt .Summary.VulnFixedBySev.Critical 0 }}{{ .Summary.VulnFixedBySev.Critical }}C {{ end }}
|
|
{{ if gt .Summary.VulnFixedBySev.High 0 }}{{ .Summary.VulnFixedBySev.High }}H {{ end }}
|
|
{{ if gt .Summary.VulnFixedBySev.Medium 0 }}{{ .Summary.VulnFixedBySev.Medium }}M {{ end }}
|
|
{{ if gt .Summary.VulnFixedBySev.Low 0 }}{{ .Summary.VulnFixedBySev.Low }}L{{ end }}
|
|
</div>
|
|
</div>
|
|
{{ end }}
|
|
|
|
<!-- Vulns new -->
|
|
{{ if gt .Summary.VulnNewCount 0 }}
|
|
<div class="stat bg-error/10 rounded-lg p-3">
|
|
<div class="stat-title text-xs">New</div>
|
|
<div class="stat-value text-sm text-error">+{{ .Summary.VulnNewCount }} vuln{{ if gt .Summary.VulnNewCount 1 }}s{{ end }}</div>
|
|
<div class="stat-desc text-xs">
|
|
{{ if gt .Summary.VulnNewBySev.Critical 0 }}{{ .Summary.VulnNewBySev.Critical }}C {{ end }}
|
|
{{ if gt .Summary.VulnNewBySev.High 0 }}{{ .Summary.VulnNewBySev.High }}H {{ end }}
|
|
{{ if gt .Summary.VulnNewBySev.Medium 0 }}{{ .Summary.VulnNewBySev.Medium }}M {{ end }}
|
|
{{ if gt .Summary.VulnNewBySev.Low 0 }}{{ .Summary.VulnNewBySev.Low }}L{{ end }}
|
|
</div>
|
|
</div>
|
|
{{ end }}
|
|
{{ end }}
|
|
</div>
|
|
|
|
{{ if .IsMultiArch }}
|
|
<div class="flex items-center gap-3 pt-4 border-t border-base-300">
|
|
<label for="diff-arch-select" class="text-sm font-medium whitespace-nowrap">{{ icon "cpu" "size-4" }} Platform</label>
|
|
<select id="diff-arch-select" class="select select-sm select-bordered"
|
|
data-diff-url="/diff/{{ .Owner.Handle }}/{{ .Repository }}?from={{ .FromDigest }}&to={{ .ToDigest }}&platform=__VALUE__">
|
|
{{ range .CommonPlatforms }}
|
|
{{ $platKey := printf "%s/%s" .OS .Architecture }}{{ if .Variant }}{{ $platKey = printf "%s/%s/%s" .OS .Architecture .Variant }}{{ end }}
|
|
<option value="{{ $platKey }}"{{ if eq $platKey $.SelectedPlatform }} selected{{ end }}>{{ .OS }}/{{ .Architecture }}{{ if .Variant }}/{{ .Variant }}{{ end }}</option>
|
|
{{ end }}
|
|
</select>
|
|
</div>
|
|
{{ end }}
|
|
</div>
|
|
|
|
{{ template "diff-content" . }}
|
|
</div>
|
|
</main>
|
|
|
|
{{ template "footer" . }}
|
|
</body>
|
|
</html>
|
|
{{ end }}
|