diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c495ef..1d0fd7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,34 @@ 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). +## [0.9.2] - 2025-07-08 + +# MFLUX v0.9.2 Release Notes + +### 🏗️ Build System Improvements + +- **Updated build backend**: Migrated from setuptools to modern `uv build` backend for faster and more reliable package builds +- **Enhanced artifact exclusion**: Optimized distribution packages by excluding documentation assets (~27MB) and example images (~5MB) from published packages +- **New `make build` command**: Added development build command for testing distribution packages and validating sizes + +### 🗃️ Offline Resilience + +- **Local-first behavior**: Implemented cache-first downloading to improve resilience when HuggingFace Hub or network connectivity is unavailable +- **Graceful fallback**: System automatically uses cached model files when available, falling back to downloads only when necessary +- **Improved reliability**: Enhanced model loading reliability in environments with unstable internet connections + +### 🔧 Developer Experience + +- **Release script improvements**: Enhanced release automation with better error handling and duplicate version detection +- **Build system fixes**: Fixed minor typos in Makefile that could cause build issues + +## Contributors + +- **Anthony Wu (@anthonywu)**: Build system modernization, offline resilience implementation +- **Filip Strand (@filipstrand)**: Release automation improvements, build fixes + +--- + ## [0.9.1] - 2025-07-04 # MFLUX v0.9.1 Release Notes diff --git a/Makefile b/Makefile index 25ab5e7..09fe1b9 100644 --- a/Makefile +++ b/Makefile @@ -99,7 +99,7 @@ test: ensure-pytest # Run uv build and check dist sizes for optimized user installs -.PHONE: build +.PHONY: build build: rm -rf dist/mflux-* # fresh build @@ -130,5 +130,6 @@ help: @echo " make format - Run ruff code formatter" @echo " make check - Run linters auto fixes *and* style formatter via pre-commit hook" @echo " make test - Run tests" + @echo " make build - Build distribution packages and check sizes" @echo " make clean - Remove the virtual environment" @echo " make help - Show this help message" diff --git a/scripts/release.py b/scripts/release.py index c1e2a9f..acd74c3 100644 --- a/scripts/release.py +++ b/scripts/release.py @@ -219,11 +219,20 @@ class ReleaseManager: env["TWINE_USERNAME"] = "__token__" env["TWINE_PASSWORD"] = pypi_token - self.run_command( - [sys.executable, "-m", "twine", "upload", "dist/*", "--verbose"], - "Publishing to PyPI", - env=env, - ) + try: + self.run_command( + [sys.executable, "-m", "twine", "upload", "dist/*", "--verbose"], + "Publishing to PyPI", + env=env, + ) + except Exception as e: + if "already been used" in str(e) or "filename has already been used" in str(e): + print(f"⚠️ Version {version} already exists on PyPI (detected during upload)") + print(" This can happen due to race conditions or previous partial uploads") + print(" The release process will continue, but PyPI publishing was skipped") + return + else: + raise def version_exists_on_pypi(self, version: str, test_pypi: bool = False) -> bool: """Return True if *version* of this package is already published on (Test)PyPI.""" @@ -310,6 +319,11 @@ class ReleaseManager: self.build_package() self.verify_package() + # Check if version already exists on PyPI before attempting to publish + if self.version_exists_on_pypi(version, test_pypi=False): + print(f"⚠️ Version {version} already exists on PyPI, skipping all PyPI publishing") + return + # Only publish to PyPI if this is a new release (both git tag and GitHub release were created) if not skip_github_release and not git_tag_exists: print("📦 Publishing to PyPI (new release)...")