quine-manifest/README.md
Philip Peterson c71e266794 README: upstream mirrors have Actions off
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 18:42:57 -09:00

2.4 KiB

quine-manifest

Declares where every Quine repo lives (this repo: forge.quinefoundation.com/quine-global/quine-manifest) on GitHub and on Forgejo (forge.quinefoundation.com), and a script that makes both match.

Bucket GitHub org Forgejo org Notes
main quine-global quine-global
labs quine-global-labs quine-global-labs
boneyard quine-global-boneyard quine-global-boneyard retired repos (not archived)

By default Forgejo is primary and push-mirrors to GitHub (primary = "forgejo"). With primary = "github", Forgejo holds a pull mirror instead.

Use

Needs Python 3.11+ and a logged-in gh.

python3.14 quine-repos.py                 # plan: show drift, change nothing
python3.14 quine-repos.py --apply         # make it so
python3.14 quine-repos.py --apply ncdu    # only some repos

To move a repo, change its bucket and apply: it's transferred on both sides, and its push mirror is repointed.

Credentials

  • Forgejo admin token: $FORGEJO_TOKEN or ~/.config/forgejo/token.
  • GitHub admin actions (transfer, archive) and imports: your gh login.
  • Push mirrors: each bucket's mirror_token_file, a GitHub fine-grained token whose resource owner is that bucket's GitHub org (Contents + Workflows read/write). Fine-grained tokens cover one org, so each bucket needs its own. The main token expires 2027-10-12.

Every repo in a bucket org (on either host) must be listed in manifest.toml; the script exits with an error before doing anything if it finds one that isn't.

Upstream mirrors (upstream = …) have Forgejo Actions off unless they say actions = true: they carry upstream's own CI, which would sit "waiting" forever for runners we don't have.

What it won't do

  • Delete repositories. A repo that's the wrong kind (a regular repo that should be a pull mirror) is reported for you to fix by hand.
  • Create GitHub orgs (GitHub has no API for that).
  • Full imports that outlast nginx's 60 s proxy timeout leave the repo stuck "migrating" — use import = "code" for repos with big release assets. Don't click "Cancel migration" on a stuck repo: it deletes the repo.