示例#1
0
def _migrate_full_metadata(cache, out):
    # Fix for https://github.com/conan-io/conan/issues/4898
    out.warn("Running a full revision metadata migration")
    refs = _get_refs(cache)
    for ref in refs:
        try:
            base_folder = os.path.normpath(
                os.path.join(cache.store, ref.dir_repr()))
            layout = PackageCacheLayout(base_folder=base_folder,
                                        ref=ref,
                                        short_paths=None,
                                        no_lock=True)
            with layout.update_metadata() as metadata:
                # Updating the RREV
                if metadata.recipe.revision is None:
                    out.warn(
                        "Package %s metadata had recipe revision None, migrating"
                        % str(ref))
                    folder = layout.export()
                    try:
                        manifest = FileTreeManifest.load(folder)
                        rrev = manifest.summary_hash
                    except Exception:
                        rrev = DEFAULT_REVISION_V1
                    metadata.recipe.revision = rrev

                prefs = _get_prefs(layout)
                existing_ids = [pref.id for pref in prefs]
                for pkg_id in list(metadata.packages.keys()):
                    if pkg_id not in existing_ids:
                        out.warn(
                            "Package %s metadata had stalled package information %s, removing"
                            % (str(ref), pkg_id))
                        del metadata.packages[pkg_id]
                # UPDATING PREVS
                for pref in prefs:
                    try:
                        pmanifest = FileTreeManifest.load(layout.package(pref))
                        prev = pmanifest.summary_hash
                    except Exception:
                        prev = DEFAULT_REVISION_V1
                    metadata.packages[pref.id].revision = prev
                    metadata.packages[
                        pref.id].recipe_revision = metadata.recipe.revision

        except Exception as e:
            raise ConanException(
                "Something went wrong while migrating metadata.json files "
                "in the cache, please try to fix the issue or wipe the cache: {}"
                ":{}".format(ref, e))
示例#2
0
 def setUp(self):
     ref = ConanFileReference.loads("lib/version@user/channel")
     self.package_layout = PackageCacheLayout(base_folder=temp_folder(),
                                              ref=ref,
                                              short_paths=False,
                                              no_lock=True)
     self.output = TestBufferConanOutput()
示例#3
0
 def package_layout(self, ref, short_paths=False):
     assert isinstance(ref,
                       ConanFileReference), "It is a {}".format(type(ref))
     check_ref_case(ref, self.store)
     base_folder = os.path.normpath(os.path.join(self.store,
                                                 ref.dir_repr()))
     return PackageCacheLayout(base_folder=base_folder,
                               ref=ref,
                               short_paths=short_paths)
示例#4
0
def _migrate_create_metadata(cache, out):
    out.warn("Migration: Generating missing metadata files")
    refs = _get_refs(cache)

    for ref in refs:
        try:
            base_folder = os.path.normpath(
                os.path.join(cache.store, ref.dir_repr()))
            # Force using a package cache layout for everything, we want to alter the cache,
            # not the editables
            layout = PackageCacheLayout(base_folder=base_folder,
                                        ref=ref,
                                        short_paths=False,
                                        no_lock=True)
            folder = layout.export()
            try:
                manifest = FileTreeManifest.load(folder)
                rrev = manifest.summary_hash
            except Exception:
                rrev = DEFAULT_REVISION_V1
            metadata_path = layout.package_metadata()
            if not os.path.exists(metadata_path):
                out.info("Creating {} for {}".format(PACKAGE_METADATA, ref))
                prefs = _get_prefs(layout)
                metadata = PackageMetadata()
                metadata.recipe.revision = rrev
                for pref in prefs:
                    try:
                        pmanifest = FileTreeManifest.load(layout.package(pref))
                        prev = pmanifest.summary_hash
                    except Exception:
                        prev = DEFAULT_REVISION_V1
                    metadata.packages[pref.id].revision = prev
                    metadata.packages[
                        pref.id].recipe_revision = metadata.recipe.revision
                save(metadata_path, metadata.dumps())
        except Exception as e:
            raise ConanException(
                "Something went wrong while generating the metadata.json files "
                "in the cache, please try to fix the issue or wipe the cache: {}"
                ":{}".format(ref, e))
    out.success("Migration: Generating missing metadata files finished OK!\n")
示例#5
0
 def package_layout(self, ref, short_paths=None, *args, **kwargs):
     assert isinstance(ref, ConanFileReference), "It is a {}".format(type(ref))
     edited_ref = self.editable_packages.get(ref.copy_clear_rev())
     if edited_ref:
         base_path = edited_ref["path"]
         layout_file = edited_ref["layout"]
         return PackageEditableLayout(base_path, layout_file, ref)
     else:
         check_ref_case(ref, self.store)
         base_folder = os.path.normpath(os.path.join(self.store, ref.dir_repr()))
         return PackageCacheLayout(base_folder=base_folder, ref=ref,
                                   short_paths=short_paths, no_lock=self._no_locks())