def parse_dataset_info(dataset, info, overwrite=True):
    """Parses the info returned by :meth:`DatasetImporter.get_dataset_info` and
    stores it on the relevant properties of the dataset.

    Args:
        dataset: a :class:`fiftyone.core.dataset.Dataset`
        info: an info dict
        overwrite (True): whether to overwrite existing dataset info fields
    """
    tags = info.pop("tags", None)
    if tags:
        _update_no_overwrite(dataset.tags, tags)

    description = info.pop("description", None)
    if description:
        if overwrite or not dataset.description:
            dataset.description = str(description)

    classes = info.pop("classes", None)
    if classes:
        if isinstance(classes, dict):
            if overwrite:
                dataset.classes.update(classes)
            else:
                _update_no_overwrite(dataset.classes, classes)
        elif isinstance(classes, list):
            if overwrite or not dataset.default_classes:
                dataset.default_classes = classes

    default_classes = info.pop("default_classes", None)
    if default_classes:
        if overwrite or not dataset.default_classes:
            dataset.default_classes = default_classes

    mask_targets = info.pop("mask_targets", None)
    if mask_targets:
        mask_targets = dataset._parse_mask_targets(mask_targets)
        if overwrite:
            dataset.mask_targets.update(mask_targets)
        else:
            _update_no_overwrite(dataset.mask_targets, mask_targets)

    default_mask_targets = info.pop("default_mask_targets", None)
    if default_mask_targets:
        if overwrite or not dataset.default_mask_targets:
            dataset.default_mask_targets = dataset._parse_default_mask_targets(
                default_mask_targets
            )

    skeletons = info.pop("skeletons", None)
    if skeletons:
        skeletons = dataset._parse_skeletons(skeletons)
        if overwrite:
            dataset.skeletons.update(skeletons)
        else:
            _update_no_overwrite(dataset.skeletons, skeletons)

    default_skeleton = info.pop("default_skeleton", None)
    if default_skeleton:
        if overwrite or not dataset.default_skeleton:
            dataset.default_skeleton = dataset._parse_default_skeleton(
                default_skeleton
            )

    app_config = info.pop("app_config", None)

    if app_config is not None:
        try:
            app_config = foo.DatasetAppConfig.from_dict(
                app_config,
                extended=True,
            )
        except Exception as e:
            app_config = None
            logger.warning("Failed to parse app_config: %s", e)

    if app_config is not None:
        dataset.app_config.merge(app_config, overwrite=overwrite)

    if overwrite:
        dataset.info.update(info)
    else:
        _update_no_overwrite(dataset.info, info)

    dataset.save()
Parses the info returned by :meth:`DatasetImporter.get_dataset_info` and
    stores it on the relevant properties of the dataset.

    Args:
        dataset: a :class:`fiftyone.core.dataset.Dataset`
        info: an info dict
        overwrite (True): whether to overwrite existing dataset info fields
    
fiftyone/utils/data/importers.py