From e7fef765b16160cc4c7e6687bad29a9b4d6d005f Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Wed, 9 Aug 2023 23:03:30 +0000 Subject: [PATCH] ref: make 'go' canonical installer, not just alias --- go/install.ps1 | 66 +++++++++++++++++++++++++++++++++++++++++++++++--- go/install.sh | 61 ++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 118 insertions(+), 9 deletions(-) diff --git a/go/install.ps1 b/go/install.ps1 index 69046e9..0e3d1f2 100644 --- a/go/install.ps1 +++ b/go/install.ps1 @@ -1,5 +1,63 @@ -#!/bin/pwsh +#!/usr/bin/env pwsh -echo "'go@$Env:WEBI_TAG' is an alias for 'golang@$Env:WEBI_VERSION'" -IF ($Env:WEBI_HOST -eq $null -or $Env:WEBI_HOST -eq "") { $Env:WEBI_HOST = "https://webinstall.dev" } -curl.exe -fsSL "$Env:WEBI_HOST/golang@$Env:WEBI_VERSION" | powershell +$pkg_cmd_name = "go" +New-Item "$Env:USERPROFILE\Downloads\webi" -ItemType Directory -Force | out-null +$pkg_download = "$Env:USERPROFILE\Downloads\webi\$Env:WEBI_PKG_FILE" + +$pkg_src = "$Env:USERPROFILE\.local\opt\$pkg_cmd_name-v$Env:WEBI_VERSION" + +$pkg_dst = "$Env:USERPROFILE\.local\opt\$pkg_cmd_name" +$pkg_dst_cmd = "$pkg_dst\bin\$pkg_cmd_name" +$pkg_dst_bin = "$pkg_dst\bin" + +if (!(Get-Command "git.exe" -ErrorAction SilentlyContinue)) +{ + & "$Env:USERPROFILE\.local\bin\webi-pwsh.ps1" git + # because we need git.exe to be available to golang immediately + $Env:PATH = "$Env:USERPROFILE\.local\opt\git\cmd;$Env:PATH" +} + +# Fetch archive +IF (!(Test-Path -Path "$pkg_download")) +{ + echo "Downloading $Env:PKG_NAME from $Env:WEBI_PKG_URL to $pkg_download" + & curl.exe -A "$Env:WEBI_UA" -fsSL "$Env:WEBI_PKG_URL" -o "$pkg_download.part" + & move "$pkg_download.part" "$pkg_download" +} + +IF (!(Test-Path -Path "$pkg_src")) +{ + echo "Installing $pkg_cmd_name" + # TODO: temp directory + + # Enter opt + pushd .local\tmp + + # Remove any leftover tmp cruft + Remove-Item -Path "$pkg_cmd_name*" -Recurse -ErrorAction Ignore + + # Unpack archive + # Windows BSD-tar handles zip. Imagine that. + echo "Unpacking $pkg_download" + & tar xf "$pkg_download" + + # Settle unpacked archive into place + echo "New Name: $pkg_cmd_name-v$Env:WEBI_VERSION" + Get-ChildItem "$pkg_cmd_name*" | Select -f 1 | Rename-Item -NewName "$pkg_cmd_name-v$Env:WEBI_VERSION" + echo "New Location: $pkg_src" + Move-Item -Path "$pkg_cmd_name-v$Env:WEBI_VERSION" -Destination "$Env:USERPROFILE\.local\opt" + + # Exit tmp + popd +} + +echo "Copying into '$pkg_dst' from '$pkg_src'" +Remove-Item -Path "$pkg_dst" -Recurse -ErrorAction Ignore +Copy-Item -Path "$pkg_src" -Destination "$pkg_dst" -Recurse +IF (!(Test-Path -Path go\bin)) { New-Item -Path go\bin -ItemType Directory -Force | out-null } + +# Add to path +webi_path_add ~/.local/opt/go/bin + +# Special to go: add default GOBIN to PATH +webi_path_add ~/go/bin diff --git a/go/install.sh b/go/install.sh index 328b598..7c2ff23 100644 --- a/go/install.sh +++ b/go/install.sh @@ -2,10 +2,61 @@ set -e set -u -__redirect_alias_golang() { - echo "'go@${WEBI_TAG:-stable}' is an alias for 'golang@${WEBI_VERSION-}'" - WEBI_HOST=${WEBI_HOST:-"https://webinstall.dev"} - curl -fsSL "$WEBI_HOST/golang@${WEBI_VERSION-}" | sh +GOBIN="${HOME}/go" +GOBIN_REAL="${HOME}/.local/opt/go-bin-v${WEBI_VERSION}" + +# The package is 'golang', but the command is 'go' +pkg_cmd_name="go" + +# NOTE: pkg_* variables can be defined here +# pkg_cmd_name +# pkg_src, pkg_src_bin, pkg_src_cmd +# pkg_dst, pkg_dst_bin, pkg_dst_cmd +# +# Their defaults are defined in _webi/template.sh at https://github.com/webinstall/packages + +pkg_get_current_version() { + # 'go version' has output in this format: + # go version go1.14.2 darwin/amd64 + # This trims it down to just the version number: + # 1.14.2 + go version 2> /dev/null | + head -n 1 | + cut -d' ' -f3 | + sed 's:go::' } -__redirect_alias_golang +pkg_format_cmd_version() { + # 'go v1.14.0' will be 'go1.14' + my_version=$(echo "$1" | sed 's:\.0::g') + echo "${pkg_cmd_name}${my_version}" +} + +pkg_link() { + # 'pkg_dst' will default to $HOME/.local/opt/go + # 'pkg_src' will be the installed version, such as to $HOME/.local/opt/go-v1.14.2 + rm -rf "$pkg_dst" + ln -s "$pkg_src" "$pkg_dst" + + # Go has a special $GOBIN + + # 'GOBIN' is set above to "${HOME}/go" + # 'GOBIN_REAL' will be "${HOME}/.local/opt/go-bin-v${WEBI_VERSION}" + rm -rf "$GOBIN" + mkdir -p "$GOBIN_REAL/bin" + ln -s "$GOBIN_REAL" "$GOBIN" +} + +pkg_post_install() { + pkg_link + + # web_path_add is defined in _webi/template.sh at https://github.com/webinstall/packages + # Updates PATH with + # "$HOME/.local/opt/go" + webi_path_add "$pkg_dst_bin" + webi_path_add "$GOBIN/bin" +} + +pkg_done_message() { + echo "Installed 'go v$WEBI_VERSION' to ~/.local/opt/go" +}