On this page
Monorepo workspace management commands: init, add, remove, list, status, outdated, release-order, check-names, and lint.
#rlsbl.commands.monorepo.commands
#rlsbl.commands.monorepo.commands
Monorepo workspace management commands: init, add, remove, list, status, outdated, and check-names.
#_create_releasable
def _create_releasable(name, tag_format_flag, target_entries, path)The Releasable an add naming an undeclared group creates.
Its tag_format is written out explicitly, either as the operator stated it (--tag-format) or as the member's primary target implies -- the same derivation monorepo absorb uses for its auto-singleton (:func:rlsbl.tag_glob.derive_releasable_tag_format), so a member's targets imply one format with one answer whichever command creates the releasable.
The root member's releasable is never created here: a workspace this command can load already declares a root member, so an add naming . is refused as a path the workspace already claims. Creating it is monorepo init --root-releasable's job, and that is where the format is required to be stated.
#_listed_releasable
def _listed_releasable(proj)How a member's releasable membership renders in a listing.
#_latest_release_for_row
def _latest_release_for_row(changes_dir, tag_glob)The release a status row reports, from that row's own RELEASE RECORD.
Returns (fact, release commit): the project's latest archived release as a displayable fact (annotated when this checkout does not contain it), and the highest archived release this checkout DOES contain, which is what bounds the coverage range. The two differ exactly when the checkout predates a release, and the table shows both rather than collapsing them.
This used to be git tag -l <glob> --sort=-v:refname, which reported whatever the tag namespace happened to hold.
#_coverage_column
def _coverage_column(release_commit, changes_dir, scope)Return the Coverage-column string for one status row.
Real JSONL coverage: the commits since release commit -- the release record entry for the highest archived release this checkout contains -- scoped to the row's members via scope (an :class:~rlsbl.ownership.OwnershipScope, which carries the whole member list), minus the exempt ones, cross-referenced against the row's unreleased.jsonl. Rendered covered/tracked with a (N exempted) suffix, matching rlsbl status.
This column used to count CHANGELOG.md bullet lines above the last version heading. CHANGELOG.md is regenerated from the JSONL at release time, so that count described the previous release's prose, never whether the current unreleased commits had entries -- and it read as "documented" when no entry existed at all.
"no changelog" when the changes directory is missing.
#_suppressed_member_version
def _suppressed_member_version(root, proj, releasable_name, releasable_config_dir)The releasable's version when proj is a publish-suppressed member, else None.
"Publish-suppressed" is the member's EFFECTIVE publish_mode -- the releasable-level config merged with the member's own -- which is the same resolution version-consistency performs before it decides to read the version file instead of the manifest. Both questions therefore get the same answer from the same place.
None means the ordinary manifest reading applies: a published member, a member outside every releasable, a releasable with no version file, or a config that cannot answer what its publish mode is (which is the version-consistency check's finding to report, not this table's).
#_cmd_status_explicit
def _cmd_status_explicit(root, projects)Render per-releasable status rows for a workspace.
One row per releasable (version, tag, coverage, member count + names), plus one row for each standalone project not belonging to any releasable. Tag globs come from the shared resolver so releasable members resolve their releasable's tag_format instead of a per-member glob.