From 5109d759f17cf48e4dea7618f57a73c304a29838 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Tue, 19 Mar 2019 17:45:51 +0200 Subject: [PATCH] system: reflink: workaround SIP error Fixes #1515 Signed-off-by: Ruslan Kuprieiev --- dvc/system.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/dvc/system.py b/dvc/system.py index fd8befe44..8ca0d53de 100644 --- a/dvc/system.py +++ b/dvc/system.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from dvc.utils.compat import str, open import os +import errno class System(object): @@ -61,8 +62,22 @@ class System(object): @staticmethod def _reflink_darwin(src, dst): import ctypes + import dvc.logger as logger + + LIBC = "libc.dylib" + LIBC_FALLBACK = "/usr/lib/libSystem.dylib" + try: + clib = ctypes.CDLL(LIBC) + except OSError as exc: + logger.debug( + "unable to access '{}' (errno '{}'). " + "Falling back to '{}'.".format(LIBC, exc.errno, LIBC_FALLBACK) + ) + if exc.errno != errno.ENOENT: + raise + # NOTE: trying to bypass System Integrity Protection (SIP) + clib = ctypes.CDLL(LIBC_FALLBACK) - clib = ctypes.CDLL("libc.dylib") if not hasattr(clib, "clonefile"): return -1