wrolpi/modules/repos/errors.py
Roland b3255e715c
Add a Repos module that mirrors git repositories (backend)
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>
2026-10-06 16:56:09 -06:00

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