mirror of
https://github.com/lrnselfreliance/wrolpi.git
synced 2026-10-26 19:01:39 -04:00
A Repo is a Collection (kind='repo') plus a `repository` row, kept up to date by a recurring Download handled by the new `git` downloader. * Full history by default (all branches and tags, no --prune; a force push saves the old HEAD under refs/wrolpi/backup/); snapshot mode (--depth 1) and a pinned branch are optional. `/tree/<branch>` URLs select a branch. * git runs HTTPS-only, never prompts, never runs hooks, and checks out symlinks as plain files. Upstream disappearing defers the download with git's error; the local copy is kept. * Repos are cloned to `repos_destination` (repos/%(repo_tag)s/%(repo_name)s) and the `repos` directory is always ignored, so repo files are never indexed. * repos.yaml is the source of truth (import, dump, backup restore). * /api/repos: list, create, get, edit, delete (files kept unless delete_files), update now, and a per-directory file tree. Tagging uses the collections tag endpoint. Also: * run_command/process_runner can merge stderr into stdout (git writes progress to stderr). * move_collection deletes an old directory that only holds empty directories (the move left an emptied .git behind). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
21 lines
488 B
Python
21 lines
488 B
Python
from http import HTTPStatus
|
|
|
|
from wrolpi.errors import APIError
|
|
|
|
|
|
class UnknownRepo(APIError):
|
|
code = 'UNKNOWN_REPO'
|
|
summary = 'Unable to find the repo'
|
|
status_code = HTTPStatus.NOT_FOUND
|
|
|
|
|
|
class InvalidRepo(APIError):
|
|
code = 'INVALID_REPO'
|
|
summary = 'The repo is invalid'
|
|
status_code = HTTPStatus.BAD_REQUEST
|
|
|
|
|
|
class RepoConflict(APIError):
|
|
code = 'REPO_CONFLICT'
|
|
summary = 'The repo conflicts with an existing repo'
|
|
status_code = HTTPStatus.CONFLICT
|