rsmultigit 0.1.16

Manage multiple git repositories at once
# Example rsmultigit config. This same text is available from a running binary
# via `rsmultigit config-example`, so to bootstrap:
#
#   mkdir -p ~/.config/rsmultigit
#   rsmultigit config-example > ~/.config/rsmultigit/config.toml
#
# The config location is fixed — there is no --config flag. Every rsmultigit
# command reads this file to decide which repositories to operate on.
#
# `repos` is a list of shell-expanded glob patterns that resolve to repo roots.
# Matches that aren't git repos are filtered out automatically.
#
# `[[check]]` blocks are consumed only by `rsmultigit check-same`, which verifies
# that a given path has identical content across a selection of repos.
#
# Selection primitives (per check rule):
#   select     — glob over repo names (required)
#   exclude    — glob of repo names to drop from the selection
#   marker     — only include repos that contain this file (relative to repo root)
#   path       — file inside each repo to compare (required)
#   enabled    — bool (default true). Disabled rules are silently skipped, but can
#                still be forced on with `--checks <name...>` for ad-hoc checks.
#   must_have  — bool (default false). When true, every in-scope repo must contain
#                `path`; missing files become rule violations (reported as "missing in:"
#                and counted as mismatches). `check-same --fix-missing` will walk
#                those violators interactively and create the file from a chosen
#                seed group.
#
# A rule passes when every surviving repo's `path` hashes the same, *and*
# (when must_have = true) every in-scope repo contains the file.
# Repos that don't contain `path` are silently skipped when must_have = false.
#
# A rule that ends up matching no files at all fails ("no files matched") —
# that usually means a stale select/path. Pass `check-same --allow-empty` to
# let such rules pass as `ok (0 files)` instead.

repos = [
    "~/git/*",
]

# ── shared dev-tooling configs across all repos ───────────────────────────────

[[check]]
name = "mypy-ini"
select = "*"
path = ".mypy.ini"

[[check]]
name = "pylintrc"
select = "*"
path = ".pylintrc"

[[check]]
name = "gitignore"
select = "*"
path = ".gitignore"

[[check]]
name = "shellcheckrc"
select = "*"
path = ".shellcheckrc"

[[check]]
name = "jshintrc"
select = "*"
path = ".jshintrc"

[[check]]
name = "jshintignore"
select = "*"
path = ".jshintignore"

# ── python-module specifics (repos prefixed `py` with the veltzer tag) ────────

[[check]]
name = "py-makefile"
select = "py*"
marker = ".veltzer.tag"
path = "Makefile"

[[check]]
name = "py-license-template"
select = "py*"
marker = ".veltzer.tag"
path = "templates/LICENSE.mako"

[[check]]
name = "py-pyproject-template"
select = "py*"
marker = ".veltzer.tag"
path = "templates/pyproject.toml.mako"

[[check]]
name = "py-readme-template"
select = "py*"
marker = ".veltzer.tag"
path = "templates/README.md.mako"

[[check]]
name = "py-build-workflow"
select = "py*"
marker = ".veltzer.tag"
path = ".github/workflows/build.yml"

# ── non-python repos (everything except `py*`) with the veltzer tag ───────────

[[check]]
name = "non-py-readme-template"
select = "*"
exclude = "py*"
marker = ".veltzer.tag"
path = "templates/README.md.mako"

[[check]]
name = "non-py-build-workflow"
select = "*"
exclude = "py*"
marker = ".veltzer.tag"
path = ".github/workflows/build.yml"

# ── repos with the veltzer tag (mix of py / non-py) ───────────────────────────

[[check]]
name = "build-workflow-template"
select = "*"
marker = ".veltzer.tag"
path = "templates/.github/workflows/build.yml.mako"

[[check]]
name = "requirements-thawed-template"
select = "*"
marker = ".veltzer.tag"
path = "templates/requirements.thawed.txt.mako"

[[check]]
name = "github-funding"
select = "*"
marker = ".veltzer.tag"
path = ".github/FUNDING.yml"

[[check]]
name = "sphinx-conf"
select = "*"
marker = ".veltzer.tag"
path = "sphinx/conf.py"

[[check]]
name = "sphinx-index"
select = "*"
marker = ".veltzer.tag"
path = "sphinx/index.rst"

[[check]]
name = "config-platform"
select = "*"
marker = ".veltzer.tag"
path = "config/platform.py"

[[check]]
name = "config-personal"
select = "*"
marker = ".veltzer.tag"
path = "config/personal.py"

[[check]]
name = "config-github"
select = "*"
marker = ".veltzer.tag"
path = "config/github.py"

[[check]]
name = "config-shared"
select = "*"
marker = ".veltzer.tag"
path = "config/shared.py"

[[check]]
name = "aspell-conf"
select = "*"
marker = ".veltzer.tag"
path = ".aspell.conf"

[[check]]
name = "mdlrc"
select = "*"
marker = ".veltzer.tag"
path = ".mdlrc"

[[check]]
name = "mdl-style"
select = "*"
marker = ".veltzer.tag"
path = ".mdl.style.rb"

# ── GCP repos ─────────────────────────────────────────────────────────────────

[[check]]
name = "gcp-gcloudignore"
select = "gcp-*"
marker = ".gcp.conf"
path = ".gcloudignore"

[[check]]
name = "gcp-makefile"
select = "gcp-*"
marker = ".gcp.conf"
path = "Makefile"

[[check]]
name = "gcp-app-yaml"
select = "gcp-*"
marker = ".gcp.conf"
path = "app.yaml"

# ── rs* Rust repos: canonical files, synced from rsconstruct ──────────────────

[[check]]
name = "rs-ci-workflow"
select = "rs*"
path = ".github/workflows/ci.yml"
must_have = true

[[check]]
name = "rs-build-rs"
select = "rs*"
path = "build.rs"
must_have = true

# ── disabled rules (were commented out in mg_check_same_files.sh) ─────────────
# Re-enable by flipping `enabled = true`, or run ad hoc via:
#   rsmultigit check-same --checks <name>

[[check]]
name = "py-deps-config"
select = "py*"
marker = ".veltzer.tag"
path = "config/deps.py"
enabled = false

[[check]]
name = "py-setup-template"
select = "py*"
marker = ".veltzer.tag"
path = "templates/setup.py.mako"
enabled = false

[[check]]
name = "py-readme-rst-template"
select = "py*"
marker = ".veltzer.tag"
path = "templates/README.rst.mako"
enabled = false

[[check]]
name = "py-idea-gitignore"
select = "py*"
marker = ".veltzer.tag"
path = ".idea/.gitignore"
enabled = false