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
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
31 lines
891 B
Python
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
|