Skip to content

Commit d2e6f30

Browse files
committed
MINGW, gitpython-developers#525: FIX remote urls in config-files
+ Parse all config-urls \-->/. + Used relative daemon-paths. +FIXED git-daemon @with_rw_and_rw_remote_repo(): + test_base.test_with_rw_remote_and_rw_repo() PASS. + test_remote.test_base() freezes now! (hidden win_err)
1 parent 66f2cbd commit d2e6f30

File tree

6 files changed

+68
-61
lines changed

6 files changed

+68
-61
lines changed

git/cmd.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,18 @@ def __setstate__(self, d):
180180
# Override this value using `Git.USE_SHELL = True`
181181
USE_SHELL = False
182182

183-
class AutoInterrupt(object):
183+
@classmethod
184+
def polish_url(cls, url):
185+
return url.replace("\\\\", "\\").replace("\\", "/")
184186

187+
class AutoInterrupt(object):
185188
"""Kill/Interrupt the stored process instance once this instance goes out of scope. It is
186189
used to prevent processes piling up in case iterators stop reading.
187190
Besides all attributes are wired through to the contained process object.
188191
189192
The wait method was overridden to perform automatic status code checking
190193
and possibly raise."""
194+
191195
__slots__ = ("proc", "args")
192196

193197
def __init__(self, proc, args):

git/remote.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
join_path,
3030
finalize_process
3131
)
32-
from git.cmd import handle_process_output
32+
from git.cmd import handle_process_output, Git
3333
from gitdb.util import join
3434
from git.compat import (defenc, force_text, is_win)
3535
import logging
@@ -557,7 +557,7 @@ def create(cls, repo, name, url, **kwargs):
557557
:raise GitCommandError: in case an origin with that name already exists"""
558558
scmd = 'add'
559559
kwargs['insert_kwargs_after'] = scmd
560-
repo.git.remote(scmd, name, url, **kwargs)
560+
repo.git.remote(scmd, name, Git.polish_url(url), **kwargs)
561561
return cls(repo, name)
562562

563563
# add is an alias

git/repo/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,7 @@ def _clone(cls, git, url, path, odb_default_type, progress, **kwargs):
897897
repo = cls(path, odbt=odbt)
898898
if repo.remotes:
899899
with repo.remotes[0].config_writer as writer:
900-
writer.set_value('url', repo.remotes[0].url.replace("\\\\", "\\").replace("\\", "/"))
900+
writer.set_value('url', Git.polish_url(repo.remotes[0].url))
901901
# END handle remote repo
902902
return repo
903903

git/test/lib/helper.py

+52-40
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,24 @@
55
# the BSD License: http://www.opensource.org/licenses/bsd-license.php
66
from __future__ import print_function
77

8-
import os
9-
from unittest import TestCase
10-
import time
11-
import tempfile
8+
from functools import wraps
129
import io
1310
import 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
1817
from 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__)))))
2426
GIT_DAEMON_PORT = os.environ.get("GIT_PYTHON_TEST_GIT_DAEMON_PORT", "9418")
2527

2628
__all__ = (
@@ -40,8 +42,8 @@
4042

4143

4244
def 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

4749
def fixture(name):
@@ -50,7 +52,7 @@ def fixture(name):
5052

5153

5254
def 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

git/test/test_base.py

-11
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,6 @@ def test_with_rw_repo(self, rw_repo):
110110
assert not rw_repo.config_reader("repository").getboolean("core", "bare")
111111
assert os.path.isdir(os.path.join(rw_repo.working_tree_dir, 'lib'))
112112

113-
# @skipIf(HIDE_WINDOWS_KNOWN_ERRORS, """
114-
# FIXME: helper.wrapper fails with:
115-
# PermissionError: [WinError 5] Access is denied:
116-
# 'C:\\Users\\appveyor\\AppData\\Local\\Temp\\1\\test_work_tree_unsupportedryfa60di\\
117-
# master_repo\\.git\\objects\\pack\\pack-bc9e0787aef9f69e1591ef38ea0a6f566ec66fe3.idx'
118-
# AND
119-
# FIXME: git-daemon failing with:
120-
# git.exc.GitCommandError: Cmd('git') failed due to: exit code(128)
121-
# cmdline: git ls-remote daemon_origin
122-
# stderr: 'fatal: bad config line 15 in file .git/config'
123-
# """)
124113
@with_rw_and_rw_remote_repo('0.1.6')
125114
def test_with_rw_remote_and_rw_repo(self, rw_repo, rw_remote_repo):
126115
assert not rw_repo.config_reader("repository").getboolean("core", "bare")

git/test/test_remote.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import tempfile
3131
import os
3232
import random
33+
from unittest.case import skipIf
34+
from git.test.lib.helper import HIDE_WINDOWS_KNOWN_ERRORS
3335

3436
# assure we have repeatable results
3537
random.seed(0)
@@ -384,12 +386,12 @@ def _assert_push_and_pull(self, remote, rw_repo, remote_repo):
384386
TagReference.delete(rw_repo, new_tag, other_tag)
385387
remote.push(":%s" % other_tag.path)
386388

387-
# @skipIf(HIDE_WINDOWS_KNOWN_ERRORS, """
388-
# FIXME: git-daemon failing with:
389-
# git.exc.GitCommandError: Cmd('git') failed due to: exit code(128)
390-
# cmdline: git ls-remote daemon_origin
391-
# stderr: 'fatal: bad config line 15 in file .git/config'
392-
# """)
389+
@skipIf(HIDE_WINDOWS_KNOWN_ERRORS, """
390+
FIXME: git-daemon failing with:
391+
git.exc.GitCommandError: Cmd('git') failed due to: exit code(128)
392+
cmdline: git ls-remote daemon_origin
393+
stderr: 'fatal: bad config line 15 in file .git/config'
394+
""")
393395
@with_rw_and_rw_remote_repo('0.1.6')
394396
def test_base(self, rw_repo, remote_repo):
395397
num_remotes = 0

0 commit comments

Comments
 (0)