1#!/usr/bin/env sh
  2set -eu
  3
  4# Downloads the latest tarball from https://zed.dev/releases and unpacks it
  5# into ~/.local/. If you'd prefer to do this manually, instructions are at
  6# https://zed.dev/docs/linux.
  7
  8main() {
  9    platform="$(uname -s)"
 10    arch="$(uname -m)"
 11    channel="${ZED_CHANNEL:-stable}"
 12    # Use TMPDIR if available (for environments with non-standard temp directories)
 13    if [ -n "${TMPDIR:-}" ] && [ -d "${TMPDIR}" ]; then
 14        temp="$(mktemp -d "$TMPDIR/zed-XXXXXX")"
 15    else
 16        temp="$(mktemp -d "/tmp/zed-XXXXXX")"
 17    fi
 18
 19    if [ "$platform" = "Darwin" ]; then
 20        platform="macos"
 21    elif [ "$platform" = "Linux" ]; then
 22        platform="linux"
 23    else
 24        echo "Unsupported platform $platform"
 25        exit 1
 26    fi
 27
 28    case "$platform-$arch" in
 29        macos-arm64* | linux-arm64* | linux-armhf | linux-aarch64)
 30            arch="aarch64"
 31            ;;
 32        macos-x86* | linux-x86* | linux-i686*)
 33            arch="x86_64"
 34            ;;
 35        *)
 36            echo "Unsupported platform or architecture"
 37            exit 1
 38            ;;
 39    esac
 40
 41    if command -v curl >/dev/null 2>&1; then
 42        curl () {
 43            command curl -fL "$@"
 44        }
 45    elif command -v wget >/dev/null 2>&1; then
 46        curl () {
 47            wget -O- "$@"
 48        }
 49    else
 50        echo "Could not find 'curl' or 'wget' in your path"
 51        exit 1
 52    fi
 53
 54    "$platform" "$@"
 55
 56    if [ "$(command -v zed)" = "$HOME/.local/bin/zed" ]; then
 57        echo "Zed has been installed. Run with 'zed'"
 58    else
 59        echo "To run Zed from your terminal, you must add ~/.local/bin to your PATH"
 60        echo "Run:"
 61
 62        case "$SHELL" in
 63            *zsh)
 64                echo "   echo 'export PATH=\$HOME/.local/bin:\$PATH' >> ~/.zshrc"
 65                echo "   source ~/.zshrc"
 66                ;;
 67            *fish)
 68                echo "   fish_add_path -U $HOME/.local/bin"
 69                ;;
 70            *)
 71                echo "   echo 'export PATH=\$HOME/.local/bin:\$PATH' >> ~/.bashrc"
 72                echo "   source ~/.bashrc"
 73                ;;
 74        esac
 75
 76        echo "To run Zed now, '~/.local/bin/zed'"
 77    fi
 78}
 79
 80linux() {
 81    if [ -n "${ZED_BUNDLE_PATH:-}" ]; then
 82        cp "$ZED_BUNDLE_PATH" "$temp/zed-linux-$arch.tar.gz"
 83    else
 84        echo "Downloading Zed"
 85        curl "https://zed.dev/api/releases/$channel/latest/zed-linux-$arch.tar.gz" > "$temp/zed-linux-$arch.tar.gz"
 86    fi
 87
 88    suffix=""
 89    if [ "$channel" != "stable" ]; then
 90        suffix="-$channel"
 91    fi
 92
 93    appid=""
 94    case "$channel" in
 95      stable)
 96        appid="dev.zed.Zed"
 97        ;;
 98      nightly)
 99        appid="dev.zed.Zed-Nightly"
100        ;;
101      preview)
102        appid="dev.zed.Zed-Preview"
103        ;;
104      dev)
105        appid="dev.zed.Zed-Dev"
106        ;;
107      *)
108        echo "Unknown release channel: ${channel}. Using stable app ID."
109        appid="dev.zed.Zed"
110        ;;
111    esac
112
113    # Unpack
114    rm -rf "$HOME/.local/zed$suffix.app"
115    mkdir -p "$HOME/.local/zed$suffix.app"
116    tar -xzf "$temp/zed-linux-$arch.tar.gz" -C "$HOME/.local/"
117
118    # Setup ~/.local directories
119    mkdir -p "$HOME/.local/bin" "$HOME/.local/share/applications"
120
121    # Link the binary
122    if [ -f "$HOME/.local/zed$suffix.app/bin/zed" ]; then
123        ln -sf "$HOME/.local/zed$suffix.app/bin/zed" "$HOME/.local/bin/zed"
124    else
125        # support for versions before 0.139.x.
126        ln -sf "$HOME/.local/zed$suffix.app/bin/cli" "$HOME/.local/bin/zed"
127    fi
128
129    # Copy .desktop file
130    desktop_file_path="$HOME/.local/share/applications/${appid}.desktop"
131    cp "$HOME/.local/zed$suffix.app/share/applications/zed$suffix.desktop" "${desktop_file_path}"
132    sed -i "s|Icon=zed|Icon=$HOME/.local/zed$suffix.app/share/icons/hicolor/512x512/apps/zed.png|g" "${desktop_file_path}"
133    sed -i "s|Exec=zed|Exec=$HOME/.local/zed$suffix.app/bin/zed|g" "${desktop_file_path}"
134}
135
136macos() {
137    echo "Downloading Zed"
138    curl "https://zed.dev/api/releases/$channel/latest/Zed-$arch.dmg" > "$temp/Zed-$arch.dmg"
139    hdiutil attach -quiet "$temp/Zed-$arch.dmg" -mountpoint "$temp/mount"
140    app="$(cd "$temp/mount/"; echo *.app)"
141    echo "Installing $app"
142    if [ -d "/Applications/$app" ]; then
143        echo "Removing existing $app"
144        rm -rf "/Applications/$app"
145    fi
146    ditto "$temp/mount/$app" "/Applications/$app"
147    hdiutil detach -quiet "$temp/mount"
148
149    mkdir -p "$HOME/.local/bin"
150    # Link the binary
151    ln -sf "/Applications/$app/Contents/MacOS/cli" "$HOME/.local/bin/zed"
152}
153
154main "$@"