aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--setuptools/svn_utils.py9
-rw-r--r--setuptools/tests/environment.py56
-rw-r--r--setuptools/tests/svn_data/dummy.zipbin0 -> 1771 bytes
-rw-r--r--setuptools/tests/test_egg_info.py96
-rw-r--r--setuptools/tests/test_sdist.py149
5 files changed, 227 insertions, 83 deletions
diff --git a/setuptools/svn_utils.py b/setuptools/svn_utils.py
index 6ac31a24..224d11ea 100644
--- a/setuptools/svn_utils.py
+++ b/setuptools/svn_utils.py
@@ -219,7 +219,13 @@ class SvnInfo(object):
def load(cls, dirname=''):
normdir = os.path.normpath(dirname)
code, data = _run_command(['svn', 'info', normdir])
- has_svn = os.path.isdir(os.path.join(normdir, '.svn'))
+ # Must check for some contents, as some use empty directories
+ # in testcases
+ svn_dir = os.path.join(normdir, '.svn')
+ has_svn = (os.path.isfile(os.path.join(svn_dir, 'entries')) or
+ os.path.isfile(os.path.join(svn_dir, 'dir-props')) or
+ os.path.isfile(os.path.join(svn_dir, 'dir-prop-base')))
+
svn_version = tuple(cls.get_svn_version().split('.'))
try:
@@ -229,7 +235,6 @@ class SvnInfo(object):
if has_svn and (code or not base_svn_version
or base_svn_version < (1, 3)):
- log.warn('Fallback onto .svn parsing')
warnings.warn(("No SVN 1.3+ command found: falling back "
"on pre 1.7 .svn parsing"), DeprecationWarning)
return SvnFileInfo(dirname)
diff --git a/setuptools/tests/environment.py b/setuptools/tests/environment.py
index 7c754b8e..bd2c53d2 100644
--- a/setuptools/tests/environment.py
+++ b/setuptools/tests/environment.py
@@ -5,6 +5,9 @@ import tempfile
import unittest
import shutil
import stat
+import unicodedata
+
+from subprocess import Popen as _Popen, PIPE as _PIPE
def _extract(self, member, path=None, pwd=None):
@@ -25,13 +28,14 @@ def _extract_from_zip(self, name, dest_path):
finally:
dest_file.close()
+
def _extract_member(self, member, targetpath, pwd):
"""for zipfile py2.5 borrowed from cpython"""
# build the destination pathname, replacing
# forward slashes to platform specific separators.
# Strip trailing path separator, unless it represents the root.
if (targetpath[-1:] in (os.path.sep, os.path.altsep)
- and len(os.path.splitdrive(targetpath)[1]) > 1):
+ and len(os.path.splitdrive(targetpath)[1]) > 1):
targetpath = targetpath[:-1]
# don't include leading "/" from file name if present
@@ -102,3 +106,53 @@ class ZippedEnvironment(unittest.TestCase):
#sigh?
pass
+
+def _which_dirs(cmd):
+ result = set()
+ for path in os.environ.get('PATH', '').split(os.pathsep):
+ filename = os.path.join(path, cmd)
+ if os.access(filename, os.X_OK):
+ result.add(path)
+ return result
+
+
+def run_setup_py(cmd, pypath=None, path=None,
+ data_stream=0, env=None):
+ """
+ Execution command for tests, separate from those used by the
+ code directly to prevent accidental behavior issues
+ """
+ if env is None:
+ env = dict()
+ for envname in os.environ:
+ env[envname] = os.environ[envname]
+
+ #override the python path if needed
+ if pypath is not None:
+ env["PYTHONPATH"] = pypath
+
+ #overide the execution path if needed
+ if path is not None:
+ env["PATH"] = path
+ if not env.get("PATH", ""):
+ env["PATH"] = _which_dirs("tar").union(_which_dirs("gzip"))
+ env["PATH"] = os.pathsep.join(env["PATH"])
+
+ cmd = [sys.executable, "setup.py"] + list(cmd)
+
+ #regarding the shell argument, see: http://bugs.python.org/issue8557
+ try:
+ proc = _Popen(cmd, stdout=_PIPE, stderr=_PIPE,
+ shell=(sys.platform == 'win32'), env=env)
+
+ data = proc.communicate()[data_stream]
+ except OSError:
+ return 1, ''
+
+ #decode the console string if needed
+ if hasattr(data, "decode"):
+ data = data.decode() # should use the preffered encoding
+ data = unicodedata.normalize('NFC', data)
+
+ #communciate calls wait()
+ return proc.returncode, data
diff --git a/setuptools/tests/svn_data/dummy.zip b/setuptools/tests/svn_data/dummy.zip
new file mode 100644
index 00000000..1347be53
--- /dev/null
+++ b/setuptools/tests/svn_data/dummy.zip
Binary files differ
diff --git a/setuptools/tests/test_egg_info.py b/setuptools/tests/test_egg_info.py
index 7abafd71..28682dfd 100644
--- a/setuptools/tests/test_egg_info.py
+++ b/setuptools/tests/test_egg_info.py
@@ -1,3 +1,4 @@
+
import os
import sys
import tempfile
@@ -5,12 +6,15 @@ import shutil
import unittest
import pkg_resources
+import warnings
from setuptools.command import egg_info
+from setuptools.tests import environment
from setuptools import svn_utils
ENTRIES_V10 = pkg_resources.resource_string(__name__, 'entries-v10')
"An entries file generated with svn 1.6.17 against the legacy Setuptools repo"
+
class TestEggInfo(unittest.TestCase):
def setUp(self):
@@ -37,7 +41,7 @@ class TestEggInfo(unittest.TestCase):
#to ensure I return using svnversion what would had been returned
version_str = svn_utils.SvnInfo.get_svn_version()
version = [int(x) for x in version_str.split('.')[:2]]
- if version != [1,6]:
+ if version != [1, 6]:
if hasattr(self, 'skipTest'):
self.skipTest('')
else:
@@ -61,14 +65,104 @@ class TestEggInfo(unittest.TestCase):
old_path = os.environ[path_variable]
os.environ[path_variable] = ''
+ #catch_warnings not available until py26
+ warning_filters = warnings.filters
+ warnings.filters = warning_filters[:]
try:
+ warnings.simplefilter("ignore", DeprecationWarning)
self._write_entries(ENTRIES_V10)
rev = egg_info.egg_info.get_svn_revision()
finally:
+ #restore the warning filters
+ warnings.filters = warning_filters
+ #restore the os path
os.environ[path_variable] = old_path
self.assertEqual(rev, '89000')
+DUMMY_SOURCE_TXT = """CHANGES.txt
+CONTRIBUTORS.txt
+HISTORY.txt
+LICENSE
+MANIFEST.in
+README.txt
+setup.py
+dummy/__init__.py
+dummy/test.txt
+dummy.egg-info/PKG-INFO
+dummy.egg-info/SOURCES.txt
+dummy.egg-info/dependency_links.txt
+dummy.egg-info/top_level.txt"""
+
+
+class TestSvnDummy(environment.ZippedEnvironment):
+
+ def setUp(self):
+ version = svn_utils.SvnInfo.get_svn_version()
+ self.base_version = tuple([int(x) for x in version.split('.')][:2])
+
+ if not self.base_version:
+ raise ValueError('No SVN tools installed')
+ elif self.base_version < (1, 3):
+ raise ValueError('Insufficient SVN Version %s' % version)
+ elif self.base_version >= (1, 9):
+ #trying the latest version
+ self.base_version = (1, 8)
+
+ self.dataname = "dummy%i%i" % self.base_version
+ self.datafile = os.path.join('setuptools', 'tests',
+ 'svn_data', self.dataname + ".zip")
+ super(TestSvnDummy, self).setUp()
+
+ def test_sources(self):
+ code, data = environment.run_setup_py(["sdist"],
+ pypath=self.old_cwd,
+ data_stream=1)
+ if code:
+ raise AssertionError(data)
+
+ sources = os.path.join('dummy.egg-info', 'SOURCES.txt')
+ infile = open(sources, 'r')
+ try:
+ read_contents = infile.read()
+ finally:
+ infile.close()
+ del infile
+
+ self.assertEqual(DUMMY_SOURCE_TXT, read_contents)
+
+ return data
+
+
+class TestSvnDummyLegacy(environment.ZippedEnvironment):
+
+ def setUp(self):
+ self.base_version = (1, 6)
+ self.dataname = "dummy%i%i" % self.base_version
+ self.datafile = os.path.join('setuptools', 'tests',
+ 'svn_data', self.dataname + ".zip")
+ super(TestSvnDummyLegacy, self).setUp()
+
+ def test_sources(self):
+ code, data = environment.run_setup_py(["sdist"],
+ pypath=self.old_cwd,
+ path="",
+ data_stream=1)
+ if code:
+ raise AssertionError(data)
+
+ sources = os.path.join('dummy.egg-info', 'SOURCES.txt')
+ infile = open(sources, 'r')
+ try:
+ read_contents = infile.read()
+ finally:
+ infile.close()
+ del infile
+
+ self.assertEqual(DUMMY_SOURCE_TXT, read_contents)
+
+ return data
+
def test_suite():
return unittest.defaultTestLoader.loadTestsFromName(__name__)
diff --git a/setuptools/tests/test_sdist.py b/setuptools/tests/test_sdist.py
index 716893dc..b42dcc57 100644
--- a/setuptools/tests/test_sdist.py
+++ b/setuptools/tests/test_sdist.py
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
"""sdist tests"""
-from __future__ import with_statement
import locale
import os
import shutil
@@ -401,81 +400,73 @@ class TestSdistTest(unittest.TestCase):
self.assertTrue(filename in cmd.filelist.files)
-def soruce_test(self):
- code, data = svn_utils._run_command([sys.executable, "setup.py", "egg_info"], stream=1)
-
- if code:
- raise AssertionError(data)
-
- sources = os.path.join('dummy.egg-info', 'SOURCES.txt')
- contents = """CHANGES.txt
-CONTRIBUTORS.txt
-HISTORY.txt
-LICENSE
-MANIFEST.in
-README.txt
-setup.py
-dummy/__init__.py
-dummy/test.txt
-dummy.egg-info/PKG-INFO
-dummy.egg-info/SOURCES.txt
-dummy.egg-info/dependency_links.txt
-dummy.egg-info/top_level.txt"""
-
- with open(sources, 'r') as infile:
- read_contents = infile.read()
-
- self.assertEqual(contents, read_contents)
-
-
-class TestSvnDummy(environment.ZippedEnvironment):
-
- def setUp(self):
- version = svn_utils.SvnInfo.get_svn_version()
- self.base_version = tuple([int(x) for x in version.split('.')][:2])
-
- if not self.base_version:
- raise ValueError('No SVN tools installed')
- elif self.base_version < (1,3):
- raise ValueError('Insufficient SVN Version %s' % version)
- elif self.base_version >= (1,9):
- #trying the latest version
- self.base_version = (1,8)
-
- self.dataname = "dummy%i%i" % self.base_version
- self.datafile = os.path.join('setuptools', 'tests',
- 'svn_data', self.dataname + ".zip")
- super(TestSvnDummy, self).setUp()
-
- def test_sources(self):
- soruce_test(self)
-
-
-class TestSvnDummyLegacy(environment.ZippedEnvironment):
+class TestDummyOutput(environment.ZippedEnvironment):
def setUp(self):
- self.base_version = (1,6)
- self.path_variable = None
- for env in os.environ:
- if env.lower() == 'path':
- self.path_variable = env
- self.old_path = os.environ[self.path_variable]
- os.environ[self.path_variable] = ''
-
- if self.path_variable is None:
- self.skipTest('Cannot figure out how to modify path')
-
- self.dataname = "dummy%i%i" % self.base_version
self.datafile = os.path.join('setuptools', 'tests',
- 'svn_data', self.dataname + ".zip")
- super(TestSvnDummyLegacy, self).setUp()
-
- def tearDown(self):
- os.environ[self.path_variable] = self.old_path
- super(TestSvnDummyLegacy, self).tearDown()
+ 'svn_data', "dummy.zip")
+ self.dataname = "dummy"
+ super(TestDummyOutput, self).setUp()
+
+ def _run(self):
+ code, data = environment.run_setup_py(["sdist"],
+ pypath=self.old_cwd,
+ data_stream=0)
+ if code:
+ info = "DIR: " + os.path.abspath('.')
+ info += "\n SDIST RETURNED: %i\n\n" % code
+ info += data
+ raise AssertionError(info)
+
+ datalines = data.splitlines()
+
+ possible = (
+ "running sdist",
+ "running egg_info",
+ "creating dummy\.egg-info",
+ "writing dummy\.egg-info",
+ "writing top-level names to dummy\.egg-info",
+ "writing dependency_links to dummy\.egg-info",
+ "writing manifest file 'dummy\.egg-info",
+ "reading manifest file 'dummy\.egg-info",
+ "reading manifest template 'MANIFEST\.in'",
+ "writing manifest file 'dummy\.egg-info",
+ "creating dummy-0.1.1",
+ "making hard links in dummy-0\.1\.1",
+ "copying files to dummy-0\.1\.1",
+ "copying \S+ -> dummy-0\.1\.1",
+ "copying dummy",
+ "copying dummy\.egg-info",
+ "hard linking \S+ -> dummy-0\.1\.1",
+ "hard linking dummy",
+ "hard linking dummy\.egg-info",
+ "Writing dummy-0\.1\.1",
+ "creating dist",
+ "creating 'dist",
+ "Creating tar archive",
+ "running check",
+ "adding 'dummy-0\.1\.1",
+ "tar .+ dist/dummy-0\.1\.1\.tar dummy-0\.1\.1",
+ "gzip .+ dist/dummy-0\.1\.1\.tar",
+ "removing 'dummy-0\.1\.1' \\(and everything under it\\)",
+ )
+
+ print(" DIR: " + os.path.abspath('.'))
+ for line in datalines:
+ found = False
+ for pattern in possible:
+ if re.match(pattern, line):
+ print(" READ: " + line)
+ found = True
+ break
+ if not found:
+ raise AssertionError("Unexpexected: %s\n-in-\n%s"
+ % (line, data))
+
+ return data
def test_sources(self):
- soruce_test(self)
+ self._run()
class TestSvn(environment.ZippedEnvironment):
@@ -486,11 +477,11 @@ class TestSvn(environment.ZippedEnvironment):
if not self.base_version:
raise ValueError('No SVN tools installed')
- elif self.base_version < (1,3):
+ elif self.base_version < (1, 3):
raise ValueError('Insufficient SVN Version %s' % version)
- elif self.base_version >= (1,9):
+ elif self.base_version >= (1, 9):
#trying the latest version
- self.base_version = (1,8)
+ self.base_version = (1, 8)
self.dataname = "svn%i%i_example" % self.base_version
self.datafile = os.path.join('setuptools', 'tests',
@@ -498,7 +489,7 @@ class TestSvn(environment.ZippedEnvironment):
super(TestSvn, self).setUp()
def test_walksvn(self):
- if self.base_version >= (1,6):
+ if self.base_version >= (1, 6):
folder2 = 'third party2'
folder3 = 'third party3'
else:
@@ -520,7 +511,7 @@ class TestSvn(environment.ZippedEnvironment):
os.path.join('folder', folder2, 'Changes.txt'),
os.path.join('folder', folder2, 'MD5SUMS'),
os.path.join('folder', folder2, 'WatashiNiYomimasu.txt'),
- os.path.join( 'folder', folder3, 'Changes.txt'),
+ os.path.join('folder', folder3, 'Changes.txt'),
os.path.join('folder', folder3, 'fin'),
os.path.join('folder', folder3, 'MD5SUMS'),
os.path.join('folder', folder3, 'oops'),
@@ -529,11 +520,11 @@ class TestSvn(environment.ZippedEnvironment):
os.path.join('folder', 'third_party', 'WatashiNiYomimasu.txt'),
os.path.join('folder', 'lalala.txt'),
os.path.join('folder', 'quest.txt'),
- #The example will have a deleted file (or should) but shouldn't return it
- ])
+ # The example will have a deleted file
+ # (or should) but shouldn't return it
+ ])
self.assertEqual(set(x for x in walk_revctrl()), expected)
def test_suite():
return unittest.defaultTestLoader.loadTestsFromName(__name__)
-