Ejemplo n.º 1
0
    def _unpack_metadata(self):

        dir_path = self.settings['PORTAGE_BUILDDIR']

        infloc = self._infloc
        pkg = self.pkg
        pkg_path = self._pkg_path

        dir_mode = 0o755
        for mydir in (dir_path, self._image_dir, infloc):
            portage.util.ensure_dirs(mydir,
                                     uid=portage.data.portage_uid,
                                     gid=portage.data.portage_gid,
                                     mode=dir_mode)

        # This initializes PORTAGE_LOG_FILE.
        portage.prepare_build_dirs(self.settings["ROOT"], self.settings, 1)
        self._writemsg_level(">>> Extracting info\n")

        yield self._bintree.dbapi.unpack_metadata(self.settings, infloc)
        check_missing_metadata = ("CATEGORY", "PF")
        for k, v in zip(
                check_missing_metadata,
                self._bintree.dbapi.aux_get(self.pkg.cpv,
                                            check_missing_metadata)):
            if v:
                continue
            elif k == "CATEGORY":
                v = pkg.category
            elif k == "PF":
                v = pkg.pf
            else:
                continue

            f = io.open(_unicode_encode(os.path.join(infloc, k),
                                        encoding=_encodings['fs'],
                                        errors='strict'),
                        mode='w',
                        encoding=_encodings['content'],
                        errors='backslashreplace')
            try:
                f.write(_unicode_decode(v + "\n"))
            finally:
                f.close()

        # Store the md5sum in the vdb.
        if pkg_path is not None:
            md5sum, = self._bintree.dbapi.aux_get(self.pkg.cpv, ['MD5'])
            if not md5sum:
                md5sum = portage.checksum.perform_md5(pkg_path)
            with io.open(_unicode_encode(os.path.join(infloc, 'BINPKGMD5'),
                                         encoding=_encodings['fs'],
                                         errors='strict'),
                         mode='w',
                         encoding=_encodings['content'],
                         errors='strict') as f:
                f.write(_unicode_decode('{}\n'.format(md5sum)))

        env_extractor = BinpkgEnvExtractor(background=self.background,
                                           scheduler=self.scheduler,
                                           settings=self.settings)
        env_extractor.start()
        yield env_extractor.async_wait()
        if env_extractor.returncode != os.EX_OK:
            raise portage.exception.PortageException(
                'failed to extract environment for {}'.format(self.pkg.cpv))