diff options
author | Sebastian Thiel <sthiel@thoughtworks.com> | 2019-08-14 17:19:19 +0800 |
---|---|---|
committer | Sebastian Thiel <sthiel@thoughtworks.com> | 2019-08-14 17:19:19 +0800 |
commit | d5cc590c875ada0c55d975cbe26141a94e306c94 (patch) | |
tree | 11609b42a0f226060aca1143f4304f008610eebd /git | |
parent | 5fa99bff215249378f90e1ce0254e66af155a301 (diff) | |
download | gitpython-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.py | 56 | ||||
-rw-r--r-- | git/test/lib/helper.py | 3 |
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): """ |