rlsbl v0.92.0 /rlsbl.releasable_cleanup
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

python
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 file
  • CHANGELOG.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

python
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

python
def _get_project_releasable(proj)

Extract the releasable value from a project.

Returns str, False, or None.

#_saferm_dir

python
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

python
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.