summaryrefslogtreecommitdiff
path: root/git
diff options
context:
space:
mode:
authorSebastian Thiel <sthiel@thoughtworks.com>2019-08-14 17:19:19 +0800
committerSebastian Thiel <sthiel@thoughtworks.com>2019-08-14 17:19:19 +0800
commitd5cc590c875ada0c55d975cbe26141a94e306c94 (patch)
tree11609b42a0f226060aca1143f4304f008610eebd /git
parent5fa99bff215249378f90e1ce0254e66af155a301 (diff)
downloadgitpython-d5cc590c875ada0c55d975cbe26141a94e306c94.tar.gz
Fix performance regression, see #906
Revert "use git rev-parse to look for config file" This reverts commit 0b6b90f9f1e5310a6f39b75e17a04c1133269e8f. Fix #906 Reopen #719
Diffstat (limited to 'git')
-rw-r--r--git/repo/base.py56
-rw-r--r--git/test/lib/helper.py3
2 files changed, 18 insertions, 41 deletions
diff --git a/git/repo/base.py b/git/repo/base.py
index 31b57a33..1df3c547 100644
--- a/git/repo/base.py
+++ b/git/repo/base.py
@@ -67,7 +67,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
@@ -203,6 +203,7 @@ class Repo(object):
# 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')]
@@ -210,35 +211,6 @@ class Repo(object):
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
@@ -252,7 +224,19 @@ class Repo(object):
pass
def close(self):
- del self.git
+ 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()
def __eq__(self, rhs):
if isinstance(rhs, Repo):
@@ -448,15 +432,7 @@ class Repo(object):
elif config_level == "global":
return osp.normpath(osp.expanduser("~/.gitconfig"))
elif config_level == "repository":
- 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
+ return osp.normpath(osp.join(self._common_dir or self.git_dir, "config"))
raise ValueError("Invalid configuration level: %r" % config_level)
diff --git a/git/test/lib/helper.py b/git/test/lib/helper.py
index 687db990..1c06010f 100644
--- a/git/test/lib/helper.py
+++ b/git/test/lib/helper.py
@@ -366,7 +366,8 @@ class TestBase(TestCase):
@classmethod
def tearDownClass(cls):
- del cls.rorepo.git
+ cls.rorepo.git.clear_cache()
+ cls.rorepo.git = None
def _make_file(self, rela_path, data, repo=None):
"""