release:resume
Table of contents
- Introduction
- How it finishes a release
- Choosing what to resume
- Leaving a channel alone
- Resuming from a checkout in development
- Resuming in CI
- Finishing a product image
- Advanced
- Reference
- Requirements
- See also
Introduction
release:resume finishes a release that reached some channels and not others, without bumping the version. It reads the version in pyproject.toml, asks each channel what it lacks, and publishes only that. Run it when a release prints The channels have DIVERGED.
splent release:resume splent_feature_notes
Resuming splent-io/splent_feature_notes v1.4.0
The version is read from pyproject.toml and is never bumped here.
Release gate (channels)
forge ready, v1.4.0 is tagged on splent-io/splent_feature_notes, release missing
pypi ready, credentials accepted, splent_feature_notes exists so this is a new version
Missing
- build and upload splent_feature_notes 1.4.0 to PyPI
- create the release for v1.4.0 on the forge
Publish what is missing? [Y/n]
How it finishes a release
A blocked channel never stops another, so a rejected forge token does not stop the PyPI upload. Your checkout never moves either. When HEAD is not at the tag, the package is built from a temporary worktree of the tag.
Choosing what to resume
splent release:resume product:my_first_app
| Target | Resumes |
|---|---|
cli or splent_cli |
splent_cli |
framework or splent_framework |
splent_framework |
product |
The selected product |
product:<name> |
That product directory, whatever is selected. product:release prints this form |
| A feature reference | splent_feature_notes or splent-io/splent_feature_notes, as in feature:release |
Leaving a channel alone
splent release:resume splent_feature_notes --no-pypi
--no-pypi, --no-forge and --no-docker leave that channel untouched. The command a release prints already carries its flags. With --no-pypi the version stays unfinished until you upload it.
Resuming from a checkout in development
When only your checkout has editable features, the command works from what HEAD holds, as product:release does.
Resuming in CI
splent release:resume splent_feature_notes --yes --wait
--yes skips the question. --wait waits however long PyPI’s new-project limit asks, which is checked before anything is built or pushed.
Finishing a product image
docker not built, HEAD is not at v1.0.4
The image is built from your checkout, as product:build does, and goes to the registries product:release uses. Check out the tag with a clean tree, run the command again, then switch back.
Advanced
What each step needs
| Step | Runs when |
|---|---|
| Push the release commit | The tag is not on the forge and the branch lacks its commit. Only a fast-forward |
| Upload to PyPI | The version is not on PyPI |
| Push the tag | The tag is not on the forge |
| Create the forge release | The tag has no release |
| Build and push the image | A registry lacks <image>:<version> |
| Create the local snapshot | A feature’s .splent_cache snapshot is missing and the tag is on the forge |
When it cannot finish
What is stuck is listed under Cannot be finished in this run. The rest is published and the command exits 1.
| Message | What to do |
|---|---|
origin/main and the commit vX.Y.Z describes have diverged |
Reconcile the branch |
not built, vX.Y.Z is on the forge but not in this checkout |
git fetch origin tag vX.Y.Z |
the working tree has uncommitted changes |
Commit or stash |
no channel can be reached |
Fix the credentials the gate names |
... did not answer within 10 minutes |
Check the network |
Then run the command again.
Reference
| Option | Description |
|---|---|
--yes |
Publish what is missing without asking |
--no-pypi |
Leave PyPI alone |
--no-forge |
Leave the forge alone |
--no-docker |
Products only. Do not build or push the image |
--wait |
Wait for PyPI’s new-project limit however long it takes |
It exits 0 when every channel has the version.
Requirements
- The version in
[project].version, and anoriginremote. - For the
producttarget, a selected product (SPLENT_APP).
See also
check:releasesfinds every package that needs this.- Release explains the pipeline and the channel gate.