Skip to content

v0.10.7

Choose a tag to compare

@github-actions github-actions released this 17 Oct 14:00
· 16 commits to main since this release
50e1579

evnx v0.10.7

The patch for the three commands about evnx itself — commands, completions
and update (package R-surface) — plus one HTTP client and one cargo command
where there were several.

⚠️ Scripts that read these exit codes or this output:

  • evnx update --check exits 1 when a newer release exists (it was 0 either
    way) and 2 when it could not check. It gains --json.
  • evnx completions takes its shell from a fixed list, so an unknown one is
    clap's usage error (exit 2, with the list) instead of evnx's "unsupported
    shell" line and the "No verdict" banner.
  • evnx update -q prints only the upgrade command, and update --check -q the
    status line and the command. --check's "asking api.github.com…" line is on
    stderr.

commands (alias surface)

  • The closing line counts what it lists (I-196):
    20 commands (83 with sub-commands). It said 83 commands under a list of 20.
  • The warning for a build without cloud names no release (I-197). It said
    pip install evnx lacked the cloud commands "up to and including 0.9.0",
    which is history and would be wrong on any later such build. It points at
    evnx update for the channels, and at cargo install evnx --all-features.
  • completions and update have a guide entry, so --json fills their
    docs_url and their --help ends with the guide (I-195). Every top-level
    command has one.
  • surface is the command's name before 0.10.0 and still works as an alias
    (D-138: no entry said so). -q has no effect, as before, and --help now
    says so (DEC-SF5).

completions

  • evnx completions bash | head -1 exits 141, not 101 (I-185).
    clap_complete panicked on the closed pipe with a message the broken-pipe
    handler did not match.
  • Five shells, in any case: bash, zsh, fish, powershell, and elvish,
    which is new
    (I-194, DEC-SF6). --help lists them, says where each shell
    reads the script, and links the guide. The scripts complete the shell names
    after evnx completions (they offered <SHELL>).

update

  • The cargo upgrade keeps every feature (I-199):
    cargo install evnx --all-features --force. It was --features cloud --force, which rebuilt an --all-features install without migrate,
    backup and restore.
  • A pip install is recognised by what pip leaves (I-193): a virtual
    environment of any name (pyvenv.cfg beside bin/ or Scripts\), or an
    evnx-*.dist-info record under the prefix's site-packages. pip install --user and system pip put the binary in ~/.local/bin and /usr/local/bin,
    which read as the install script, so pip users were told to run the curl
    installer. With no such evidence, those two folders get both commands.
    Checked against the published 0.10.5 wheel.
  • --check answers with its exit code (I-198, DEC-SF4): 0 for the latest
    release or newer, 1 when a newer one exists, 2 when it could not check.
    --check --json prints schema (1), installed, latest, status,
    channel, command and release_url. A release with no page link still
    answers.
  • --help names the seven channels it detects — it said "nine install
    channels" and named none (D-140) — and lists the exit codes.
  • The --check message for a build with no network support names
    cargo install evnx --all-features (it said --features cloud).
  • Debug builds read EVNX_UPDATE_URL, for the tests; a release binary ignores
    it and always asks api.github.com.

Every command: --help of a build without every feature

  • The note at the end of evnx --help in a cargo install evnx build names
    what each feature adds (with org, which it left out) and gives one cargo
    line, --all-features, instead of one per feature.

Release checks

  • scripts/check-build-features.sh <evnx> reads the feature list from
    evnx commands --json and exits 1 naming what is missing (I-200). The PyPI
    wheel check uses it instead of grepping --help for four command names, which
    could not see migrate or backup; the npm check runs it on the global
    install; docs/RELEASING.md uses it for every channel.

npm

  • A slow registry no longer fails a correct npm release, and re-running a
    failed one finishes it
    (I-256). v0.10.6 uploaded all five platform packages,
    then gave up after 300 s on one that npm showed 8.5 minutes after its publish;
    the re-run stopped on that package, which npm was still processing, and the
    wrapper step could not be re-run at all. Both publishes now go through
    scripts/npm-publish-packages.sh: a version already in the registry is
    skipped, an authentication failure (npm's 404 Not Found - PUT included)
    stops at once and names NPM_TOKEN, and any other failure waits for the
    version to appear. Each phase shares one deadline — 20 minutes for the five
    platform packages, 20 for the wrapper, 10 for latest — through
    npm-await.sh's new NPM_AWAIT_DEADLINE, and the job stops after an hour.

Docs

  • README: sections for evnx commands, evnx completions and evnx update;
    Verify runs evnx commands (D-137, D-142); the cargo line for cloud support
    is --all-features, the one update prints (D-141).

Shared code

One definition each, where commands had their own:

  • core::build: the feature list (commands), and CARGO_INSTALL and
    CARGO_UPGRADE, the cargo command every message names. Five copies carried
    three flag sets; a test now fails on any other cargo install evnx --….
  • core::http (with net): the HTTP client builder and transport_reason, for
    update --check and every cloud command, whose copies differed only in the
    timeout they named. The private-CA fix (I-192, DEC-SF1, still open) will land
    there once.
  • utils::term::write_stdout(): writes an answer and exits 141 on a closed
    pipe, for output that does not pass through println!.
  • Tests: one commands --json reader (three files had their own), a
    closed-stdout runner, and the binary placed in a fake install location.

Library

  • Commands::Completions { shell } is a clap_complete::Shell, not a String.
  • commands::update::Channel::Script is Channel::ScriptOrPip;
    Channel::candidates(), Channel::id() and Channel::from_install() are
    new. commands::update::run takes json and returns a Verdict.

Installation

Linux / macOS (shell script)

curl -sSL https://raw.githubusercontent.com/urwithajit9/evnx/main/scripts/install.sh | bash

Homebrew (macOS and Linux)

brew install urwithajit9/evnx/evnx

Scoop (Windows, user-local)

scoop bucket add evnx https://github.com/urwithajit9/scoop-evnx
scoop install evnx

Winget (Windows, system-wide)

winget install urwithajit9.evnx

npm / Node.js

npm install -g @evnx/cli

Python (pipx)

pipx install evnx

Cargo

cargo install evnx --all-features

cargo install compiles from source with default = [], so plain
cargo install evnx gives you a binary without the auth,
vault and cloud commands. Every other channel above ships them
already — the binaries are built with --all-features.

Checksums

SHA256 checksums are provided for each binary. Verify after download:

sha256sum -c evnx-*.tar.gz.sha256

What's Changed

  • surface 0.10.7 (R-surface): update --check exit codes and --json, pip detection, five shells, one HTTP client by @urwithajit9 in #195
  • chore(release): 0.10.7 by @urwithajit9 in #196

Full Changelog: v0.10.6...v0.10.7

npm / Node.js

npm install -g @evnx/cli          # global install
npx @evnx/cli --version           # zero-install usage
npm install --save-dev @evnx/cli  # project dev dependency