diff --git a/CHANGELOG.md b/CHANGELOG.md index 93a9b40..91414e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,39 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [6.2.0] - 2026-05-22 — Final release; project deprecated -### Fixed +### Deprecated +- **The `deltaglider` Python package is deprecated as of this release.** + The canonical implementation is now + [`deltaglider_proxy`](https://github.com/beshu-tech/deltaglider_proxy), a + single Rust binary that ships the S3-compatible proxy, the `s3` CLI + (every Python subcommand has a 1:1 Rust equivalent), and the web UI. + Wire format is byte-identical: data written by this tool is readable + by `deltaglider_proxy` and vice versa. +- **Every CLI invocation now prints a deprecation banner to stderr.** + Set `DG_SUPPRESS_DEPRECATION=1` to silence it for CI/automation that + hasn't migrated yet. +- **PyPI classifier bumped to `Development Status :: 7 - Inactive`.** +- **Repo will be archived approximately one week after this release.** + PyPI installs continue to work indefinitely (PyPI never deletes + published versions), but no further updates or security fixes will + land. File new issues against + [`deltaglider_proxy`](https://github.com/beshu-tech/deltaglider_proxy/issues). + +Migration: +```bash +brew install beshu-tech/tap/deltaglider_proxy +# or grab a binary from +# https://github.com/beshu-tech/deltaglider_proxy/releases + +alias dg='deltaglider_proxy s3' +dg cp foo s3://bucket/foo +dg ls s3://bucket +dg migrate s3://src s3://dest +``` + +### Fixed (carried from Unreleased) - **Direct-upload metadata now uses the canonical `dg-*` dashed namespace.** Pre-fix, files routed through `_upload_direct` (non-delta-eligible extensions: `.sha1`, `.sha512`, etc.) wrote metadata with bare underscored keys (`original_name`, `file_sha256`, `compression`) while delta and reference uploads correctly used the namespaced form (`dg-original-name`, `dg-file-sha256`, `dg-compression`). Downstream consumers — most visibly the [DeltaGlider Proxy](https://github.com/beshu-tech/deltaglider_proxy) — only recognised the dashed form, so every `.sha1`/`.sha512` listing triggered a `PATHOLOGICAL | Missing/corrupt DG metadata` warning. Aligned the writer to the canonical scheme so new uploads stop producing log spam. ### Changed diff --git a/README.md b/README.md index fa53258..4746474 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,40 @@ # DeltaGlider +> ## ⚠️ DEPRECATED — use [`deltaglider_proxy`](https://github.com/beshu-tech/deltaglider_proxy) +> +> This Python package is **deprecated as of v6.2.0** (this is the last +> feature release). The canonical implementation is now +> **[`deltaglider_proxy`](https://github.com/beshu-tech/deltaglider_proxy)** — +> a single Rust binary that ships the S3-compatible proxy, the CLI, and +> the web UI. Wire format is byte-identical: data written by this tool +> is readable by `deltaglider_proxy` and vice versa. +> +> **Migration:** +> ```bash +> # Install the Rust binary (proxy + CLI + UI, one artifact): +> brew install beshu-tech/tap/deltaglider_proxy +> # or download from https://github.com/beshu-tech/deltaglider_proxy/releases +> +> # Optional alias for Python-style ergonomics: +> alias dg='deltaglider_proxy s3' +> +> # Every Python subcommand has a 1:1 Rust equivalent: +> deltaglider cp … → deltaglider_proxy s3 cp … +> deltaglider migrate … → deltaglider_proxy s3 migrate … +> deltaglider stats … → deltaglider_proxy s3 stats … +> ``` +> +> The Python repository will be **archived** approximately one week +> after the v6.2.0 release. PyPI installs will continue to work +> indefinitely (PyPI never deletes published versions), but no further +> updates or security fixes will land here. Open issues and PRs should +> go to [`deltaglider_proxy`](https://github.com/beshu-tech/deltaglider_proxy/issues). +> +> The stderr deprecation notice can be suppressed with +> `DG_SUPPRESS_DEPRECATION=1` for CI that hasn't migrated yet. + +--- + [![PyPI version](https://badge.fury.io/py/deltaglider.svg)](https://pypi.org/project/deltaglider/) [![GitHub Repository](https://img.shields.io/badge/github-deltaglider-blue.svg)](https://github.com/beshu-tech/deltaglider) [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) diff --git a/pyproject.toml b/pyproject.toml index 2dbae43..8415329 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "deltaglider" dynamic = ["version"] -description = "Store 4TB in 5GB: S3-compatible storage with 99.9% compression for versioned files" +description = "DEPRECATED — migrate to deltaglider_proxy (Rust): https://github.com/beshu-tech/deltaglider_proxy . Store 4TB in 5GB: S3-compatible storage with 99.9% compression for versioned files." authors = [ {name = "Beshu Tech", email = "info@beshu.tech"}, ] @@ -32,7 +32,7 @@ keywords = [ "devops", ] classifiers = [ - "Development Status :: 4 - Beta", + "Development Status :: 7 - Inactive", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "Operating System :: OS Independent", diff --git a/src/deltaglider/app/cli/main.py b/src/deltaglider/app/cli/main.py index 614a754..a9a238b 100644 --- a/src/deltaglider/app/cli/main.py +++ b/src/deltaglider/app/cli/main.py @@ -142,6 +142,42 @@ def _version_callback(ctx: click.Context, param: click.Parameter, value: bool) - ctx.exit(0) +# Deprecation banner shown at the top of every CLI invocation (stderr). +# Suppressed by setting DG_SUPPRESS_DEPRECATION=1 in the environment — for +# CI/automation that hasn't migrated yet and doesn't want noise on every +# run. Print only once per process; some commands (e.g. `migrate`) invoke +# `cli` callbacks transitively. +_DEPRECATION_PRINTED = False + + +def _print_deprecation_notice() -> None: + global _DEPRECATION_PRINTED + if _DEPRECATION_PRINTED: + return + _DEPRECATION_PRINTED = True + if os.environ.get("DG_SUPPRESS_DEPRECATION") == "1": + return + click.echo( + "═════════════════════════════════════════════════════════════════\n" + " deltaglider (Python) is DEPRECATED as of v6.2.0.\n" + "\n" + " The canonical implementation is now `deltaglider_proxy`, a single\n" + " Rust binary that ships the S3-compatible proxy, the CLI, and the\n" + " web UI. Wire format is byte-identical with this tool.\n" + "\n" + " brew install beshu-tech/tap/deltaglider_proxy # or download:\n" + " https://github.com/beshu-tech/deltaglider_proxy/releases\n" + "\n" + " Then:\n" + " alias dg='deltaglider_proxy s3'\n" + " dg cp s3://bucket/key .\n" + "\n" + " Suppress this notice: DG_SUPPRESS_DEPRECATION=1\n" + "═════════════════════════════════════════════════════════════════", + err=True, + ) + + @click.group() @click.option("--debug", is_flag=True, help="Enable debug logging") @click.option( @@ -154,9 +190,14 @@ def _version_callback(ctx: click.Context, param: click.Parameter, value: bool) - ) @click.pass_context def cli(ctx: click.Context, debug: bool) -> None: - """DeltaGlider - Delta-aware S3 file storage wrapper.""" + """DeltaGlider - Delta-aware S3 file storage wrapper. + + DEPRECATED as of v6.2.0. Migrate to `deltaglider_proxy` — see + https://github.com/beshu-tech/deltaglider_proxy + """ import logging + _print_deprecation_notice() log_level = "DEBUG" if debug else os.environ.get("DG_LOG_LEVEL", "INFO") ctx.obj = create_service(log_level) logging.getLogger("deltaglider").info("deltaglider %s", __version__)