Appendix D: Upload Guide

This guide details the procedures for uploading PyEQSP distributions and documentation to their respective hosting platforms using the project’s automation suite.

Important

Protected Branch Policy: These procedures assume the main branch is protected. All changes, including version bumps, must be performed on a release branch and merged via Pull Request after verification.

Release Distribution (PyPI / TestPyPI)

To build and upload the package, use the scripts in the release/ directory. These scripts ensure that all documentation links are converted to absolute GitHub URLs for correct rendering on project pages.

1. Create Release Branch & Version Bump

Start from an up-to-date main branch and create a dedicated staging area.

git checkout main
git pull origin main
git checkout -b release_branch_1_0b1

Edit pyproject.toml to set the new version (e.g., 1.0b1).

2. Run Build with verification (TestPyPI)

From the release branch, run the pre-flight check:

python3 release/upload_release.py --testpypi

This script will:

  • Initialize the release/pypi_readme_fix.py logic to swap relative links.

  • Trigger release/build_dist.py for a clean sdist and wheel creation.

  • Verify the artifact using twine check.

  • Attempt an upload to the TestPyPI repository.

Caution

TestPyPI Immutability: If an upload to TestPyPI fails after a successful partial upload, or if you need to fix a bug discovered during the check, you must increment the version number (e.g., 1.0b1 to 1.0b2) in pyproject.toml. TestPyPI does not allow re-uploading the same version string.

3. GitHub Synchronization & CI Verification

Once the TestPyPI rendering is confirmed, push your branch and open a PR.

  1. Push Branch:

    git add .
    git commit -m "Release 1.0b1: Open Beta Engagement Infrastructure"
    git push -u origin release_branch_1_0b1
    
  2. Create Pull Request: Create a PR from your release branch to main.

  3. Verify CI: Ensure that the GitHub Actions “CI” and “Verify Distribution Build” workflows pass 100%. This serves as the final gatekeeper before the production upload.

4. Production PyPI Upload & Tagging

Once the PR is approved and merged into main:

# Switch to the updated main branch
git checkout main
git pull origin main

# Perform production upload
python3 release/upload_release.py --pypi

# Create and push the release tag
git tag release_1_0b1
git push origin release_1_0b1

Caution

PyPI Immutability & Failure Recovery: Like TestPyPI, production PyPI is strictly immutable. If the upload fails after any artifact (sdist or wheel) has been successfully accepted, you cannot re-upload to that version string. To recover:

  1. Fix the underlying issue (e.g., build error or metadata fix) on a new branch.

  2. Increment the version in pyproject.toml (e.g., 1.0b11.0b2).

  3. Restart the entire release process from Step 1.

SourceForge Documentation Mirror Upload

To update the project documentation mirror at http://pyeqsp.sourceforge.io:

1. Generate & Upload

The documentation upload is semi-automated via the release/upload_sourceforge.py script.

# This script builds the docs and generates the scp command
python3 release/upload_sourceforge.py

After reviewing the generated command, execute it to upload the doc/_build/html contents to your SourceForge htdocs directory.

2. Verify Web Rendering

Check http://pyeqsp.sourceforge.io to ensure all Markdown, mathematics symbols, and navigation elements render correctly.