How MutSeqR is developed, versioned, and released. MutSeqR is a Bioconductor-managed package: it lives in two repositories and the release process is partly run by the Bioconductor team, so a few rules here are Bioconductor policy, not house style. Read §3 and §5 before your first push to Bioconductor.
1. The two repositories
| Repo | Remote | URL | Role |
|---|---|---|---|
| GitHub | origin |
github.com/EHSRB-BSRSE-Bioinformatics/MutSeqR |
Development: branches, PRs, CI, pkgdown, GitHub Releases |
| Bioconductor | upstream |
git@git.bioconductor.org:packages/MutSeqR.git (SSH) |
Canonical package; source of BiocManager::install()
|
feature branch ─PR─> github devel ─PR─> github main ─push─> Bioc devel
│
│ twice a year, done BY
│ THE BIOCONDUCTOR TEAM
▼
Bioc RELEASE_3_XX (even y)
Key facts about the Bioconductor side (see Git version control):
- Only
develand the currentRELEASE_X_Ybranch exist and are writable. No new branches, no tags, no force-pushes on that server. -
Releases are not git tags. A release = the
RELEASE_X_Ybranch plus the Bioc team’s version-bump commits. (Our GitHub tags are for local traceability only; they do nothing for the Bioc process.) - Pushing is only accepted as a fast-forward. If you’re behind, merge
upstream/develback first (§7).
2. Branch model
| Branch | Where | Version | Purpose |
|---|---|---|---|
devel |
GitHub | tracks main
|
Feature staging: feature branches PR here, then here → main. Keep it current with main (git merge main into it after merges) |
main |
GitHub and Bioc devel (kept in sync) |
odd y (e.g. 1.1.z) |
The push line: 1:1 with Bioc devel. Everything user-facing-next-release flows through here |
RELEASE_3_XX |
Bioc | even y (e.g. 1.0.z) |
Current release. Cherry-picks only (§6). No feature work, no merges |
v1.0.0-Bioc3.23 |
GitHub tag + Release | — | Traceability marker per Bioc release; triggers the pkgdown workflow |
Consequences:
- End users install from Bioconductor, so “clean
main” is for us: it is exactly the state we push upstream. - There is no GitHub mirror of
RELEASE_X_Y; the release state is visible via the tag and on the Bioc server.
3. Versioning (Bioconductor policy)
From the version numbering rules:
- Versions are
x.y.z.yis even in release, odd indevel.0.99.zwas the pre-1.0 signal; MutSeqR’s first Bioc release (3.23) converted0.99.11→ 1.0.0 (release) / 1.1.0 (devel). -
Authors increment
zby 1 for work pushed to the devel line. Commits without azbump do not propagate toBiocManager::install(). -
y(andx) are bumped mechanically by the Bioc team at every release, for every package — release → next eveny, devel → next oddy,zreset to 0. There is no per-package judgment about whether a bump is “deserved”:x.yencodes the release cycle, not the scale of change. (Bioc versions are not SemVer;NEWS.md+ our release tags are the user-facing “what changed” channel.) - The only author-driven bump: setting
y = 99in devel signals “major changes” — the next release then convertsx.99.z→(x+1).0.0. Use only when you actually ship breaking changes. - We never bump
x/yourselves, except the one-timey = 99choice above. Our invariant to maintain: GitHubmain== Biocdevel(they differ from the release by design — odd vs eveny). - ⚠️ The
x.x.9000devel convention is a CRAN convention. Do not use it here — it violates the even/odd-ypolicy.
4. Everyday development
Environment: we use pixi for the R runtime + tooling; R package deps install from CRAN/Bioc (conda-forge’s Bioc coverage is incomplete).
pixi install # one-time (R 4.5 + pandoc)
pixi run setup # installs dev tools + all package deps (see scripts/setup-deps.R)
pixi run test # devtools::test()
pixi run document # roxygen
pixi run check # rcmdcheck
pixi run bioccheck # BiocCheck (Bioc's own lint)
Feature flow:
-
git checkout -b feature/... main(or offdevel— either is fine, PRs land ondevel) - Develop; PR →
devel(CI: R-CMD-check on all PRs). - PR
devel→mainwhen the batch is ready to ship. - After the merge: bump
develcurrent withmain. - Push the batch to Bioconductor (§5).
NEWS.md: keep the top entry at or ahead of the current devel version. One entry per release at minimum; the release ritual (§5) enforces it.
5. Pushing work to Bioconductor
Do this after merging to main, when the batch is ready:
pixi run prepare-release # document -> z-bump -> NEWS check -> test -> commit
git push origin main
git push upstream main:devel # 'upstream' = git.bioconductor.org; writes to its 'devel'
Verify it landed:
- Next day’s devel build report shows your commit;
BiocManager::install("MutSeqR", version = "devel")gives you the new1.1.z. - If the push is rejected (non-fast-forward):
git fetch upstream,git merge upstream/devel, resolve, then push again.
prepare-release intentionally stops short of the upstream push — pushing to Bioconductor is a deliberate human act.
6. Hotfixes to the released version
Users of the current release (e.g. 1.0.0 on Bioc 3.23) do not see the devel line. A user-facing hotfix means cherry-picking to the release branch:
- Fix on the devel line as usual (PR →
main,zbump, push toupstream devel) so the fix also rides the next release. - Cherry-pick the fix commit (not the version-bump commit) onto
upstream/RELEASE_3_XX, bump itszseparately (e.g.1.0.0→1.0.1), commit,git push upstream RELEASE_3_XX. - Only the current release branch is writable; for older releases, email maintainer@bioconductor.org.
- Never merge
devel→ release; cherry-picks only. - Note the fix in
NEWS.mdunder the release version.
7. When Bioconductor cuts a release (≈ twice a year)
The Bioc team branches RELEASE_3_XX and bumps versions on both their branches (devel: even→odd y, e.g. 1.1.0 → 1.3.0 for the cycle after 3.24… see the table in the Bioc docs). Our ritual afterwards:
git fetch upstream- Merge
upstream/develinto localmain(usually fast-forward) →git push origin main. - Tag + GitHub Release on the released commit:
v1.2.0-Bioc3.24→ release notes in NEWS → triggers pkgdown. - Update pins for the new Bioc cycle:
-
pixi.toml:r-baseif R moved (Bioc 3.23 = R 4.5; 3.24 = R 4.6) - CI:
bioconductor_dockertag /BiocManagerversion, if/when we pin one (see Open items)
-
- Bump
develstaging branch current withmain.
8. Quick reference / troubleshooting
| Symptom | Cause / fix |
|---|---|
git push upstream main:devel rejected |
You’re behind Bioc: git fetch upstream && git merge upstream/devel, then push |
Change pushed but BiocManager::install() doesn’t see it |
No z bump in DESCRIPTION (Bioc only serves bumped commits) |
ssh -T git@git.bioconductor.org → permission denied |
Register your SSH key in the BiocCredentials app; a correct key prints your package list with R W next to MutSeqR |
Pushing to upstream a branch other than devel/RELEASE_3_XX
|
Not possible by policy — do it via GitHub + the flows above |
| “Should I use 1.2.9000 on devel?” | No — that’s CRAN. Here: odd y, z bumps (§3) |
| R version / Bioc version mismatch in pixi |
pixi.toml pins r-base to the current Bioc cycle’s R; update at each release (§7) |
9. Open items
- CI currently runs R-CMD-check via
r-lib/actions(R devel only, Bioc deps resolved at runtime). Planned: PR-gated check + BiocCheck using the officialbioconductor/bioconductor_docker:<release>image for exact version parity, plus a devel-tracking job onmain. - Optional CI gate: PR touching
R/must changeDESCRIPTIONVersion andNEWS.md.
