Files
pkgmgr/src/pkgmgr/core/remote_provisioning/registry.py
Kevin Veen-Birkenbach 2debdbee09
Some checks failed
CI / test-unit (push) Has been cancelled
CI / test-integration (push) Has been cancelled
CI / test-env-virtual (push) Has been cancelled
CI / test-env-nix (push) Has been cancelled
CI / test-e2e (push) Has been cancelled
CI / test-virgin-user (push) Has been cancelled
CI / test-virgin-root (push) Has been cancelled
CI / codesniffer-shellcheck (push) Has been cancelled
CI / codesniffer-ruff (push) Has been cancelled
* **Split mirror responsibilities into clear subcommands**
Setup configures local Git state, check validates remote reachability in a read-only way, and provision explicitly creates missing remote repositories. Destructive behavior is never implicit.

* **Introduce a remote provisioning layer**
  pkgmgr can now ensure that repositories exist on remote providers. If a repository is missing, it can be created automatically on supported platforms when explicitly requested.

* **Add a provider registry for extensibility**
  Providers are resolved based on the remote host, with optional hints to force a specific backend. This makes it straightforward to add further providers later without changing the core logic.

* **Use a lightweight, dependency-free HTTP client**
  All API communication is handled via a small stdlib-based client. HTTP errors are mapped to meaningful domain errors, improving diagnostics and error handling consistency.

* **Centralize credential resolution**
  API tokens are resolved in a strict order: environment variables first, then the system keyring, and finally an interactive prompt if allowed. This works well for both CI and interactive use.

* **Keep keyring integration optional**
  Secure token storage via the OS keyring is provided as an optional dependency. If unavailable, pkgmgr still works using environment variables or one-off interactive tokens.

* **Improve CLI parser safety and clarity**
  Shared argument helpers now guard against duplicate definitions, making composed subcommands more robust and easier to maintain.

* **Expand end-to-end test coverage**
  All mirror-related workflows are exercised through real CLI invocations in preview mode, ensuring full wiring correctness while remaining safe for automated test environments.

https://chatgpt.com/share/693df441-a780-800f-bcf7-96e06cc9e421
2025-12-14 00:16:54 +01:00

31 lines
891 B
Python

# src/pkgmgr/core/remote_provisioning/registry.py
from __future__ import annotations
from dataclasses import dataclass
from typing import List, Optional
from .providers.base import RemoteProvider
from .providers.gitea import GiteaProvider
from .providers.github import GitHubProvider
@dataclass
class ProviderRegistry:
"""Resolve the correct provider implementation for a host."""
providers: List[RemoteProvider]
@classmethod
def default(cls) -> "ProviderRegistry":
# Order matters: more specific providers first; fallback providers last.
return cls(providers=[GitHubProvider(), GiteaProvider()])
def resolve(self, host: str) -> Optional[RemoteProvider]:
for p in self.providers:
try:
if p.can_handle(host):
return p
except Exception:
continue
return None