Commit 0c39ec94 authored by Philip Thiem's avatar Philip Thiem

fixed some issues with OSError

have to emulate zipfile extract on py2.5 and earlier for tests

--HG--
extra : rebase_source : c6ad4eab19a2a454b8b8043d88d9582168f617aa
parent 5b799285
......@@ -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, \
......
......@@ -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:
......
......@@ -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'),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment