No description
Find a file
Philip Peterson 63a024ff20 List app-build, Forgejo-only and public
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 21:09:27 -09:00
__pycache__ Descriptions: "forked from" on Forgejo, "mirror of <Forgejo>" on GitHub 2026-10-10 20:01:51 -08:00
manifest.toml List app-build, Forgejo-only and public 2026-11-03 21:09:27 -09:00
quine-repos.py actions: off for upstream mirrors 2026-11-03 18:41:09 -09:00
README.md README: upstream mirrors have Actions off 2026-11-03 18:42:57 -09:00

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.