mirror of
https://github.com/sergi0g/cup.git
synced 2025-11-13 23:53:48 -05:00
feat: detect image url from label
This commit is contained in:
3
.github/actions/build-image/action.yml
vendored
3
.github/actions/build-image/action.yml
vendored
@@ -8,7 +8,7 @@ inputs:
|
|||||||
required: true
|
required: true
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: 'composite'
|
using: "composite"
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -47,5 +47,6 @@ runs:
|
|||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
|
|||||||
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -355,7 +355,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cup"
|
name = "cup"
|
||||||
version = "3.0.4"
|
version = "3.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bollard",
|
"bollard",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "cup"
|
name = "cup"
|
||||||
version = "3.0.4"
|
version = "3.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ pub struct VersionInfo {
|
|||||||
pub struct Image {
|
pub struct Image {
|
||||||
pub reference: String,
|
pub reference: String,
|
||||||
pub parts: Parts,
|
pub parts: Parts,
|
||||||
|
pub url: Option<String>,
|
||||||
pub digest_info: Option<DigestInfo>,
|
pub digest_info: Option<DigestInfo>,
|
||||||
pub version_info: Option<VersionInfo>,
|
pub version_info: Option<VersionInfo>,
|
||||||
pub error: Option<String>,
|
pub error: Option<String>,
|
||||||
@@ -61,6 +62,7 @@ impl Image {
|
|||||||
repository,
|
repository,
|
||||||
tag,
|
tag,
|
||||||
},
|
},
|
||||||
|
url: image.url(),
|
||||||
digest_info: Some(DigestInfo {
|
digest_info: Some(DigestInfo {
|
||||||
local_digests,
|
local_digests,
|
||||||
remote_digest: None,
|
remote_digest: None,
|
||||||
@@ -141,6 +143,7 @@ impl Image {
|
|||||||
Update {
|
Update {
|
||||||
reference: self.reference.clone(),
|
reference: self.reference.clone(),
|
||||||
parts: self.parts.clone(),
|
parts: self.parts.clone(),
|
||||||
|
url: self.url.clone(),
|
||||||
result: UpdateResult {
|
result: UpdateResult {
|
||||||
has_update: has_update.to_option_bool(),
|
has_update: has_update.to_option_bool(),
|
||||||
info: match has_update {
|
info: match has_update {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ use bollard::secret::{ImageInspect, ImageSummary};
|
|||||||
pub trait InspectData {
|
pub trait InspectData {
|
||||||
fn tags(&self) -> Option<&Vec<String>>;
|
fn tags(&self) -> Option<&Vec<String>>;
|
||||||
fn digests(&self) -> Option<&Vec<String>>;
|
fn digests(&self) -> Option<&Vec<String>>;
|
||||||
|
fn url(&self) -> Option<String>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl InspectData for ImageInspect {
|
impl InspectData for ImageInspect {
|
||||||
@@ -13,6 +14,16 @@ impl InspectData for ImageInspect {
|
|||||||
fn digests(&self) -> Option<&Vec<String>> {
|
fn digests(&self) -> Option<&Vec<String>> {
|
||||||
self.repo_digests.as_ref()
|
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 {
|
impl InspectData for ImageSummary {
|
||||||
@@ -23,4 +34,8 @@ impl InspectData for ImageSummary {
|
|||||||
fn digests(&self) -> Option<&Vec<String>> {
|
fn digests(&self) -> Option<&Vec<String>> {
|
||||||
Some(&self.repo_digests)
|
Some(&self.repo_digests)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn url(&self) -> Option<String> {
|
||||||
|
self.labels.get("org.opencontainers.image.url").cloned()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ use super::{parts::Parts, status::Status};
|
|||||||
pub struct Update {
|
pub struct Update {
|
||||||
pub reference: String,
|
pub reference: String,
|
||||||
pub parts: Parts,
|
pub parts: Parts,
|
||||||
|
pub url: Option<String>,
|
||||||
pub result: UpdateResult,
|
pub result: UpdateResult,
|
||||||
pub time: u32,
|
pub time: u32,
|
||||||
pub server: Option<String>,
|
pub server: Option<String>,
|
||||||
|
|||||||
@@ -40,7 +40,9 @@ export default function Image({ data }: { data: Image }) {
|
|||||||
: data.reference;
|
: data.reference;
|
||||||
const info = getInfo(data)!;
|
const info = getInfo(data)!;
|
||||||
let url: string | null = null;
|
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) {
|
switch (data.parts.registry) {
|
||||||
case "registry-1.docker.io":
|
case "registry-1.docker.io":
|
||||||
url = `https://hub.docker.com/r/${data.parts.repository}`;
|
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">
|
<div className="mb-4 flex items-center gap-3">
|
||||||
<Box className={`size-6 shrink-0 text-${theme}-500`} />
|
<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 ? (
|
{url ? (
|
||||||
<>
|
<>
|
||||||
<a
|
<a
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ export interface Image {
|
|||||||
repository: string;
|
repository: string;
|
||||||
tag: string;
|
tag: string;
|
||||||
};
|
};
|
||||||
|
url: string | null;
|
||||||
result: {
|
result: {
|
||||||
has_update: boolean | null;
|
has_update: boolean | null;
|
||||||
info: VersionInfo | DigestInfo | null;
|
info: VersionInfo | DigestInfo | null;
|
||||||
|
|||||||
Reference in New Issue
Block a user