summaryrefslogtreecommitdiff
path: root/git/test/lib/helper.py
diff options
context:
space:
mode:
authorKostis Anagnostopoulos <ankostis@gmail.com>2016-09-26 21:31:21 +0200
committerKostis Anagnostopoulos <ankostis@gmail.com>2016-09-27 12:37:23 +0200
commitaa3f2fa76844e1700ba37723acf603428b20ef74 (patch)
treec84269e176c02d07ba5566343ac834e93a5946e4 /git/test/lib/helper.py
parentf495e94028bfddc264727ffc464cd694ddd05ab8 (diff)
downloadgitpython-aa3f2fa76844e1700ba37723acf603428b20ef74.tar.gz
src, #519: Improve daemon launch so Win does not stuck
+ Retrofit try...finally blocks to ensure killing the daemon - now vulnerable also on Windows due to Popen() + CREATE_NEW_PROCESS_GROUP - BUT `test_base.test_with_rw_remote_and_rw_repo()` TC fails in MINGW due to invalid remote-URL in fetching-repo's config. Another day. - NEXT FREEZE to solve: test-diff_interface() under MINGW!
Diffstat (limited to 'git/test/lib/helper.py')
-rw-r--r--git/test/lib/helper.py69
1 files changed, 38 insertions, 31 deletions
diff --git a/git/test/lib/helper.py b/git/test/lib/helper.py
index 7cc1dcae..9e6be3e3 100644
--- a/git/test/lib/helper.py
+++ b/git/test/lib/helper.py
@@ -14,6 +14,7 @@ import logging
from git import Repo, Remote, GitCommandError, Git
from git.compat import string_types, is_win
+import textwrap
osp = os.path.dirname
@@ -201,43 +202,45 @@ def with_rw_and_rw_remote_repo(working_tree_ref):
d_remote.config_writer.set('url', remote_repo_url)
temp_dir = osp(_mktemp())
- # On windows, this will fail ... we deal with failures anyway and default to telling the user to do it
+ # On MINGW-git, daemon exists, in Cygwin-git, this will fail.
+ gd = Git().daemon(temp_dir, enable='receive-pack', listen='127.0.0.1', port=GIT_DAEMON_PORT,
+ as_process=True)
try:
- gd = Git().daemon(temp_dir, enable='receive-pack', listen='127.0.0.1', port=GIT_DAEMON_PORT,
- as_process=True)
# yes, I know ... fortunately, this is always going to work if sleep time is just large enough
time.sleep(0.5)
- except Exception:
- gd = None
# end
- # try to list remotes to diagnoes whether the server is up
- try:
- rw_repo.git.ls_remote(d_remote)
- except GitCommandError as e:
- # We assume in good faith that we didn't start the daemon - but make sure we kill it anyway
- # Of course we expect it to work here already, but maybe there are timing constraints
- # on some platforms ?
- if gd is not None:
- gd.proc.terminate()
- log.warning('git-ls-remote failed due to: %s(%s)', type(e), e)
- if is_win():
- msg = "git-daemon needs to run this test, but windows does not have one. "
- msg += 'Otherwise, run: git-daemon "%s"' % temp_dir
- raise AssertionError(msg)
- else:
- msg = 'Please start a git-daemon to run this test, execute: git daemon --enable=receive-pack "%s"'
- msg += 'You can also run the daemon on a different port by passing --port=<port>'
- msg += 'and setting the environment variable GIT_PYTHON_TEST_GIT_DAEMON_PORT to <port>'
- msg %= temp_dir
+ # try to list remotes to diagnoes whether the server is up
+ try:
+ rw_repo.git.ls_remote(d_remote)
+ except GitCommandError as e:
+ # We assume in good faith that we didn't start the daemon - but make sure we kill it anyway
+ # Of course we expect it to work here already, but maybe there are timing constraints
+ # on some platforms ?
+ if gd is not None:
+ gd.proc.terminate()
+ log.warning('git(%s) ls-remote failed due to:%s',
+ rw_repo.git_dir, e)
+ if is_win():
+ msg = textwrap.dedent("""
+ MINGW yet has problems with paths, CYGWIN additionally is missing `git-daemon`
+ needed to run this test. Anyhow, try starting `git-daemon` manually:""")
+ else:
+ msg = "Please try starting `git-daemon` manually:"
+
+ msg += textwrap.dedent("""
+ git daemon --enable=receive-pack '%s'
+ You can also run the daemon on a different port by passing --port=<port>"
+ and setting the environment variable GIT_PYTHON_TEST_GIT_DAEMON_PORT to <port>
+ """ % temp_dir)
raise AssertionError(msg)
- # END make assertion
- # END catch ls remote error
+ # END make assertion
+ # END catch ls remote error
+
+ # adjust working dir
+ prev_cwd = os.getcwd()
+ os.chdir(rw_repo.working_dir)
- # adjust working dir
- prev_cwd = os.getcwd()
- os.chdir(rw_repo.working_dir)
- try:
try:
return func(self, rw_repo, rw_remote_repo)
except:
@@ -245,11 +248,15 @@ def with_rw_and_rw_remote_repo(working_tree_ref):
repo_dir, remote_repo_dir)
repo_dir = remote_repo_dir = None
raise
+ finally:
+ os.chdir(prev_cwd)
+
finally:
if gd is not None:
gd.proc.terminate()
- os.chdir(prev_cwd)
+ import gc
+ gc.collect()
rw_repo.git.clear_cache()
rw_remote_repo.git.clear_cache()
if repo_dir: