예제 #1
0
def main(args):
    """Entry point for Python 3"""
    if args.verbose or environ.get('PYCLEAN_DEBUG') == '1':
        log.setLevel(logging.DEBUG)
        log.debug('argv: %s', sys.argv)
        log.debug('args: %s', args)
    else:
        log.setLevel(logging.WARNING)

    if args.version:
        if args.version.endswith('3.1'):  # 3.1, -3.1
            magic_tag = False
        else:
            magic_tag = get_magic_tag_to_remove(getver(args.version))
        d = destroyer(magic_tag)
    else:
        d = destroyer()  # remove everything
    next(d)  # initialize coroutine

    if args.package:
        for pkg in args.package:
            log.info('cleaning package %s', pkg)
            pfiles = set(dpf.from_package(pkg))

    if args.directory:
        log.info('cleaning directories: %s', args.directory)
        files = set(dpf.from_directory(args.directory))
        if args.package:
            files = files & pfiles
    else:
        files = pfiles

    for filename in files:
        d.send(filename)
예제 #2
0
def so2pyver(fpath):
    """Return libpython version file is linked to or None.

    :rtype: tuple
    :returns: Python version
    """

    cmd = "readelf -Wd '%s'" % fpath
    process = Popen(cmd, stdout=PIPE, shell=True)
    match = SHAREDLIB_RE.search(process.stdout.read())
    if match:
        return getver(match.groups()[0])
def so2pyver(fpath):
    """Return libpython version file is linked to or None.

    :rtype: tuple
    :returns: Python version
    """

    cmd = "readelf -Wd '%s'" % fpath
    process = Popen(cmd, stdout=PIPE, shell=True)
    match = SHAREDLIB_RE.search(process.stdout.read())
    if match:
        return getver(match.groups()[0])
예제 #4
0
def shebang2pyver(fpath):
    """Check file's shebang.

    :rtype: tuple
    :returns: pair of Python interpreter string and Python version
    """
    try:
        with open(fpath) as fp:
            data = fp.read(32)
            match = SHEBANG_RE.match(data)
            if not match:
                return None
            res = match.groups()
            if res != (None, None):
                if res[1]:
                    res = res[0], getver(res[1])
                return res
    except IOError:
        log.error('cannot open %s', fpath)
def shebang2pyver(fpath):
    """Check file's shebang.

    :rtype: tuple
    :returns: pair of Python interpreter string and Python version
    """
    try:
        with open(fpath) as fp:
            data = fp.read(32)
            match = SHEBANG_RE.match(data)
            if not match:
                return None
            res = match.groups()
            if res != (None, None):
                if res[1]:
                    res = res[0], getver(res[1])
                return res
    except IOError:
        log.error('cannot open %s', fpath)
예제 #6
0
def guess_dependency(req, version=None):
    log.debug('trying to guess dependency for %s (python=%s)', req,
              vrepr(version) if version else None)
    if isinstance(version, basestring):
        version = getver(version)

    # some upstreams have weird ideas for distribution name...
    name, rest = re.compile('([^!><= \[]+)(.*)').match(req).groups()
    req = safe_name(name) + rest

    data = load()
    req_d = REQUIRES_RE.match(req)
    if not req_d:
        log.info('please ask dh_python2 author to fix REQUIRES_RE '
                 'or your upstream author to fix requires.txt')
        raise Exception('requirement is not valid: %s' % req)
    req_d = req_d.groupdict()
    name = req_d['name']
    details = data.get(name.lower())
    if details:
        for item in details:
            if version and version not in item.get('versions', version):
                # rule doesn't match version, try next one
                continue

            if not item['dependency']:
                return  # this requirement should be ignored
            if item['dependency'].endswith(')'):
                # no need to translate versions if version is hardcoded in
                # Debian dependency
                return item['dependency']
            if req_d['version'] and (item['standard'] or item['rules']) and\
               req_d['operator'] not in (None, '=='):
                v = _translate(req_d['version'], item['rules'],
                               item['standard'])
                return "%s (%s %s)" % (item['dependency'], req_d['operator'],
                                       v)
            else:
                return item['dependency']

    # try dpkg -S
    query = "'*/%s-?*\.egg-info'" % ci_regexp(
        safe_name(name))  # TODO: .dist-info
    if version:
        query = "%s | grep '/python%s/\|/pyshared/'" % \
                (query, vrepr(version))
    else:
        query = "%s | grep '/python2\../\|/pyshared/'" % query

    log.debug("invoking dpkg -S %s", query)
    process = Popen("/usr/bin/dpkg -S %s" % query, \
                    shell=True, stdout=PIPE, stderr=PIPE)
    stdout, stderr = process.communicate()
    if process.returncode == 0:
        result = set()
        for line in stdout.split('\n'):
            if not line.strip():
                continue
            result.add(line.split(':')[0])
        if len(result) > 1:
            log.error('more than one package name found for %s dist', name)
        else:
            return result.pop()
    else:
        log.debug('dpkg -S did not find package for %s: %s', name, stderr)

    # fall back to python-distname
    pname = sensible_pname(name)
    log.info(
        'Cannot find installed package that provides %s. '
        'Using %s as package name. Please add "%s correct_package_name" '
        'line to debian/pydist-overrides to override it if this is incorrect.',
        name, pname, safe_name(name))
    return pname
예제 #7
0
def guess_dependency(req, version=None):
    log.debug('trying to guess dependency for %s (python=%s)',
              req, vrepr(version) if version else None)
    if isinstance(version, basestring):
        version = getver(version)

    # some upstreams have weird ideas for distribution name...
    name, rest = re.compile('([^><= \[]+)(.*)').match(req).groups()
    req = safe_name(name) + rest

    data = load()
    req_dict = REQUIRES_RE.match(req)
    if not req_dict:
        log.info('please ask dh_python2 author to fix REQUIRES_RE '
                 'or your upstream author to fix requires.txt')
        raise Exception('requirement is not valid: %s' % req)
    req_dict = req_dict.groupdict()
    name = req_dict['name']
    details = data.get(name.lower())
    if details:
        for item in details:
            if version and version not in item.get('versions', version):
                # rule doesn't match version, try next one
                continue

            if not item['dependency']:
                return  # this requirement should be ignored
            if item['dependency'].endswith(')'):
                # no need to translate versions if version is hardcoded in Debian
                # dependency
                return item['dependency']
            if req_dict['version']:
                # FIXME: translate it (rules, versions)
                return item['dependency']
            else:
                return item['dependency']

    # try dpkg -S
    query = "'*/%s-?*\.egg-info'" % ci_regexp(safe_name(name))  # TODO: .dist-info
    if version:
        query = "%s | grep '/python%s/\|/pyshared/'" % \
                (query, vrepr(version))
    else:
        query = "%s | grep '/python2\../\|/pyshared/'" % query

    log.debug("invoking dpkg -S %s", query)
    process = Popen("/usr/bin/dpkg -S %s" % query, \
                    shell=True, stdout=PIPE, stderr=PIPE)
    stdout, stderr = process.communicate()
    if process.returncode == 0:
        result = set()
        for line in stdout.split('\n'):
            if not line.strip():
                continue
            result.add(line.split(':')[0])
        if len(result) > 1:
            log.error('more than one package name found for %s dist', name)
        else:
            return result.pop()
    else:
        log.debug('dpkg -S did not find package for %s: %s', name, stderr)

    # fall back to python-distname
    pname = sensible_pname(name)
    log.warn('Cannot find installed package that provides %s. '
             'Using %s as package name. Please add "%s correct_package_name" '
             'line to debian/pydist-overrides to override it if this is incorrect.',
             name, pname, safe_name(name))
    return pname