From 36b0f576e5a00726d76695fd3300710be6f925f8 Mon Sep 17 00:00:00 2001
From: Andre Silva <32734153+Aandree5@users.noreply.github.com>
Date: Sat, 19 Jul 2025 20:22:11 +0100
Subject: [PATCH] fix: improved import from docker parsing (#3642)
---
...widget-multiReleasesRepositories-input.tsx | 103 ++++++++++--------
1 file changed, 57 insertions(+), 46 deletions(-)
diff --git a/packages/widgets/src/_inputs/widget-multiReleasesRepositories-input.tsx b/packages/widgets/src/_inputs/widget-multiReleasesRepositories-input.tsx
index 0eecc8e2e..556322084 100644
--- a/packages/widgets/src/_inputs/widget-multiReleasesRepositories-input.tsx
+++ b/packages/widgets/src/_inputs/widget-multiReleasesRepositories-input.tsx
@@ -509,19 +509,19 @@ interface ReleasesRepositoryImport extends ReleasesRepository {
alreadyImported: boolean;
}
-interface ContainerImageSelectorProps {
- containerImage: ReleasesRepositoryImport;
+interface ImportRepositorySelectProps {
+ repository: ReleasesRepositoryImport;
integration?: Integration;
versionFilterPrecisionOptions: string[];
onImageSelectionChanged?: (isSelected: boolean) => void;
}
-const ContainerImageSelector = ({
- containerImage,
+const ImportRepositorySelect = ({
+ repository,
integration,
versionFilterPrecisionOptions,
onImageSelectionChanged,
-}: ContainerImageSelectorProps) => {
+}: ImportRepositorySelectProps) => {
const tRepository = useScopedI18n("widget.releases.option.repositories");
const checkBoxProps: CheckboxProps = !onImageSelectionChanged
? {
@@ -539,29 +539,29 @@ const ContainerImageSelector = ({
label={
- {containerImage.identifier}
+ {repository.identifier}
}
{...checkBoxProps}
/>
- {containerImage.versionFilter && (
+ {repository.versionFilter && (
{tRepository("versionFilter.label")}:
- {containerImage.versionFilter.prefix && containerImage.versionFilter.prefix}
+ {repository.versionFilter.prefix && repository.versionFilter.prefix}
- {versionFilterPrecisionOptions[containerImage.versionFilter.precision]}
+ {versionFilterPrecisionOptions[repository.versionFilter.precision]}
- {containerImage.versionFilter.suffix && containerImage.versionFilter.suffix}
+ {repository.versionFilter.suffix && repository.versionFilter.suffix}
)}
@@ -610,36 +610,47 @@ const RepositoryImportModal = createModal(({ innerProps,
enabled: innerProps.isAdmin,
});
- const containersImages: ReleasesRepositoryImport[] = useMemo(
+ const importRepositories: ReleasesRepositoryImport[] = useMemo(
() =>
- docker.data?.containers.reduce((acc, containerImage) => {
- const imageParts = containerImage.image.split("/");
- const source = imageParts.length > 1 ? imageParts[0] : "docker.io";
- const identifierImage = imageParts.length > 1 ? imageParts[1] : imageParts[0];
+ docker.data?.containers.reduce((acc, container) => {
+ const [maybeSource, maybeIdentifierAndVersion] = container.image.split(/\/(.*)/);
+ const hasSource = maybeSource && maybeSource in sourceToProviderKind;
+ const source = hasSource ? maybeSource : "docker.io";
+ const identifierAndVersion = hasSource ? maybeIdentifierAndVersion : container.image;
- if (!source || !identifierImage) return acc;
+ if (!identifierAndVersion) return acc;
- const providerKey = source in containerImageToProviderKind ? containerImageToProviderKind[source] : "dockerHub";
+ const providerKey = sourceToProviderKind[source];
const integrationId = Object.values(innerProps.integrations).find(
(integration) => integration.kind === providerKey,
)?.id;
- const [identifier, version] = identifierImage.split(":");
+ const [identifier, version] = identifierAndVersion.split(":");
if (!identifier || !integrationId) return acc;
- if (acc.some((item) => item.providerIntegrationId === integrationId && item.identifier === identifier))
+ if (
+ acc.some(
+ (item) =>
+ item.providerIntegrationId !== undefined &&
+ innerProps.integrations[item.providerIntegrationId]?.kind === providerKey &&
+ item.identifier === identifier,
+ )
+ )
return acc;
acc.push({
id: createId(),
providerIntegrationId: integrationId,
identifier,
- iconUrl: containerImage.iconUrl ?? undefined,
+ iconUrl: container.iconUrl ?? undefined,
name: formatIdentifierName(identifier),
versionFilter: version ? parseImageVersionToVersionFilter(version) : undefined,
alreadyImported: innerProps.repositories.some(
- (item) => item.providerIntegrationId === integrationId && item.identifier === identifier,
+ (item) =>
+ item.providerIntegrationId !== undefined &&
+ innerProps.integrations[item.providerIntegrationId]?.kind === providerKey &&
+ item.identifier === identifier,
),
});
return acc;
@@ -657,13 +668,13 @@ const RepositoryImportModal = createModal(({ innerProps,
}, [innerProps, selectedImages, actions]);
const allImagesImported = useMemo(
- () => containersImages.every((containerImage) => containerImage.alreadyImported),
- [containersImages],
+ () => importRepositories.every((repository) => repository.alreadyImported),
+ [importRepositories],
);
const anyImagesImported = useMemo(
- () => containersImages.some((containerImage) => containerImage.alreadyImported),
- [containersImages],
+ () => importRepositories.some((repository) => repository.alreadyImported),
+ [importRepositories],
);
return (
@@ -673,7 +684,7 @@ const RepositoryImportModal = createModal(({ innerProps,
{tRepository("importRepositories.loading")}
- ) : containersImages.length === 0 ? (
+ ) : importRepositories.length === 0 ? (
{tRepository("importRepositories.noImagesFound")}
@@ -694,23 +705,23 @@ const RepositoryImportModal = createModal(({ innerProps,
{!allImagesImported &&
- containersImages
- .filter((containerImage) => !containerImage.alreadyImported)
- .map((containerImage) => {
- const integration = containerImage.providerIntegrationId
- ? innerProps.integrations[containerImage.providerIntegrationId]
+ importRepositories
+ .filter((repository) => !repository.alreadyImported)
+ .map((repository) => {
+ const integration = repository.providerIntegrationId
+ ? innerProps.integrations[repository.providerIntegrationId]
: undefined;
return (
-
isSelected
- ? setSelectedImages([...selectedImages, containerImage])
- : setSelectedImages(selectedImages.filter((img) => img !== containerImage))
+ ? setSelectedImages([...selectedImages, repository])
+ : setSelectedImages(selectedImages.filter((img) => img !== repository))
}
/>
);
@@ -723,17 +734,17 @@ const RepositoryImportModal = createModal(({ innerProps,
{anyImagesImported &&
- containersImages
- .filter((containerImage) => containerImage.alreadyImported)
- .map((containerImage) => {
- const integration = containerImage.providerIntegrationId
- ? innerProps.integrations[containerImage.providerIntegrationId]
+ importRepositories
+ .filter((repository) => repository.alreadyImported)
+ .map((repository) => {
+ const integration = repository.providerIntegrationId
+ ? innerProps.integrations[repository.providerIntegrationId]
: undefined;
return (
-
@@ -763,7 +774,7 @@ const RepositoryImportModal = createModal(({ innerProps,
size: "xl",
});
-const containerImageToProviderKind: Record = {
+const sourceToProviderKind: Record = {
"ghcr.io": "github",
"docker.io": "dockerHub",
};