From 2ed54140aeebb6bde4a1c1c1b5aa1eabdb24377b Mon Sep 17 00:00:00 2001 From: ssobol77 Date: Mon, 11 May 2026 05:58:40 +0200 Subject: [PATCH] fix(release): unblock v0.1.2 release pipeline Bug 7 (FreeBSD packaging): The build_binary() shell function in scripts/build-and-package-freebsd.sh is invoked via command substitution at line 405: EXECUTABLE="$(build_binary)" The function prints diagnostic progress messages through print_step/print_warn/print_error helpers (e.g. 'Cleaning previous artifacts...', 'Building one-file binary with PyInstaller...'), which all wrote to stdout. As a result $EXECUTABLE captured the entire log output concatenated with the actual binary path. The subsequent 'install -m 755 "$EXECUTABLE" ...' interpreted the first newline as a path boundary and failed with: install: dist/ecli: No such file or directory The process '/usr/bin/ssh' failed with exit code 71 Fix: redirect print_step, print_warn, and print_error output to stderr ('>&2'). This is the standard Unix idiom: progress and diagnostic messages on stderr, data on stdout. The function now emits only the binary path on stdout, which command substitution captures cleanly. print_header was not modified because it is only invoked at top level, never inside a captured subshell. Bug 8 (PyPI logo not rendering): README.md referenced the logo via the GitHub blob viewer URL: https://github.com/SSobol77/ecli/blob/main/img/logo_m.png GitHub renders this through its HTML viewer; PyPI fetches the URL directly and gets an HTML page instead of the raw PNG, so the logo did not appear on pypi.org/project/ecli-editor/. Fix: use the raw.githubusercontent.com URL, which returns the binary image directly: https://raw.githubusercontent.com/SSobol77/ecli/main/img/logo_m.png Version: bumped pyproject.toml from 0.1.1 to 0.1.2. Background: PyPI 0.1.1 was published successfully during the v0.1.1 release attempt (visible at pypi.org/project/ecli-editor/0.1.1/). The aggregate workflow failed AFTER PyPI publish, due to the FreeBSD build_binary bug. Maintainer continues forward strategy: PyPI 0.1.1 stays as-is (immutable), no v0.1.1 GitHub Release is created, v0.1.2 becomes the first complete release across all platforms. --- README.md | 2 +- pyproject.toml | 2 +- scripts/build-and-package-freebsd.sh | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 32a6073..7f1bffd 100755 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Licensed under the Apache License, Version 2.0. See the LICENSE file in the project root for full license text. -->

- ecli Logo + ecli Logo

ECLI

diff --git a/pyproject.toml b/pyproject.toml index c38c5e9..8b2157d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ build-backend = "hatchling.build" [project] name = "ecli-editor" -version = "0.1.1" +version = "0.1.2" description = "ECLI — fast terminal code editor" readme = "README.md" requires-python = ">=3.11" diff --git a/scripts/build-and-package-freebsd.sh b/scripts/build-and-package-freebsd.sh index fce1053..b431322 100755 --- a/scripts/build-and-package-freebsd.sh +++ b/scripts/build-and-package-freebsd.sh @@ -124,9 +124,9 @@ set -eu # -------- Pretty printing ------------------------------------------------------ print_header() { printf "\033[1;36m==> %s\033[0m\n" "$*"; } -print_step() { printf "\033[32m -> %s\033[0m\n" "$*"; } -print_warn() { printf "\033[33mWARN:\033[0m %s\n" "$*"; } -print_error() { printf "\033[31mERROR:\033[0m %s\n" "$*"; } +print_step() { printf "\033[32m -> %s\033[0m\n" "$*" >&2; } +print_warn() { printf "\033[33mWARN:\033[0m %s\n" "$*" >&2; } +print_error() { printf "\033[31mERROR:\033[0m %s\n" "$*" >&2; } # -------- Paths & meta -------------------------------------------------------- PROJECT_ROOT="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"