install.sh: Add our own flag parser

Fully supports long opts!
This commit is contained in:
Anmol Sethi 2020-05-21 15:17:02 -04:00
parent 0129e002e8
commit 510d84898c
No known key found for this signature in database
GPG Key ID: 8CEF1878FF10ADEB
7 changed files with 220 additions and 85 deletions

View File

@ -1,10 +1,9 @@
--- ---
name: Bug report name: Bug report
about: Report a bug and help us improve about: Report a bug and help us improve
title: '' title: ""
labels: '' labels: ""
assignees: '' assignees: ""
--- ---
<!-- <!--

View File

@ -1,10 +1,9 @@
--- ---
name: Extension request name: Extension request
about: Request an extension missing from the code-server marketplace about: Request an extension missing from the code-server marketplace
title: '' title: ""
labels: extension-request labels: extension-request
assignees: cmoog assignees: cmoog
--- ---
<!-- <!--

View File

@ -1,10 +1,9 @@
--- ---
name: Feature request name: Feature request
about: Suggest an idea about: Suggest an idea
title: '' title: ""
labels: feature labels: feature
assignees: '' assignees: ""
--- ---
<!-- <!--

View File

@ -17,28 +17,54 @@ For a full setup and walkthrough, please see [./doc/guide.md](./doc/guide.md).
## Install ## Install
You can easily and securely install code-server with our install script. You can easily and securely install code-server with our install script on any Linux or macOS machine.
```bash ```bash
# First run to print out the install process. # First run to print out the install process.
curl -sSL https://get.docker.com/ | sh -s -- --dry-run curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run
# Now it will actually install. # Now it will actually install.
curl -sSL https://get.docker.com/ | sh -s -- curl -fsSL https://code-server.dev/install.sh | sh
``` ```
```
$ curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run --help
Installs latest code-server on any macOS or Linux system preferring to use the OS package manager.
curl -fsSL https://code-server.dev/install.sh | sh -s --
- For Debian, Ubuntu, Raspbian it will install the latest deb package. - For Debian, Ubuntu, Raspbian it will install the latest deb package.
- For Fedora, CentOS, RHEL, openSUSE it will install the latest rpm package. - For Fedora, CentOS, RHEL, openSUSE it will install the latest rpm package.
- For Arch Linux it will install the AUR package. - For Arch Linux it will install the AUR package.
- For any unrecognized Linux operating system it will install the latest static release into `/usr/local/lib/code-server-X.X.X`. - For any unrecognized Linux operating system it will install the latest static release into ~/.local
- For macOS it will install the Homebrew package. - Add ~/.local/bin to your $PATH to run code-server.
- If Homebrew is not installed it will install the latest static release into `/usr/local/lib/code-server-X.X.X`.
If ran on an architecture with no binary releases, it will install the npm package with `yarn` or `npm`. - For macOS it will install the Homebrew package.
We only have binary releases for `amd64` and `arm64` presently. - If Homebrew is not installed it will install the latest static release into ~/.local
- Add ~/.local/bin to your $PATH to run code-server.
- If ran on an architecture with no binary releases or outdated libc/libcxx, it will install the
npm package with yarn or npm.
- We only have binary releases for amd64 and arm64 presently.
--dry-run Enables a dry run where where the steps that would have taken place
are printed but do not actually execute.
--static Forces the installation of a static release into ~/.local
This flag takes an optional argument for the installation prefix which defaults to "~/.local".
code-server will be unarchived into ~/.local/lib/code-server.X.X.X and the binary will be symlinked
into "~/.local/bin/code-server". You will need to add ~/.local/bin to your $PATH to use it without
the full path.
To install system wide set the prefix to /usr/local.
--version Pass to install a specific version instead of the latest release.
```
If you still don't trust our install script, even with the above explaination and the dry run, we have If you still don't trust our install script, even with the above explaination and the dry run, we have
docs in [./doc/install.md](./doc/install.md) that explain how to install `code-server` each of the above docs in [./doc/install.md](./doc/install.md) that explain how to install `code-server` on a variety of
operating systems. The script runs the exact same commands. platforms. The script runs the exact same commands.
### Docker ### Docker
@ -53,6 +79,8 @@ docker run -it -p 127.0.0.1:8080:8080 \
codercom/code-server:latest codercom/code-server:latest
``` ```
You should also check out
## FAQ ## FAQ
See [./doc/FAQ.md](./doc/FAQ.md). See [./doc/FAQ.md](./doc/FAQ.md).

View File

@ -23,6 +23,7 @@ main() {
doctoc --title '# FAQ' doc/FAQ.md > /dev/null doctoc --title '# FAQ' doc/FAQ.md > /dev/null
doctoc --title '# Setup Guide' doc/guide.md > /dev/null doctoc --title '# Setup Guide' doc/guide.md > /dev/null
doctoc --title '# Install' doc/install.md > /dev/null
if [[ ${CI-} && $(git ls-files --other --modified --exclude-standard) ]]; then if [[ ${CI-} && $(git ls-files --other --modified --exclude-standard) ]]; then
echo "Files need generation or are formatted incorrectly:" echo "Files need generation or are formatted incorrectly:"

View File

@ -1,5 +1,17 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
# Install # Install
- [Debian, Ubuntu](#debian-ubuntu)
- [Fedora, CentOS, RHEL, SUSE](#fedora-centos-rhel-suse)
- [Arch Linux](#arch-linux)
- [yarn, npm](#yarn-npm)
- [macOS](#macos)
- [Static Releases](#static-releases)
- [Docker](#docker)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
This document demonstrates how to install `code-server` on This document demonstrates how to install `code-server` on
various distros and operating systems. various distros and operating systems.
@ -20,7 +32,7 @@ systemctl --user enable --now code-server
# Now visit http://127.0.0.1:8080. Your password is in ~/.config/code-server/config.yaml # Now visit http://127.0.0.1:8080. Your password is in ~/.config/code-server/config.yaml
``` ```
## Fedora, CentOS, Red Hat, SUSE ## Fedora, CentOS, RHEL, SUSE
```bash ```bash
curl -fOL https://github.com/cdr/code-server/releases/download/v3.3.1/code-server-3.3.1-amd64.rpm curl -fOL https://github.com/cdr/code-server/releases/download/v3.3.1/code-server-3.3.1-amd64.rpm
@ -49,8 +61,11 @@ systemctl --user enable --now code-server
## yarn, npm ## yarn, npm
We recommend installing with `yarn` or `npm` if we don't have a precompiled release for your machine's We recommend installing with `yarn` or `npm` if:
platform or architecture or your glibc < v2.19.
1. We don't have a precompiled release for your machine's platform or architecture.
2. libc < v2.19
3. libcxx < 3.4.20
**note:** Installing via `yarn` or `npm` builds native modules on install and so requires C dependencies. **note:** Installing via `yarn` or `npm` builds native modules on install and so requires C dependencies.
See [./doc/npm.md](./doc/npm.md) for installing these dependencies. See [./doc/npm.md](./doc/npm.md) for installing these dependencies.
@ -81,15 +96,22 @@ They bundle the node binary and node_modules.
2. Unpack the release. 2. Unpack the release.
3. You can run code-server by executing `./bin/code-server`. 3. You can run code-server by executing `./bin/code-server`.
Add the code-server `bin` directory to your `$PATH` to easily execute `code-server` without the full path every time. You can add the code-server `bin` directory to your `$PATH` or link to it from a
directory in your `$PATH` to easily execute `code-server` without the full path every time.
Here is an example script for installing and using a static `code-server` release on Linux: Here is an example script for installing and using a static `code-server` release on Linux:
```bash ```bash
mkdir -p ~/.local/lib ~/.local/bin
curl -fL https://github.com/cdr/code-server/releases/download/v3.3.1/code-server-3.3.1-linux-amd64.tar.gz \ curl -fL https://github.com/cdr/code-server/releases/download/v3.3.1/code-server-3.3.1-linux-amd64.tar.gz \
| sudo tar -C /usr/local/lib -xz | tar -C ~/.local/lib -xz
sudo mv /usr/local/lib/code-server-3.3.1-linux-amd64 /usr/local/lib/code-server-3.3.1 mv ~/.local/lib/code-server-3.3.1-linux-amd64 ~/.local/lib/code-server-3.3.1
PATH="/usr/local/lib/code-server-3.3.1/bin:$PATH" ln -s ~/.local/lib/code-server-3.3.1/bin/code-server ~/.local/bin/code-server
PATH="~/.local/bin:$PATH"
code-server code-server
# Now visit http://127.0.0.1:8080. Your password is in ~/.config/code-server/config.yaml # Now visit http://127.0.0.1:8080. Your password is in ~/.config/code-server/config.yaml
``` ```
## Docker
Documented in [README.md](../README.md#docker).

View File

@ -1,47 +1,54 @@
#!/bin/sh #!/bin/sh
set -eu set -eu
VERSION=3.3.1
usage() { usage() {
cat << EOF cat <<EOF
$0 [-d] [-s] [-p <static-install-prefix>] $0 [--dry-run] [--version X.X.X] [--static <install-prefix>=~/.local]
Installs code-server on any macOS or Linux system. Installs latest code-server on any macOS or Linux system preferring to use the OS package manager.
If ran on Ubuntu, Debian or Raspbian then the GitHub releases v$VERSION curl -fsSL https://code-server.dev/install.sh | sh -s --
deb package will be fetched and installed.
If ran on Fedora, CentOS, RHEL or openSUSE then the GitHub releases v$VERSION - For Debian, Ubuntu, Raspbian it will install the latest deb package.
rpm package will be fetched and installed. - For Fedora, CentOS, RHEL, openSUSE it will install the latest rpm package.
- For Arch Linux it will install the AUR package.
- For any unrecognized Linux operating system it will install the latest static release into ~/.local
- Add ~/.local/bin to your \$PATH to run code-server.
If ran on macOS and Homebrew is installed then the Homebrew code-server - For macOS it will install the Homebrew package.
package will be installed. However, if Homebrew is not installed then - If Homebrew is not installed it will install the latest static release into ~/.local
v$VERSION of the macOS static release will be installed - Add ~/.local/bin to your \$PATH to run code-server.
into /usr/local/lib/code-server-$VERSION.
If ran on Arch Linux, then the code-server AUR package will be installed. - If ran on an architecture with no binary releases or outdated libc/libcxx, it will install the
npm package with yarn or npm.
- We only have binary releases for amd64 and arm64 presently.
If ran on an unsupported architecture the npm package will be installed --dry-run Enables a dry run where where the steps that would have taken place
with yarn or npm. Only amd64 and arm64 are currently supported. are printed but do not actually execute.
If ran on any other Linux distro, v$VERSION of the linux static release --version Pass to install a specific version instead of the latest release.
will be installed into /usr/local/lib/code-server-$VERSION.
-d Enables a dry run where where the steps that would have taken place --static Forces the installation of a static release into ~/.local
are printed but do not actually execute.
-s Forces the installation of a static release into /usr/local/lib/code-server-$VERSION This flag takes an optional argument for the installation prefix which defaults to "~/.local".
Set the -p flag to change the installation prefix from /usr/local/lib code-server will be unarchived into ~/.local/lib/code-server.X.X.X and the binary will be symlinked
into "~/.local/bin/code-server". You will need to add ~/.local/bin to your \$PATH to use it without
the full path.
-p Sets the installation prefix for a static release install. To install system wide set the prefix to /usr/local.
EOF EOF
exit 1 }
echo_latest_version() {
version="$(curl -fsSL https://api.github.com/repos/cdr/code-server/releases/latest | jq -r .tag_name)"
# Strip leading v.
version="${version:1}"
echo "$version"
} }
echo_static_postinstall() { echo_static_postinstall() {
echo echo
cat << EOF cat <<EOF
Static release has been installed into $STATIC_INSTALL_PREFIX/code-server-$VERSION Static release has been installed into $STATIC_INSTALL_PREFIX/code-server-$VERSION
Please extend your path to use code-server: Please extend your path to use code-server:
PATH="$STATIC_INSTALL_PREFIX/code-server-$VERSION/bin:\$PATH" PATH="$STATIC_INSTALL_PREFIX/code-server-$VERSION/bin:\$PATH"
@ -52,7 +59,7 @@ EOF
echo_systemd_postinstall() { echo_systemd_postinstall() {
echo echo
cat << EOF cat <<EOF
To have systemd start code-server now and restart on boot: To have systemd start code-server now and restart on boot:
systemctl --user enable --now code-server systemctl --user enable --now code-server
Or, if you don't want/need a background service you can run: Or, if you don't want/need a background service you can run:
@ -61,20 +68,66 @@ EOF
} }
main() { main() {
unset DRY_RUN STATIC STATIC_INSTALL_PREFIX SKIP_LOG if [ "${TRACE-}" ]; then
while getopts ":dsp:h" opt; do set -x
case "$opt" in fi
d) DRY_RUN=1 ;;
s) STATIC=1 ;; unset \
p) STATIC_INSTALL_PREFIX="$OPTARG" ;; DRY_RUN \
h | ?) usage ;; STATIC \
STATIC_INSTALL_PREFIX \
SKIP_LOG \
VERSION \
OPTIONAL
while [ "$#" -gt 0 ]; do
case "$1" in
--dry-run)
DRY_RUN=1
;;
--static)
STATIC=1
if [ "${2-}" ]; then
STATIC_INSTALL_PREFIX="$(OPTIONAL=1 parse_arg "$@")"
shift
fi
;;
--static=*)
STATIC=1
STATIC_INSTALL_PREFIX="$(OPTIONAL=1 parse_arg "$@")"
;;
--version)
VERSION="$(parse_arg "$@")"
shift
;;
--version=*)
VERSION="$(parse_arg "$@")"
;;
-h | --h | --help)
usage
exit 0
;;
*)
echoerr "Unknown flag $1"
echoerr "Run with --help to see usage."
exit 1
;;
esac esac
shift
done done
shift $((OPTIND - 1))
VERSION="${VERSION-$(echo_latest_version)}"
STATIC_INSTALL_PREFIX="${STATIC_INSATLL_PREFIX-$HOME/.local}"
echo "${DRY_RUN-}"
echo "${STATIC_INSTALL_PREFIX-}"
echo "${VERSION-}"
exit 1
OS="$(os)" OS="$(os)"
if [ ! "$OS" ]; then if [ ! "$OS" ]; then
echo "Unsupported OS $(uname)." echoerr "Unsupported OS $(uname)."
exit 1 exit 1
fi fi
@ -83,8 +136,8 @@ main() {
ARCH="$(arch)" ARCH="$(arch)"
if [ ! "$ARCH" ]; then if [ ! "$ARCH" ]; then
if [ "${STATIC-}" ]; then if [ "${STATIC-}" ]; then
echo "No static releases available for the architecture $(uname -m)." echoerr "No static releases available for the architecture $(uname -m)."
echo "Please rerun without the -s flag to install from npm." echoerr "Please rerun without the -s flag to install from npm."
exit 1 exit 1
fi fi
install_npm install_npm
@ -119,18 +172,34 @@ main() {
esac esac
} }
install_macos() { parse_arg() {
if command_exists brew; then case "$1" in
echo "Installing from Homebrew." *=*)
opt="${1#=*}"
sh_c brew install code-server optarg="${1#*=}"
if [ ! "$optarg" -a ! "${OPTIONAL-}" ]; then
echoerr "$opt requires an argument"
echoerr "Run with --help to see usage."
exit 1
fi
echo "$optarg"
return return
fi ;;
esac
echo "Homebrew is not installed so installing static release." case "${2-}" in
"" | -* | --*)
install_static if [ ! "${OPTIONAL-}" ]; then
echoerr "$1 requires an argument"
echoerr "Run with --help to see usage."
exit 1
fi
;;
*)
echo "$2"
return
;;
esac
} }
fetch() { fetch() {
@ -151,6 +220,20 @@ fetch() {
mv "$FILE.incomplete" "$FILE" mv "$FILE.incomplete" "$FILE"
} }
install_macos() {
if command_exists brew; then
echo "Installing from Homebrew."
sh_c brew install code-server
return
fi
echo "Homebrew is not installed so installing static release."
install_static
}
install_deb() { install_deb() {
echo "Installing v$VERSION deb package from GitHub releases." echo "Installing v$VERSION deb package from GitHub releases."
@ -169,7 +252,7 @@ install_rpm() {
echo_systemd_postinstall echo_systemd_postinstall
} }
install_arch() { install_aur() {
echo "Installing from the AUR." echo "Installing from the AUR."
fetch "https://aur.archlinux.org/cgit/aur.git/snapshot/code-server.tar.gz" "$CACHE_DIR/code-server-aur.tar.gz" fetch "https://aur.archlinux.org/cgit/aur.git/snapshot/code-server.tar.gz" "$CACHE_DIR/code-server-aur.tar.gz"
@ -194,7 +277,7 @@ install_static() {
if [ ! -d "$STATIC_INSTALL_PREFIX" ]; then if [ ! -d "$STATIC_INSTALL_PREFIX" ]; then
echo echo
echo "Static release install prefix $STATIC_INSTALL_PREFIX does not exist" echoerr "Static release install prefix $STATIC_INSTALL_PREFIX does not exist"
exit 1 exit 1
fi fi
@ -212,7 +295,7 @@ install_static() {
} }
install_npm() { install_npm() {
echo "No precompiled releases for $(uname -m)." echoerr "No precompiled releases for $(uname -m)."
if command_exists yarn; then if command_exists yarn; then
echo "Installing with yarn." echo "Installing with yarn."
sh_c yarn global add code-server --unsafe-perm sh_c yarn global add code-server --unsafe-perm
@ -222,10 +305,10 @@ install_npm() {
sh_c npm install -g code-server --unsafe-perm sh_c npm install -g code-server --unsafe-perm
return return
fi fi
echo echoerr
echo "Please install npm or yarn to install code-server!" echoerr "Please install npm or yarn to install code-server!"
echo "You will need at least node v12 and a few C build dependencies." echoerr "You will need at least node v12 and a few C build dependencies."
echo "See the docs https://github.com/cdr/code-server#yarn-npm" echoerr "See the docs https://github.com/cdr/code-server#yarn-npm"
exit 1 exit 1
} }
@ -303,7 +386,7 @@ arch() {
} }
command_exists() { command_exists() {
command -v "$@" > /dev/null 2>&1 command -v "$@" >/dev/null 2>&1
} }
sh_c() { sh_c() {
@ -325,14 +408,14 @@ sudo_sh_c() {
sh_c "su -c '$*'" sh_c "su -c '$*'"
else else
echo echo
echo "This script needs to run the following command as root." echoerr "This script needs to run the following command as root."
echo " $*" echoerr " $*"
echo "Please run this script as root or install sudo or su." echoerr "Please run this script as root or install sudo or su."
exit 1 exit 1
fi fi
} }
cache_dir() { echo_cache_dir() {
if [ "${XDG_CACHE_HOME-}" ]; then if [ "${XDG_CACHE_HOME-}" ]; then
echo "$XDG_CACHE_HOME/code-server" echo "$XDG_CACHE_HOME/code-server"
elif [ "${HOME-}" ]; then elif [ "${HOME-}" ]; then
@ -342,4 +425,8 @@ cache_dir() {
fi fi
} }
echoerr() {
echo "$@" >&2
}
main "$@" main "$@"