def pyremove(interpreter, package, vrange): """Remove public modules listed in pkg.pyremove file.""" srcfpath = "./debian/%s.pyremove" % package if not exists(srcfpath): return impl = interpreter.impl versions = get_requested_versions(impl, vrange) for line in open(srcfpath, encoding='utf-8'): if not line or line.startswith('#'): continue details = REMOVE_RE.match(line) if not details: raise ValueError("unrecognized line: %s: %s" % (package, line)) details = details.groupdict() myvers = versions & get_requested_versions(impl, details['vrange']) if not myvers: log.debug('%s.pyremove: no matching versions for line %s', package, line) for version in myvers: site_dirs = interpreter.old_sitedirs(package, version) site_dirs.append(interpreter.sitedir(package, version)) for sdir in site_dirs: files = glob(sdir + '/' + details['pattern']) for fpath in files: if isdir(fpath): rmtree(fpath) else: os.remove(fpath)
def pyinstall(interpreter, package, vrange): """Install local files listed in pkg.pyinstall files as public modules.""" srcfpath = "./debian/%s.pyinstall" % package if not exists(srcfpath): return impl = interpreter.impl versions = get_requested_versions(impl, vrange) for line in open(srcfpath, encoding='utf-8'): if not line or line.startswith('#'): continue details = INSTALL_RE.match(line) if not details: raise ValueError("unrecognized line: %s" % line) details = details.groupdict() if details['module']: details['module'] = details['module'].replace('.', '/') myvers = versions & get_requested_versions(impl, details['vrange']) if not myvers: log.debug('%s.pyinstall: no matching versions for line %s', package, line) continue files = glob(details['pattern']) if not files: raise ValueError("missing file(s): %s" % details['pattern']) for fpath in files: fpath = fpath.lstrip('/.') if details['module']: dstname = join(details['module'], split(fpath)[1]) elif fpath.startswith('debian/'): dstname = fpath[7:] else: dstname = fpath for version in myvers: dstfpath = join(interpreter.sitedir(package, version), dstname) dstdir = split(dstfpath)[0] if not exists(dstdir): os.makedirs(dstdir) if exists(dstfpath): os.remove(dstfpath) os.link(fpath, dstfpath)
def load(impl): """Load iformation about installed Python distributions. :param impl: interpreter implementation, f.e. cpython2, cpython3, pypy :type impl: str """ fname = PYDIST_OVERRIDES_FNAMES.get(impl) if exists(fname): to_check = [fname] # first one! else: to_check = [] dname = PYDIST_DIRS.get(impl) if isdir(dname): to_check.extend(join(dname, i) for i in os.listdir(dname)) fbname = '/usr/share/dh-python/dist/{}_fallback'.format(impl) if exists(fbname): # fall back generated at dh-python build time to_check.append(fbname) # last one! result = {} for fpath in to_check: with open(fpath, encoding='utf-8') as fp: for line in fp: line = line.strip('\r\n') if line.startswith('#') or not line: continue dist = PYDIST_RE.search(line) if not dist: raise Exception('invalid pydist line: %s (in %s)' % (line, fpath)) dist = dist.groupdict() name = safe_name(dist['name']) dist['versions'] = get_requested_versions(impl, dist['vrange']) dist['dependency'] = dist['dependency'].strip() if dist['rules']: dist['rules'] = dist['rules'].split(';') else: dist['rules'] = [] result.setdefault(name, []).append(dist) return result