diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4696df2e..dcf91784 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -8,7 +8,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Run ./ci/steps/fmt.sh - uses: ./ci/container + uses: ./ci/images/debian8 with: args: ./ci/steps/fmt.sh @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Run ./ci/steps/lint.sh - uses: ./ci/container + uses: ./ci/images/debian8 with: args: ./ci/steps/lint.sh @@ -26,7 +26,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Run ./ci/steps/test.sh - uses: ./ci/container + uses: ./ci/images/debian8 with: args: ./ci/steps/test.sh @@ -35,7 +35,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Run ./ci/steps/release.sh - uses: ./ci/container + uses: ./ci/images/debian8 with: args: ./ci/steps/release.sh - name: Upload npm package artifact @@ -55,7 +55,7 @@ jobs: name: npm-package path: ./release-npm-package - name: Run ./ci/steps/release-packages.sh - uses: ./ci/container + uses: ./ci/images/centos7 with: args: ./ci/steps/release-packages.sh - name: Upload release artifacts @@ -75,7 +75,7 @@ jobs: name: npm-package path: ./release-npm-package - name: Run ./ci/steps/release-packages.sh - uses: ./ci/container/arm64 + uses: ./ci/images/centos7 with: args: ./ci/steps/release-packages.sh - name: Upload release artifacts @@ -94,8 +94,6 @@ jobs: with: name: npm-package path: ./release-npm-package - - run: brew unlink node@12 - - run: brew install node - run: ./ci/steps/release-packages.sh env: # Otherwise we get rate limited when fetching the ripgrep binary. @@ -118,7 +116,7 @@ jobs: name: release-packages path: ./release-packages - name: Run ./ci/steps/build-docker-image.sh - uses: ./ci/container + uses: ./ci/images/debian8 with: args: ./ci/steps/build-docker-image.sh - name: Upload release image @@ -138,7 +136,7 @@ jobs: name: release-packages path: ./release-packages - name: Run ./ci/steps/build-docker-image.sh - uses: ./ci/container/arm64 + uses: ./ci/images/centos7 with: args: ./ci/steps/build-docker-image.sh - name: Upload release image diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 2bb7df09..c2fe429b 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Run ./ci/steps/publish-npm.sh - uses: ./ci/container + uses: ./ci/images/debian8 with: args: ./ci/steps/publish-npm.sh env: @@ -22,7 +22,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Run ./ci/steps/push-docker-manifest.sh - uses: ./ci/container + uses: ./ci/images/debian8 with: args: ./ci/steps/push-docker-manifest.sh env: diff --git a/.gitignore b/.gitignore index 5c10b876..424cb9e7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ release-packages/ release-gcp/ release-images/ node_modules +node-* diff --git a/.ignore b/.ignore new file mode 100644 index 00000000..a65b4177 --- /dev/null +++ b/.ignore @@ -0,0 +1 @@ +lib diff --git a/ci/README.md b/ci/README.md index 4ab6da56..9624988b 100644 --- a/ci/README.md +++ b/ci/README.md @@ -35,12 +35,13 @@ Make sure you have `$GITHUB_TOKEN` set and [hub](https://github.com/github/hub) 10. Wait for the npm package to be published. 11. Update the homebrew package. - Send a pull request to [homebrew-core](https://github.com/Homebrew/homebrew-core) with the URL in the [formula](https://github.com/Homebrew/homebrew-core/blob/master/Formula/code-server.rb) updated. +12. Make sure to add a release without the `v` prefix for autoupdate from `3.2.0`. ## dev This directory contains scripts used for the development of code-server. -- [./ci/dev/container](./dev/container) +- [./ci/dev/image](./dev/image) - See [./doc/CONTRIBUTING.md](../doc/CONTRIBUTING.md) for docs on the development container. - [./ci/dev/fmt.sh](./dev/fmt.sh) (`yarn fmt`) - Runs formatters. @@ -104,17 +105,17 @@ You can disable minification by setting `MINIFY=`. - Post install script for the npm package. - Bundled by`yarn release`. -## release-container +## release-image -This directory contains the release docker container. +This directory contains the release docker container image. -- [./release-container/build.sh](./release-container/build.sh) +- [./release-image/build.sh](./release-image/build.sh) - Builds the release container with the tag `codercom/code-server-$ARCH:$VERSION`. - Assumes debian releases are ready in `./release-packages`. -## container +## images -This directory contains the container for CI. +This directory contains the images for CI. ## steps diff --git a/ci/build/build-packages.sh b/ci/build/build-packages.sh index 716af699..058a5478 100755 --- a/ci/build/build-packages.sh +++ b/ci/build/build-packages.sh @@ -30,9 +30,16 @@ release_archive() { local release_name="code-server-$VERSION-$OS-$ARCH" if [[ $OS == "linux" ]]; then tar -czf "release-packages/$release_name.tar.gz" --transform "s/^\.\/release-standalone/$release_name/" ./release-standalone + elif [[ $OS == "darwin" && $ARCH == "x86_64" ]]; then + # Just exists to make autoupdating from 3.2.0 work again. + mv ./release-standalone "./$release_name" + zip -r "release-packages/$release_name.zip" "./$release_name" + mv "./$release_name" ./release-standalone + return else tar -czf "release-packages/$release_name.tar.gz" -s "/^release-standalone/$release_name/" release-standalone fi + echo "done (release-packages/$release_name)" release_gcp diff --git a/ci/build/build-standalone-release.sh b/ci/build/build-standalone-release.sh index 2556e44b..df6cdc56 100755 --- a/ci/build/build-standalone-release.sh +++ b/ci/build/build-standalone-release.sh @@ -17,14 +17,6 @@ main() { mkdir -p "$RELEASE_PATH/bin" rsync ./ci/build/code-server.sh "$RELEASE_PATH/bin/code-server" rsync "$node_path" "$RELEASE_PATH/lib/node" - if [[ $OS == "linux" ]]; then - bundle_dynamic_lib libstdc++ - bundle_dynamic_lib libgcc_s - elif [[ $OS == "macos" ]]; then - bundle_dynamic_lib libicui18n - bundle_dynamic_lib libicuuc - bundle_dynamic_lib libicudata - fi ln -s "./bin/code-server" "$RELEASE_PATH/code-server" ln -s "./lib/node" "$RELEASE_PATH/node" @@ -33,17 +25,4 @@ main() { yarn --production --frozen-lockfile } -bundle_dynamic_lib() { - local lib_name="$1" - local lib_path - - if [[ $OS == "linux" ]]; then - lib_path="$(ldd "$RELEASE_PATH/lib/node" | grep "$lib_name" | awk '{print $3 }')" - elif [[ $OS == "macos" ]]; then - lib_path="$(otool -L "$RELEASE_PATH/lib/node" | grep "$lib_name" | awk '{print $1 }')" - fi - - cp "$lib_path" "$RELEASE_PATH/lib" -} - main "$@" diff --git a/ci/build/code-server.sh b/ci/build/code-server.sh index aca05745..deb36ac3 100755 --- a/ci/build/code-server.sh +++ b/ci/build/code-server.sh @@ -1,25 +1,36 @@ #!/bin/sh +set -eu # This script is intended to be bundled into the standalone releases. # Runs code-server with the bundled node binary. -# More complicated than readlink -f or realpath to support macOS. -# See https://github.com/cdr/code-server/issues/1537 -bin_dir() { - # We read the symlink, which may be relative from $0. - dst="$(readlink "$0")" - # We cd into the $0 directory. - cd "$(dirname "$0")" || exit 1 - # Now we can cd into the dst directory. - cd "$(dirname "$dst")" || exit 1 - # Finally we use pwd -P to print the absolute path of the directory of $dst. - pwd -P || exit 1 +_realpath() { + # See https://github.com/cdr/code-server/issues/1537 on why no realpath or readlink -f. + + script="$1" + cd "$(dirname "$script")" + + while [ -L "$(basename "$script")" ]; do + if [ -L "./node" ] && [ -L "./code-server" ] && + [ -f "package.json" ] && + cat package.json | grep -q '^ "name": "code-server",$'; then + echo "***** Please use the script in bin/code-server instead!" >&2 + echo "***** This script will soon be removed!" >&2 + echo "***** See the release notes at https://github.com/cdr/code-server/releases/tag/v3.4.0" >&2 + fi + + script="$(readlink "$(basename "$script")")" + cd "$(dirname "$script")" + done + + echo "$PWD/$(basename "$script")" } -BIN_DIR=$(bin_dir) -if [ "$(uname)" = "Linux" ]; then - export LD_LIBRARY_PATH="$BIN_DIR/../lib${LD_LIBRARY_PATH+:$LD_LIBRARY_PATH}" -elif [ "$(uname)" = "Darwin" ]; then - export DYLD_LIBRARY_PATH="$BIN_DIR/../lib${DYLD_LIBRARY_PATH+:$DYLD_LIBRARY_PATH}" -fi -exec "$BIN_DIR/../lib/node" "$BIN_DIR/.." "$@" +root() { + script="$(_realpath "$0")" + bin_dir="$(dirname "$script")" + dirname "$bin_dir" +} + +ROOT="$(root)" +exec "$ROOT/lib/node" "$ROOT" "$@" diff --git a/ci/build/test-standalone-release.sh b/ci/build/test-standalone-release.sh index 0344ea39..0d7010a2 100755 --- a/ci/build/test-standalone-release.sh +++ b/ci/build/test-standalone-release.sh @@ -15,7 +15,8 @@ main() { ./release-standalone/bin/code-server --extensions-dir "$EXTENSIONS_DIR" --install-extension ms-python.python local installed_extensions installed_extensions="$(./release-standalone/bin/code-server --extensions-dir "$EXTENSIONS_DIR" --list-extensions 2>&1)" - if [[ $installed_extensions != "ms-python.python" ]]; then + if [[ $installed_extensions != "info Using config file ~/.config/code-server/config.yaml +ms-python.python" ]]; then echo "Unexpected output from listing extensions:" echo "$installed_extensions" exit 1 diff --git a/ci/container/arm64/Dockerfile b/ci/container/arm64/Dockerfile deleted file mode 100644 index 705365bc..00000000 --- a/ci/container/arm64/Dockerfile +++ /dev/null @@ -1,53 +0,0 @@ -FROM debian:9 - -RUN apt-get update - -# Needed for debian repositories added below. -RUN apt-get install -y curl gnupg - -# Installs node. -RUN curl -fsSL https://deb.nodesource.com/setup_14.x | bash - && \ - apt-get install -y nodejs - -# Installs yarn. -RUN curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ - echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ - apt-get update && apt-get install -y yarn - -# Installs VS Code build deps. -RUN apt-get install -y build-essential \ - libsecret-1-dev \ - libx11-dev \ - libxkbfile-dev - -# Installs envsubst. -RUN apt-get install -y gettext-base - -# Misc build dependencies. -RUN apt-get install -y git rsync unzip - -# We need latest jq from debian buster for date support. -RUN ARCH="$(dpkg --print-architecture)" && \ - curl -fsSOL http://http.us.debian.org/debian/pool/main/libo/libonig/libonig5_6.9.1-1_$ARCH.deb && \ - dpkg -i libonig*.deb && \ - curl -fsSOL http://http.us.debian.org/debian/pool/main/j/jq/libjq1_1.5+dfsg-2+b1_$ARCH.deb && \ - dpkg -i libjq*.deb && \ - curl -fsSOL http://http.us.debian.org/debian/pool/main/j/jq/jq_1.5+dfsg-2+b1_$ARCH.deb && \ - dpkg -i jq*.deb && rm *.deb - -# Installs shellcheck. -# Unfortunately coredumps on debian:8 so disabled for now. -#RUN curl -fsSL https://github.com/koalaman/shellcheck/releases/download/v0.7.1/shellcheck-v0.7.1.linux.$(uname -m).tar.xz | \ -# tar -xJ && \ -# mv shellcheck*/shellcheck /usr/local/bin && \ -# rm -R shellcheck* - -# Install Go dependencies -RUN ARCH="$(dpkg --print-architecture)" && \ - curl -fsSL "https://dl.google.com/go/go1.14.3.linux-$ARCH.tar.gz" | tar -C /usr/local -xz -ENV PATH=/usr/local/go/bin:/root/go/bin:$PATH -ENV GO111MODULE=on -RUN go get mvdan.cc/sh/v3/cmd/shfmt -RUN go get github.com/goreleaser/nfpm/cmd/nfpm - -RUN curl -fsSL https://get.docker.com | sh diff --git a/ci/container/arm64/README.md b/ci/container/arm64/README.md deleted file mode 100644 index 388572ca..00000000 --- a/ci/container/arm64/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# arm64 - -Unfortunately there is no arm64 build of `debian:8` so -we need to use `debian:9` instead. - -This is just an exact copy of [../Dockerfile](../Dockerfile) with the base image change. diff --git a/ci/dev/fmt.sh b/ci/dev/fmt.sh index d7ebdbbf..d3bd4191 100755 --- a/ci/dev/fmt.sh +++ b/ci/dev/fmt.sh @@ -4,7 +4,7 @@ set -euo pipefail main() { cd "$(dirname "$0")/../.." - shfmt -i 2 -w -s -sr $(git ls-files "*.sh") + shfmt -i 2 -w -sr $(git ls-files "*.sh") local prettierExts prettierExts=( @@ -24,6 +24,8 @@ main() { doctoc --title '# FAQ' doc/FAQ.md > /dev/null doctoc --title '# Setup Guide' doc/guide.md > /dev/null doctoc --title '# Install' doc/install.md > /dev/null + doctoc --title '# npm Install Requirements' doc/npm.md > /dev/null + doctoc --title '# Contributing' doc/CONTRIBUTING.md > /dev/null if [[ ${CI-} && $(git ls-files --other --modified --exclude-standard) ]]; then echo "Files need generation or are formatted incorrectly:" diff --git a/ci/dev/container/Dockerfile b/ci/dev/image/Dockerfile similarity index 100% rename from ci/dev/container/Dockerfile rename to ci/dev/image/Dockerfile diff --git a/ci/dev/container/exec.sh b/ci/dev/image/exec.sh similarity index 93% rename from ci/dev/container/exec.sh rename to ci/dev/image/exec.sh index 98231c73..ea208755 100755 --- a/ci/dev/container/exec.sh +++ b/ci/dev/image/exec.sh @@ -42,7 +42,7 @@ run() { build() { echo "--- Building $container_name" - docker build -t $container_name ./ci/dev/container > /dev/null + docker build -t $container_name ./ci/dev/image > /dev/null } main "$@" diff --git a/ci/dev/lint.sh b/ci/dev/lint.sh index f9f54202..219c3793 100755 --- a/ci/dev/lint.sh +++ b/ci/dev/lint.sh @@ -7,9 +7,9 @@ main() { eslint --max-warnings=0 --fix $(git ls-files "*.ts" "*.tsx" "*.js") stylelint $(git ls-files "*.css") tsc --noEmit - # See comment in ./ci/container/Dockerfile + # See comment in ./ci/image/debian8 if [[ ! ${CI-} ]]; then - shellcheck -e SC2046,SC2164,SC2154,SC1091,SC1090 $(git ls-files "*.sh") + shellcheck -e SC2046,SC2164,SC2154,SC1091,SC1090,SC2002 $(git ls-files "*.sh") fi } diff --git a/ci/images/centos7/Dockerfile b/ci/images/centos7/Dockerfile new file mode 100644 index 00000000..4e3f1f94 --- /dev/null +++ b/ci/images/centos7/Dockerfile @@ -0,0 +1,26 @@ +FROM centos:7 + +RUN ARCH="$(uname -m | sed 's/86_64/64/; s/aarch64/arm64/')" && \ + curl -fsSL "https://nodejs.org/dist/v14.4.0/node-v14.4.0-linux-$ARCH.tar.xz" | tar -C /usr/local -xJ && \ + mv /usr/local/node-v14.4.0-linux-$ARCH /usr/local/node-v14.4.0 +ENV PATH=/usr/local/node-v14.4.0/bin:$PATH +RUN npm install -g yarn + +RUN yum groupinstall -y 'Development Tools' +RUN yum install -y python2 libsecret-devel libX11-devel libxkbfile-devel + +RUN npm config set python python2 + +RUN yum install -y epel-release && yum install -y jq +RUN yum install -y rsync + +# Copied from ../debian8/Dockerfile +# Install Go dependencies +RUN ARCH="$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/')" && \ + curl -fsSL "https://dl.google.com/go/go1.14.3.linux-$ARCH.tar.gz" | tar -C /usr/local -xz +ENV PATH=/usr/local/go/bin:/root/go/bin:$PATH +ENV GO111MODULE=on +RUN go get mvdan.cc/sh/v3/cmd/shfmt +RUN go get github.com/goreleaser/nfpm/cmd/nfpm + +RUN curl -fsSL https://get.docker.com | sh diff --git a/ci/container/Dockerfile b/ci/images/debian8/Dockerfile similarity index 96% rename from ci/container/Dockerfile rename to ci/images/debian8/Dockerfile index 8612f84d..fa3b16dc 100644 --- a/ci/container/Dockerfile +++ b/ci/images/debian8/Dockerfile @@ -43,7 +43,7 @@ RUN ARCH="$(dpkg --print-architecture)" && \ # rm -R shellcheck* # Install Go dependencies -RUN ARCH="$(dpkg --print-architecture)" && \ +RUN ARCH="$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/')" && \ curl -fsSL "https://dl.google.com/go/go1.14.3.linux-$ARCH.tar.gz" | tar -C /usr/local -xz ENV PATH=/usr/local/go/bin:/root/go/bin:$PATH ENV GO111MODULE=on diff --git a/ci/release-container/Dockerfile b/ci/release-image/Dockerfile similarity index 100% rename from ci/release-container/Dockerfile rename to ci/release-image/Dockerfile diff --git a/ci/release-container/build.sh b/ci/release-image/build.sh similarity index 85% rename from ci/release-container/build.sh rename to ci/release-image/build.sh index e91ea33c..5969e15a 100755 --- a/ci/release-container/build.sh +++ b/ci/release-image/build.sh @@ -5,7 +5,7 @@ main() { cd "$(dirname "$0")/../.." source ./ci/lib.sh - docker build -t "codercom/code-server-$ARCH:$VERSION" -f ./ci/release-container/Dockerfile . + docker build -t "codercom/code-server-$ARCH:$VERSION" -f ./ci/release-image/Dockerfile . } main "$@" diff --git a/ci/steps/build-docker-image.sh b/ci/steps/build-docker-image.sh index 692fa40f..16653a0e 100755 --- a/ci/steps/build-docker-image.sh +++ b/ci/steps/build-docker-image.sh @@ -5,7 +5,7 @@ main() { cd "$(dirname "$0")/../.." source ./ci/lib.sh - ./ci/release-container/build.sh + ./ci/release-image/build.sh mkdir -p release-images docker save "codercom/code-server-$ARCH:$VERSION" > "release-images/code-server-$ARCH-$VERSION.tar" diff --git a/ci/steps/release-packages.sh b/ci/steps/release-packages.sh index bb1dcf5f..39c51063 100755 --- a/ci/steps/release-packages.sh +++ b/ci/steps/release-packages.sh @@ -4,6 +4,11 @@ set -euo pipefail main() { cd "$(dirname "$0")/../.." + if [[ $OSTYPE == darwin* ]]; then + curl -L https://nodejs.org/dist/v14.4.0/node-v14.4.0-darwin-x64.tar.gz | tar -xz + PATH="$PATH:node-v14.4.0-darwin-x64/bin" + fi + # https://github.com/actions/upload-artifact/issues/38 tar -xzf release-npm-package/package.tar.gz diff --git a/doc/CONTRIBUTING.md b/doc/CONTRIBUTING.md index 5e3f689c..219e4846 100644 --- a/doc/CONTRIBUTING.md +++ b/doc/CONTRIBUTING.md @@ -1,5 +1,15 @@ + + # Contributing +- [Requirements](#requirements) +- [Development Workflow](#development-workflow) +- [Build](#build) +- [Structure](#structure) + - [VS Code Patch](#vs-code-patch) + + + - [Detailed CI and build process docs](../ci) ## Requirements @@ -11,7 +21,7 @@ Differences: - We require a minimum of node v12 but later versions should work. - We use [fnpm](https://github.com/goreleaser/nfpm) to build `.deb` and `.rpm` packages. - We use [jq](https://stedolan.github.io/jq/) to build code-server releases. -- The [CI container](../ci/container/Dockerfile) is a useful reference for all our dependencies. +- The [CI container](../ci/images/debian8/Dockerfile) is a useful reference for all our dependencies. ## Development Workflow @@ -25,7 +35,7 @@ yarn watch To develop inside of an isolated docker container: ```shell -./ci/dev/container/exec.sh +./ci/dev/image/exec.sh root@12345:/code-server# yarn root@12345:/code-server# yarn vscode diff --git a/doc/FAQ.md b/doc/FAQ.md index fdeb7c58..154aef3b 100644 --- a/doc/FAQ.md +++ b/doc/FAQ.md @@ -47,14 +47,15 @@ However, it is not entirely equivalent to Microsoft's VS Code. While the core of VS Code is open source, the marketplace and many published Microsoft extensions are not. -Not only are they closed source, Microsoft prohibits the use of any non-Microsoft VS Code from accessing their marketplace. +Furthermore, Microsoft prohibits the use of any non-Microsoft VS Code from accessing their marketplace. See the [TOS](https://cdn.vsassets.io/v/M146_20190123.39/_content/Microsoft-Visual-Studio-Marketplace-Terms-of-Use.pdf). > Marketplace Offerings are intended for use only with Visual Studio Products and Services > and you may only install and use Marketplace Offerings with Visual Studio Products and Services. -As a result, we have created our own marketplace for open source extensions. +As a result, we cannot offer any extensions on the Microsoft marketplace. Instead, +we have created our own marketplace for open source extensions. It works by scraping GitHub for VS Code extensions and building them. It's not perfect but getting better by the day with more and more extensions. diff --git a/doc/npm.md b/doc/npm.md index 18d9fc5e..f4d0ee09 100644 --- a/doc/npm.md +++ b/doc/npm.md @@ -1,5 +1,13 @@ + + # npm Install Requirements +- [Ubuntu, Debian](#ubuntu-debian) +- [Fedora, CentOS, RHEL](#fedora-centos-rhel) +- [macOS](#macos) + + + If you're installing the npm module you'll need certain dependencies to build the native modules used by VS Code. @@ -20,7 +28,7 @@ sudo apt-get install -y \ ```bash sudo yum groupinstall -y 'Development Tools' -sudo yum config-manager --set-enabled PowerTools +sudo yum config-manager --set-enabled PowerTools # unnecessary on CentOS 7 sudo yum install -y python2 libsecret-devel libX11-devel libxkbfile-devel npm config set python python2 ``` diff --git a/package.json b/package.json index cd7c45ff..aa6d1fe6 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,6 @@ }, "main": "out/node/entry.js", "devDependencies": { - "@types/adm-zip": "^0.4.32", "@types/fs-extra": "^8.0.1", "@types/http-proxy": "^1.17.4", "@types/js-yaml": "^3.12.3", @@ -66,7 +65,6 @@ }, "dependencies": { "@coder/logger": "1.1.11", - "adm-zip": "^0.4.14", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "http-proxy": "^1.18.0", diff --git a/src/node/app/update.ts b/src/node/app/update.ts index 588e5201..23cfd88b 100644 --- a/src/node/app/update.ts +++ b/src/node/app/update.ts @@ -1,5 +1,4 @@ import { field, logger } from "@coder/logger" -import zip from "adm-zip" import * as cp from "child_process" import * as fs from "fs-extra" import * as http from "http" @@ -213,11 +212,7 @@ export class UpdateHttpProvider extends HttpProvider { const response = await this.requestResponse(url) try { - if (downloadPath.endsWith(".tar.gz")) { - downloadPath = await this.extractTar(response, downloadPath) - } else { - downloadPath = await this.extractZip(response, downloadPath) - } + downloadPath = await this.extractTar(response, downloadPath) logger.debug("Downloaded update", field("path", downloadPath)) // The archive should have a directory inside at the top level with the @@ -275,40 +270,6 @@ export class UpdateHttpProvider extends HttpProvider { return downloadPath } - private async extractZip(response: Readable, downloadPath: string): Promise { - logger.debug("Downloading zip", field("path", downloadPath)) - - response.pause() - await fs.remove(downloadPath) - - const write = fs.createWriteStream(downloadPath) - response.pipe(write) - response.on("error", (error) => write.destroy(error)) - response.on("close", () => write.end()) - - await new Promise((resolve, reject) => { - write.on("error", reject) - write.on("close", resolve) - response.resume - }) - - const zipPath = downloadPath - downloadPath = downloadPath.replace(/\.zip$/, "") - await fs.remove(downloadPath) - - logger.debug("Extracting zip", field("path", zipPath)) - - await new Promise((resolve, reject) => { - new zip(zipPath).extractAllToAsync(downloadPath, true, (error) => { - return error ? reject(error) : resolve() - }) - }) - - await fs.remove(zipPath) - - return downloadPath - } - /** * Given an update return the name for the packaged archived. */ @@ -329,7 +290,7 @@ export class UpdateHttpProvider extends HttpProvider { if (arch === "x64") { arch = "x86_64" } - return `code-server-${update.version}-${target}-${arch}.${target === "darwin" ? "zip" : "tar.gz"}` + return `code-server-${update.version}-${target}-${arch}.tar.gz` } private async request(uri: string): Promise { diff --git a/src/node/cli.ts b/src/node/cli.ts index fdde8979..e3072b1d 100644 --- a/src/node/cli.ts +++ b/src/node/cli.ts @@ -348,7 +348,9 @@ export async function readConfigFile(configPath?: string): Promise { logger.info(`Wrote default config file to ${humanPath(configPath)}`) } - logger.info(`Using config file ${humanPath(configPath)}`) + if (!process.env.CODE_SERVER_PARENT_PID) { + logger.info(`Using config file ${humanPath(configPath)}`) + } const configFile = await fs.readFile(configPath) const config = yaml.safeLoad(configFile.toString(), { diff --git a/src/node/entry.ts b/src/node/entry.ts index 69d32ca8..a7d8663d 100644 --- a/src/node/entry.ts +++ b/src/node/entry.ts @@ -31,11 +31,7 @@ try { const version = pkg.version || "development" const commit = pkg.commit || "development" -const main = async (cliArgs: Args): Promise => { - const configArgs = await readConfigFile(cliArgs.config) - // This prioritizes the flags set in args over the ones in the config file. - let args = Object.assign(configArgs, cliArgs) - +const main = async (args: Args, cliArgs: Args, configArgs: Args): Promise => { if (!args.auth) { args = { ...args, @@ -127,18 +123,21 @@ const main = async (cliArgs: Args): Promise => { } async function entry(): Promise { - const tryParse = async (): Promise => { + const tryParse = async (): Promise<[Args, Args, Args]> => { try { - let args = parse(process.argv.slice(2)) + const cliArgs = parse(process.argv.slice(2)) + const configArgs = await readConfigFile(cliArgs.config) + // This prioritizes the flags set in args over the ones in the config file. + let args = Object.assign(configArgs, cliArgs) args = await setDefaults(args) - return args + return [args, cliArgs, configArgs] } catch (error) { console.error(error.message) process.exit(1) } } - const args = await tryParse() + const [args, cliArgs, configArgs] = await tryParse() if (args.help) { console.log("code-server", version, commit) console.log("") @@ -182,7 +181,7 @@ async function entry(): Promise { }) vscode.on("exit", (code) => process.exit(code || 0)) } else { - wrap(() => main(args)) + wrap(() => main(args, cliArgs, configArgs)) } } diff --git a/test/update.test.ts b/test/update.test.ts index 18f0d9a6..8725eb5f 100644 --- a/test/update.test.ts +++ b/test/update.test.ts @@ -1,8 +1,6 @@ -import zip from "adm-zip" import * as assert from "assert" import * as fs from "fs-extra" import * as http from "http" -import * as os from "os" import * as path from "path" import * as tar from "tar-fs" import * as zlib from "zlib" @@ -88,28 +86,18 @@ describe("update", () => { fs.writeFile(path.join(archivePath, archiveName, "node"), `NODE BINARY`), ]) - if (os.platform() === "darwin") { - await new Promise((resolve, reject) => { - const zipFile = new zip() - zipFile.addLocalFolder(archivePath) - zipFile.writeZip(archivePath + ".zip", (error) => { - return error ? reject(error) : resolve(error) - }) + await new Promise((resolve, reject) => { + const write = fs.createWriteStream(archivePath + ".tar.gz") + const compress = zlib.createGzip() + compress.pipe(write) + compress.on("error", (error) => compress.destroy(error)) + compress.on("close", () => write.end()) + tar.pack(archivePath).pipe(compress) + write.on("close", reject) + write.on("finish", () => { + resolve() }) - } else { - await new Promise((resolve, reject) => { - const write = fs.createWriteStream(archivePath + ".tar.gz") - const compress = zlib.createGzip() - compress.pipe(write) - compress.on("error", (error) => compress.destroy(error)) - compress.on("close", () => write.end()) - tar.pack(archivePath).pipe(compress) - write.on("close", reject) - write.on("finish", () => { - resolve() - }) - }) - } + }) }) after(() => { diff --git a/yarn.lock b/yarn.lock index f8b76db0..2ba7cba6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -910,13 +910,6 @@ traverse "^0.6.6" unified "^6.1.6" -"@types/adm-zip@^0.4.32": - version "0.4.33" - resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.4.33.tgz#ea5b94f771443f655613b64f920c0555867200dd" - integrity sha512-WM0DCWFLjXtddl0fu0+iN2ZF+qz8RF9RddG5OSy/S90AQz01Fu8lHn/3oTIZDxvG8gVcnBLAHMHOdBLbV6m6Mw== - dependencies: - "@types/node" "*" - "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -1130,11 +1123,6 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== -adm-zip@^0.4.14: - version "0.4.14" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.14.tgz#2cf312bcc9f8875df835b0f6040bd89be0a727a9" - integrity sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g== - ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: version "6.12.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"