Exemple #1
0
 def _getitem(self, cpv):
     path = pjoin(self.location, cpv)
     try:
         data = readlines_ascii(path, True, True, True)
         if data is None:
             raise KeyError(cpv)
         return self._parse_data(data, data.mtime)
     except (EnvironmentError, ValueError) as e:
         raise_from(errors.CacheCorruption(cpv, e))
Exemple #2
0
 def _getitem(self, cpv):
     path = pjoin(self.location, cpv)
     try:
         data = readlines_ascii(path, True, True, True)
         if data is None:
             raise KeyError(cpv)
         return self._parse_data(data, data.mtime)
     except (EnvironmentError, ValueError) as e:
         raise_from(errors.CacheCorruption(cpv, e))
Exemple #3
0
def _read_cache_file(package, cache_path):
    """Read an existing cache file."""
    stored_cache = {}
    cache_data = list(readlines_ascii(cache_path, True, True, False))
    if len(cache_data) >= 1:
        if cache_data[0] != CACHE_HEADER:
            logger.warning("plugin cache has a wrong header: %r, regenerating",
                           cache_data[0])
            cache_data = []
        else:
            cache_data = cache_data[1:]
    if not cache_data:
        return {}
    try:
        for line in cache_data:
            module, mtime, entries = line.split(':', 2)
            mtime = int(mtime)
            # Needed because ''.split(':') == [''], not []
            if not entries:
                entries = set()
            else:
                entries = entries.replace(':', ',').split(',')

                if not len(entries) % 3 == 0:
                    logger.error(
                        "failed reading cache %s; entries field isn't "
                        "divisable by 3: %r", cache_path, entries)
                    continue
                entries = iter(entries)

                def f(val):
                    if val.isdigit():
                        val = int(val)
                    return val

                entries = set(
                    _plugin_data(key, int(priority),
                                 f'{package.__name__}.{module}', f(target))
                    for (key, priority,
                         target) in zip(entries, entries, entries))
            stored_cache[(module, mtime)] = entries
    except IGNORED_EXCEPTIONS:
        raise
    except Exception as e:
        logger.warning("failed reading cache; exception %s, regenerating.", e)
        stored_cache.clear()

    return stored_cache
Exemple #4
0
def _read_mtime_cache(location):
    try:
        logger.debug("reading mtime cache at %r", (location,))
        d = {}
        for k, v in read_dict(readlines_ascii(location, True), splitter=None, source_isiter=True).iteritems():
            v = v.split()
            # mtime pkg1 fullver1 virtual1 pkg2 fullver2 virtual2...
            # if it's not the right length, skip this entry,
            # cache validation will update it.
            if (len(v) - 1) % 3 == 0:
                d[k] = v
        return d
    except IOError as e:
        if e.errno != errno.ENOENT:
            raise
        logger.debug("failed reading mtime cache at %r", (location,))
        return {}
Exemple #5
0
def _read_mtime_cache(location):
    try:
        logger.debug("reading mtime cache at %r", (location,))
        d = {}
        for k, v in read_dict(readlines_ascii(location, True), splitter=None,
            source_isiter=True).iteritems():
            v = v.split()
            # mtime pkg1 fullver1 virtual1 pkg2 fullver2 virtual2...
            # if it's not the right length, skip this entry,
            # cache validation will update it.
            if (len(v) -1) % 3 == 0:
                d[k] = v
        return d
    except IOError as e:
        if e.errno != errno.ENOENT:
            raise
        logger.debug("failed reading mtime cache at %r", (location,))
        return {}
Exemple #6
0
    def _atoms(self):
        try:
            s = set()
            for x in readlines_ascii(self.path, True):
                if not x or x.startswith("#"):
                    continue
                elif x.startswith("@"):
                    if self.error_on_subsets:
                        raise ValueError(
                            "set %s isn't a valid atom in pkgset %r" %
                            (x, self.path))
                    logger.warning(
                        "set item %r found in pkgset %r: it will be "
                        "wiped on update since portage/pkgcore store set items "
                        "in a separate way", x[1:], self.path)
                    continue
                s.add(atom(x))
        except InvalidDependency as e:
            raise errors.ParsingError("parsing %r" % self.path,
                                      exception=e) from e

        return s