From e2567bb3f9f6d7b6691eff7cb7045d34a0cbffb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Novotn=C3=BD?= Date: Wed, 29 May 2019 00:44:41 +0200 Subject: [PATCH] remote: local: try to reflink before copying Fixes #2057 --- dvc/utils/__init__.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/dvc/utils/__init__.py b/dvc/utils/__init__.py index 784ba1ab4..ee31900e2 100644 --- a/dvc/utils/__init__.py +++ b/dvc/utils/__init__.py @@ -113,7 +113,9 @@ def dict_md5(d, exclude=[]): def copyfile(src, dest, no_progress_bar=False, name=None): """Copy file with progress bar""" + from dvc.exceptions import DvcException from dvc.progress import progress + from dvc.system import System copied = 0 name = name if name else os.path.basename(dest) @@ -122,15 +124,18 @@ def copyfile(src, dest, no_progress_bar=False, name=None): if os.path.isdir(dest): dest = os.path.join(dest, os.path.basename(src)) - with open(src, "rb") as fsrc, open(dest, "wb+") as fdest: - while True: - buf = fsrc.read(LOCAL_CHUNK_SIZE) - if not buf: - break - fdest.write(buf) - copied += len(buf) - if not no_progress_bar: - progress.update_target(name, copied, total) + try: + System.reflink(src, dest) + except DvcException: + with open(src, "rb") as fsrc, open(dest, "wb+") as fdest: + while True: + buf = fsrc.read(LOCAL_CHUNK_SIZE) + if not buf: + break + fdest.write(buf) + copied += len(buf) + if not no_progress_bar: + progress.update_target(name, copied, total) if not no_progress_bar: progress.finish_target(name)