diff --git a/dvc/command/common/base.py b/dvc/command/common/base.py index b6ba891dd..f0c7e98b9 100644 --- a/dvc/command/common/base.py +++ b/dvc/command/common/base.py @@ -3,6 +3,7 @@ import os from dvc.project import Project from dvc.logger import Logger from dvc.exceptions import DvcException +from dvc.lock import LockError class CmdBase(object): @@ -26,8 +27,12 @@ class CmdBase(object): raise DvcException(msg.format(root)) def run_cmd(self): - with self.project.lock: + try: + with self.project.lock: return self.run() + except LockError as ex: + self.project.logger.error(str(ex)) + return 1 # Abstract methods that have to be implemented by any inheritance class def run(self): diff --git a/dvc/lock.py b/dvc/lock.py index d6f21506c..5063cd219 100644 --- a/dvc/lock.py +++ b/dvc/lock.py @@ -1,5 +1,11 @@ import os import fasteners +from dvc.exceptions import DvcException + + +class LockError(DvcException): + pass + class Lock(object): LOCK_FILE = 'lock' @@ -14,7 +20,8 @@ class Lock(object): return Lock(dvc_dir) def lock(self): - self._lock.acquire(timeout=self.TIMEOUT) + if not self._lock.acquire(timeout=self.TIMEOUT): + raise LockError('Cannot perform the cmd since DVC is busy and locked. Please retry the cmd later.') def unlock(self): self._lock.release()