scmrepo 3.2.0__py3-none-any.whl → 3.3.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of scmrepo might be problematic. Click here for more details.
- scmrepo/asyn.py +1 -0
- scmrepo/base.py +1 -0
- scmrepo/fs.py +2 -2
- scmrepo/git/__init__.py +6 -3
- scmrepo/git/backend/base.py +1 -1
- scmrepo/git/backend/dulwich/__init__.py +2 -2
- scmrepo/git/backend/dulwich/asyncssh_vendor.py +8 -4
- scmrepo/git/backend/gitpython.py +2 -2
- scmrepo/git/backend/pygit2/__init__.py +8 -7
- scmrepo/git/config.py +1 -0
- scmrepo/git/credentials.py +1 -0
- scmrepo/git/lfs/client.py +52 -19
- scmrepo/git/lfs/storage.py +1 -1
- scmrepo/noscm.py +3 -2
- scmrepo/urls.py +21 -0
- {scmrepo-3.2.0.dist-info → scmrepo-3.3.1.dist-info}/METADATA +15 -15
- scmrepo-3.3.1.dist-info/RECORD +38 -0
- {scmrepo-3.2.0.dist-info → scmrepo-3.3.1.dist-info}/WHEEL +1 -1
- scmrepo-3.2.0.dist-info/RECORD +0 -37
- {scmrepo-3.2.0.dist-info → scmrepo-3.3.1.dist-info}/LICENSE +0 -0
- {scmrepo-3.2.0.dist-info → scmrepo-3.3.1.dist-info}/top_level.txt +0 -0
scmrepo/asyn.py
CHANGED
scmrepo/base.py
CHANGED
scmrepo/fs.py
CHANGED
|
@@ -33,8 +33,8 @@ class GitFileSystem(AbstractFileSystem):
|
|
|
33
33
|
self,
|
|
34
34
|
path: Optional[str] = None,
|
|
35
35
|
rev: Optional[str] = None,
|
|
36
|
-
scm: "Git" = None,
|
|
37
|
-
trie: "GitTrie" = None,
|
|
36
|
+
scm: Optional["Git"] = None,
|
|
37
|
+
trie: Optional["GitTrie"] = None,
|
|
38
38
|
rev_resolver: Optional[Callable[["Git", str], str]] = None,
|
|
39
39
|
**kwargs,
|
|
40
40
|
):
|
scmrepo/git/__init__.py
CHANGED
|
@@ -142,7 +142,7 @@ class Git(Base):
|
|
|
142
142
|
def clone(
|
|
143
143
|
cls,
|
|
144
144
|
url: str,
|
|
145
|
-
to_path: str,
|
|
145
|
+
to_path: Union[str, os.PathLike[str]],
|
|
146
146
|
rev: Optional[str] = None,
|
|
147
147
|
bare: bool = False,
|
|
148
148
|
mirror: bool = False,
|
|
@@ -319,13 +319,16 @@ class Git(Base):
|
|
|
319
319
|
|
|
320
320
|
@classmethod
|
|
321
321
|
def init(
|
|
322
|
-
cls,
|
|
322
|
+
cls,
|
|
323
|
+
path: Union[str, os.PathLike[str]],
|
|
324
|
+
bare: bool = False,
|
|
325
|
+
_backend: Optional[str] = None,
|
|
323
326
|
) -> "Git":
|
|
324
327
|
for name, backend in GitBackends.DEFAULT.items():
|
|
325
328
|
if _backend and name != _backend:
|
|
326
329
|
continue
|
|
327
330
|
try:
|
|
328
|
-
backend.init(path, bare=bare)
|
|
331
|
+
backend.init(os.fsdecode(path), bare=bare)
|
|
329
332
|
# TODO: reuse created object instead of initializing a new one.
|
|
330
333
|
return cls(path)
|
|
331
334
|
except NotImplementedError:
|
scmrepo/git/backend/base.py
CHANGED
|
@@ -47,7 +47,7 @@ class BaseGitBackend(ABC):
|
|
|
47
47
|
@abstractmethod
|
|
48
48
|
def clone(
|
|
49
49
|
url: str,
|
|
50
|
-
to_path: str,
|
|
50
|
+
to_path: Union[str, os.PathLike[str]],
|
|
51
51
|
shallow_branch: Optional[str] = None,
|
|
52
52
|
progress: Optional[Callable[["GitProgressEvent"], None]] = None,
|
|
53
53
|
bare: bool = False,
|
|
@@ -223,7 +223,7 @@ class DulwichBackend(BaseGitBackend): # pylint:disable=abstract-method
|
|
|
223
223
|
def clone(
|
|
224
224
|
cls,
|
|
225
225
|
url: str,
|
|
226
|
-
to_path: str,
|
|
226
|
+
to_path: Union[str, os.PathLike[str]],
|
|
227
227
|
shallow_branch: Optional[str] = None,
|
|
228
228
|
progress: Optional[Callable[["GitProgressEvent"], None]] = None,
|
|
229
229
|
bare: bool = False,
|
|
@@ -265,7 +265,7 @@ class DulwichBackend(BaseGitBackend): # pylint:disable=abstract-method
|
|
|
265
265
|
else:
|
|
266
266
|
cls._set_default_tracking_branch(repo)
|
|
267
267
|
except Exception as exc: # noqa: BLE001
|
|
268
|
-
raise CloneError(url, to_path) from exc
|
|
268
|
+
raise CloneError(url, os.fsdecode(to_path)) from exc
|
|
269
269
|
|
|
270
270
|
@staticmethod
|
|
271
271
|
def _set_default_tracking_branch(repo: "Repo"):
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"""asyncssh SSH vendor for Dulwich."""
|
|
2
|
+
|
|
2
3
|
import asyncio
|
|
3
4
|
import os
|
|
4
5
|
from collections.abc import Coroutine, Iterator, Sequence
|
|
5
6
|
from typing import (
|
|
6
7
|
TYPE_CHECKING,
|
|
8
|
+
Any,
|
|
7
9
|
Callable,
|
|
8
10
|
Optional,
|
|
9
11
|
cast,
|
|
@@ -287,9 +289,9 @@ class AsyncSSHVendor(BaseAsyncObject, SSHVendor):
|
|
|
287
289
|
from asyncssh.auth import MSG_USERAUTH_PK_OK, _ClientPublicKeyAuth
|
|
288
290
|
|
|
289
291
|
# pylint: disable=protected-access
|
|
290
|
-
_ClientPublicKeyAuth._packet_handlers[
|
|
291
|
-
|
|
292
|
-
|
|
292
|
+
_ClientPublicKeyAuth._packet_handlers[MSG_USERAUTH_PK_OK] = (
|
|
293
|
+
_process_public_key_ok_gh
|
|
294
|
+
)
|
|
293
295
|
|
|
294
296
|
try:
|
|
295
297
|
conn = await asyncssh.connect(
|
|
@@ -303,7 +305,9 @@ class AsyncSSHVendor(BaseAsyncObject, SSHVendor):
|
|
|
303
305
|
encoding=None,
|
|
304
306
|
client_factory=InteractiveSSHClient,
|
|
305
307
|
)
|
|
306
|
-
proc = await conn.create_process(
|
|
308
|
+
proc: SSHClientProcess[Any] = await conn.create_process(
|
|
309
|
+
command, encoding=None
|
|
310
|
+
)
|
|
307
311
|
except asyncssh.misc.PermissionDenied as exc:
|
|
308
312
|
raise AuthError(f"{username}@{host}:{port or 22}") from exc
|
|
309
313
|
return AsyncSSHWrapper(conn, proc)
|
scmrepo/git/backend/gitpython.py
CHANGED
|
@@ -168,7 +168,7 @@ class GitPythonBackend(BaseGitBackend): # pylint:disable=abstract-method
|
|
|
168
168
|
@requires_git
|
|
169
169
|
def clone(
|
|
170
170
|
url: str,
|
|
171
|
-
to_path: str,
|
|
171
|
+
to_path: Union[str, os.PathLike[str]],
|
|
172
172
|
shallow_branch: Optional[str] = None,
|
|
173
173
|
progress: Optional[Callable[["GitProgressEvent"], None]] = None,
|
|
174
174
|
bare: bool = False,
|
|
@@ -214,7 +214,7 @@ class GitPythonBackend(BaseGitBackend): # pylint:disable=abstract-method
|
|
|
214
214
|
tmp_repo = clone_from(branch=shallow_branch, depth=1)
|
|
215
215
|
tmp_repo.close()
|
|
216
216
|
except GitCommandError as exc: # pylint: disable=no-member
|
|
217
|
-
raise CloneError(url, to_path) from exc
|
|
217
|
+
raise CloneError(url, os.fsdecode(to_path)) from exc
|
|
218
218
|
|
|
219
219
|
@staticmethod
|
|
220
220
|
@requires_git
|
|
@@ -2,7 +2,7 @@ import locale
|
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
4
|
import stat
|
|
5
|
-
from collections.abc import
|
|
5
|
+
from collections.abc import Iterable, Iterator, Mapping
|
|
6
6
|
from contextlib import contextmanager
|
|
7
7
|
from io import BytesIO, StringIO, TextIOWrapper
|
|
8
8
|
from typing import (
|
|
@@ -25,6 +25,7 @@ from scmrepo.exceptions import (
|
|
|
25
25
|
from scmrepo.git.backend.base import BaseGitBackend, SyncStatus
|
|
26
26
|
from scmrepo.git.config import Config
|
|
27
27
|
from scmrepo.git.objects import GitCommit, GitObject, GitTag
|
|
28
|
+
from scmrepo.urls import is_scp_style_url
|
|
28
29
|
from scmrepo.utils import relpath
|
|
29
30
|
|
|
30
31
|
logger = logging.getLogger(__name__)
|
|
@@ -272,7 +273,7 @@ class Pygit2Backend(BaseGitBackend): # pylint:disable=abstract-method
|
|
|
272
273
|
def clone(
|
|
273
274
|
cls,
|
|
274
275
|
url: str,
|
|
275
|
-
to_path: str,
|
|
276
|
+
to_path: Union[str, os.PathLike[str]],
|
|
276
277
|
shallow_branch: Optional[str] = None,
|
|
277
278
|
progress: Optional[Callable[["GitProgressEvent"], None]] = None,
|
|
278
279
|
bare: bool = False,
|
|
@@ -292,7 +293,7 @@ class Pygit2Backend(BaseGitBackend): # pylint:disable=abstract-method
|
|
|
292
293
|
if mirror:
|
|
293
294
|
cls._set_mirror(repo, progress=progress)
|
|
294
295
|
except GitError as exc:
|
|
295
|
-
raise CloneError(url, to_path) from exc
|
|
296
|
+
raise CloneError(url, os.fsdecode(to_path)) from exc
|
|
296
297
|
|
|
297
298
|
@staticmethod
|
|
298
299
|
def _set_mirror(
|
|
@@ -636,7 +637,7 @@ class Pygit2Backend(BaseGitBackend): # pylint:disable=abstract-method
|
|
|
636
637
|
raise SCMError("Unknown merge analysis result")
|
|
637
638
|
|
|
638
639
|
@contextmanager
|
|
639
|
-
def _get_remote(self, url: str) ->
|
|
640
|
+
def _get_remote(self, url: str) -> Iterator["Remote"]:
|
|
640
641
|
"""Return a pygit2.Remote suitable for the specified Git URL or remote name."""
|
|
641
642
|
try:
|
|
642
643
|
remote = self.repo.remotes[url]
|
|
@@ -646,11 +647,11 @@ class Pygit2Backend(BaseGitBackend): # pylint:disable=abstract-method
|
|
|
646
647
|
except KeyError as exc:
|
|
647
648
|
raise SCMError(f"'{url}' is not a valid Git remote or URL") from exc
|
|
648
649
|
|
|
649
|
-
if os.name == "nt"
|
|
650
|
-
url = url
|
|
650
|
+
if os.name == "nt":
|
|
651
|
+
url = url.removeprefix("file://")
|
|
651
652
|
remote = self.repo.remotes.create_anonymous(url)
|
|
652
653
|
parsed = urlparse(remote.url)
|
|
653
|
-
if parsed.scheme in ("git", "git+ssh", "ssh") or remote.url
|
|
654
|
+
if parsed.scheme in ("git", "git+ssh", "ssh") or is_scp_style_url(remote.url):
|
|
654
655
|
raise NotImplementedError
|
|
655
656
|
yield remote
|
|
656
657
|
|
scmrepo/git/config.py
CHANGED
scmrepo/git/credentials.py
CHANGED
scmrepo/git/lfs/client.py
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
|
-
import re
|
|
5
4
|
import shutil
|
|
6
5
|
from abc import abstractmethod
|
|
7
6
|
from collections.abc import Iterable, Iterator
|
|
8
7
|
from contextlib import AbstractContextManager, contextmanager, suppress
|
|
8
|
+
from http import HTTPStatus
|
|
9
9
|
from tempfile import NamedTemporaryFile
|
|
10
|
+
from time import time
|
|
10
11
|
from typing import TYPE_CHECKING, Any, Optional
|
|
12
|
+
from urllib.parse import urlparse
|
|
11
13
|
|
|
12
14
|
import aiohttp
|
|
13
15
|
from aiohttp_retry import ExponentialRetry, RetryClient
|
|
@@ -18,6 +20,7 @@ from funcy import cached_property
|
|
|
18
20
|
|
|
19
21
|
from scmrepo.git.backend.dulwich import _get_ssh_vendor
|
|
20
22
|
from scmrepo.git.credentials import Credential, CredentialNotFoundError
|
|
23
|
+
from scmrepo.urls import SCP_REGEX, is_scp_style_url
|
|
21
24
|
|
|
22
25
|
from .exceptions import LFSError
|
|
23
26
|
from .pointer import Pointer
|
|
@@ -64,11 +67,12 @@ class LFSClient(AbstractContextManager):
|
|
|
64
67
|
sock_connect=self._REQUEST_TIMEOUT,
|
|
65
68
|
sock_read=self._REQUEST_TIMEOUT,
|
|
66
69
|
),
|
|
67
|
-
retry_options=
|
|
70
|
+
retry_options=_ExponentialRetry(
|
|
68
71
|
attempts=self._SESSION_RETRIES,
|
|
69
72
|
factor=self._SESSION_BACKOFF_FACTOR,
|
|
70
73
|
max_timeout=self._REQUEST_TIMEOUT,
|
|
71
74
|
exceptions={aiohttp.ClientError},
|
|
75
|
+
statuses={HTTPStatus.TOO_MANY_REQUESTS},
|
|
72
76
|
),
|
|
73
77
|
**kwargs,
|
|
74
78
|
)
|
|
@@ -81,9 +85,9 @@ class LFSClient(AbstractContextManager):
|
|
|
81
85
|
|
|
82
86
|
@classmethod
|
|
83
87
|
def from_git_url(cls, git_url: str) -> "LFSClient":
|
|
84
|
-
if git_url.startswith(
|
|
88
|
+
if git_url.startswith("ssh://") or is_scp_style_url(git_url):
|
|
85
89
|
return _SSHLFSClient.from_git_url(git_url)
|
|
86
|
-
if git_url.startswith("https://"):
|
|
90
|
+
if git_url.startswith(("http://", "https://")):
|
|
87
91
|
return _HTTPLFSClient.from_git_url(git_url)
|
|
88
92
|
raise NotImplementedError(f"Unsupported Git URL: {git_url}")
|
|
89
93
|
|
|
@@ -91,8 +95,7 @@ class LFSClient(AbstractContextManager):
|
|
|
91
95
|
pass
|
|
92
96
|
|
|
93
97
|
@abstractmethod
|
|
94
|
-
def _get_auth_header(self, *, upload: bool) -> dict:
|
|
95
|
-
...
|
|
98
|
+
def _get_auth_header(self, *, upload: bool) -> dict: ...
|
|
96
99
|
|
|
97
100
|
async def _batch_request(
|
|
98
101
|
self,
|
|
@@ -211,11 +214,9 @@ class _HTTPLFSClient(LFSClient):
|
|
|
211
214
|
|
|
212
215
|
|
|
213
216
|
class _SSHLFSClient(LFSClient):
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
)
|
|
217
|
-
|
|
218
|
-
def __init__(self, url: str, host: str, port: int, path: str):
|
|
217
|
+
def __init__(
|
|
218
|
+
self, url: str, host: str, port: int, username: Optional[str], path: str
|
|
219
|
+
):
|
|
219
220
|
"""
|
|
220
221
|
Args:
|
|
221
222
|
url: LFS server URL.
|
|
@@ -226,25 +227,42 @@ class _SSHLFSClient(LFSClient):
|
|
|
226
227
|
super().__init__(url)
|
|
227
228
|
self.host = host
|
|
228
229
|
self.port = port
|
|
230
|
+
self.username = username
|
|
229
231
|
self.path = path
|
|
230
232
|
self._ssh = _get_ssh_vendor()
|
|
231
233
|
|
|
232
234
|
@classmethod
|
|
233
235
|
def from_git_url(cls, git_url: str) -> "_SSHLFSClient":
|
|
234
|
-
|
|
235
|
-
|
|
236
|
+
if scp_match := SCP_REGEX.match(git_url):
|
|
237
|
+
# Add an ssh:// prefix and replace the ':' with a '/'.
|
|
238
|
+
git_url = scp_match.expand(r"ssh://\1\2/\3")
|
|
239
|
+
|
|
240
|
+
parsed = urlparse(git_url)
|
|
241
|
+
if parsed.scheme != "ssh" or not parsed.hostname:
|
|
236
242
|
raise ValueError(f"Invalid Git SSH URL: {git_url}")
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
243
|
+
|
|
244
|
+
host = parsed.hostname
|
|
245
|
+
port = parsed.port or 22
|
|
246
|
+
path = parsed.path.lstrip("/")
|
|
247
|
+
username = parsed.username
|
|
248
|
+
|
|
249
|
+
url_path = path.removesuffix(".git") + ".git/info/lfs"
|
|
250
|
+
url = f"https://{host}/{url_path}"
|
|
251
|
+
return cls(url, host, port, username, path)
|
|
240
252
|
|
|
241
253
|
def _get_auth_header(self, *, upload: bool) -> dict:
|
|
242
254
|
return self._git_lfs_authenticate(
|
|
243
|
-
self.host, self.port,
|
|
255
|
+
self.host, self.port, self.username, self.path, upload=upload
|
|
244
256
|
).get("header", {})
|
|
245
257
|
|
|
246
258
|
def _git_lfs_authenticate(
|
|
247
|
-
self,
|
|
259
|
+
self,
|
|
260
|
+
host: str,
|
|
261
|
+
port: int,
|
|
262
|
+
username: Optional[str],
|
|
263
|
+
path: str,
|
|
264
|
+
*,
|
|
265
|
+
upload: bool = False,
|
|
248
266
|
) -> dict:
|
|
249
267
|
action = "upload" if upload else "download"
|
|
250
268
|
return json.loads(
|
|
@@ -252,7 +270,7 @@ class _SSHLFSClient(LFSClient):
|
|
|
252
270
|
command=f"git-lfs-authenticate {path} {action}",
|
|
253
271
|
host=host,
|
|
254
272
|
port=port,
|
|
255
|
-
username=
|
|
273
|
+
username=username,
|
|
256
274
|
).read()
|
|
257
275
|
)
|
|
258
276
|
|
|
@@ -273,3 +291,18 @@ def _as_atomic(to_info: str, create_parents: bool = False) -> Iterator[str]:
|
|
|
273
291
|
raise
|
|
274
292
|
else:
|
|
275
293
|
shutil.move(tmp_file.name, to_info)
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
class _ExponentialRetry(ExponentialRetry):
|
|
297
|
+
def get_timeout(
|
|
298
|
+
self, attempt: int, response: Optional[aiohttp.ClientResponse] = None
|
|
299
|
+
) -> float:
|
|
300
|
+
if response is not None and response.status == HTTPStatus.TOO_MANY_REQUESTS:
|
|
301
|
+
if "Retry-After" in response.headers:
|
|
302
|
+
with suppress(ValueError):
|
|
303
|
+
return float(response.headers["Retry-After"])
|
|
304
|
+
for k in ["RateLimit-Reset", "X-RateLimit-Reset"]:
|
|
305
|
+
if k in response.headers:
|
|
306
|
+
with suppress(ValueError):
|
|
307
|
+
return float(response.headers[k]) - time()
|
|
308
|
+
return super().get_timeout(attempt, response)
|
scmrepo/git/lfs/storage.py
CHANGED
scmrepo/noscm.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import os
|
|
2
|
+
from typing import Union
|
|
2
3
|
|
|
3
4
|
from .base import Base
|
|
4
5
|
|
|
@@ -8,7 +9,7 @@ from .base import Base
|
|
|
8
9
|
class NoSCM(Base):
|
|
9
10
|
def __init__(
|
|
10
11
|
self,
|
|
11
|
-
root_dir:
|
|
12
|
+
root_dir: Union[str, os.PathLike[str], None] = None,
|
|
12
13
|
_raise_not_implemented_as=NotImplementedError,
|
|
13
14
|
):
|
|
14
15
|
super().__init__(root_dir=root_dir)
|
scmrepo/urls.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
# from https://github.com/pypa/pip/blob/303fed36c1771de4063063a866776a9103972317/src/pip/_internal/vcs/git.py#L40
|
|
4
|
+
# SCP (Secure copy protocol) shorthand. e.g. 'git@example.com:foo/bar.git'
|
|
5
|
+
SCP_REGEX = re.compile(
|
|
6
|
+
r"""^
|
|
7
|
+
# Optional user, e.g. 'git@'
|
|
8
|
+
(\w+@)?
|
|
9
|
+
# Server, e.g. 'github.com'.
|
|
10
|
+
([^/:]+):
|
|
11
|
+
# The server-side path. e.g. 'user/project.git'. Must start with an
|
|
12
|
+
# alphanumeric character so as not to be confusable with a Windows paths
|
|
13
|
+
# like 'C:/foo/bar' or 'C:\foo\bar'.
|
|
14
|
+
(\w[^:]*)
|
|
15
|
+
$""",
|
|
16
|
+
re.VERBOSE,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def is_scp_style_url(url: str) -> bool:
|
|
21
|
+
return bool(SCP_REGEX.match(url))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: scmrepo
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.3.1
|
|
4
4
|
Summary: scmrepo
|
|
5
5
|
Author-email: Iterative <support@dvc.org>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -26,22 +26,22 @@ Requires-Dist: funcy >=1.14
|
|
|
26
26
|
Requires-Dist: aiohttp-retry >=2.5.0
|
|
27
27
|
Requires-Dist: tqdm
|
|
28
28
|
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: mypy ==1.9.0 ; extra == 'dev'
|
|
29
30
|
Requires-Dist: scmrepo[tests] ; extra == 'dev'
|
|
31
|
+
Requires-Dist: types-certifi ; extra == 'dev'
|
|
32
|
+
Requires-Dist: types-mock ; extra == 'dev'
|
|
33
|
+
Requires-Dist: types-paramiko ; extra == 'dev'
|
|
34
|
+
Requires-Dist: types-tqdm ; extra == 'dev'
|
|
30
35
|
Provides-Extra: tests
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist: pytest
|
|
34
|
-
Requires-Dist: pytest-
|
|
35
|
-
Requires-Dist:
|
|
36
|
-
Requires-Dist: pytest-
|
|
37
|
-
Requires-Dist: pytest-
|
|
38
|
-
Requires-Dist:
|
|
39
|
-
Requires-Dist:
|
|
40
|
-
Requires-Dist: types-certifi ==2021.10.8.3 ; extra == 'tests'
|
|
41
|
-
Requires-Dist: types-mock ==5.1.0.2 ; extra == 'tests'
|
|
42
|
-
Requires-Dist: types-paramiko ==3.4.0.20240120 ; extra == 'tests'
|
|
43
|
-
Requires-Dist: types-tqdm ; extra == 'tests'
|
|
44
|
-
Requires-Dist: pytest-docker ==2.2.0 ; (python_version < "3.10" and implementation_name != "pypy") and extra == 'tests'
|
|
36
|
+
Requires-Dist: aioresponses <0.8,>=0.7 ; extra == 'tests'
|
|
37
|
+
Requires-Dist: paramiko <4,>=3.4.0 ; extra == 'tests'
|
|
38
|
+
Requires-Dist: pytest <9,>=7 ; extra == 'tests'
|
|
39
|
+
Requires-Dist: pytest-asyncio <1,>=0.23.2 ; extra == 'tests'
|
|
40
|
+
Requires-Dist: pytest-cov >=4.1.0 ; extra == 'tests'
|
|
41
|
+
Requires-Dist: pytest-docker <4,>=1 ; extra == 'tests'
|
|
42
|
+
Requires-Dist: pytest-mock ; extra == 'tests'
|
|
43
|
+
Requires-Dist: pytest-sugar ; extra == 'tests'
|
|
44
|
+
Requires-Dist: pytest-test-utils <0.2,>=0.1.0 ; extra == 'tests'
|
|
45
45
|
|
|
46
46
|
scmrepo
|
|
47
47
|
=======
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
scmrepo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
scmrepo/asyn.py,sha256=eckXZkVngwbNNyO04eAJUZxsTy7kvsdz0TUGaWpJpf0,1524
|
|
3
|
+
scmrepo/base.py,sha256=pgddGR7UeZoEq2d5lip1vjbxTmpwTnKFH4JwHy-Fmho,3007
|
|
4
|
+
scmrepo/exceptions.py,sha256=vR8BuCKgKh9lMnCemzNYGHiJctioOmhn_Kv5m8XO69Y,1053
|
|
5
|
+
scmrepo/fs.py,sha256=ARD8_TRSdHpuiaYwF7QXrQIyfl9AFj7ctv_Ltc6pAAs,7740
|
|
6
|
+
scmrepo/noscm.py,sha256=xraqlBek4zhFlHf1LvTMkgBM0hykgcTfMVkTNCpVlcQ,491
|
|
7
|
+
scmrepo/progress.py,sha256=fRUMvkcw6GLuVTP_tK7mGpKeJjbJulFP8rPUqyltkYQ,2157
|
|
8
|
+
scmrepo/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
+
scmrepo/urls.py,sha256=vEfW1h1lb7GXvMVBk-TNwqctpl-5xGMA2LbOPVn7t4Q,638
|
|
10
|
+
scmrepo/utils.py,sha256=_F3rVvPhES-A2JxLGob0RV8BOnHzxbA9aDPClA7_V8M,1512
|
|
11
|
+
scmrepo/git/__init__.py,sha256=6giWgQpgAlJslOkFmSAYkw8pb7nuefrbpZZf5Np3Iyo,17189
|
|
12
|
+
scmrepo/git/config.py,sha256=0t0OBmJ9SIa5tf22QdcGzhZfdMzzppvEmceUDg8ZPyE,943
|
|
13
|
+
scmrepo/git/credentials.py,sha256=LvCCK4BQRtIduz4rnTnfSP6zEbngQtzCNvNYUmiQtkw,20944
|
|
14
|
+
scmrepo/git/objects.py,sha256=vqeFpUlMFHL9Yv1h3wTA7mbRWHCVC_4KgLy5aAISD2g,4674
|
|
15
|
+
scmrepo/git/stash.py,sha256=rnZDeOsO9P-k2e7ulCLUmZKSxSCxaRKl3XJlh97F084,2801
|
|
16
|
+
scmrepo/git/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
scmrepo/git/backend/base.py,sha256=nVMkUIeSVu-ZLCd2QPxMfTgrjnTOejM1UET9R7qKJRc,13560
|
|
18
|
+
scmrepo/git/backend/gitpython.py,sha256=RTDNUVLiJmhcRgdaJpApTQi6sMN-an9P9xKZBKwk7co,25350
|
|
19
|
+
scmrepo/git/backend/dulwich/__init__.py,sha256=x6DsVddlEeUW39-0WPjRFjRlqc3U2f0opZ1Hm2pvBts,34820
|
|
20
|
+
scmrepo/git/backend/dulwich/asyncssh_vendor.py,sha256=y0mvx3tRR99Nv85e2n39nPYlhme8dplmQQSbSpx7FDM,11562
|
|
21
|
+
scmrepo/git/backend/dulwich/client.py,sha256=bcDroljSvNz6s5WWv9UVvZHKkOJOVTK_zU7YCq62TN4,2360
|
|
22
|
+
scmrepo/git/backend/pygit2/__init__.py,sha256=gNOFVLgB8gpXSKfuL_-Vk7GhVkZk6DiwuJMahel0Ue0,37035
|
|
23
|
+
scmrepo/git/backend/pygit2/callbacks.py,sha256=Ky4YmUPhv9xjU_44ypBYIcaVHJixzaGb6t9HIeUmBP4,2751
|
|
24
|
+
scmrepo/git/backend/pygit2/filter.py,sha256=2NlWfQ7soXN1H7Es6-LctE74hpj3QKQTlYqXRH83VpM,2128
|
|
25
|
+
scmrepo/git/lfs/__init__.py,sha256=at5blRIKnKpg_g5dLRDsGWBFi6SbucRlF_DX6aAkGtE,257
|
|
26
|
+
scmrepo/git/lfs/client.py,sha256=SLlGFC09YD55nTDQ7MjuKD9alql-eOriyNePZikFaYo,10171
|
|
27
|
+
scmrepo/git/lfs/exceptions.py,sha256=cLlImmPXWJJUl44S4xcRBa2T9wYRkWTaKQGwJylwOhA,77
|
|
28
|
+
scmrepo/git/lfs/fetch.py,sha256=ADNpskbDrvMI7ru4AiOf_c1gfw8TQ7Wct0EiN2Pq-qc,4683
|
|
29
|
+
scmrepo/git/lfs/object.py,sha256=rAYY_z9EYoHPfbpF1QHwL7ecYgaETPyCl-zBx0E1oIQ,337
|
|
30
|
+
scmrepo/git/lfs/pointer.py,sha256=BcVbtjoOUG9cEzyJSJDeweqehGZvq43P6NNLDYUGYEI,3181
|
|
31
|
+
scmrepo/git/lfs/progress.py,sha256=ELlBs2SeXhAcnPDN23w3FTeBRgB9RGqBD2CFMS6n9Xs,4750
|
|
32
|
+
scmrepo/git/lfs/smudge.py,sha256=1O_fznptWo4CKXqcJgUoWP6cgWWhvGAZ3d87kasG3cQ,1610
|
|
33
|
+
scmrepo/git/lfs/storage.py,sha256=2weDldy6MFrA8IDzBczsPy8fBWCp4FKaJTT0f6eIT64,2396
|
|
34
|
+
scmrepo-3.3.1.dist-info/LICENSE,sha256=-1jhbPjoIVHR0cEgahL4Zhct75Ff4MzYCR_jOaJDPq8,11340
|
|
35
|
+
scmrepo-3.3.1.dist-info/METADATA,sha256=YVCBBEmy-xK7sR9lw-3BeIh-fCDZ9XLNQWXRuVSmINE,4730
|
|
36
|
+
scmrepo-3.3.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
37
|
+
scmrepo-3.3.1.dist-info/top_level.txt,sha256=iunjod6w3GogERsAYfLRupnANXnqzX3jbIfbeIQG5cc,8
|
|
38
|
+
scmrepo-3.3.1.dist-info/RECORD,,
|
scmrepo-3.2.0.dist-info/RECORD
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
scmrepo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
scmrepo/asyn.py,sha256=1l4Npa6gmIeZY6t_8S1LK5CJ3qAW_NMgKPrsN-8f9kU,1523
|
|
3
|
-
scmrepo/base.py,sha256=UjEw7iQhYRAxj4Ia9x5NFMjI__AO7ql6IERoFo7hslo,3006
|
|
4
|
-
scmrepo/exceptions.py,sha256=vR8BuCKgKh9lMnCemzNYGHiJctioOmhn_Kv5m8XO69Y,1053
|
|
5
|
-
scmrepo/fs.py,sha256=0izyq5in6b20H2eSjpud7ykDzKE3230qvcM_3oko7iY,7720
|
|
6
|
-
scmrepo/noscm.py,sha256=aiGE-fabmgF6WTp5mdE5KLeqiOobPVQYa-Ie1zSHs8U,463
|
|
7
|
-
scmrepo/progress.py,sha256=fRUMvkcw6GLuVTP_tK7mGpKeJjbJulFP8rPUqyltkYQ,2157
|
|
8
|
-
scmrepo/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
-
scmrepo/utils.py,sha256=_F3rVvPhES-A2JxLGob0RV8BOnHzxbA9aDPClA7_V8M,1512
|
|
10
|
-
scmrepo/git/__init__.py,sha256=3NEW9rBH2ohprKjXIfodDXnpZxAbAtEYUPMO5uk5Hxw,17101
|
|
11
|
-
scmrepo/git/config.py,sha256=oMoxRq8oJOTRZUNArsT6xpNlfP2n1eTXDMlfHtv1pEs,942
|
|
12
|
-
scmrepo/git/credentials.py,sha256=qJZLLyaDH4t2nut3Yep9Jk9ZEkThjJfVMDZXOFajdZU,20943
|
|
13
|
-
scmrepo/git/objects.py,sha256=vqeFpUlMFHL9Yv1h3wTA7mbRWHCVC_4KgLy5aAISD2g,4674
|
|
14
|
-
scmrepo/git/stash.py,sha256=rnZDeOsO9P-k2e7ulCLUmZKSxSCxaRKl3XJlh97F084,2801
|
|
15
|
-
scmrepo/git/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
|
-
scmrepo/git/backend/base.py,sha256=acxuSQ0Z-UGNkGraCdLQxBxDHbTdYWi-FzXtwdb-1O8,13535
|
|
17
|
-
scmrepo/git/backend/gitpython.py,sha256=6L47iX1SmqfM04_Ghwd_DEHegOKewCLu-5MTkBZO_Zo,25312
|
|
18
|
-
scmrepo/git/backend/dulwich/__init__.py,sha256=oEajaQDbmVs5Sl90tM4F8rwdvPZagXbgx6aAAL-jvKg,34782
|
|
19
|
-
scmrepo/git/backend/dulwich/asyncssh_vendor.py,sha256=OuZ_bWe5-LiZCIMwBRaX_uj03oEcrRgr1uf9i2Xv4Fk,11497
|
|
20
|
-
scmrepo/git/backend/dulwich/client.py,sha256=bcDroljSvNz6s5WWv9UVvZHKkOJOVTK_zU7YCq62TN4,2360
|
|
21
|
-
scmrepo/git/backend/pygit2/__init__.py,sha256=tapIRAh--nzGUcVGijaMSal2ZPscab9c1mHdqiUIxBU,37004
|
|
22
|
-
scmrepo/git/backend/pygit2/callbacks.py,sha256=Ky4YmUPhv9xjU_44ypBYIcaVHJixzaGb6t9HIeUmBP4,2751
|
|
23
|
-
scmrepo/git/backend/pygit2/filter.py,sha256=2NlWfQ7soXN1H7Es6-LctE74hpj3QKQTlYqXRH83VpM,2128
|
|
24
|
-
scmrepo/git/lfs/__init__.py,sha256=at5blRIKnKpg_g5dLRDsGWBFi6SbucRlF_DX6aAkGtE,257
|
|
25
|
-
scmrepo/git/lfs/client.py,sha256=I3HX3X3-2ZR3wetb6h19bGcV5rx-Wp2zLwECc-mlKhs,8926
|
|
26
|
-
scmrepo/git/lfs/exceptions.py,sha256=cLlImmPXWJJUl44S4xcRBa2T9wYRkWTaKQGwJylwOhA,77
|
|
27
|
-
scmrepo/git/lfs/fetch.py,sha256=ADNpskbDrvMI7ru4AiOf_c1gfw8TQ7Wct0EiN2Pq-qc,4683
|
|
28
|
-
scmrepo/git/lfs/object.py,sha256=rAYY_z9EYoHPfbpF1QHwL7ecYgaETPyCl-zBx0E1oIQ,337
|
|
29
|
-
scmrepo/git/lfs/pointer.py,sha256=BcVbtjoOUG9cEzyJSJDeweqehGZvq43P6NNLDYUGYEI,3181
|
|
30
|
-
scmrepo/git/lfs/progress.py,sha256=ELlBs2SeXhAcnPDN23w3FTeBRgB9RGqBD2CFMS6n9Xs,4750
|
|
31
|
-
scmrepo/git/lfs/smudge.py,sha256=1O_fznptWo4CKXqcJgUoWP6cgWWhvGAZ3d87kasG3cQ,1610
|
|
32
|
-
scmrepo/git/lfs/storage.py,sha256=x31GQRtrZH1SBoLc_m_IaLmR-mUBw_VC01HVkWgwHvI,2371
|
|
33
|
-
scmrepo-3.2.0.dist-info/LICENSE,sha256=-1jhbPjoIVHR0cEgahL4Zhct75Ff4MzYCR_jOaJDPq8,11340
|
|
34
|
-
scmrepo-3.2.0.dist-info/METADATA,sha256=-sK4txnW8FAqOTeww2mbq9HMlUp_1dKSdpM3a6i3jPI,4841
|
|
35
|
-
scmrepo-3.2.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
36
|
-
scmrepo-3.2.0.dist-info/top_level.txt,sha256=iunjod6w3GogERsAYfLRupnANXnqzX3jbIfbeIQG5cc,8
|
|
37
|
-
scmrepo-3.2.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|