From 078e38b434a7aa58dcf97d17b6c423d5f35a97f8 Mon Sep 17 00:00:00 2001
From: Sheogorath <sheogorath@shivering-isles.com>
Date: Tue, 18 Jan 2022 02:20:12 +0100
Subject: [PATCH] WIP: First simplifications for shell tools

---
 resources/shell-tools/bin/manifest.sh |  83 +++++++++++++++++
 resources/shell-tools/bin/pull.sh     |  38 ++------
 resources/shell-tools/bin/push.sh     |  30 ++++---
 resources/shell-tools/bin/tagging.sh  | 125 --------------------------
 resources/shell-tools/install.sh      |   6 +-
 5 files changed, 111 insertions(+), 171 deletions(-)
 create mode 100755 resources/shell-tools/bin/manifest.sh
 delete mode 100755 resources/shell-tools/bin/tagging.sh

diff --git a/resources/shell-tools/bin/manifest.sh b/resources/shell-tools/bin/manifest.sh
new file mode 100755
index 0000000..d9e2320
--- /dev/null
+++ b/resources/shell-tools/bin/manifest.sh
@@ -0,0 +1,83 @@
+#!/bin/bash
+
+set -o pipefail
+set -u
+set -e
+
+VERSION=0.2.0
+
+printVersion() {
+    echo "$VERSION"
+}
+
+printUsage() {
+    printVersion
+    echo "
+    Shivering-Isles manifest tool
+
+    Usage of $0:
+        $0 <IMAGE REFERENCE> <PREFIX> <VERSION> <SUFFIX>
+
+    Example:
+        $0 myimage:test myApp 2.0.24 alpine
+    "
+    exit 1
+}
+
+PREFIX=""
+SUFFIX=""
+LATEST=0
+LOCAL=0
+MULTIARCH_SUPPORTED="amd64|arm64|aarch64"
+
+if [ "$1" = "--help" ]; then
+    printUsage
+fi
+
+for i in "$@"
+do
+case $i in
+    -p=*|--prefix=*)
+    PREFIX="${i#*=}"
+    shift
+    ;;
+    -s=*|--suffix=*)
+    SUFFIX="${i#*=}"
+    shift # past argument=value
+    ;;
+    -v|--version)
+    printVersion
+    exit 0
+    shift # past argument with no value
+    ;;
+    -h|--help)
+    printUsage
+    shift
+    ;;
+    *)
+          # further/unknown options
+    ;;
+esac
+done
+
+CURRENT_IMAGE_REFERENCE=${1:-invalid}
+TARGET_IMAGE_NAME=${2:-invalid}
+TARGET_IMAGE_VERSION=${3:-invalid}
+
+if [ "$CURRENT_IMAGE_REFERENCE" = "invalid" ] || [ "$TARGET_IMAGE_NAME" = "invalid" ] || [ "$TARGET_IMAGE_VERSION" = "invalid" ]; then
+    echo "Error: Invalid image name or version" >&2
+    printUsage
+fi
+
+mapfile -t MULTIARCH_IMAGES < <(podman images | awk '{print $1 ":" $2}' | grep -Pe "$CURRENT_IMAGE_REFERENCE-($MULTIARCH_SUPPORTED)$")
+MULTIARCH_IMAGES_COUNT=${#MULTIARCH_IMAGES[@]}
+
+TARGET_IMAGE_REFERENCE="${TARGET_IMAGE_NAME}:${PREFIX}${TARGET_IMAGE_VERSION}${SUFFIX}"
+for IMAGE_REFERENCE in $(podman images --format="{{.Repository}}:{{.Tag}}" "$CURRENT_IMAGE_REFERENCE"); do
+    MANIFEST_CMD_PARAMETERES=""
+    if [[ "$IMAGE_REFERENCE" =~ "aarch64"|"arm64" ]]; then
+        podman manifest add --variant v8 "$TARGET_IMAGE_REFERENCE" containers-storage:"$IMAGE_REFERENCE"
+    else
+        podman manifest add "$TARGET_IMAGE_REFERENCE" containers-storage:"$IMAGE_REFERENCE"
+    fi
+done
diff --git a/resources/shell-tools/bin/pull.sh b/resources/shell-tools/bin/pull.sh
index 934c976..1e06488 100755
--- a/resources/shell-tools/bin/pull.sh
+++ b/resources/shell-tools/bin/pull.sh
@@ -4,7 +4,7 @@ set -o pipefail
 set -u
 set -e
 
-VERSION=0.1.0
+VERSION=0.2.0
 
 printVersion() {
     echo "$VERSION"
@@ -26,12 +26,6 @@ printUsage() {
     exit 1
 }
 
-CONTAINER_CMD=podman
-
-if ! command -v "$CONTAINER_CMD" >/dev/null 2>&1; then
-    CONTAINER_CMD=docker
-fi
-
 if [ "$1" = "--help" ]; then
     printUsage
 fi
@@ -39,10 +33,6 @@ fi
 for i in "$@"
 do
 case $i in
-    --container-cmd=*)
-    CONTAINER_CMD="${i#*=}"
-    shift # past argument with no value
-    ;;
     -v|--version)
     printVersion
     exit 0
@@ -65,25 +55,13 @@ if [ "$CONTAINER_IMAGE_NAME" = "invalid" ]; then
     printUsage
 fi
 
-IMAGE_PULL_SUCCESS=0
+NUMBER_IMAGES="$(podman images "$CONTAINER_IMAGE_NAME" | wc -l)"
 
-# shellcheck disable=SC2015
-podman pull "$CONTAINER_IMAGE_NAME" && \
-  IMAGE_PULL_SUCCESS=1 || \
-  true
-
-# shellcheck disable=SC2015
-podman pull "$CONTAINER_IMAGE_NAME-amd64" && \
-  IMAGE_PULL_SUCCESS=1 || \
-  true
-
-# shellcheck disable=SC2015
-podman pull "$CONTAINER_IMAGE_NAME-arm64" || \
-  podman pull "$CONTAINER_IMAGE_NAME-aarch64" && \
-  IMAGE_PULL_SUCCESS=1 || \
-  true
+for i in "$CONTAINER_IMAGE_NAME"{,-amd64,-arm64,-aarch64}; do
+    podman pull "$i" || true
+done
 
-if [ "$IMAGE_PULL_SUCCESS" == "0" ]; then
-  echo "Error: No images pulled" >&2
-  exit 1
+if ! [ "$NUMBER_IMAGES" -lt "$(podman images "$CONTAINER_IMAGE_NAME" | wc -l)" ]; then
+    echo "Number of pulled images unchanged. Failed to pull images." >&2
+    exit 1
 fi
diff --git a/resources/shell-tools/bin/push.sh b/resources/shell-tools/bin/push.sh
index a9c5683..5dab24c 100755
--- a/resources/shell-tools/bin/push.sh
+++ b/resources/shell-tools/bin/push.sh
@@ -4,7 +4,7 @@ set -o pipefail
 set -u
 set -e
 
-VERSION=0.1.0
+VERSION=0.2.0
 
 printVersion() {
     echo "$VERSION"
@@ -18,19 +18,15 @@ printUsage() {
     This tool will push all tagged versions of a container image upstream
 
     Usage of $0:
-        $0 <IMAGE REFERENCE>
+        $0 <MANIFEST REFERENCE>
 
     Example:
-        $0 registry.example.com/example/app
+        $0 registry.example.com/example/app:1.2.3
     "
     exit 1
 }
 
-CONTAINER_CMD=podman
-
-if ! command -v "$CONTAINER_CMD" >/dev/null 2>&1; then
-    CONTAINER_CMD=docker
-fi
+LATEST=0
 
 if [ "$1" = "--help" ]; then
     printUsage
@@ -39,9 +35,9 @@ fi
 for i in "$@"
 do
 case $i in
-    --container-cmd=*)
-    CONTAINER_CMD="${i#*=}"
-    shift # past argument with no value
+    -l|--latest)
+    LATEST=1
+    shift
     ;;
     -v|--version)
     printVersion
@@ -59,11 +55,19 @@ esac
 done
 
 CONTAINER_IMAGE_NAME=${1:-invalid}
+CONTAINER_IMAGE_VERSION=${2:-invalid}
+
 
 if [ "$CONTAINER_IMAGE_NAME" = "invalid" ]; then
     echo "Error: Invalid image name" >&2
     printUsage
 fi
 
-# shellcheck disable=SC2086
-$CONTAINER_CMD images --format "{{.Repository}}:{{.Tag}}" "$CONTAINER_IMAGE_NAME" | grep "$CONTAINER_IMAGE_NAME" | xargs -L 1 "$(dirname "$0")/../libexec/pushImageOrManifest.sh"
+for i in $(seq 1 "${#CONTAINER_IMAGE_VERSION}"); do
+    REMOTE_VERSION=$(echo "$CONTAINER_IMAGE_VERSION" | cut -d. -f1-$i)
+    podman manifest push "$CONTAINER_IMAGE_NAME" "docker://${CONTAINER_IMAGE_NAME}:${REMOTE_VERSION}"
+done
+
+if [ "$LATEST" = 0 ]; then
+    podman manifest push "$CONTAINER_IMAGE_NAME" "docker://${CONTAINER_IMAGE_NAME}:latest"
+fi
diff --git a/resources/shell-tools/bin/tagging.sh b/resources/shell-tools/bin/tagging.sh
deleted file mode 100755
index dc66ad2..0000000
--- a/resources/shell-tools/bin/tagging.sh
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/bin/bash
-
-set -o pipefail
-set -u
-set -e
-
-VERSION=0.1.0
-
-printVersion() {
-    echo "$VERSION"
-}
-
-printUsage() {
-    printVersion
-    echo "
-    Shivering-Isles tagging tool
-
-    Usage of $0:
-        $0 <IMAGE REFERENCE> <PREFIX> <VERSION> <SUFFIX>
-
-    Example:
-        $0 myimage:test myApp 2.0.24 alpine
-    "
-    exit 1
-}
-
-createTagOrManifest() {
-    TARGET_IMAGE_REFERENCE=$1
-    if [ "$MULTIARCH_IMAGES_COUNT" -gt "0" ]; then
-        $CONTAINER_CMD manifest create "$TARGET_IMAGE_REFERENCE"
-        for IMAGE_REFERENCE in "${MULTIARCH_IMAGES[@]}"
-        do
-            MANIFEST_OPTIONS=()
-            if [[ "$IMAGE_REFERENCE" =~ "aarch64"|"arm64" ]]; then
-                MANIFEST_OPTIONS+=(--variant v8)
-            fi
-            if [ "$LOCAL" = "1" ]; then
-                $CONTAINER_CMD manifest add "${MANIFEST_OPTIONS[@]}" "$TARGET_IMAGE_REFERENCE" containers-storage:"$IMAGE_REFERENCE"
-            else
-                $CONTAINER_CMD manifest add "${MANIFEST_OPTIONS[@]}" "$TARGET_IMAGE_REFERENCE" "$IMAGE_REFERENCE"
-            fi
-        done
-    else
-        $CONTAINER_CMD tag "$CURRENT_IMAGE_REFERENCE" "$TARGET_IMAGE_REFERENCE"
-    fi
-}
-
-CONTAINER_CMD="podman"
-PREFIX=""
-SUFFIX=""
-LATEST=0
-LOCAL=0
-MULTIARCH_SUPPORTED="amd64|arm64|aarch64"
-
-if ! command -v "$CONTAINER_CMD" >/dev/null 2>&1; then
-    CONTAINER_CMD=docker
-fi
-
-if [ "$1" = "--help" ]; then
-    printUsage
-fi
-
-for i in "$@"
-do
-case $i in
-    -p=*|--prefix=*)
-    PREFIX="${i#*=}"
-    shift
-    ;;
-    -s=*|--suffix=*)
-    SUFFIX="${i#*=}"
-    shift # past argument=value
-    ;;
-    -l|--latest)
-    LATEST=1
-    shift # past argument=value
-    ;;
-    --local)
-    LOCAL=1
-    shift # past argument=value
-    ;;
-    --container-cmd=*)
-    CONTAINER_CMD="${i#*=}"
-    shift # past argument with no value
-    ;;
-    -v|--version)
-    printVersion
-    exit 0
-    shift # past argument with no value
-    ;;
-    -h|--help)
-    printUsage
-    shift
-    ;;
-    *)
-          # further/unknown options
-    ;;
-esac
-done
-
-CURRENT_IMAGE_REFERENCE=${1:-invalid}
-TARGET_IMAGE_NAME=${2:-invalid}
-TARGET_IMAGE_VERSION=${3:-invalid}
-
-if [ "$CURRENT_IMAGE_REFERENCE" = "invalid" ] || [ "$TARGET_IMAGE_NAME" = "invalid" ] || [ "$TARGET_IMAGE_VERSION" = "invalid" ]; then
-    echo "Error: Invalid image name or version" >&2
-    printUsage
-fi
-
-mapfile -t MULTIARCH_IMAGES < <($CONTAINER_CMD images | awk '{print $1 ":" $2}' | grep -Pe "$CURRENT_IMAGE_REFERENCE-($MULTIARCH_SUPPORTED)$")
-MULTIARCH_IMAGES_COUNT=${#MULTIARCH_IMAGES[@]}
-
-counter=1
-new_version="$(echo "$TARGET_IMAGE_VERSION" | cut -d. -f$counter)"
-last_version=""
-while [ "$last_version" != "$new_version" ]; do
-    createTagOrManifest "${TARGET_IMAGE_NAME}:${PREFIX}${new_version}${SUFFIX}"
-    last_version="$new_version"
-    ((counter++))
-    new_version="$(echo "$TARGET_IMAGE_VERSION" | cut -d. -f-"$counter")"
-done
-
-if [ "$LATEST" = "1" ]; then
-    createTagOrManifest "${TARGET_IMAGE_NAME}:latest"
-fi
diff --git a/resources/shell-tools/install.sh b/resources/shell-tools/install.sh
index e59da23..9c7f858 100755
--- a/resources/shell-tools/install.sh
+++ b/resources/shell-tools/install.sh
@@ -2,17 +2,17 @@
 
 BASENAME="$(dirname "$0")"
 
-cp "$BASENAME"/./bin/tagging.sh /usr/local/bin/si-tagging
+cp "$BASENAME"/./bin/tagging.sh /usr/local/bin/si-manifest
 cp "$BASENAME"/./bin/push.sh /usr/local/bin/si-push
 cp "$BASENAME"/./bin/pull.sh /usr/local/bin/si-pull
 cp "$BASENAME"/./bin/fix-dockerfile.sh /usr/local/bin/si-fix
 cp "$BASENAME"/./libexec/pushImageOrManifest.sh /usr/local/libexec/pushImageOrManifest.sh
-chown root:root /usr/local/bin/si-tagging
+chown root:root /usr/local/bin/si-manifest
 chown root:root /usr/local/bin/si-push
 chown root:root /usr/local/bin/si-pull
 chown root:root /usr/local/bin/si-fix
 chown root:root /usr/local/libexec/pushImageOrManifest.sh
-chmod 0755 /usr/local/bin/si-tagging
+chmod 0755 /usr/local/bin/si-manifest
 chmod 0755 /usr/local/bin/si-push
 chmod 0755 /usr/local/bin/si-pull
 chmod 0755 /usr/local/bin/si-fix
-- 
GitLab