Skip to content
rlsbl.commands.rewrite

The rlsbl rewrite command group: working-tree rewrites previewed per file, whose occurrence counts are the contract an apply re-derives before it writes.

#rlsbl.commands.rewrite

#rlsbl.commands.rewrite

The rlsbl rewrite command group: working-tree rewrites, previewed first.

Each command in this group changes source or manifest files in the CURRENT working tree -- nothing is pushed, tagged, published or sent anywhere. They share one contract, and it is the reason they live together:

  • Observe, then preview, then apply. The plan is built by reading the

tree, under :func:rlsbl.preview_apply.no_writes, and --dry-run renders that plan instead of performing it. The plan is per FILE (or per dependency entry), and every item carries its occurrence count.

  • The counts are the contract. An apply re-derives each item's count from

disk immediately before writing and refuses when it disagrees with the count the preview reported. A tree that moved between preview and apply is a hard abort with nothing further written -- never a silent partial sweep against content nobody previewed.

  • The abort is honest about what it already wrote. Items applied before

the failing one stay on disk; there is no rollback. The message enumerates them (see :mod:rlsbl.commands.rewrite.abort) and says that a re-run re-plans from the tree as it is now.

Both commands are classified mutating but NOT consequential: the writes are local, fully previewable, and revertible with git.

This package deliberately re-exports nothing. Each command's handler in rlsbl/__init__.py imports its own submodule, so the group's modules stay independent of one another and a test patches a dispatch target at the module that defines it.

Search