Skip to content

Commit

Permalink
have get_repo() accept files, including those that don't exist
Browse files Browse the repository at this point in the history
  • Loading branch information
artgoldberg committed Jun 15, 2019
1 parent 3bbc7d3 commit 1825929
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 14 deletions.
16 changes: 10 additions & 6 deletions tests/util/test_git.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from pathlib import Path

# todo: next: get push working on CircleCI
RUNNING_ON_CIRCLE = True
RUNNING_ON_CIRCLE = False


# todo: next: rename wc_utils.util.git: update wc_utils, obj_model, wc_kb, wc_sim, & wc_lang
Expand All @@ -43,16 +43,20 @@ def tearDown(self):
self.test_git_repos.delete_test_repo()

def test_get_repo(self):
repo = get_repo(dirname='.')
repo = get_repo(path='.')
self.assertTrue(isinstance(repo, git.Repo))
repo = get_repo(dirname=os.path.dirname(__file__), search_parent_directories=False)
repo = get_repo(path=os.path.dirname(__file__))
self.assertTrue(isinstance(repo, git.Repo))
repo = get_repo(dirname=os.path.dirname(__file__), search_parent_directories=True)
repo = get_repo(path=os.path.dirname(__file__), search_parent_directories=False)
self.assertTrue(isinstance(repo, git.Repo))
repo = get_repo(__file__)
self.assertTrue(isinstance(repo, git.Repo))
repo = get_repo(path=os.path.join(os.path.dirname(__file__), 'no such file'))
self.assertTrue(isinstance(repo, git.Repo))

tempdir = tempfile.mkdtemp()
with self.assertRaisesRegex(ValueError, 'is not in a Git repository'):
get_repo(dirname=tempdir)
get_repo(path=tempdir)
shutil.rmtree(tempdir)

def test_repo_status(self):
Expand Down Expand Up @@ -111,7 +115,7 @@ def test_repo_status(self):
with self.assertRaisesRegex(ValueError, r"data_file '.+' must be in the repo that's in '.+'"):
repo_status(self.repo, RepoMetadataCollectionType.DATA_REPO, data_file='/tmp/test.xlsx')

repo = get_repo(dirname='.')
repo = get_repo(path='.')
with self.assertRaisesRegex(ValueError, "data_file must be provided if repo_type is "
"RepoMetadataCollectionType.DATA_REPO"):
repo_status(repo, RepoMetadataCollectionType.DATA_REPO)
Expand Down
19 changes: 11 additions & 8 deletions wc_utils/util/git.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,37 @@
from .config import core


def get_repo(dirname='.', search_parent_directories=True):
def get_repo(path='.', search_parent_directories=True):
""" Get a Git repository
Args:
dirname (:obj:`str`): path to Git repository
path (:obj:`str`): path to file or directory in a Git repository; if `path` doesn't exist
or is a file then its directory is used
search_parent_directories (:obj:`bool`, optional): if :obj:`True`, search for the root
of the repository among the parent directories of :obj:`dirname`; default=:obj:`True`
of the repository among the parent directories of :obj:`path`; default=:obj:`True`
Returns:
:obj:`git.Repo`: a `GitPython` repository
Raises:
:obj:`ValueError`: if obj:`dirname` is not a path to a Git repository
:obj:`ValueError`: if obj:`path` is not a path to a Git repository
"""
repo = None
resolved_path = Path(dirname).expanduser().resolve()
resolved_path = Path(path).expanduser().resolve()
if not resolved_path.exists() or resolved_path.is_file():
resolved_path = resolved_path.parent
dirnames = itertools.chain([str(resolved_path)], resolved_path.parents)
if search_parent_directories:
dirnames = [str(resolved_path)]
for parent_dirname in dirnames:
try:
repo = git.Repo(str(parent_dirname), search_parent_directories=search_parent_directories)
break
except (git.exc.InvalidGitRepositoryError, git.exc.NoSuchPathError):
except (git.exc.InvalidGitRepositoryError, git.exc.NoSuchPathError) as e:
pass

if not repo:
raise ValueError('"{}" is not in a Git repository'.format(dirname))
raise ValueError('"{}" is not in a Git repository'.format(path))
return repo


Expand Down Expand Up @@ -144,7 +147,7 @@ def get_repo_metadata(dirname='.', search_parent_directories=True, repo_type=Non
:obj:`ValueError`: if obj:`dirname` is not a path to a Git repository,
or if the repo is not suitable for gathering metadata
"""
repo = get_repo(dirname=dirname, search_parent_directories=search_parent_directories)
repo = get_repo(path=dirname, search_parent_directories=search_parent_directories)
if repo_type:
unsuitable_changes = repo_status(repo, repo_type, data_file=data_file)
if unsuitable_changes:
Expand Down

0 comments on commit 1825929

Please sign in to comment.