Skip to content

Commit

Permalink
use git rev-parse to look for config file
Browse files Browse the repository at this point in the history
  • Loading branch information
bdauvergne authored and Byron committed Aug 11, 2019
1 parent daa3f35 commit 0b6b90f
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 18 deletions.
56 changes: 40 additions & 16 deletions git/repo/base.py
Expand Up @@ -66,7 +66,7 @@ class Repo(object):
'git_dir' is the .git repository directory, which is always set."""
DAEMON_EXPORT_FILE = 'git-daemon-export-ok'

git = None # Must exist, or __del__ will fail in case we raise on `__init__()`
_git = None # Must exist, or __del__ will fail in case we raise on `__init__()`
working_dir = None
_working_tree_dir = None
git_dir = None
Expand Down Expand Up @@ -202,14 +202,42 @@ def __init__(self, path=None, odbt=GitCmdObjectDB, search_parent_directories=Fal
# END working dir handling

self.working_dir = self._working_tree_dir or self.common_dir
self.git = self.GitCommandWrapperType(self.working_dir)

# special handling, in special times
args = [osp.join(self.common_dir, 'objects')]
if issubclass(odbt, GitCmdObjectDB):
args.append(self.git)
self.odb = odbt(*args)

def _get_git(self):
working_dir = self._working_tree_dir or self.common_dir
if self._git:
if self._git._working_dir != expand_path(working_dir):
self.close()
self._git = None

if not self._git:
self._git = self.GitCommandWrapperType(working_dir)
return self._git

def _del_git(self):
if self._git:
self._git.clear_cache()
self._git = None
# Tempfiles objects on Windows are holding references to
# open files until they are collected by the garbage
# collector, thus preventing deletion.
# TODO: Find these references and ensure they are closed
# and deleted synchronously rather than forcing a gc
# collection.
if is_win:
gc.collect()
gitdb.util.mman.collect()
if is_win:
gc.collect()

git = property(fget=_get_git, fdel=_del_git)

def __enter__(self):
return self

Expand All @@ -223,19 +251,7 @@ def __del__(self):
pass

def close(self):
if self.git:
self.git.clear_cache()
# Tempfiles objects on Windows are holding references to
# open files until they are collected by the garbage
# collector, thus preventing deletion.
# TODO: Find these references and ensure they are closed
# and deleted synchronously rather than forcing a gc
# collection.
if is_win:
gc.collect()
gitdb.util.mman.collect()
if is_win:
gc.collect()
del self.git

def __eq__(self, rhs):
if isinstance(rhs, Repo):
Expand Down Expand Up @@ -431,7 +447,15 @@ def _get_config_path(self, config_level):
elif config_level == "global":
return osp.normpath(osp.expanduser("~/.gitconfig"))
elif config_level == "repository":
return osp.normpath(osp.join(self._common_dir or self.git_dir, "config"))
try:
config_path = self.git.rev_parse("config", git_path=True)
except GitCommandError:
return osp.normpath(osp.join(self._common_dir or self.git_dir, "config"))
else:
if self.git._working_dir:
return osp.normpath(osp.join(self.git._working_dir, config_path))
else:
return config_path

raise ValueError("Invalid configuration level: %r" % config_level)

Expand Down
3 changes: 1 addition & 2 deletions git/test/lib/helper.py
Expand Up @@ -366,8 +366,7 @@ def setUpClass(cls):

@classmethod
def tearDownClass(cls):
cls.rorepo.git.clear_cache()
cls.rorepo.git = None
del cls.rorepo.git

def _make_file(self, rela_path, data, repo=None):
"""
Expand Down

0 comments on commit 0b6b90f

Please sign in to comment.