diff options
-rwxr-xr-x | setuptools/command/egg_info.py | 2 | ||||
-rw-r--r-- | setuptools/svn_utils.py | 16 | ||||
-rw-r--r-- | setuptools/tests/test_svn.py | 87 |
3 files changed, 95 insertions, 10 deletions
diff --git a/setuptools/command/egg_info.py b/setuptools/command/egg_info.py index cb557361..345ec8ae 100755 --- a/setuptools/command/egg_info.py +++ b/setuptools/command/egg_info.py @@ -9,7 +9,7 @@ from distutils.errors import * from distutils import log from setuptools.command.sdist import sdist from setuptools.compat import basestring -from .. import svn_utils +from setuptools import svn_utils from distutils.util import convert_path from distutils.filelist import FileList as _FileList from pkg_resources import parse_requirements, safe_name, parse_version, \ diff --git a/setuptools/svn_utils.py b/setuptools/svn_utils.py index 10c5861d..932ee75c 100644 --- a/setuptools/svn_utils.py +++ b/setuptools/svn_utils.py @@ -34,10 +34,14 @@ _SVN_VER_RE = re.compile(r'(?:(\d+):)?(\d+)([a-z]*)\s*$', re.I) # python-subprocess-popen-environment-path
def _run_command(args, stdout=_PIPE, stderr=_PIPE):
#regarding the shell argument, see: http://bugs.python.org/issue8557
- proc = _Popen(args, stdout=stdout, stderr=stderr,
- shell=(sys.platform == 'win32'))
+ try:
+ proc = _Popen(args, stdout=stdout, stderr=stderr,
+ shell=(sys.platform == 'win32'))
+
+ data = proc.communicate()[0]
+ except OSError:
+ return 1, ''
- data = proc.communicate()[0]
#TODO: this is probably NOT always utf-8
try:
data = unicode(data, encoding='utf-8')
@@ -60,11 +64,13 @@ def _get_entry_schedule(entry): def parse_revision(path):
- code, data = _run_command(['svnversion', path])
+ code, data = _run_command(['svnversion', '-c', path])
if code:
log.warn("svnversion failed")
- return []
+ return 0
+ else:
+ log.warn('Version: %s' % data.strip())
parsed = _SVN_VER_RE.match(data)
if parsed:
diff --git a/setuptools/tests/test_svn.py b/setuptools/tests/test_svn.py index 7f5f6108..8b73452f 100644 --- a/setuptools/tests/test_svn.py +++ b/setuptools/tests/test_svn.py @@ -17,6 +17,54 @@ from setuptools.command import sdist #requires python >= 2.4 from subprocess import call as _call +def _extract(self, member, path=None, pwd=None): + """for zipfile py2.5 borrowed from cpython""" + if not isinstance(member, zipfile.ZipInfo): + member = self.getinfo(member) + + if path is None: + path = os.getcwd() + + return _extract_member(self, member, path, pwd) + +def _extract_from_zip(self, name, dest_path): + dest_file = open(dest_path, 'wb') + try: + dest_file.write(self.read(name)) + 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): + targetpath = targetpath[:-1] + + # don't include leading "/" from file name if present + if member.filename[0] == '/': + targetpath = os.path.join(targetpath, member.filename[1:]) + else: + targetpath = os.path.join(targetpath, member.filename) + + targetpath = os.path.normpath(targetpath) + + # Create all upper directories if necessary. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + os.makedirs(upperdirs) + + if member.filename[-1] == '/': + if not os.path.isdir(targetpath): + os.mkdir(targetpath) + return targetpath + + _extract_from_zip(self, member.filename, targetpath) + + return targetpath + def _remove_dir(target): @@ -31,13 +79,21 @@ def _remove_dir(target): class TestSvnVersion(unittest.TestCase): def test_no_svn_found(self): - old_path = os.environ['path'] - os.environ['path'] = '' + path_variable = None + for env in os.environ: + if env.lower() == 'path': + path_variable = env + + if path_variable is None: + self.skipTest('Cannot figure out how to modify path') + + old_path = os.environ[path_variable] + os.environ[path_variable] = '' try: version = svn_utils.get_svn_tool_version() self.assertEqual(version, '') finally: - os.environ['path'] = old_path + os.environ[path_variable] = old_path def test_svn_should_exist(self): version = svn_utils.get_svn_tool_version() @@ -47,13 +103,21 @@ class TestSvnVersion(unittest.TestCase): class TestSvn_1_7(unittest.TestCase): def setUp(self): + version = svn_utils.get_svn_tool_version() + ver_list = [int(x) for x in version.split('.')] + if ver_list < [1,7,0]: + self.version_err = 'Insufficent Subversion (%s)' % version + else: + self.version_err = None + + self.temp_dir = tempfile.mkdtemp() zip_file, source, target = [None, None, None] try: zip_file = zipfile.ZipFile(os.path.join('setuptools', 'tests', 'svn17_example.zip')) for files in zip_file.namelist(): - zip_file.extract(files, self.temp_dir) + _extract(zip_file, files, self.temp_dir) finally: if zip_file: zip_file.close() @@ -66,11 +130,26 @@ class TestSvn_1_7(unittest.TestCase): os.chdir(self.old_cwd) _remove_dir(self.temp_dir) + def _chk_skip(self): + if self.version_err is not None: + if hasattr(self, 'skipTest'): + self.skipTest(self.version_err) + else: + sys.stderr.write(self.version_error + "\n") + return True + return False + def test_egg_info(self): + if self._chk_skip: + return + rev = egg_info.egg_info.get_svn_revision() self.assertEqual(rev, '4') def test_iterator(self): + if self._chk_skip: + return + expected = set([ os.path.join('.', 'readme.txt'), os.path.join('.', 'other'), |