wrolpi/alembic/versions
lrnselfreliance 93d878952c
Add a Repos module that mirrors git repositories (#783)
Repos keeps local mirrors of git repositories, cloned over https and kept up to date on a schedule.

- A Repo is a Collection (kind='repo') plus a `repository` row.  The new `git` downloader clones it, then updates it
  (weekly by default, or Never: the clone is kept as it is and only updated on request).
- Repos are saved in `repos/<tag>/<name>` (the Repos Directory, ignored by default) or a directory the user chooses.
  An existing clone can be imported where it is.  repos.yaml is the source of truth.
- A GitHub-like page shows each repo's README, files, and history, with a ZIP download.  READMEs are searchable
  under the global search's Other tab.
- git is hardened against hostile repos and configs: https only, pinned addresses with no private addresses (for the
  repo and its submodules), sanitized configs, no hooks or links, and only clones WROLPi made or imported are
  updated.
- Tagging a Repo moves its clone as one directory.  Repo changes wait for repos.yaml to be imported at startup.
- The file mover groups unindexed files with no primary file as one FileGroup, and never replaces a file at the
  destination.  A failed tag move restores the Collection's tag.  A Collection's directory cannot leave the media
  directory.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 15:16:58 -06:00
..
2026_07_10_1350_sqlite_baseline.py Postgres -> SQLite hard cutover: the database moves into the media directory. 2026-07-12 14:09:37 -06:00
2026_07_14_0900_browse_covering_index.py SQLite: make the browse pages index-only. 2026-07-14 07:46:29 -06:00
2026_09_16_1200_file_group_stem.py files: SQL FileGroup compare, stem column, drop unused discovery path (#713) 2026-09-18 08:57:56 -06:00
2026_09_18_1200_unique_directory_stem.py files: unique (directory, stem) after collapsing duplicate FileGroups (#715) 2026-09-19 21:03:49 -06:00
2026_09_20_1200_drop_file_group_idempotency.py files: extract refresh compare into its own module; drop file_group.idempotency (#717) 2026-09-20 20:58:19 -06:00
2026_09_27_1200_domain_collection_summary.py collections: channel and domain listings read trigger-maintained summary columns (#739) 2026-09-27 11:36:08 -06:00
2026_09_28_1200_collection_listing_indexes.py collections: listing answers channel and download queries from covering indexes (#740) 2026-09-27 12:53:40 -06:00
2026_10_05_1200_markdown_mimetype.py Preview markdown files formatted, with a raw toggle (#780) 2026-10-05 13:26:42 -06:00
2026_10_06_1200_repository.py Add a Repos module that mirrors git repositories (#783) 2026-10-07 15:16:58 -06:00
2026_10_06_1300_repository_search.py Add a Repos module that mirrors git repositories (#783) 2026-10-07 15:16:58 -06:00
2026_10_06_1400_repository_submodules.py Add a Repos module that mirrors git repositories (#783) 2026-10-07 15:16:58 -06:00
2026_10_06_1500_repository_clone_token.py Add a Repos module that mirrors git repositories (#783) 2026-10-07 15:16:58 -06:00