| |
| |
|
|
| """Module implementing a remote object allowing easy access to git remotes.""" |
|
|
| __all__ = ["RemoteReference"] |
|
|
| import os |
|
|
| from git.util import join_path |
|
|
| from .head import Head |
|
|
| |
|
|
| from typing import Any, Iterator, NoReturn, TYPE_CHECKING, Union |
|
|
| from git.types import PathLike |
|
|
| if TYPE_CHECKING: |
| from git.remote import Remote |
| from git.repo import Repo |
|
|
| |
|
|
|
|
| class RemoteReference(Head): |
| """A reference pointing to a remote head.""" |
|
|
| _common_path_default = Head._remote_common_path_default |
|
|
| @classmethod |
| def iter_items( |
| cls, |
| repo: "Repo", |
| common_path: Union[PathLike, None] = None, |
| remote: Union["Remote", None] = None, |
| *args: Any, |
| **kwargs: Any, |
| ) -> Iterator["RemoteReference"]: |
| """Iterate remote references, and if given, constrain them to the given remote.""" |
| common_path = common_path or cls._common_path_default |
| if remote is not None: |
| common_path = join_path(common_path, str(remote)) |
| |
| |
| return super().iter_items(repo, common_path) |
|
|
| |
| |
| |
| |
| @classmethod |
| def delete(cls, repo: "Repo", *refs: "RemoteReference", **kwargs: Any) -> None: |
| """Delete the given remote references. |
| |
| :note: |
| `kwargs` are given for comparability with the base class method as we |
| should not narrow the signature. |
| """ |
| repo.git.branch("-d", "-r", *refs) |
| |
| |
| |
| for ref in refs: |
| try: |
| os.remove(os.path.join(repo.common_dir, ref.path)) |
| except OSError: |
| pass |
| try: |
| os.remove(os.path.join(repo.git_dir, ref.path)) |
| except OSError: |
| pass |
| |
|
|
| @classmethod |
| def create(cls, *args: Any, **kwargs: Any) -> NoReturn: |
| """Raise :exc:`TypeError`. Defined so the ``create`` method is disabled.""" |
| raise TypeError("Cannot explicitly create remote references") |
|
|