198 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env bash
 | 
						|
set -e
 | 
						|
 | 
						|
AIKEN_DIR=${AIKEN_DIR-"$HOME/.aiken"}
 | 
						|
AIKEN_BIN_DIR="$AIKEN_DIR/bin"
 | 
						|
 | 
						|
BINS=(aiken)
 | 
						|
 | 
						|
export RUSTFLAGS="-C target-cpu=native"
 | 
						|
 | 
						|
main() {
 | 
						|
  need_cmd git
 | 
						|
  need_cmd curl
 | 
						|
 | 
						|
  while [[ $1 ]]; do
 | 
						|
    case $1 in
 | 
						|
      --)               shift; break;;
 | 
						|
 | 
						|
      install)     shift; AIKUP_VERSION=$1;;
 | 
						|
      -l|--list)
 | 
						|
	list_versions
 | 
						|
	exit 0
 | 
						|
	;;
 | 
						|
      -h|--help)
 | 
						|
        usage
 | 
						|
        exit 0
 | 
						|
        ;;
 | 
						|
      *)
 | 
						|
        warn "unknown option: $1"
 | 
						|
        usage
 | 
						|
        exit 1
 | 
						|
    esac; shift
 | 
						|
  done
 | 
						|
 | 
						|
  if [ -z "$AIKUP_VERSION" ]; then
 | 
						|
    AIKUP_VERSION=$(get_latest_release)
 | 
						|
    say "no version specified; installing latest: $AIKUP_VERSION"
 | 
						|
  fi
 | 
						|
 | 
						|
  # Print the banner after successfully parsing args
 | 
						|
  banner
 | 
						|
 | 
						|
  AIKUP_REPO="aiken-lang/aiken"
 | 
						|
 | 
						|
  AIKUP_TAG=$AIKUP_VERSION
 | 
						|
 | 
						|
  # Normalize versions
 | 
						|
  if [[ "$AIKUP_VERSION" == [[:digit:]]* ]]; then
 | 
						|
    # Add v prefix
 | 
						|
    AIKUP_VERSION="v${AIKUP_VERSION}"
 | 
						|
    AIKUP_TAG="${AIKUP_VERSION}"
 | 
						|
  fi
 | 
						|
 | 
						|
  say "installing aiken (version ${AIKUP_VERSION}, tag ${AIKUP_TAG})"
 | 
						|
 | 
						|
  PLATFORM="$(uname -s)"
 | 
						|
  case $PLATFORM in
 | 
						|
    Linux)
 | 
						|
      PLATFORM="linux"
 | 
						|
      ;;
 | 
						|
    Darwin)
 | 
						|
      PLATFORM="darwin"
 | 
						|
      ;;
 | 
						|
    *)
 | 
						|
      err "unsupported platform: $PLATFORM"
 | 
						|
      ;;
 | 
						|
  esac
 | 
						|
 | 
						|
  ARCHITECTURE="$(uname -m)"
 | 
						|
  if [ "${ARCHITECTURE}" = "x86_64" ]; then
 | 
						|
    # Redirect stderr to /dev/null to avoid printing errors if non Rosetta.
 | 
						|
    if [ "$(sysctl -n sysctl.proc_translated 2>/dev/null)" = "1" ]; then
 | 
						|
      ARCHITECTURE="arm64" # Rosetta.
 | 
						|
    else
 | 
						|
      ARCHITECTURE="amd64" # Intel.
 | 
						|
    fi
 | 
						|
  elif [ "${ARCHITECTURE}" = "arm64" ] ||[ "${ARCHITECTURE}" = "aarch64" ] ; then
 | 
						|
    ARCHITECTURE="arm64" # Arm.
 | 
						|
  else
 | 
						|
    ARCHITECTURE="amd64" # Amd.
 | 
						|
  fi
 | 
						|
 | 
						|
  # Compute the URL of the release tarball in the Aiken repository.
 | 
						|
  RELEASE_URL="https://github.com/${AIKUP_REPO}/releases/download/${AIKUP_TAG}/"
 | 
						|
  BIN_TARBALL_URL="${RELEASE_URL}aiken_${AIKUP_VERSION}_${PLATFORM}_${ARCHITECTURE}.tar.gz"
 | 
						|
 | 
						|
  # Download the binaries tarball and unpack it into the .aiken bin directory.
 | 
						|
  say "downloading aiken"
 | 
						|
  ensure curl -# -L "$BIN_TARBALL_URL" | tar -xzC "$AIKEN_BIN_DIR"
 | 
						|
 | 
						|
  for bin in "${BINS[@]}"; do
 | 
						|
    bin_path="$AIKEN_BIN_DIR/$bin"
 | 
						|
 | 
						|
    # Print installed msg
 | 
						|
    say "installed - $("$bin_path" --version)"
 | 
						|
 | 
						|
    # Check if the default path of the binary is not in AIKEN_BIN_DIR
 | 
						|
    which_path="$(which "$bin")"
 | 
						|
    if [ "$which_path" != "$bin_path" ]; then
 | 
						|
      warn ""
 | 
						|
      cat 1>&2 <<EOF
 | 
						|
There are multiple binaries with the name '$bin' present in your 'PATH'.
 | 
						|
This may be the result of installing '$bin' using another method,
 | 
						|
like Cargo or other package managers.
 | 
						|
You may need to run 'rm $which_path' or move '$AIKEN_BIN_DIR'
 | 
						|
in your 'PATH' to allow the newly installed version to take precedence!
 | 
						|
EOF
 | 
						|
    fi
 | 
						|
  done
 | 
						|
 | 
						|
  say "done"
 | 
						|
}
 | 
						|
 | 
						|
usage() {
 | 
						|
  cat 1>&2 <<EOF
 | 
						|
The installer for Aiken.
 | 
						|
 | 
						|
Update or revert to a specific Aiken version with ease.
 | 
						|
 | 
						|
USAGE:
 | 
						|
    aikup <SUBCOMMAND>
 | 
						|
 | 
						|
OPTIONS:
 | 
						|
    -l, --list      List available versions
 | 
						|
    -h, --help      Print help information
 | 
						|
 | 
						|
SUBCOMMANDS:
 | 
						|
    install         Install a specific version
 | 
						|
EOF
 | 
						|
}
 | 
						|
 | 
						|
list_versions() {
 | 
						|
  say "available versions"
 | 
						|
  curl -sSL "https://api.github.com/repos/aiken-lang/aiken/tags" |
 | 
						|
    grep -E '"name": "v[1-9]' |
 | 
						|
    sed 's/.*\(v[^"]*\)",.*/\1/'
 | 
						|
}
 | 
						|
 | 
						|
get_latest_release () {
 | 
						|
  curl --silent "https://api.github.com/repos/aiken-lang/aiken/releases/latest" |
 | 
						|
    grep '"tag_name":' |
 | 
						|
    sed -E 's/.*"([^"]+)".*/\1/'
 | 
						|
}
 | 
						|
 | 
						|
say() {
 | 
						|
  printf "aikup: %s\n" "$1"
 | 
						|
}
 | 
						|
 | 
						|
warn() {
 | 
						|
  say "warning: ${1}" >&2
 | 
						|
}
 | 
						|
 | 
						|
err() {
 | 
						|
  say "$1" >&2
 | 
						|
  exit 1
 | 
						|
}
 | 
						|
 | 
						|
need_cmd() {
 | 
						|
  if ! check_cmd "$1"; then
 | 
						|
    err "need '$1' (command not found)"
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
check_cmd() {
 | 
						|
  command -v "$1" > /dev/null 2>&1
 | 
						|
}
 | 
						|
 | 
						|
# Run a command that should never fail. If the command fails execution
 | 
						|
# will immediately terminate with an error showing the failing
 | 
						|
# command.
 | 
						|
ensure() {
 | 
						|
  if ! "$@"; then err "command failed: $*"; fi
 | 
						|
}
 | 
						|
 | 
						|
# Banner Function for Aiken
 | 
						|
banner() {
 | 
						|
  printf '
 | 
						|
 | 
						|
================================================================================
 | 
						|
 | 
						|
░█▀▀▄░▀█▀░▒█░▄▀░▒█▀▀▀░▒█▄░▒█             Modern and modular toolkit
 | 
						|
▒█▄▄█░▒█░░▒█▀▄░░▒█▀▀▀░▒█▒█▒█       for Cardano Smart Contract development.
 | 
						|
▒█░▒█░▄█▄░▒█░▒█░▒█▄▄▄░▒█░░▀█                 Written in Rust.
 | 
						|
 | 
						|
================================================================================
 | 
						|
 | 
						|
Repo       : https://github.com/aiken-lang/aiken
 | 
						|
Docs       : https://aiken-lang.org/
 | 
						|
Chat       : https://discord.gg/Vc3x8N9nz2
 | 
						|
Contribute : https://github.com/aiken-lang/aiken/blob/main/CONTRIBUTING.md
 | 
						|
 | 
						|
================================================================================
 | 
						|
'
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
main "$@" || exit 1
 |