m/cup
1
0
mirror of https://github.com/sergi0g/cup.git synced 2025-11-13 15:43:49 -05:00

feat: detect image url from label

This commit is contained in:
Sergio
2025-03-11 17:06:00 +02:00
parent a5a1f12899
commit a599d4e084
8 changed files with 28 additions and 5 deletions

View File

@@ -8,7 +8,7 @@ inputs:
required: true
runs:
using: 'composite'
using: "composite"
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -47,5 +47,6 @@ runs:
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max

2
Cargo.lock generated
View File

@@ -355,7 +355,7 @@ dependencies = [
[[package]]
name = "cup"
version = "3.0.4"
version = "3.1.0"
dependencies = [
"bollard",
"chrono",

View File

@@ -1,6 +1,6 @@
[package]
name = "cup"
version = "3.0.4"
version = "3.1.0"
edition = "2021"
[dependencies]

View File

@@ -35,6 +35,7 @@ pub struct VersionInfo {
pub struct Image {
pub reference: String,
pub parts: Parts,
pub url: Option<String>,
pub digest_info: Option<DigestInfo>,
pub version_info: Option<VersionInfo>,
pub error: Option<String>,
@@ -61,6 +62,7 @@ impl Image {
repository,
tag,
},
url: image.url(),
digest_info: Some(DigestInfo {
local_digests,
remote_digest: None,
@@ -141,6 +143,7 @@ impl Image {
Update {
reference: self.reference.clone(),
parts: self.parts.clone(),
url: self.url.clone(),
result: UpdateResult {
has_update: has_update.to_option_bool(),
info: match has_update {

View File

@@ -3,6 +3,7 @@ use bollard::secret::{ImageInspect, ImageSummary};
pub trait InspectData {
fn tags(&self) -> Option<&Vec<String>>;
fn digests(&self) -> Option<&Vec<String>>;
fn url(&self) -> Option<String>;
}
impl InspectData for ImageInspect {
@@ -13,6 +14,16 @@ impl InspectData for ImageInspect {
fn digests(&self) -> Option<&Vec<String>> {
self.repo_digests.as_ref()
}
fn url(&self) -> Option<String> {
match &self.config {
Some(config) => match &config.labels {
Some(labels) => labels.get("org.opencontainers.image.url").cloned(),
None => None,
},
None => None,
}
}
}
impl InspectData for ImageSummary {
@@ -23,4 +34,8 @@ impl InspectData for ImageSummary {
fn digests(&self) -> Option<&Vec<String>> {
Some(&self.repo_digests)
}
fn url(&self) -> Option<String> {
self.labels.get("org.opencontainers.image.url").cloned()
}
}

View File

@@ -7,6 +7,7 @@ use super::{parts::Parts, status::Status};
pub struct Update {
pub reference: String,
pub parts: Parts,
pub url: Option<String>,
pub result: UpdateResult,
pub time: u32,
pub server: Option<String>,

View File

@@ -40,7 +40,9 @@ export default function Image({ data }: { data: Image }) {
: data.reference;
const info = getInfo(data)!;
let url: string | null = null;
if (clickable_registries.includes(data.parts.registry)) {
if (data.url) {
url = data.url;
} else if (clickable_registries.includes(data.parts.registry)) {
switch (data.parts.registry) {
case "registry-1.docker.io":
url = `https://hub.docker.com/r/${data.parts.repository}`;
@@ -82,7 +84,7 @@ export default function Image({ data }: { data: Image }) {
>
<div className="mb-4 flex items-center gap-3">
<Box className={`size-6 shrink-0 text-${theme}-500`} />
<DialogTitle className="font-mono text-black dark:text-white break-all">
<DialogTitle className="break-all font-mono text-black dark:text-white">
{url ? (
<>
<a

View File

@@ -20,6 +20,7 @@ export interface Image {
repository: string;
tag: string;
};
url: string | null;
result: {
has_update: boolean | null;
info: VersionInfo | DigestInfo | null;