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 CHANGED
@@ -1,4 +1,5 @@
1
1
  """DVC re-implementation of fsspec's dedicated async event loop."""
2
+
2
3
  import asyncio
3
4
  import os
4
5
  import threading
scmrepo/base.py CHANGED
@@ -1,4 +1,5 @@
1
1
  """Manages source control systems (e.g. Git) in DVC."""
2
+
2
3
  from contextlib import AbstractContextManager
3
4
 
4
5
 
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, path: str, bare: bool = False, _backend: Optional[str] = None
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:
@@ -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
- MSG_USERAUTH_PK_OK
292
- ] = _process_public_key_ok_gh
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(command, encoding=None)
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)
@@ -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 Generator, Iterable, Iterator, Mapping
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) -> Generator["Remote", None, None]:
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" and url.startswith("file://"):
650
- url = url[len("file://") :]
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.startswith("git@"):
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
@@ -1,4 +1,5 @@
1
1
  """git config convenience wrapper."""
2
+
2
3
  import logging
3
4
  from abc import ABC, abstractmethod
4
5
  from collections.abc import Iterator
@@ -26,6 +26,7 @@ https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage
26
26
  Currently Dulwich supports only the `get` operation
27
27
 
28
28
  """
29
+
29
30
  import locale
30
31
  import logging
31
32
  import os
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=ExponentialRetry(
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(("ssh://", "git@")):
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
- _URL_PATTERN = re.compile(
215
- r"(?:ssh://)?git@(?P<host>\S+?)(?::(?P<port>\d+))?(?:[:/])(?P<path>\S+?)\.git"
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
- result = cls._URL_PATTERN.match(git_url)
235
- if not result:
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
- host, port, path = result.group("host", "port", "path")
238
- url = f"https://{host}/{path}.git/info/lfs"
239
- return cls(url, host, int(port or 22), path)
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, f"{self.path}.git", upload=upload
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, host: str, port: int, path: str, *, upload: bool = False
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="git",
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)
@@ -12,7 +12,7 @@ if TYPE_CHECKING:
12
12
 
13
13
 
14
14
  class LFSStorage:
15
- def __init__(self, path: str):
15
+ def __init__(self, path: Union[str, os.PathLike[str]]):
16
16
  self.path = path
17
17
 
18
18
  def fetch(
scmrepo/noscm.py CHANGED
@@ -1,4 +1,5 @@
1
- from typing import Optional
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: Optional[str] = None,
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.2.0
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: pytest ==7.2.0 ; extra == 'tests'
32
- Requires-Dist: pytest-sugar ==0.9.5 ; extra == 'tests'
33
- Requires-Dist: pytest-cov ==3.0.0 ; extra == 'tests'
34
- Requires-Dist: pytest-mock ==3.8.2 ; extra == 'tests'
35
- Requires-Dist: mypy ==0.971 ; extra == 'tests'
36
- Requires-Dist: pytest-test-utils ==0.0.8 ; extra == 'tests'
37
- Requires-Dist: pytest-asyncio ==0.18.3 ; extra == 'tests'
38
- Requires-Dist: mock ==5.1.0 ; extra == 'tests'
39
- Requires-Dist: paramiko ==3.3.1 ; extra == 'tests'
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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,,