From 8610c0c95ea29d5beabd280139c4c9ca930d59af Mon Sep 17 00:00:00 2001 From: Saugat Pachhai Date: Tue, 11 Feb 2020 00:42:34 +0545 Subject: [PATCH] repo: raise exception if root_dir is not a directory path (#3295) * repo: throw if root_dir in Repo.__init__() is not a directory path When Repo is instantiated with invalid urls such as 'http://github.com/iterative/dvc.git', it does os.path.realpath which is not intelligent enough and just concatenates with current working directory, which is then traversed outward. It might happen that the outward folder is a dvc directory which is not really what we want. So, a check for root to be a directory is added. Otherwise, NotDvcRepoError is thrown with a custom message. * repo: set message from raise for NotDvcRepoError --- dvc/exceptions.py | 13 +------------ dvc/repo/__init__.py | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/dvc/exceptions.py b/dvc/exceptions.py index 357f8c7cfb..4af6111080 100644 --- a/dvc/exceptions.py +++ b/dvc/exceptions.py @@ -112,18 +112,7 @@ def __init__(self, path): class NotDvcRepoError(DvcException): - """Thrown if a directory is not a DVC repo. - - Args: - root (str): path to the directory. - """ - - def __init__(self, root): - msg = ( - "you are not inside of a DVC repository " - "(checked up to mount point '{}')" - ) - super().__init__(msg.format(root)) + """Thrown if a directory is not a DVC repo""" class DvcParserError(DvcException): diff --git a/dvc/repo/__init__.py b/dvc/repo/__init__.py index 9bdb04cd76..16062042fd 100644 --- a/dvc/repo/__init__.py +++ b/dvc/repo/__init__.py @@ -129,19 +129,24 @@ def __repr__(self): @classmethod def find_root(cls, root=None): - if root is None: - root = os.getcwd() - else: - root = os.path.abspath(os.path.realpath(root)) + root_dir = os.path.realpath(root or os.curdir) + + if not os.path.isdir(root_dir): + raise NotDvcRepoError("directory '{}' does not exist".format(root)) while True: - dvc_dir = os.path.join(root, cls.DVC_DIR) + dvc_dir = os.path.join(root_dir, cls.DVC_DIR) if os.path.isdir(dvc_dir): - return root - if os.path.ismount(root): + return root_dir + if os.path.ismount(root_dir): break - root = os.path.dirname(root) - raise NotDvcRepoError(root) + root_dir = os.path.dirname(root_dir) + + message = ( + "you are not inside of a DVC repository " + "(checked up to mount point '{}')" + ).format(root_dir) + raise NotDvcRepoError(message) @classmethod def find_dvc_dir(cls, root=None):