Skip to content

ells v0.2.4

Choose a tag to compare

@github-actions github-actions released this 19 Oct 11:06
· 5 commits to main since this release

ells v0.2.4

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.2.4 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows PowerShell:

$env:ELLS_VERSION="v0.2.4"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex

安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt


[0.2.4] - 2026-10-19

修复

  • Windows 自更新重启不再"看起来像闪退":更新换完二进制后,新版本是在同一个控制台里被拉
    起来的 —— 旧进程一退出,外层 shell 立刻把提示符打回同一块屏幕,于是两个进程往同一个控制台写。
    取证过:新进程根本没死(备用屏进得去、事件流读得到、Resize 也收到了,只是尺寸是继承来的
    80×24),但用户看到的只是提示符压着一片残片,就像程序自己闪退了。现在 Windows 用
    CREATE_NEW_CONSOLE 拉起新版本 —— 它从第一帧起独占一块自己的控制台,在 Windows Terminal 下
    就是新开一个标签;旧标签交还给 shell 之后还会打印一句"新版本在默认终端的新标签/新窗口里打开",
    免得那条空白被当成崩溃。对照实验里新控制台拿到的是真实尺寸 Resize(133, 30) 与 FocusGained。
  • macOS / Linux 上 0.2.3 完全起不来(Error: The cursor position could not be read within a normal duration)修好了:0.2.3 为了让第一帧整屏重画,用的是 ratatui::Terminal::clear()。
    这个函数第一步是"问终端光标现在在哪" —— unix 上那是一发 \x1b[6n 写进 stdout 然后等回话,
    而 ells 在第一次绘制之前就把 crossterm 的异步事件流跑起来了,tty 的读字节归它管:回话被事件流
    吃掉,问的人只能等到超时,clear()? 一路冒泡到 main,程序在第一帧之前就退出。Windows 上
    "问光标"走控制台 API、不发转义序列,所以只有 macOS / Linux 全废。现在整屏重画改用
    terminal.resize(当前尺寸):Viewport::Fullscreen 下它做的是同一套"清屏 + 作废差分基线",
    但不问光标。残影那个问题依旧没有回归 —— 守卫脚本在真 pty 里断言三件事:一个 \x1b[6n 都不许
    发、列表页真的画出内容、按 q 退出码为 0 且离开备用屏。
  • 更新换完二进制却没留下退路,现在有了:起不来就自动退回上一版:以前只有 Windows 会把旧镜像
    挪成 .old(因为它不许删运行中的 exe),unix 上旧的直接没了 —— 新版万一首帧就崩,用户手里既没有
    旧版本、也看不到报错,只剩一行 Error:。现在 unix 同样先挪备份,替换成功后写一条"待验证"记录
    (ells.update.pending,就放在二进制旁边),第一帧真的画到屏幕上才算确认、把备份和记录一起扔掉。
    两条退路:带着未确认的记录又起不来 → 下次启动当场退回上一版并自动重新拉起;主循环带着错误退出
    → 当场退回再拉起。退回过的版本记进 ells.update.rejected,检查更新时不再把它当成新版本推给用户
    (否则会卡在"提示更新 → 装上 → 崩 → 退回 → 又提示更新")。没有备份时绝不挪走正在跑的二进制。
  • 启动时把同目录的启动名修回安装脚本的形状,ells 能开、s 打不开不会再出现:安装脚本在同一
    个目录里放下两个名字(Windows 上是 ells.exe + s.exe 两份真拷贝,macOS / Linux 上 s 是指向
    ells 的软链),而自更新只换得动"正在跑的那一个",替换中途还可能把软链变成一份独立拷贝、或让
    它悬空指向一个已经不存在的名字(命令还在 PATH 里,执行只报"没有那个文件")。现在每次界面启动都
    先按安装脚本的形状核对同目录:断链重新指回、缺失的名字补上、内容不同的用正在跑的这份覆盖;正在跑
    的本身、以及解析后是同一个文件的软链一律跳过(拷回自己 = 边截断边读同一个 inode,会把刚装好的
    二进制写坏),被别的实例占用、覆盖不动的也只是记一条日志然后跳过,不算启动失败。

完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README