diff --git a/.appveyor.yml b/.appveyor.yml index 701fc4ac2..69b7fe567 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -7,6 +7,9 @@ environment: matrix: ## MINGW # + - PYTHON: "C:\\Python26" + PYTHON_VERSION: "2.6" + GIT_PATH: "%GIT_DAEMON_PATH%" - PYTHON: "C:\\Python27" PYTHON_VERSION: "2.7" GIT_PATH: "%GIT_DAEMON_PATH%" diff --git a/.travis.yml b/.travis.yml index f7dd247ba..a3f8c7054 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,14 @@ language: python python: + - "2.6" - "2.7" - "3.3" - "3.4" - "3.5" # - "pypy" - won't work as smmap doesn't work (see gitdb/.travis.yml for details) +#matrix: +# allow_failures: +# - python: "2.6" git: # a higher depth is needed for most of the tests - must be high enough to not actually be shallow # as we clone our own repository in the process @@ -15,6 +19,7 @@ install: - git fetch --tags - pip install -r test-requirements.txt - pip install codecov sphinx + - if [ "$TRAVIS_PYTHON_VERSION" == '2.6' ]; then pip install unittest2; fi # generate some reflog as git-python tests need it (in master) - ./init-tests-after-clone.sh diff --git a/git/cmd.py b/git/cmd.py index 72ba82c3c..78b5ff70d 100644 --- a/git/cmd.py +++ b/git/cmd.py @@ -139,9 +139,9 @@ def dict_to_slots_and__excluded_are_none(self, d, excluded=()): CREATE_NO_WINDOW = 0x08000000 ## CREATE_NEW_PROCESS_GROUP is needed to allow killing it afterwards, -# seehttps://docs.python.org/3/library/subprocess.html#subprocess.Popen.send_signal +# see https://docs.python.org/3/library/subprocess.html#subprocess.Popen.send_signal PROC_CREATIONFLAGS = (CREATE_NO_WINDOW | subprocess.CREATE_NEW_PROCESS_GROUP - if is_win + if is_win and sys.version_info >= (2, 7) else 0) @@ -245,7 +245,7 @@ def __del__(self): return # can be that nothing really exists anymore ... - if os is None or os.kill is None: + if os is None or getattr(os, 'kill', None) is None: return # try to kill it @@ -831,8 +831,12 @@ def _call_process(self, method, *args, **kwargs): :return: Same as ``execute``""" # Handle optional arguments prior to calling transform_kwargs # otherwise these'll end up in args, which is bad. - _kwargs = {k: v for k, v in kwargs.items() if k in execute_kwargs} - kwargs = {k: v for k, v in kwargs.items() if k not in execute_kwargs} + _kwargs = dict() + for kwarg in execute_kwargs: + try: + _kwargs[kwarg] = kwargs.pop(kwarg) + except KeyError: + pass insert_after_this_arg = kwargs.pop('insert_kwargs_after', None) diff --git a/git/objects/submodule/base.py b/git/objects/submodule/base.py index 18988b975..a35240f1f 100644 --- a/git/objects/submodule/base.py +++ b/git/objects/submodule/base.py @@ -3,7 +3,10 @@ import logging import os import stat -from unittest.case import SkipTest +try: + from unittest import SkipTest +except ImportError: + from unittest2 import SkipTest import uuid import git diff --git a/git/test/lib/helper.py b/git/test/lib/helper.py index 1515f2a1f..743f720c8 100644 --- a/git/test/lib/helper.py +++ b/git/test/lib/helper.py @@ -7,20 +7,24 @@ import contextlib from functools import wraps +import sys import io import logging import os import tempfile import textwrap import time -from unittest import TestCase -import unittest -from git.compat import string_types, is_win, PY3 +from git.compat import string_types, is_win from git.util import rmtree, cwd import os.path as osp +if sys.version_info[0:2] == (2, 6): + import unittest2 as unittest +else: + import unittest +TestCase = unittest.TestCase ospd = osp.dirname @@ -335,8 +339,11 @@ class TestBase(TestCase): of the project history ( to assure tests don't fail for others ). """ - if not PY3: - assertRaisesRegex = unittest.TestCase.assertRaisesRegexp + # On py26, unittest2 has assertRaisesRegex + # On py3, unittest has assertRaisesRegex + # On py27, we use unittest, which names it differently: + if sys.version_info[0:2] == (2, 7): + assertRaisesRegex = TestCase.assertRaisesRegexp def _small_repo_url(self): """:return" a path to a small, clonable repository""" diff --git a/git/test/test_base.py b/git/test/test_base.py index cec40de82..69f161bee 100644 --- a/git/test/test_base.py +++ b/git/test/test_base.py @@ -7,7 +7,10 @@ import os import sys import tempfile -from unittest import skipIf +try: + from unittest import SkipTest, skipIf +except ImportError: + from unittest2 import SkipTest, skipIf from git import ( Blob, @@ -131,7 +134,6 @@ def test_add_unicode(self, rw_repo): try: file_path.encode(sys.getfilesystemencoding()) except UnicodeEncodeError: - from unittest import SkipTest raise SkipTest("Environment doesn't support unicode filenames") with open(file_path, "wb") as fp: diff --git a/git/test/test_fun.py b/git/test/test_fun.py index 9d4366537..b472fe19c 100644 --- a/git/test/test_fun.py +++ b/git/test/test_fun.py @@ -1,6 +1,9 @@ from io import BytesIO from stat import S_IFDIR, S_IFREG, S_IFLNK -from unittest.case import skipIf +try: + from unittest import skipIf +except ImportError: + from unittest2 import skipIf from git.compat import PY3 from git.index import IndexFile diff --git a/git/test/test_index.py b/git/test/test_index.py index 1abe22f48..071ac623f 100644 --- a/git/test/test_index.py +++ b/git/test/test_index.py @@ -13,7 +13,10 @@ ) import sys import tempfile -from unittest.case import skipIf +try: + from unittest import skipIf +except ImportError: + from unittest2 import skipIf from git import ( IndexFile, @@ -149,8 +152,9 @@ def add_bad_blob(): except Exception as ex: msg_py3 = "required argument is not an integer" msg_py2 = "cannot convert argument to integer" - ## msg_py26 ="unsupported operand type(s) for &: 'str' and 'long'" - assert msg_py2 in str(ex) or msg_py3 in str(ex), str(ex) + msg_py26 = "unsupported operand type(s) for &: 'str' and 'long'" + assert msg_py2 in str(ex) or msg_py3 in str(ex) or \ + msg_py26 in str(ex), str(ex) ## 2nd time should not fail due to stray lock file try: diff --git a/git/test/test_remote.py b/git/test/test_remote.py index 8b50ea35c..aae4fb9f3 100644 --- a/git/test/test_remote.py +++ b/git/test/test_remote.py @@ -6,7 +6,10 @@ import random import tempfile -from unittest.case import skipIf +try: + from unittest import skipIf +except ImportError: + from unittest2 import skipIf from git import ( RemoteProgress, diff --git a/git/test/test_repo.py b/git/test/test_repo.py index 374a26eee..9ad80ee63 100644 --- a/git/test/test_repo.py +++ b/git/test/test_repo.py @@ -11,7 +11,10 @@ import pickle import sys import tempfile -from unittest.case import skipIf +try: + from unittest import skipIf, SkipTest +except ImportError: + from unittest2 import skipIf, SkipTest from git import ( InvalidGitRepositoryError, @@ -53,7 +56,6 @@ from git.util import HIDE_WINDOWS_KNOWN_ERRORS, cygpath from git.test.lib import with_rw_directory from git.util import join_path_native, rmtree, rmfile, bin_to_hex -from unittest import SkipTest import functools as fnt import os.path as osp diff --git a/git/test/test_submodule.py b/git/test/test_submodule.py index 7b05f49ab..59a40fa02 100644 --- a/git/test/test_submodule.py +++ b/git/test/test_submodule.py @@ -3,7 +3,10 @@ # the BSD License: http://www.opensource.org/licenses/bsd-license.php import os import sys -from unittest.case import skipIf +try: + from unittest import skipIf +except ImportError: + from unittest2 import skipIf import git from git.cmd import Git diff --git a/git/test/test_tree.py b/git/test/test_tree.py index f92598743..ab85bc9c6 100644 --- a/git/test/test_tree.py +++ b/git/test/test_tree.py @@ -6,7 +6,10 @@ from io import BytesIO import sys -from unittest.case import skipIf +try: + from unittest import skipIf +except ImportError: + from unittest2 import skipIf from git import ( Tree, diff --git a/git/test/test_util.py b/git/test/test_util.py index 8f8d22725..525c86092 100644 --- a/git/test/test_util.py +++ b/git/test/test_util.py @@ -6,7 +6,11 @@ import tempfile import time -from unittest.case import skipIf +try: + from unittest import skipIf +except ImportError: + from unittest2 import skipIf + import ddt diff --git a/git/util.py b/git/util.py index 1e0d3eb42..6e3ddfab4 100644 --- a/git/util.py +++ b/git/util.py @@ -11,11 +11,15 @@ import logging import os import platform +import subprocess import re import shutil import stat import time -from unittest.case import SkipTest +try: + from unittest import SkipTest +except ImportError: + from unittest2 import SkipTest from gitdb.util import (# NOQA @IgnorePep8 make_sha, @@ -303,7 +307,7 @@ def is_cygwin_git(git_executable): if not is_win: return False - from subprocess import check_output + #from subprocess import check_output is_cygwin = _is_cygwin_cache.get(git_executable) if is_cygwin is None: @@ -316,8 +320,11 @@ def is_cygwin_git(git_executable): ## Just a name given, not a real path. uname_cmd = osp.join(git_dir, 'uname') - uname = check_output(uname_cmd, universal_newlines=True) - is_cygwin = 'CYGWIN' in uname + process = subprocess.Popen([uname_cmd], stdout=subprocess.PIPE, + universal_newlines=True) + uname_out, _ = process.communicate() + #retcode = process.poll() + is_cygwin = 'CYGWIN' in uname_out except Exception as ex: log.debug('Failed checking if running in CYGWIN due to: %r', ex) _is_cygwin_cache[git_executable] = is_cygwin diff --git a/requirements.txt b/requirements.txt index 396446062..a8e7a7a8a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ gitdb>=0.6.4 ddt>=1.1.1 +unittest2; python_version < '2.7'