55# the BSD License: http://www.opensource.org/licenses/bsd-license.php
66from __future__ import print_function
77
8- import os
9- from unittest import TestCase
10- import time
11- import tempfile
8+ from functools import wraps
129import io
1310import logging
11+ import os
12+ import tempfile
13+ import textwrap
14+ import time
15+ from unittest import TestCase
1416
15- from functools import wraps
16-
17- from git .util import rmtree
1817from git .compat import string_types , is_win
19- import textwrap
18+ from git .util import rmtree
19+
20+ import os .path as osp
2021
21- osp = os .path .dirname
2222
23- GIT_REPO = os .environ .get ("GIT_PYTHON_TEST_GIT_REPO_BASE" , osp (osp (osp (osp (__file__ )))))
23+ ospd = osp .dirname
24+
25+ GIT_REPO = os .environ .get ("GIT_PYTHON_TEST_GIT_REPO_BASE" , ospd (ospd (ospd (ospd (__file__ )))))
2426GIT_DAEMON_PORT = os .environ .get ("GIT_PYTHON_TEST_GIT_DAEMON_PORT" , "9418" )
2527
2628__all__ = (
4042
4143
4244def fixture_path (name ):
43- test_dir = osp ( osp (__file__ ))
44- return os . path .join (test_dir , "fixtures" , name )
45+ test_dir = ospd ( ospd (__file__ ))
46+ return osp .join (test_dir , "fixtures" , name )
4547
4648
4749def fixture (name ):
@@ -50,7 +52,7 @@ def fixture(name):
5052
5153
5254def absolute_project_path ():
53- return os . path . abspath (os . path .join (osp (__file__ ), ".." , ".." ))
55+ return osp . abspath (osp .join (osp (__file__ ), ".." , ".." ))
5456
5557#} END routines
5658
@@ -170,26 +172,31 @@ def repo_creator(self):
170172 return argument_passer
171173
172174
173- def launch_git_daemon (temp_dir , ip , port ):
175+ def launch_git_daemon (base_path , ip , port ):
174176 from git import Git
175177 if is_win :
176178 ## On MINGW-git, daemon exists in .\Git\mingw64\libexec\git-core\,
177179 # but if invoked as 'git daemon', it detaches from parent `git` cmd,
178180 # and then CANNOT DIE!
179181 # So, invoke it as a single command.
180- ## Cygwin-git has no daemon.
182+ ## Cygwin-git has no daemon. But it can use MINGW's.
181183 #
182- daemon_cmd = ['git-daemon' , temp_dir ,
184+ daemon_cmd = ['git-daemon' ,
183185 '--enable=receive-pack' ,
184186 '--listen=%s' % ip ,
185- '--port=%s' % port ]
187+ '--port=%s' % port ,
188+ '--base-path=%s' % base_path ,
189+ base_path ]
186190 gd = Git ().execute (daemon_cmd , as_process = True )
187191 else :
188- gd = Git ().daemon (temp_dir ,
192+ gd = Git ().daemon (base_path ,
189193 enable = 'receive-pack' ,
190194 listen = ip ,
191195 port = port ,
196+ base_path = base_path ,
192197 as_process = True )
198+ # yes, I know ... fortunately, this is always going to work if sleep time is just large enough
199+ time .sleep (0.5 )
193200 return gd
194201
195202
@@ -217,7 +224,8 @@ def case(self, rw_repo, rw_remote_repo)
217224 See working dir info in with_rw_repo
218225 :note: We attempt to launch our own invocation of git-daemon, which will be shutdown at the end of the test.
219226 """
220- from git import Remote , GitCommandError
227+ from git import Git , Remote , GitCommandError
228+
221229 assert isinstance (working_tree_ref , string_types ), "Decorator requires ref name for working tree checkout"
222230
223231 def argument_passer (func ):
@@ -245,23 +253,36 @@ def remote_repo_creator(self):
245253 pass
246254 crw .set (section , "receivepack" , True )
247255
248- # initialize the remote - first do it as local remote and pull, then
249- # we change the url to point to the daemon. The daemon should be started
250- # by the user, not by us
256+ # Initialize the remote - first do it as local remote and pull, then
257+ # we change the url to point to the daemon.
251258 d_remote = Remote .create (rw_repo , "daemon_origin" , remote_repo_dir )
252259 d_remote .fetch ()
253- remote_repo_url = "git://localhost:%s%s" % (GIT_DAEMON_PORT , remote_repo_dir )
254260
261+ base_path , rel_repo_dir = osp .split (remote_repo_dir )
262+
263+ remote_repo_url = "git://localhost:%s/%s" % (GIT_DAEMON_PORT , rel_repo_dir )
255264 with d_remote .config_writer as cw :
256265 cw .set ('url' , remote_repo_url )
257266
258- temp_dir = osp (_mktemp ())
259- gd = launch_git_daemon (temp_dir , '127.0.0.1' , GIT_DAEMON_PORT )
260267 try :
261- # yes, I know ... fortunately, this is always going to work if sleep time is just large enough
262- time .sleep (0.5 )
263- # end
264-
268+ gd = launch_git_daemon (Git .polish_url (base_path ), '127.0.0.1' , GIT_DAEMON_PORT )
269+ except Exception as ex :
270+ if is_win :
271+ msg = textwrap .dedent ("""
272+ The `git-daemon.exe` must be in PATH.
273+ For MINGW, look into .\Git\mingw64\libexec\git-core\), but problems with paths might appear.
274+ CYGWIN has no daemon, but if one exists, it gets along fine (has also paths problems)
275+ Anyhow, alternatively try starting `git-daemon` manually:""" )
276+ else :
277+ msg = "Please try starting `git-daemon` manually:"
278+ msg += textwrap .dedent ("""
279+ git daemon --enable=receive-pack --base-path=%s %s
280+ You can also run the daemon on a different port by passing --port=<port>"
281+ and setting the environment variable GIT_PYTHON_TEST_GIT_DAEMON_PORT to <port>
282+ """ % (base_path , base_path ))
283+ raise AssertionError (ex , msg )
284+ # END make assertion
285+ else :
265286 # try to list remotes to diagnoes whether the server is up
266287 try :
267288 rw_repo .git .ls_remote (d_remote )
@@ -283,15 +304,6 @@ def remote_repo_creator(self):
283304 Anyhow, alternatively try starting `git-daemon` manually:""" )
284305 else :
285306 msg = "Please try starting `git-daemon` manually:"
286-
287- msg += textwrap .dedent ("""
288- git daemon --enable=receive-pack '%s'
289- You can also run the daemon on a different port by passing --port=<port>"
290- and setting the environment variable GIT_PYTHON_TEST_GIT_DAEMON_PORT to <port>
291- """ % temp_dir )
292- from nose import SkipTest
293- raise SkipTest (msg ) if is_win else AssertionError (msg )
294- # END make assertion
295307 # END catch ls remote error
296308
297309 # adjust working dir
@@ -359,7 +371,7 @@ class TestBase(TestCase):
359371
360372 def _small_repo_url (self ):
361373 """:return" a path to a small, clonable repository"""
362- return os . path .join (self .rorepo .working_tree_dir , 'git/ext/gitdb/gitdb/ext/smmap' )
374+ return osp .join (self .rorepo .working_tree_dir , 'git/ext/gitdb/gitdb/ext/smmap' )
363375
364376 @classmethod
365377 def setUpClass (cls ):
@@ -383,7 +395,7 @@ def _make_file(self, rela_path, data, repo=None):
383395 with the given data. Returns absolute path to created file.
384396 """
385397 repo = repo or self .rorepo
386- abs_path = os . path .join (repo .working_tree_dir , rela_path )
398+ abs_path = osp .join (repo .working_tree_dir , rela_path )
387399 with open (abs_path , "w" ) as fp :
388400 fp .write (data )
389401 return abs_path
0 commit comments