| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 8ea7e26 commit 4b586fb
9 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -186,14 +186,18 @@ def __setstate__(self, d): | |||
| 186 | 186 | # Override this value using `Git.USE_SHELL = True` | |
| 187 | 187 | USE_SHELL = False | |
| 188 | 188 | ||
| 189 | - class AutoInterrupt(object): | ||
| 189 | + @classmethod | ||
| 190 | + def polish_url(cls, url): | ||
| 191 | + return url.replace("\\\\", "\\").replace("\\", "/") | ||
| 190 | 192 | ||
| 193 | + class AutoInterrupt(object): | ||
| 191 | 194 | """Kill/Interrupt the stored process instance once this instance goes out of scope. It is | |
| 192 | 195 | used to prevent processes piling up in case iterators stop reading. | |
| 193 | 196 | Besides all attributes are wired through to the contained process object. | |
| 194 | 197 | ||
| 195 | 198 | The wait method was overridden to perform automatic status code checking | |
| 196 | 199 | and possibly raise.""" | |
| 200 | + | ||
| 197 | 201 | __slots__ = ("proc", "args") | |
| 198 | 202 | ||
| 199 | 203 | def __init__(self, proc, args): | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -29,7 +29,7 @@ | |||
| 29 | 29 | join_path, | |
| 30 | 30 | finalize_process | |
| 31 | 31 | ) | |
| 32 | - from git.cmd import handle_process_output | ||
| 32 | + from git.cmd import handle_process_output, Git | ||
| 33 | 33 | from gitdb.util import join | |
| 34 | 34 | from git.compat import (defenc, force_text, is_win) | |
| 35 | 35 | import logging | |
@@ -570,7 +570,7 @@ def create(cls, repo, name, url, **kwargs): | |||
| 570 | 570 | :raise GitCommandError: in case an origin with that name already exists""" | |
| 571 | 571 | scmd = 'add' | |
| 572 | 572 | kwargs['insert_kwargs_after'] = scmd | |
| 573 | - repo.git.remote(scmd, name, url, **kwargs) | ||
| 573 | + repo.git.remote(scmd, name, Git.polish_url(url), **kwargs) | ||
| 574 | 574 | return cls(repo, name) | |
| 575 | 575 | ||
| 576 | 576 | # add is an alias | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -897,7 +897,7 @@ def _clone(cls, git, url, path, odb_default_type, progress, **kwargs): | |||
| 897 | 897 | repo = cls(path, odbt=odbt) | |
| 898 | 898 | if repo.remotes: | |
| 899 | 899 | 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)) | ||
| 901 | 901 | # END handle remote repo | |
| 902 | 902 | return repo | |
| 903 | 903 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -5,26 +5,28 @@ | |||
| 5 | 5 | # the BSD License: http://www.opensource.org/licenses/bsd-license.php | |
| 6 | 6 | from __future__ import print_function | |
| 7 | 7 | ||
| 8 | - import os | ||
| 9 | - from unittest import TestCase | ||
| 10 | - import time | ||
| 11 | - import tempfile | ||
| 8 | + from functools import wraps | ||
| 12 | 9 | import io | |
| 13 | 10 | import logging | |
| 11 | + import os | ||
| 12 | + import tempfile | ||
| 13 | + import textwrap | ||
| 14 | + import time | ||
| 15 | + from unittest import TestCase | ||
| 14 | 16 | ||
| 15 | - from functools import wraps | ||
| 16 | - | ||
| 17 | - from git.util import rmtree | ||
| 18 | 17 | from git.compat import string_types, is_win | |
| 19 | - import textwrap | ||
| 18 | + from git.util import rmtree, HIDE_WINDOWS_KNOWN_ERRORS | ||
| 19 | + | ||
| 20 | + import os.path as osp | ||
| 21 | + | ||
| 20 | 22 | ||
| 21 | - osp = os.path.dirname | ||
| 23 | + ospd = osp.dirname | ||
| 22 | 24 | ||
| 23 | - GIT_REPO = os.environ.get("GIT_PYTHON_TEST_GIT_REPO_BASE", osp(osp(osp(osp(__file__))))) | ||
| 24 | - GIT_DAEMON_PORT = os.environ.get("GIT_PYTHON_TEST_GIT_DAEMON_PORT", "9418") | ||
| 25 | + GIT_REPO = os.environ.get("GIT_PYTHON_TEST_GIT_REPO_BASE", ospd(ospd(ospd(ospd(__file__))))) | ||
| 26 | + GIT_DAEMON_PORT = os.environ.get("GIT_PYTHON_TEST_GIT_DAEMON_PORT", "19418") | ||
| 25 | 27 | ||
| 26 | 28 | __all__ = ( | |
| 27 | - 'fixture_path', 'fixture', 'absolute_project_path', 'StringProcessAdapter', | ||
| 29 | + 'fixture_path', 'fixture', 'StringProcessAdapter', | ||
| 28 | 30 | 'with_rw_directory', 'with_rw_repo', 'with_rw_and_rw_remote_repo', 'TestBase', 'TestCase', | |
| 29 | 31 | 'GIT_REPO', 'GIT_DAEMON_PORT' | |
| 30 | 32 | ) | |
@@ -35,18 +37,13 @@ | |||
| 35 | 37 | ||
| 36 | 38 | ||
| 37 | 39 | def fixture_path(name): | |
| 38 | - test_dir = osp(osp(__file__)) | ||
| 39 | - return os.path.join(test_dir, "fixtures", name) | ||
| 40 | + return osp.join(ospd(ospd(__file__)), 'fixtures', name) | ||
| 40 | 41 | ||
| 41 | 42 | ||
| 42 | 43 | def fixture(name): | |
| 43 | 44 | with open(fixture_path(name), 'rb') as fd: | |
| 44 | 45 | return fd.read() | |
| 45 | 46 | ||
| 46 | - | ||
| 47 | - def absolute_project_path(): | ||
| 48 | - return os.path.abspath(os.path.join(osp(__file__), "..", "..")) | ||
| 49 | - | ||
| 50 | 47 | #} END routines | |
| 51 | 48 | ||
| 52 | 49 | #{ Adapters | |
@@ -165,26 +162,31 @@ def repo_creator(self): | |||
| 165 | 162 | return argument_passer | |
| 166 | 163 | ||
| 167 | 164 | ||
| 168 | - def launch_git_daemon(temp_dir, ip, port): | ||
| 165 | + def launch_git_daemon(base_path, ip, port): | ||
| 169 | 166 | from git import Git | |
| 170 | 167 | if is_win: | |
| 171 | 168 | ## On MINGW-git, daemon exists in .\Git\mingw64\libexec\git-core\, | |
| 172 | 169 | # but if invoked as 'git daemon', it detaches from parent `git` cmd, | |
| 173 | 170 | # and then CANNOT DIE! | |
| 174 | 171 | # So, invoke it as a single command. | |
| 175 | - ## Cygwin-git has no daemon. | ||
| 172 | + ## Cygwin-git has no daemon. But it can use MINGW's. | ||
| 176 | 173 | # | |
| 177 | - daemon_cmd = ['git-daemon', temp_dir, | ||
| 174 | + daemon_cmd = ['git-daemon', | ||
| 178 | 175 | '--enable=receive-pack', | |
| 179 | 176 | '--listen=%s' % ip, | |
| 180 | - '--port=%s' % port] | ||
| 177 | + '--port=%s' % port, | ||
| 178 | + '--base-path=%s' % base_path, | ||
| 179 | + base_path] | ||
| 181 | 180 | gd = Git().execute(daemon_cmd, as_process=True) | |
| 182 | 181 | else: | |
| 183 | - gd = Git().daemon(temp_dir, | ||
| 182 | + gd = Git().daemon(base_path, | ||
| 184 | 183 | enable='receive-pack', | |
| 185 | 184 | listen=ip, | |
| 186 | 185 | port=port, | |
| 186 | + base_path=base_path, | ||
| 187 | 187 | as_process=True) | |
| 188 | + # yes, I know ... fortunately, this is always going to work if sleep time is just large enough | ||
| 189 | + time.sleep(0.5) | ||
| 188 | 190 | return gd | |
| 189 | 191 | ||
| 190 | 192 | ||
@@ -212,7 +214,8 @@ def case(self, rw_repo, rw_remote_repo) | |||
| 212 | 214 | See working dir info in with_rw_repo | |
| 213 | 215 | :note: We attempt to launch our own invocation of git-daemon, which will be shutdown at the end of the test. | |
| 214 | 216 | """ | |
| 215 | - from git import Remote, GitCommandError | ||
| 217 | + from git import Git, Remote, GitCommandError | ||
| 218 | + | ||
| 216 | 219 | assert isinstance(working_tree_ref, string_types), "Decorator requires ref name for working tree checkout" | |
| 217 | 220 | ||
| 218 | 221 | def argument_passer(func): | |
@@ -240,23 +243,36 @@ def remote_repo_creator(self): | |||
| 240 | 243 | pass | |
| 241 | 244 | crw.set(section, "receivepack", True) | |
| 242 | 245 | ||
| 243 | - # initialize the remote - first do it as local remote and pull, then | ||
| 244 | - # we change the url to point to the daemon. The daemon should be started | ||
| 245 | - # by the user, not by us | ||
| 246 | + # Initialize the remote - first do it as local remote and pull, then | ||
| 247 | + # we change the url to point to the daemon. | ||
| 246 | 248 | d_remote = Remote.create(rw_repo, "daemon_origin", remote_repo_dir) | |
| 247 | 249 | d_remote.fetch() | |
| 248 | - remote_repo_url = "git://localhost:%s%s" % (GIT_DAEMON_PORT, remote_repo_dir) | ||
| 249 | 250 | ||
| 251 | + base_path, rel_repo_dir = osp.split(remote_repo_dir) | ||
| 252 | + | ||
| 253 | + remote_repo_url = "git://localhost:%s/%s" % (GIT_DAEMON_PORT, rel_repo_dir) | ||
| 250 | 254 | with d_remote.config_writer as cw: | |
| 251 | 255 | cw.set('url', remote_repo_url) | |
| 252 | 256 | ||
| 253 | - temp_dir = osp(_mktemp()) | ||
| 254 | - gd = launch_git_daemon(temp_dir, '127.0.0.1', GIT_DAEMON_PORT) | ||
| 255 | 257 | try: | |
| 256 | - # yes, I know ... fortunately, this is always going to work if sleep time is just large enough | ||
| 257 | - time.sleep(0.5) | ||
| 258 | - # end | ||
| 259 | - | ||
| 258 | + gd = launch_git_daemon(Git.polish_url(base_path), '127.0.0.1', GIT_DAEMON_PORT) | ||
| 259 | + except Exception as ex: | ||
| 260 | + if is_win: | ||
| 261 | + msg = textwrap.dedent(""" | ||
| 262 | + The `git-daemon.exe` must be in PATH. | ||
| 263 | + For MINGW, look into .\Git\mingw64\libexec\git-core\), but problems with paths might appear. | ||
| 264 | + CYGWIN has no daemon, but if one exists, it gets along fine (has also paths problems) | ||
| 265 | + Anyhow, alternatively try starting `git-daemon` manually:""") | ||
| 266 | + else: | ||
| 267 | + msg = "Please try starting `git-daemon` manually:" | ||
| 268 | + msg += textwrap.dedent(""" | ||
| 269 | + git daemon --enable=receive-pack --base-path=%s %s | ||
| 270 | + You can also run the daemon on a different port by passing --port=<port>" | ||
| 271 | + and setting the environment variable GIT_PYTHON_TEST_GIT_DAEMON_PORT to <port> | ||
| 272 | + """ % (base_path, base_path)) | ||
| 273 | + raise AssertionError(ex, msg) | ||
| 274 | + # END make assertion | ||
| 275 | + else: | ||
| 260 | 276 | # try to list remotes to diagnoes whether the server is up | |
| 261 | 277 | try: | |
| 262 | 278 | rw_repo.git.ls_remote(d_remote) | |
@@ -283,9 +299,9 @@ def remote_repo_creator(self): | |||
| 283 | 299 | git daemon --enable=receive-pack '%s' | |
| 284 | 300 | You can also run the daemon on a different port by passing --port=<port>" | |
| 285 | 301 | and setting the environment variable GIT_PYTHON_TEST_GIT_DAEMON_PORT to <port> | |
| 286 | - """ % temp_dir) | ||
| 302 | + """ % base_path) | ||
| 287 | 303 | from unittest import SkipTest | |
| 288 | - raise SkipTest(msg) if is_win else AssertionError(msg) | ||
| 304 | + raise SkipTest(msg) if HIDE_WINDOWS_KNOWN_ERRORS else AssertionError(e, msg) | ||
| 289 | 305 | # END make assertion | |
| 290 | 306 | # END catch ls remote error | |
| 291 | 307 | ||
@@ -354,7 +370,7 @@ class TestBase(TestCase): | |||
| 354 | 370 | ||
| 355 | 371 | def _small_repo_url(self): | |
| 356 | 372 | """:return" a path to a small, clonable repository""" | |
| 357 | - return os.path.join(self.rorepo.working_tree_dir, 'git/ext/gitdb/gitdb/ext/smmap') | ||
| 373 | + return osp.join(self.rorepo.working_tree_dir, 'git/ext/gitdb/gitdb/ext/smmap') | ||
| 358 | 374 | ||
| 359 | 375 | @classmethod | |
| 360 | 376 | def setUpClass(cls): | |
@@ -378,7 +394,7 @@ def _make_file(self, rela_path, data, repo=None): | |||
| 378 | 394 | with the given data. Returns absolute path to created file. | |
| 379 | 395 | """ | |
| 380 | 396 | repo = repo or self.rorepo | |
| 381 | - abs_path = os.path.join(repo.working_tree_dir, rela_path) | ||
| 397 | + abs_path = osp.join(repo.working_tree_dir, rela_path) | ||
| 382 | 398 | with open(abs_path, "w") as fp: | |
| 383 | 399 | fp.write(data) | |
| 384 | 400 | return abs_path | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -110,17 +110,6 @@ def test_with_rw_repo(self, rw_repo): | |||
| 110 | 110 | assert not rw_repo.config_reader("repository").getboolean("core", "bare") | |
| 111 | 111 | assert os.path.isdir(os.path.join(rw_repo.working_tree_dir, 'lib')) | |
| 112 | 112 | ||
| 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 | - # """) | ||
| 124 | 113 | @with_rw_and_rw_remote_repo('0.1.6') | |
| 125 | 114 | def test_with_rw_remote_and_rw_repo(self, rw_repo, rw_remote_repo): | |
| 126 | 115 | assert not rw_repo.config_reader("repository").getboolean("core", "bare") | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -16,7 +16,7 @@ def tearDown(self): | |||
| 16 | 16 | import gc | |
| 17 | 17 | gc.collect() | |
| 18 | 18 | ||
| 19 | - # @skipIf(HIDE_WINDOWS_KNOWN_ERRORS, | ||
| 19 | + # @skipIf(HIDE_WINDOWS_KNOWN_ERRORS, ## ACTUALLY skipped by `git.submodule.base#L869`. | ||
| 20 | 20 | # "FIXME: helper.wrapper fails with: PermissionError: [WinError 5] Access is denied: " | |
| 21 | 21 | # "'C:\\Users\\appveyor\\AppData\\Local\\Temp\\1\\test_work_tree_unsupportedryfa60di\\master_repo\\.git\\objects\\pack\\pack-bc9e0787aef9f69e1591ef38ea0a6f566ec66fe3.idx") # noqa E501 | |
| 22 | 22 | @with_rw_directory | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -28,8 +28,11 @@ | |||
| 28 | 28 | from git.util import IterableList, rmtree | |
| 29 | 29 | from git.compat import string_types | |
| 30 | 30 | import tempfile | |
| 31 | - import os | ||
| 31 | + import os.path as osp | ||
| 32 | 32 | import random | |
| 33 | + from unittest.case import skipIf | ||
| 34 | + from git.util import HIDE_WINDOWS_KNOWN_ERRORS | ||
| 35 | + from git.cmd import Git | ||
| 33 | 36 | ||
| 34 | 37 | # assure we have repeatable results | |
| 35 | 38 | random.seed(0) | |
@@ -105,7 +108,7 @@ def tearDown(self): | |||
| 105 | 108 | gc.collect() | |
| 106 | 109 | ||
| 107 | 110 | def _print_fetchhead(self, repo): | |
| 108 | - with open(os.path.join(repo.git_dir, "FETCH_HEAD")): | ||
| 111 | + with open(osp.join(repo.git_dir, "FETCH_HEAD")): | ||
| 109 | 112 | pass | |
| 110 | 113 | ||
| 111 | 114 | def _do_test_fetch_result(self, results, remote): | |
@@ -156,7 +159,7 @@ def _commit_random_file(self, repo): | |||
| 156 | 159 | # Create a file with a random name and random data and commit it to repo. | |
| 157 | 160 | # Return the commited absolute file path | |
| 158 | 161 | index = repo.index | |
| 159 | - new_file = self._make_file(os.path.basename(tempfile.mktemp()), str(random.random()), repo) | ||
| 162 | + new_file = self._make_file(osp.basename(tempfile.mktemp()), str(random.random()), repo) | ||
| 160 | 163 | index.add([new_file]) | |
| 161 | 164 | index.commit("Committing %s" % new_file) | |
| 162 | 165 | return new_file | |
@@ -263,7 +266,8 @@ def get_info(res, remote, name): | |||
| 263 | 266 | # must clone with a local path for the repo implementation not to freak out | |
| 264 | 267 | # as it wants local paths only ( which I can understand ) | |
| 265 | 268 | other_repo = remote_repo.clone(other_repo_dir, shared=False) | |
| 266 | - remote_repo_url = "git://localhost:%s%s" % (GIT_DAEMON_PORT, remote_repo.git_dir) | ||
| 269 | + remote_repo_url = osp.basename(remote_repo.git_dir) # git-daemon runs with appropriate `--base-path`. | ||
| 270 | + remote_repo_url = Git.polish_url("git://localhost:%s/%s" % (GIT_DAEMON_PORT, remote_repo_url)) | ||
| 267 | 271 | ||
| 268 | 272 | # put origin to git-url | |
| 269 | 273 | other_origin = other_repo.remotes.origin | |
@@ -384,12 +388,7 @@ def _assert_push_and_pull(self, remote, rw_repo, remote_repo): | |||
| 384 | 388 | TagReference.delete(rw_repo, new_tag, other_tag) | |
| 385 | 389 | remote.push(":%s" % other_tag.path) | |
| 386 | 390 | ||
| 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 | - # """) | ||
| 391 | + @skipIf(HIDE_WINDOWS_KNOWN_ERRORS, "FIXME: Freezes!") | ||
| 393 | 392 | @with_rw_and_rw_remote_repo('0.1.6') | |
| 394 | 393 | def test_base(self, rw_repo, remote_repo): | |
| 395 | 394 | num_remotes = 0 | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -472,12 +472,16 @@ def test_creation_deletion(self): | |||
| 472 | 472 | head = self.rorepo.create_head("new_head", "HEAD~1") | |
| 473 | 473 | self.rorepo.delete_head(head) | |
| 474 | 474 | ||
| 475 | - tag = self.rorepo.create_tag("new_tag", "HEAD~2") | ||
| 476 | - self.rorepo.delete_tag(tag) | ||
| 475 | + try: | ||
| 476 | + tag = self.rorepo.create_tag("new_tag", "HEAD~2") | ||
| 477 | + finally: | ||
| 478 | + self.rorepo.delete_tag(tag) | ||
| 477 | 479 | with self.rorepo.config_writer(): | |
| 478 | 480 | pass | |
| 479 | - remote = self.rorepo.create_remote("new_remote", "git@server:repo.git") | ||
| 480 | - self.rorepo.delete_remote(remote) | ||
| 481 | + try: | ||
| 482 | + remote = self.rorepo.create_remote("new_remote", "git@server:repo.git") | ||
| 483 | + finally: | ||
| 484 | + self.rorepo.delete_remote(remote) | ||
| 481 | 485 | ||
| 482 | 486 | def test_comparison_and_hash(self): | |
| 483 | 487 | # this is only a preliminary test, more testing done in test_index | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -418,7 +418,7 @@ def _do_base_tests(self, rwrepo): | |||
| 418 | 418 | # Error if there is no submodule file here | |
| 419 | 419 | self.failUnlessRaises(IOError, Submodule._config_parser, rwrepo, rwrepo.commit(self.k_no_subm_tag), True) | |
| 420 | 420 | ||
| 421 | - # @skipIf(HIDE_WINDOWS_KNOWN_ERRORS, | ||
| 421 | + # @skipIf(HIDE_WINDOWS_KNOWN_ERRORS, ## ACTUALLY skipped by `git.submodule.base#L869`. | ||
| 422 | 422 | # "FIXME: fails with: PermissionError: [WinError 32] The process cannot access the file because" | |
| 423 | 423 | # "it is being used by another process: " | |
| 424 | 424 | # "'C:\\Users\\ankostis\\AppData\\Local\\Temp\\tmp95c3z83bnon_bare_test_base_rw\\git\\ext\\gitdb\\gitdb\\ext\\smmap'") # noqa E501 | |
| Back | FazBrowse Home | New Git URL |
0 commit comments