From 1c8064ebf057e956b4d873fdaccaecbb4f67ca88 Mon Sep 17 00:00:00 2001 From: Tomas Mirchev Date: Mon, 3 Nov 2025 08:04:08 +0200 Subject: [PATCH] init --- parse_image_ref.sh | 110 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 parse_image_ref.sh diff --git a/parse_image_ref.sh b/parse_image_ref.sh new file mode 100644 index 0000000..0cd5f31 --- /dev/null +++ b/parse_image_ref.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash +# parse_image_ref.sh + +DEFAULT_REGISTRY="registry.tm0.app" +DEFAULT_TAG="latest" + +parse_image_ref() { + local input="$1" + + local image_ref registry repo tag label + + if [[ $input == */* ]]; then + local prefix="${input%%/*}" + if [[ "$prefix" == "docker" ]]; then + input="docker.io/library/${input#*/}" + elif [[ "$prefix" == "tm0" ]]; then + input="${DEFAULT_REGISTRY}/${input#*/}" + fi + + registry="${input%%/*}" + input=${input#*/} + else + registry="$DEFAULT_REGISTRY" + fi + + if [[ "${input##*/}" == *:* ]]; then + tag="${input##*:}" + input="${input%:*}" + else + tag="$DEFAULT_TAG" + fi + + repo="${registry}/${input}" + repo="${repo#*/}" + image_ref="${registry}/${repo}:${tag}" + + label="${registry%.*}" + label="${label##*.}/${repo##*/}" + + echo "$image_ref $repo $tag $label" +} + +# ------------------------------------------------------------------- +# Test harness +# ------------------------------------------------------------------- +test_case() { + local input="$1" + local expected="$2" + local output + output="$(parse_image_ref "$input")" + + if [[ "$output" == "$expected" ]]; then + printf "✅ PASS: %-35s => %s\n" "$input" "$output" + else + printf "❌ FAIL: %-35s\n" "$input" + printf " expected: %s\n" "$expected" + printf " got: %s\n" "$output" + fi +} + +run_tests() { + echo "Running test cases..." + echo + + test_case "tm0/nginx" \ + "registry.tm0.app/nginx:latest nginx latest tm0/nginx" + + test_case "tm0/dev/api" \ + "registry.tm0.app/dev/api:latest dev/api latest tm0/api" + + test_case "registry.tm0.app/nginx" \ + "registry.tm0.app/nginx:latest nginx latest tm0/nginx" + + test_case "registry.tm0.app:2525/nginx" \ + "registry.tm0.app:2525/nginx:latest nginx latest tm0/nginx" + + test_case "registry.tm0.app/dev/api" \ + "registry.tm0.app/dev/api:latest dev/api latest tm0/api" + + test_case "a.b.c.registry.tm0.app/dev/api" \ + "a.b.c.registry.tm0.app/dev/api:latest dev/api latest tm0/api" + + test_case "docker/nginx" \ + "docker.io/library/nginx:latest library/nginx latest docker/nginx" + + test_case "docker/nginx:1.25" \ + "docker.io/library/nginx:1.25 library/nginx 1.25 docker/nginx" + + test_case "docker.io/library/nginx:1.25" \ + "docker.io/library/nginx:1.25 library/nginx 1.25 docker/nginx" + + test_case "docker/redis" \ + "docker.io/library/redis:latest library/redis latest docker/redis" + + test_case "custom-registry.io/team/api:2.3.1" \ + "custom-registry.io/team/api:2.3.1 team/api 2.3.1 custom-registry/api" + + test_case "custom-registry.io:2525/team/api:2.3.1" \ + "custom-registry.io:2525/team/api:2.3.1 team/api 2.3.1 custom-registry/api" + + test_case "custom-registry.io:2525/api:2.3.1" \ + "custom-registry.io:2525/api:2.3.1 api 2.3.1 custom-registry/api" + + test_case "custom-registry.io/app" \ + "custom-registry.io/app:latest app latest custom-registry/app" +} + +if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then + run_tests +fi