示例#1
0
文件: fs.py 项目: lotus321/HITCON2014
def fix_locations(package, interpreter, versions, options):
    """Move files to the right location."""
    # make a copy since we change version later
    interpreter = Interpreter(interpreter)

    for version in versions:
        interpreter.version = version

        dstdir = interpreter.sitedir(package)
        for srcdir in interpreter.old_sitedirs(package):
            if isdir(srcdir):
                # TODO: what about relative symlinks?
                log.debug('moving files from %s to %s', srcdir, dstdir)
                share_files(srcdir, dstdir, interpreter, options)
                parent_dir = '/'.join(srcdir.split('/')[:-1])
                while parent_dir:
                    if exists(parent_dir):
                        if os.listdir(parent_dir):
                            break
                        os.rmdir(parent_dir)
                    parent_dir = dirname(parent_dir)

        # do the same with debug locations
        dstdir = interpreter.sitedir(package, gdb=True)
        for srcdir in interpreter.old_sitedirs(package, gdb=True):
            if isdir(srcdir):
                log.debug('moving files from %s to %s', srcdir, dstdir)
                share_files(srcdir, dstdir, interpreter, options)
                parent_dir = '/'.join(srcdir.split('/')[:-1])
                while parent_dir:
                    if exists(parent_dir):
                        if os.listdir(parent_dir):
                            break
                        os.rmdir(parent_dir)
                    parent_dir = dirname(parent_dir)
示例#2
0
 def test_python26dbg(self):
     i = Interpreter('python2.6-dbg')
     self.assertEqual(i.soabi(), '')
     self.assertIsNone(i.check_extname('foo_d.so'))
     self.assertEqual(i.check_extname('foo.so'), 'foo_d.so')
     self.assertEqual(i.check_extname('foo/bar/bazmodule.so'),
                      'foo/bar/bazmodule_d.so')
示例#3
0
def fix_locations(package, interpreter, versions, options):
    """Move files to the right location."""
    # make a copy since we change version later
    interpreter = Interpreter(interpreter)

    for version in versions:
        interpreter.version = version

        dstdir = interpreter.sitedir(package)
        for srcdir in interpreter.old_sitedirs(package):
            if isdir(srcdir):
                # TODO: what about relative symlinks?
                log.debug('moving files from %s to %s', srcdir, dstdir)
                share_files(srcdir, dstdir, interpreter, options)
                try:
                    os.removedirs(srcdir)
                except OSError:
                    pass

        # do the same with debug locations
        dstdir = interpreter.sitedir(package, gdb=True)
        for srcdir in interpreter.old_sitedirs(package, gdb=True):
            if isdir(srcdir):
                log.debug('moving files from %s to %s', srcdir, dstdir)
                share_files(srcdir, dstdir, interpreter, options)
                try:
                    os.removedirs(srcdir)
                except OSError:
                    pass
示例#4
0
 def test_pypy(self):
     sorted(Interpreter.parse('pypy').items()) == \
         [('debug', None), ('name', 'pypy'), ('options', ()), ('path', ''), ('version', None)]
     sorted(Interpreter.parse('#! /usr/bin/pypy --foo').items()) == \
         [('debug', None), ('name', 'pypy'), ('options', ('--foo',)), ('path', '/usr/bin/'), ('version', None)]
     Interpreter('pypy').sitedir(
         version='2.0') == '/usr/lib/pypy/dist-packages/'
示例#5
0
def get_requested_versions(impl, vrange=None, available=None):
    """Return a set of requested and supported Python versions.

    :param impl: interpreter implementation
    :param available: if set to `True`, return installed versions only,
        if set to `False`, return requested versions that are not installed.
        By default returns all requested versions.
    :type available: bool

    >>> sorted(get_requested_versions('cpython3', '')) == sorted(supported('cpython3'))
    True
    >>> sorted(get_requested_versions('cpython3', '-')) == sorted(supported('cpython3'))
    True
    >>> get_requested_versions('cpython3', '>= 5.0')
    set()
    """
    if isinstance(vrange, str):
        vrange = VersionRange(vrange)

    if not vrange:
        versions = set(supported(impl))
    else:
        minv = Version(major=0,
                       minor=0) if vrange.minver is None else vrange.minver
        maxv = Version(major=99,
                       minor=99) if vrange.maxver is None else vrange.maxver
        if minv == maxv:
            versions = set([minv] if minv in supported(impl) else tuple())
        else:
            versions = set(v for v in supported(impl) if minv <= v < maxv)

    if available is not None:
        # to avoid circular imports
        global Interpreter
        if Interpreter is None:
            from dhpython.interpreter import Interpreter
    if available:
        interpreter = Interpreter(impl=impl)
        versions = set(v for v in versions if exists(interpreter.binary(v)))
    elif available is False:
        interpreter = Interpreter(impl=impl)
        versions = set(v for v in versions
                       if not exists(interpreter.binary(v)))

    return versions
示例#6
0
 def test_python27dbg(self):
     i = Interpreter('python2.7-dbg')
     self.assertEqual(i.soabi(), '')
     self.assertEqual(i.check_extname('foo.so'), 'foo.MYARCH_d.so')
     self.assertEqual(i.check_extname('foo_d.so'), 'foo.MYARCH_d.so')
     self.assertIsNone(i.check_extname('foo.MYARCH_d.so'))
     self.assertIsNone(
         i.check_extname('foo.OTHER_d.so'))  # different architecture
     self.assertEqual(i.check_extname('foo/bar/bazmodule.so'),
                      'foo/bar/baz.MYARCH_d.so')
示例#7
0
 def test_python32(self):
     i = Interpreter('python3.2')
     self.assertEqual(i.soabi(), 'cpython-32mu')
     self.assertEqual(i.check_extname('foo.so'), r'foo.cpython-32mu.so')
     self.assertIsNone(
         i.check_extname('foo.cpython-33m.so'))  # different version
     self.assertIsNone(i.check_extname(
         'foo.cpython-32mu-OTHER.so'))  # different architecture
     self.assertIsNone(i.check_extname('foo.abi3.so'))
     self.assertEqual(i.check_extname('foo/bar/bazmodule.so'),
                      r'foo/bar/bazmodule.cpython-32mu.so')
示例#8
0
 def test_python36dbg(self):
     i = Interpreter('python3.6-dbg')
     self.assertEqual(i.soabi(), 'cpython-36dm')
     self.assertEqual(i.check_extname('foo.so'),
                      r'foo.cpython-36dm-MYARCH.so')
     self.assertIsNone(
         i.check_extname('foo.cpython-32m.so'))  # different version
     self.assertIsNone(i.check_extname(
         'foo.cpython-36m-OTHER.so'))  # different architecture
     self.assertIsNone(i.check_extname('foo.abi3.so'))
     self.assertEqual(i.check_extname('foo/bar/bazmodule.so'),
                      r'foo/bar/baz.cpython-36dm-MYARCH.so')
示例#9
0
 def test_python31dbg(self):
     i = Interpreter('python3.1-dbg')
     self.assertEqual(i.soabi(), '')
     self.assertIsNone(i.check_extname('foo.so'))
     self.assertIsNone(i.check_extname('foo.abi3.so'))
     self.assertIsNone(i.check_extname('foo/bar/bazmodule.so'))
示例#10
0
 def test_version(self):
     i = Interpreter(impl='cpython2')
     self.assertEqual(str(i), 'python')
     self.assertEqual(i.binary('2.7'), '/usr/bin/python2.7')