Merge branch 'devel/master' into tizen
authorTaehyub Kim <taehyub.kim@samsung.com>
Wed, 25 Jan 2023 05:49:30 +0000 (14:49 +0900)
committerTaehyub Kim <taehyub.kim@samsung.com>
Wed, 25 Jan 2023 05:49:30 +0000 (14:49 +0900)
Change-Id: I71ed33d64f1b1a36d9402109e6a5179f5e70b379

workload-install.sh [new file with mode: 0755]

diff --git a/workload-install.sh b/workload-install.sh
new file mode 100755 (executable)
index 0000000..60e750f
--- /dev/null
@@ -0,0 +1,230 @@
+#
+# Copyright (c) Samsung Electronics. All rights reserved.
+# Licensed under the MIT license. See LICENSE file in the project root for full license information.
+#
+
+#!/bin/bash -e
+
+MANIFEST_BASE_NAME="samsung.net.sdk.tizen.manifest"
+MANIFEST_VERSION="<latest>"
+DOTNET_INSTALL_DIR="<auto>"
+DOTNET_TARGET_VERSION_BAND="<auto>"
+DOTNET_DEFAULT_PATH_LINUX="/usr/share/dotnet"
+DOTNET_DEFAULT_PATH_MACOS="/usr/local/share/dotnet"
+UPDATE_ALL_WORKLOADS="false"
+
+LatestVersionMap=(
+    "$MANIFEST_BASE_NAME-6.0.100=7.0.101"
+    "$MANIFEST_BASE_NAME-6.0.200=7.0.100-preview.13.6"
+    "$MANIFEST_BASE_NAME-6.0.300=7.0.304"
+    "$MANIFEST_BASE_NAME-6.0.400=7.0.400"
+    "$MANIFEST_BASE_NAME-7.0.100-preview.6=7.0.100-preview.6.14"
+    "$MANIFEST_BASE_NAME-7.0.100-preview.7=7.0.100-preview.7.20"
+    "$MANIFEST_BASE_NAME-7.0.100-rc.1=7.0.100-rc.1.22"
+    "$MANIFEST_BASE_NAME-7.0.100-rc.2=7.0.100-rc.2.24"
+    "$MANIFEST_BASE_NAME-7.0.100=7.0.103"
+    "$MANIFEST_BASE_NAME-8.0.100-alpha.1=7.0.104"
+    )
+
+while [ $# -ne 0 ]; do
+    name=$1
+    case "$name" in
+        -v|--version)
+            shift
+            MANIFEST_VERSION=$1
+            ;;
+        -d|--dotnet-install-dir)
+            shift
+            DOTNET_INSTALL_DIR=$1
+            ;;
+        -t|--dotnet-target-version-band)
+            shift
+            DOTNET_TARGET_VERSION_BAND=$1
+            ;;
+        -u|--update-all-workloads)
+            shift
+            UPDATE_ALL_WORKLOADS="true"
+            ;;
+        -h|--help)
+            script_name="$(basename "$0")"
+            echo "Tizen Workload Installer"
+            echo "Usage: $script_name [-v|--version <VERSION>] [-d|--dotnet-install-dir <DIR>] [-t|--dotnet-target-version-band <VERSION>]"
+            echo "       $script_name -h|-?|--help"
+            echo ""
+            echo "Options:"
+            echo "  -v,--version <VERSION>                     Use specific VERSION, Defaults to \`$MANIFEST_VERSION\`."
+            echo "  -d,--dotnet-install-dir <DIR>              Dotnet SDK Location installed, Defaults to \`$DOTNET_INSTALL_DIR\`."
+            echo "  -t,--dotnet-target-version-band <VERSION>  Use specific dotnet version band for install location, Defaults to \`$DOTNET_TARGET_VERSION_BAND\`."
+            exit 0
+            ;;
+        *)
+            echo "Unknown argument \`$name\`"
+            exit 1
+            ;;
+    esac
+
+    shift
+done
+
+function read_dotnet_link() {
+    cd -P "$(dirname "$1")"
+    dotnet_file="$PWD/$(basename "$1")"
+    while [[ -h "$dotnet_file" ]]; do
+        cd -P "$(dirname "$dotnet_file")"
+        dotnet_file="$(readlink "$dotnet_file")"
+        cd -P "$(dirname "$dotnet_file")"
+        dotnet_file="$PWD/$(basename "$dotnet_file")"
+    done
+    echo $PWD
+}
+
+function error_permission_denied() {
+    echo "No permission to install manifest. Try again with sudo."
+    exit 1
+}
+
+function ensure_directory() {
+    if [ ! -d $1 ]; then
+        mkdir -p $1 || error_permission_denied
+    fi
+    [ ! -w $1 ] && error_permission_denied
+}
+
+# Check dotnet install directory.
+if [[ "$DOTNET_INSTALL_DIR" == "<auto>" ]]; then
+    if [[ -n "$DOTNET_ROOT" && -d "$DOTNET_ROOT" ]]; then
+        DOTNET_INSTALL_DIR=$DOTNET_ROOT
+    elif [[ -d "$DOTNET_DEFAULT_PATH_LINUX" ]]; then
+        DOTNET_INSTALL_DIR=$DOTNET_DEFAULT_PATH_LINUX
+    elif [[ -d "$DOTNET_DEFAULT_PATH_MACOS" ]]; then
+        DOTNET_INSTALL_DIR=$DOTNET_DEFAULT_PATH_MACOS
+    elif [[ -n "$(which dotnet)" ]]; then
+        DOTNET_INSTALL_DIR=$(read_dotnet_link $(which dotnet))
+    fi
+fi
+if [ ! -d $DOTNET_INSTALL_DIR ]; then
+    echo "No installed dotnet \`$DOTNET_INSTALL_DIR\`."
+    exit 1
+fi
+
+function getLatestVersion () {
+    for index in "${LatestVersionMap[@]}"; do
+         if [ "${index%%=*}" = "${1}" ]; then
+             echo "${index#*=}"
+         fi
+    done
+}
+
+# Check installed dotnet version
+DOTNET_COMMAND="$DOTNET_INSTALL_DIR/dotnet"
+
+if [ ! -x "$DOTNET_COMMAND" ]; then
+    echo "$DOTNET_COMMAND command not found"
+    exit 1
+fi
+
+function install_tizenworkload() {
+    DOTNET_VERSION=$1
+    IFS='.' read -r -a array <<< "$DOTNET_VERSION"
+    CURRENT_DOTNET_VERSION=${array[0]}
+    DOTNET_VERSION_BAND="${array[0]}.${array[1]}.${array[2]:0:1}00"
+    MANIFEST_NAME="$MANIFEST_BASE_NAME-$DOTNET_VERSION_BAND"
+
+    # Reset local variables
+    if [[ "$UPDATE_ALL_WORKLOADS" == "true" ]]; then
+        DOTNET_TARGET_VERSION_BAND="<auto>"
+        MANIFEST_VERSION="<latest>"
+    fi
+
+    # Check version band
+    if [[ "$DOTNET_TARGET_VERSION_BAND" == "<auto>" ]]; then
+        if [[ "$CURRENT_DOTNET_VERSION" -ge "7" ]]; then
+            if [[ "$DOTNET_VERSION" == *"-preview"* || $DOTNET_VERSION == *"-rc"* || $DOTNET_VERSION == *"-alpha"* ]] && [[ ${#array[@]} -ge 4 ]]; then
+                DOTNET_TARGET_VERSION_BAND="$DOTNET_VERSION_BAND${array[2]:3}.${array[3]}"
+                MANIFEST_NAME="$MANIFEST_BASE_NAME-$DOTNET_TARGET_VERSION_BAND"
+            else
+                DOTNET_TARGET_VERSION_BAND=$DOTNET_VERSION_BAND
+            fi
+        else
+            DOTNET_TARGET_VERSION_BAND=$DOTNET_VERSION_BAND
+        fi
+    fi
+
+    # Check latest version of manifest.
+    if [[ "$MANIFEST_VERSION" == "<latest>" ]]; then
+        MANIFEST_VERSION=$(curl -s https://api.nuget.org/v3-flatcontainer/$MANIFEST_NAME/index.json | grep \" | tail -n 1 | tr -d '\r' | xargs)
+        if [ ! "$MANIFEST_VERSION" ]; then
+            MANIFEST_VERSION=$(getLatestVersion "$MANIFEST_NAME")
+            if [[ -n $MANIFEST_VERSION ]]; then
+                echo "Return cached latest version: $MANIFEST_VERSION"
+            else
+                echo "Failed to get the latest version of $MANIFEST_NAME."
+                return
+            fi
+        fi
+    fi
+
+    # Check workload manifest directory.
+    SDK_MANIFESTS_DIR=$DOTNET_INSTALL_DIR/sdk-manifests/$DOTNET_TARGET_VERSION_BAND
+    ensure_directory $SDK_MANIFESTS_DIR
+
+    TMPDIR=$(mktemp -d)
+
+    echo "Installing $MANIFEST_NAME/$MANIFEST_VERSION to $SDK_MANIFESTS_DIR..."
+
+    # Download and extract the manifest nuget package.
+    curl -s -o $TMPDIR/manifest.zip -L https://www.nuget.org/api/v2/package/$MANIFEST_NAME/$MANIFEST_VERSION
+
+    unzip -qq -d $TMPDIR/unzipped $TMPDIR/manifest.zip
+    if [ ! -d $TMPDIR/unzipped/data ]; then
+        echo "No such files to install."
+        return
+    fi
+    chmod 744 $TMPDIR/unzipped/data/*
+
+    # Copy manifest files to dotnet sdk.
+    mkdir -p $SDK_MANIFESTS_DIR/samsung.net.sdk.tizen
+    cp -f $TMPDIR/unzipped/data/* $SDK_MANIFESTS_DIR/samsung.net.sdk.tizen/
+
+    if [ ! -f $SDK_MANIFESTS_DIR/samsung.net.sdk.tizen/WorkloadManifest.json ]; then
+        echo "Installation is failed."
+        return
+    fi
+
+    # Install workload packs.
+    if [ -f global.json ]; then
+        CACHE_GLOBAL_JSON="true"
+        mv global.json global.json.bak
+    else
+        CACHE_GLOBAL_JSON="false"
+    fi
+    dotnet new globaljson --sdk-version $DOTNET_VERSION
+    $DOTNET_INSTALL_DIR/dotnet workload install tizen --skip-manifest-update
+
+    # Clean-up
+    rm -fr $TMPDIR
+    rm global.json
+    if [[ "$CACHE_GLOBAL_JSON" == "true" ]]; then
+        mv global.json.bak global.json
+    fi
+
+    echo "Done installing Tizen workload $MANIFEST_VERSION"
+    echo ""
+}
+
+if [[ "$UPDATE_ALL_WORKLOADS" == "true" ]]; then
+    INSTALLED_DOTNET_SDKS=$($DOTNET_COMMAND --list-sdks | sed -n '/^6\|^7/p' | sed 's/ \[.*//g')
+else
+    INSTALLED_DOTNET_SDKS=$($DOTNET_COMMAND --version)
+fi
+
+if [ -z "$INSTALLED_DOTNET_SDKS" ]; then
+    echo ".NET SDK version 6 or later is required to install Tizen Workload."
+else
+    for DOTNET_SDK in $INSTALLED_DOTNET_SDKS; do
+        echo "Check Tizen Workload for sdk $DOTNET_SDK."
+        install_tizenworkload $DOTNET_SDK
+    done
+fi
+
+echo "DONE"