mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-09 15:28:26 +01:00
* objects: add ExternalRepoFile object type * RepoDependency: implement get_obj (use ExternalRepoFile) * drop distinction between used external and used objects * update tests * remove unneeded fetch from ExternalRepoFile * wrap erepo errors as an object error * update cloud/remote functions for new used_objs behavior * fix update() rev/locked behavior * update import tests * remove ExternalRepoFile * move get_obj and get_used_objs implementations back into repo dependency * return objects plus associated ODB (remote) in get_used_objs * odb: add tmp_dir field and support creating Remote from an odb * return dict mapping odb -> objects in get_used_objs * use dummy git odb for git imports * fetch: support pulling from specific odb * update cloud funcs for get_used_objs usage * update tests for used_objs behavior * use fetch in dep.download * catch circular imports from local fs repos * add tests for chained and circular imports * move tmp_dir into odb config * update return docstring for repo.used_objs
56 lines
1.3 KiB
Python
56 lines
1.3 KiB
Python
import logging
|
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
from typing import TYPE_CHECKING, Optional
|
|
|
|
from dvc.progress import Tqdm
|
|
|
|
from .tree import Tree
|
|
|
|
if TYPE_CHECKING:
|
|
from .db.base import ObjectDB
|
|
from .file import HashFile
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def save(
|
|
odb: "ObjectDB",
|
|
obj: "HashFile",
|
|
jobs: Optional[int] = None,
|
|
**kwargs,
|
|
):
|
|
if isinstance(obj, Tree):
|
|
with ThreadPoolExecutor(max_workers=jobs) as executor:
|
|
for future in Tqdm(
|
|
as_completed(
|
|
executor.submit(
|
|
odb.add,
|
|
entry.path_info,
|
|
entry.fs,
|
|
entry.hash_info,
|
|
**kwargs,
|
|
)
|
|
for _, entry in obj
|
|
),
|
|
desc="Saving files",
|
|
total=len(obj),
|
|
unit="file",
|
|
):
|
|
future.result()
|
|
|
|
odb.add(obj.path_info, obj.fs, obj.hash_info, **kwargs)
|
|
|
|
|
|
def check(odb, obj):
|
|
odb.check(obj.hash_info)
|
|
|
|
if isinstance(obj, Tree):
|
|
for _, entry in obj:
|
|
odb.check(entry.hash_info)
|
|
|
|
|
|
def load(odb, hash_info):
|
|
if hash_info.isdir:
|
|
return Tree.load(odb, hash_info)
|
|
return odb.get(hash_info)
|