def get_modified_deliverable_file_content(reporoot, filenames):
    # Determine which deliverable files to process by taking our
    # command line arguments or by scanning the git repository
    # for the most recent change.
    deliverable_files = filenames
    if not deliverable_files:
        deliverable_files = find_modified_deliverable_files(
            reporoot
        )

    for basename in deliverable_files:
        filename = os.path.join(reporoot, basename)
        if not os.path.exists(filename):
            # The file must have been deleted, skip it.
            continue
        with open(filename, 'r') as f:
            deliverable_data = yaml.load(f.read())

        # Determine where to send email announcements of
        # releases. Default to the development list, to cut down on
        # excessive emails to the announcement list.
        send_announcements_to = deliverable_data.get(
            'send-announcements-to',
            'openstack-dev@lists.openstack.org',
        )

        # Determine whether announcements should include a PyPI
        # link. Default to no, for service projects, because it is
        # less irksome to fail to include a link to a thing that
        # exists than to link to something that does not.
        include_pypi_link = deliverable_data.get(
            'include-pypi-link',
            False,
        )
        include_pypi_link = 'yes' if include_pypi_link else 'no'

        # The series name is part of the filename, rather than the file
        # body. That causes release.sh to be called with series="_independent"
        # for release:independent projects, and release.sh to use master branch
        # to evaluate fixed bugs.
        series_name = os.path.basename(
            os.path.dirname(os.path.abspath(filename))
        ).lstrip('_')
        deliverable_name = os.path.splitext(os.path.basename(filename))[0]

        all_versions = {
            rel['version']: rel for rel in deliverable_data['releases']
        }
        version = deliverable_data['releases'][-1]['version']
        this_version = all_versions[version]
        final_versions = [
            r['version']
            for r in deliverable_data['releases']
            if not PRE_RELEASE_RE.search(r['version'])
        ]
        first_full_release = 'yes' if (
            final_versions and
            this_version['version'] == final_versions[0]
        ) else 'no'
        for project in this_version['projects']:
            yield (deliverable_name, series_name, version,
                   project['repo'], project['hash'],
                   send_announcements_to,
                   include_pypi_link,
                   first_full_release)
Return a sequence of tuples containing the new versions.
dataset/ETHPy150Open openstack-infra/release-tools/list_deliverable_changes.py/get_modified_deliverable_file_content