summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorSebastian Thiel <byronimo@gmail.com>2009-11-06 11:11:04 +0100
committerSebastian Thiel <byronimo@gmail.com>2009-11-06 11:11:04 +0100
commita4d06724202afccd2b5c54f81bcf2bf26dea7fff (patch)
treeb503ccd4b1ba0ee13e6a0311a9f6fae78011754f /test
parent453995f70f93c0071c5f7534f58864414f01cfde (diff)
parent4114d19e2c02f3ffca9feb07b40d9475f36604cc (diff)
downloadgitpython-a4d06724202afccd2b5c54f81bcf2bf26dea7fff.tar.gz
Merge branch 'win_fixes'
* win_fixes: Fixed commit.count method which now handles the paths case properly. It appears git-rev-list uses empty paths in some way, which is quite hard to specify on a shell, but easy if the process is spawned directly test_remote: fixed test which assumed existance of local master tracking branch, it will now create it if necessary Index tests adopted to windows - especially the symlink test needed adjustment, but it works as expected even on systems that do not support symlinks ARGH: wb and rb is not the same as r and w on windows, hence reading of binary files went crazy as well as binary writing test_commit: commit.count actually returned incorrect values on linux, namely 141 instead of 143. Manual checking showed that 143 is the correct number, on linux this will have to be fixed helper: repo creation functions now handle errors on windows during os.remove by changing the mode to 777 and delete the file again. Otherwise the whole operation would fail on read-only files. Why is windows as it is ? Why does it do that to me ? removed large-input test as it is totally dependent on the subprocess implementation in the end whether pipeing large input works. In general , input and output pipes are used, the shell is bypassed, hence there is no reason for a problem unless we are on a very rare platform. And if so, we can't do anything about it so why should there be a possibly failing test ? Problem is that the test would fail on windows in case it is not installed on c:\windows repo.clone: Added plenty of special handling to allow drive letters to work as expected. Its quite terrible to see a two-line method inflate to 20 Fixed config module which forgot to call the superclass's initializer, finally causing failure in python 2.6 fixed test_repo to work on windows cmd: added clear_cache method now used by test repo decorators to be sure persistent commands are killed before trying to remove the directory. Unfortunately, it still claims someone has opened the file. handle.exe does not show anyone, so what is happening here ? Is it just a windows odity ? If nothing helps I could just keep the temp data, but lets do some more testing first git cmd on windows now runs without the shell, see diff for explanation Fixed windows TASKKILL so it actually does something *silently* Added utilities helping to create proper paths either with slashes or backslashes depending on the operating system
Diffstat (limited to 'test')
-rw-r--r--test/git/test_commit.py2
-rw-r--r--test/git/test_git.py7
-rw-r--r--test/git/test_index.py18
-rw-r--r--test/git/test_remote.py8
-rw-r--r--test/git/test_repo.py12
-rw-r--r--test/git/test_utils.py4
-rw-r--r--test/testlib/helper.py32
7 files changed, 54 insertions, 29 deletions
diff --git a/test/git/test_commit.py b/test/git/test_commit.py
index be6d1a28..2e3f131e 100644
--- a/test/git/test_commit.py
+++ b/test/git/test_commit.py
@@ -75,7 +75,7 @@ class TestCommit(TestBase):
assert_equal(sha1, commit.sha)
def test_count(self):
- assert self.rorepo.tag('refs/tags/0.1.5').commit.count( ) == 141
+ assert self.rorepo.tag('refs/tags/0.1.5').commit.count( ) == 143
def test_list(self):
assert isinstance(Commit.list_items(self.rorepo, '0.1.5', max_count=5)['5117c9c8a4d3af19a9958677e45cda9269de1541'], Commit)
diff --git a/test/git/test_git.py b/test/git/test_git.py
index c4a39e85..6e4ab394 100644
--- a/test/git/test_git.py
+++ b/test/git/test_git.py
@@ -45,13 +45,6 @@ class TestGit(TestCase):
self.git.hash_object(istream=fh, stdin=True))
fh.close()
- def test_it_handles_large_input(self):
- if sys.platform == 'win32':
- output = self.git.execute(["type", "C:\WINDOWS\system32\cmd.exe"])
- else:
- output = self.git.execute(["cat", "/bin/bash"])
- assert_true(len(output) > 4096) # at least 4k
-
@patch_object(Git, 'execute')
def test_it_ignores_false_kwargs(self, git):
# this_should_not_be_ignored=False implies it *should* be ignored
diff --git a/test/git/test_index.py b/test/git/test_index.py
index e9541232..1a543f82 100644
--- a/test/git/test_index.py
+++ b/test/git/test_index.py
@@ -42,7 +42,7 @@ class TestTree(TestBase):
# write the data - it must match the original
tmpfile = tempfile.mktemp()
index_merge.write(tmpfile)
- fp = open(tmpfile, 'r')
+ fp = open(tmpfile, 'rb')
assert fp.read() == fixture("index_merge")
fp.close()
os.remove(tmpfile)
@@ -164,14 +164,14 @@ class TestTree(TestBase):
# reset the working copy as well to current head,to pull 'back' as well
new_data = "will be reverted"
file_path = os.path.join(rw_repo.git.git_dir, "CHANGES")
- fp = open(file_path, "w")
+ fp = open(file_path, "wb")
fp.write(new_data)
fp.close()
index.reset(rev_head_parent, working_tree=True)
assert not index.diff(None)
assert cur_branch == rw_repo.active_branch
assert cur_commit == rw_repo.head.commit
- fp = open(file_path)
+ fp = open(file_path,'rb')
try:
assert fp.read() != new_data
finally:
@@ -332,7 +332,8 @@ class TestTree(TestBase):
# add fake symlink and assure it checks-our as symlink
fake_symlink_relapath = "my_fake_symlink"
- fake_symlink_path = self._make_file(fake_symlink_relapath, "/etc/that", rw_repo)
+ link_target = "/etc/that"
+ fake_symlink_path = self._make_file(fake_symlink_relapath, link_target, rw_repo)
fake_entry = BaseIndexEntry((0120000, null_sha, 0, fake_symlink_relapath))
entries = index.reset(new_commit).add([fake_entry])
assert len(entries) == 1 and S_ISLNK(entries[0].mode)
@@ -341,5 +342,12 @@ class TestTree(TestBase):
assert not S_ISLNK(os.stat(fake_symlink_path)[ST_MODE])
os.remove(fake_symlink_path)
index.checkout(fake_symlink_path)
- assert S_ISLNK(os.lstat(fake_symlink_path)[ST_MODE])
+
+ # on windows we will never get symlinks
+ if os.name == 'nt':
+ # simlinks should contain the link as text ( which is what a
+ # symlink actually is )
+ open(fake_symlink_path,'rb').read() == link_target
+ else:
+ assert S_ISLNK(os.lstat(fake_symlink_path)[ST_MODE])
diff --git a/test/git/test_remote.py b/test/git/test_remote.py
index 0af9f0cf..700798dd 100644
--- a/test/git/test_remote.py
+++ b/test/git/test_remote.py
@@ -240,7 +240,13 @@ class TestRemote(TestBase):
lhead = rw_repo.head
lindex = rw_repo.index
# assure we are on master and it is checked out where the remote is
- lhead.reference = rw_repo.heads.master
+ try:
+ lhead.reference = rw_repo.heads.master
+ except AttributeError:
+ # if the author is on a non-master branch, the clones might not have
+ # a local master yet. We simply create it
+ lhead.reference = rw_repo.create_head('master')
+ # END master handling
lhead.reset(remote.refs.master, working_tree=True)
# push without spec should fail ( without further configuration )
diff --git a/test/git/test_repo.py b/test/git/test_repo.py
index 0b196a1f..93ab7a90 100644
--- a/test/git/test_repo.py
+++ b/test/git/test_repo.py
@@ -7,15 +7,14 @@
import os, sys
from test.testlib import *
from git import *
+from git.utils import join_path_native
+import tempfile
class TestRepo(TestBase):
@raises(InvalidGitRepositoryError)
def test_new_should_raise_on_invalid_repo_location(self):
- if sys.platform == "win32":
- Repo("C:\\WINDOWS\\Temp")
- else:
- Repo("/tmp")
+ Repo(tempfile.gettempdir())
@raises(NoSuchPathError)
def test_new_should_raise_on_non_existant_path(self):
@@ -220,7 +219,8 @@ class TestRepo(TestBase):
def test_untracked_files(self):
base = self.rorepo.git.git_dir
- files = (base+"/__test_myfile", base+"/__test_other_file")
+ files = ( join_path_native(base, "__test_myfile"),
+ join_path_native(base, "__test_other_file") )
num_recently_untracked = 0
try:
for fpath in files:
@@ -233,7 +233,7 @@ class TestRepo(TestBase):
# assure we have all names - they are relative to the git-dir
num_test_untracked = 0
for utfile in untracked_files:
- num_test_untracked += os.path.join(base, utfile) in files
+ num_test_untracked += join_path_native(base, utfile) in files
assert len(files) == num_test_untracked
finally:
for fpath in files:
diff --git a/test/git/test_utils.py b/test/git/test_utils.py
index 029d2054..69a9297d 100644
--- a/test/git/test_utils.py
+++ b/test/git/test_utils.py
@@ -56,7 +56,7 @@ class TestUtils(TestCase):
def _cmp_contents(self, file_path, data):
# raise if data from file at file_path
# does not match data string
- fp = open(file_path, "r")
+ fp = open(file_path, "rb")
try:
assert fp.read() == data
finally:
@@ -66,7 +66,7 @@ class TestUtils(TestCase):
my_file = tempfile.mktemp()
orig_data = "hello"
new_data = "world"
- my_file_fp = open(my_file, "w")
+ my_file_fp = open(my_file, "wb")
my_file_fp.write(orig_data)
my_file_fp.close()
diff --git a/test/testlib/helper.py b/test/testlib/helper.py
index 27c2b3d9..e33961a7 100644
--- a/test/testlib/helper.py
+++ b/test/testlib/helper.py
@@ -17,7 +17,7 @@ def fixture_path(name):
return os.path.join(test_dir, "fixtures", name)
def fixture(name):
- return open(fixture_path(name)).read()
+ return open(fixture_path(name), 'rb').read()
def absolute_project_path():
return os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
@@ -63,7 +63,18 @@ class ListProcessAdapter(object):
poll = wait
-
+
+def _rmtree_onerror(osremove, fullpath, exec_info):
+ """
+ Handle the case on windows that read-only files cannot be deleted by
+ os.remove by setting it to mode 777, then retry deletion.
+ """
+ if os.name != 'nt' or osremove is not os.remove:
+ raise
+
+ os.chmod(fullpath, 0777)
+ os.remove(fullpath)
+
def with_bare_rw_repo(func):
"""
Decorator providing a specially made read-write repository to the test case
@@ -82,7 +93,8 @@ def with_bare_rw_repo(func):
try:
return func(self, rw_repo)
finally:
- shutil.rmtree(repo_dir)
+ rw_repo.git.clear_cache()
+ shutil.rmtree(repo_dir, onerror=_rmtree_onerror)
# END cleanup
# END bare repo creator
bare_repo_creator.__name__ = func.__name__
@@ -107,7 +119,8 @@ def with_rw_repo(working_tree_ref):
try:
return func(self, rw_repo)
finally:
- shutil.rmtree(repo_dir)
+ rw_repo.git.clear_cache()
+ shutil.rmtree(repo_dir, onerror=_rmtree_onerror)
# END cleanup
# END rw repo creator
repo_creator.__name__ = func.__name__
@@ -174,13 +187,18 @@ def with_rw_and_rw_remote_repo(working_tree_ref):
rw_repo.git.ls_remote(d_remote)
except GitCommandError,e:
print str(e)
- raise AssertionError('Please start a git-daemon to run this test, execute: git-daemon "%s"'%tempfile.gettempdir())
+ if os.name == 'nt':
+ raise AssertionError('git-daemon needs to run this test, but windows does not have one. Otherwise, run: git-daemon "%s"'%tempfile.gettempdir())
+ else:
+ raise AssertionError('Please start a git-daemon to run this test, execute: git-daemon "%s"'%tempfile.gettempdir())
try:
return func(self, rw_repo, rw_remote_repo)
finally:
- shutil.rmtree(repo_dir)
- shutil.rmtree(remote_repo_dir)
+ rw_repo.git.clear_cache()
+ rw_remote_repo.git.clear_cache()
+ shutil.rmtree(repo_dir, onerror=_rmtree_onerror)
+ shutil.rmtree(remote_repo_dir, onerror=_rmtree_onerror)
# END cleanup
# END bare repo creator
remote_repo_creator.__name__ = func.__name__