update flutter install
authorAJ ONeal <coolaj86@gmail.com>
Sun, 14 Jun 2020 06:20:53 +0000 (00:20 -0600)
committerAJ ONeal <coolaj86@gmail.com>
Sun, 14 Jun 2020 06:20:53 +0000 (00:20 -0600)
flutter/install.bash
webi/template.bash

index 446e1e45021a7d20876fc5b5bd61e3aa5405e0b6..8be47b08b20296f8ef66e209bb87554f1fb8133b 100644 (file)
@@ -18,50 +18,86 @@ set -u
 # Install flutter #
 ###################
 
-common_flutter_home="${HOME}/.local/opt/flutter"
-new_flutter_home="${HOME}/.local/opt/flutter-v${WEBI_VERSION}"
-new_flutter="${HOME}/.local/opt/flutter-v${WEBI_VERSION}/bin/flutter"
+# The command name may be different from the package name
+# (i.e. golang => go, rustlang => cargo, ripgrep => rg)
+# Note: $HOME may contain special characters and should alway be quoted
+pkg_cmd_name="flutter"
+#pkg_cmd_name_formatted="flutter $WEBI_VERSION"
 
-# Test for existing version 
-set +e
-cur_flutter="$(command -v flutter)"
-set -e
-if [ -n "$cur_flutter" ]; then
-  cur_ver=$(flutter --version | head -n 1 | cut -d' ' -f2)
-  if [ "$cur_ver" == "$(echo $WEBI_VERSION)" ]; then
-    echo "flutter v$WEBI_VERSION already installed at $cur_flutter"
-    exit 0
-  elif [ "$cur_flutter" != "$new_flutter" ]; then
-    echo "WARN: possible conflict with flutter v$WEBI_VERSION at $cur_flutter"
-  fi
-fi
+# Some of these directories may be the same
+pkg_common_opt="$HOME/.local/opt/flutter"
+pkg_common_bin="$HOME/.local/opt/flutter/bin"
+pkg_common_cmd="$HOME/.local/opt/flutter/bin/flutter"
+pkg_new_opt="$HOME/.local/opt/flutter-v$WEBI_VERSION"
+pkg_new_bin="$HOME/.local/opt/flutter-v$WEBI_VERSION/bin"
+pkg_new_cmd="$HOME/.local/opt/flutter-v$WEBI_VERSION/bin/flutter"
+pkg_current_cmd=""
 
-webi_download
+# The version info should be reduced to a sortable version, without any leading characters
+# (i.e. v12.8.0 => 12.8.0, go1.14 => 1.14, 1.12.13+hotfix => 1.12.13+hotfix)
+pkg_get_current_version() {
+    echo "$(flutter --version 2>/dev/null | head -n 1 | cut -d' ' -f2)"
+}
 
-webi_extract
+# Any version-related directories should be unlinked and relinked to the correct version
+# (for example: 'go' is special and needs both $HOME/go and $HOME/.local/opt/go)
+# (others like 'rg', 'hugo', and 'caddy' are single files that just get replaced)
+pkg_switch_version() {
+    rm -rf "$pkg_common_opt"
+    ln -s "$pkg_new_opt" "$pkg_common_opt"
+}
+
+# Different packages represent the version in different ways
+# ex: node v12.8.0 (leading 'v')
+# ex: go1.14 (no space, nor trailing '.0's)
+# ex: flutter 1.17.2 (plain)
+pkg_format_cmd_version() {
+    my_version=$1
+    echo "$pkg_cmd_name $my_version"
+}
 
-pushd "${WEBI_TMP}" 2>&1 >/dev/null
-        echo Installing flutter v${WEBI_VERSION} as "$new_flutter" 
+pkg_install() {
+    pushd "$WEBI_TMP" 2>&1 >/dev/null
 
         # simpler for single-binary commands
         #mv ./example*/bin/example "$HOME/.local/bin"
 
         # best for packages and toolchains
-        rm -rf "$new_flutter_home"
         if [ -n "$(command -v rsync 2>/dev/null | grep rsync)" ]; then
-          rsync -Krl ./flutter*/ "$new_flutter_home/" 2>/dev/null
+            rsync -Krl ./flutter*/ "$pkg_new_opt/" 2>/dev/null
         else
-          cp -Hr ./flutter*/* "$new_flutter_home/" 2>/dev/null
-          cp -Hr ./flutter*/.* "$new_flutter_home/" 2>/dev/null
+            cp -Hr ./flutter*/* "$pkg_new_opt/" 2>/dev/null
+            cp -Hr ./flutter*/.* "$pkg_new_opt/" 2>/dev/null
         fi
         rm -rf ./flutter*
-popd 2>&1 >/dev/null
+    popd 2>&1 >/dev/null
+}
 
-###################
-#   Update PATH   #
-###################
+pkg_post_install() {
+    webi_path_add "$pkg_common_bin"
+}
+
+#
+# The webi_* functions are defined in webi/template.bash at https://github.com/webinstall/packages
+#
+
+# for packages that can have multiple versions
+webi_check
+# for packages that can be downloaded via links in ./releases.js
+webi_download
+# for single files or packaged directories (compressed or uncompressed)
+# supported formats: .xz, .tar.*, and .zip
+webi_extract
+
+echo "Installing '$pkg_cmd_name' v$WEBI_VERSION as $pkg_new_cmd"
+
+# for installing the tool
+pkg_install
+# for updating paths and installing companion tools
+pkg_post_install
+# for re-linking to a previously installed version
+pkg_switch_version
+
+echo "Installed '$pkg_cmd_name' v$WEBI_VERSION as $pkg_new_cmd"
 
-# TODO get better output from pathman / output the path to add as return to webi bootstrap
-webi_path_add "$new_flutter_home/bin"
-echo "Installed 'flutter'"
 echo ""
index 9b90b66c4faf7378eec0e4b7b42968ae22904557..a3d9e7ef84c711ae76f716de8278e10500af9d80 100644 (file)
@@ -43,6 +43,34 @@ export WEBI_CURL="$(command -v curl)"
 export WEBI_WGET="$(command -v wget)"
 set -e
 
+webi_check() {
+    # Test for existing version
+    set +e
+    pkg_current_cmd="$(command -v "$pkg_cmd_name")"
+    set -e
+    my_current_version=""
+    if [ -n "$pkg_current_cmd" ]; then
+        pkg_current_version="$(pkg_get_current_version)"
+        # remove trailing '.0's for golang's sake
+        my_current_version="$(echo $pkg_current_version | sed 's:\.0::g')"
+        my_new_version="$(echo $WEBI_VERSION | sed 's:\.0::g')"
+        my_canonical_name="$(pkg_format_cmd_version "$WEBI_VERSION")"
+        if [ "$my_new_version" == "$my_current_version" ]; then
+            echo "$my_canonical_name already installed at $pkg_current_cmd"
+            exit 0
+        else
+            if [ "$pkg_current_cmd" != "$pkg_common_cmd" ]; then
+                echo "WARN: possible conflict between $my_canonical_name and $pkg_current_version at $pkg_current_cmd"
+            fi
+            if [ -x "$pkg_new_cmd" ]; then
+                pkg_switch_version
+                echo "switched to $my_canonical_name at $pkg_new_opt"
+                exit 0
+            fi
+          fi
+    fi
+}
+
 webi_download() {
     if [ -n "${1:-}" ]; then
         my_url="$1"