On this page
Cleanup utilities for per-package .rlsbl/ directories after releasable model migration.
#rlsbl.releasable_cleanup
#rlsbl.releasable_cleanup
Cleanup utilities for per-package .rlsbl/ directories after releasable model migration.
When a workspace uses explicit-mode releasables, changelog and release state moves to per-releasable directories under .rlsbl-monorepo/releasables/{name}/. The per-package .rlsbl/changes/ and .rlsbl/releases/ directories become dead state that should be removed.
These functions are intended for use by migration tooling (Phase 10), not for automatic invocation during scaffold or release.
#cleanup_per_package_release_state
def cleanup_per_package_release_state(workspace_root, projects=None, releasables=None)Remove per-package .rlsbl/ state for packages in explicit-mode releasables.
Only acts when the workspace is in explicit mode ([[releasables]] is defined in workspace.toml). For each project that belongs to a releasable (releasable is a string, not False), removes:
.rlsbl/changes/-- changelog state (moved to releasable level).rlsbl/releases/-- release state (moved to releasable level).rlsbl/hooks/-- hook scripts (moved to releasable level).rlsbl/bases/-- merge bases (moved to releasable level).rlsbl/lint/-- lint configs (moved to releasable level).rlsbl/version-- rlsbl scaffold version fileCHANGELOG.md-- generated changelog (now per-releasable).rlsbl/config.json-- only when identical to the releasable-level config
Uses saferm for removal so there is an audit trail and the files are recoverable.
Args:
workspace_root: path to the monorepo root (containing .rlsbl-monorepo/).projects: optional pre-loaded list of WorkspaceProject. If None, loads
from workspace.toml.
releasables: optional pre-loaded list of Releasable. If None, loads
from workspace.toml.
Returns:
- A list of paths that were removed (empty if nothing to clean).
Raises:
RuntimeError: if saferm is not available on PATH.subprocess.CalledProcessError: if saferm fails for a path.
#verify_minimal_rlsbl
def verify_minimal_rlsbl(project_path)Return unexpected files/dirs in .rlsbl/ for a releasable member package.
After cleanup, a per-package .rlsbl/ should contain only:
hashes.json(scaffold metadata)managed-files.json(scaffold metadata)config.json(only if it has overrides differing from releasable config)
Args:
project_path: absolute or relative path to the project directory.
Returns:
- A list of unexpected file/directory names found in
.rlsbl/. - Empty list means the directory is clean.
#_get_project_releasable
def _get_project_releasable(proj)Extract the releasable value from a project.
Returns str, False, or None.
#_saferm_dir
def _saferm_dir(path, project_name, subdir_name)Remove a directory using saferm with an audit trail.
Raises RuntimeError if saferm is not on PATH. Raises subprocess.CalledProcessError if saferm exits non-zero.
#_saferm_file
def _saferm_file(path, project_name, file_name)Remove a single file using saferm with an audit trail.
Raises RuntimeError if saferm is not on PATH. Raises subprocess.CalledProcessError if saferm exits non-zero.