Esempio n. 1
0
    def run(self):
        changesets = self.get_hgmo_changesets()

        if not any(
                parse_revision_id(changeset["desc"]) is not None
                for changeset in changesets):
            logger.info(
                "None of the commits in the try push are linked to a Phabricator revision"
            )
            return

        self.retrieve_source_and_artifacts()

        reports = self.build_reports(only=[("all", "all")])
        logger.info("Built all covdir reports", nb=len(reports))

        # Retrieve the full report
        full_path = reports.get(("all", "all"))
        assert full_path is not None, "Missing full report (all:all)"
        report = json.load(open(full_path))

        # Upload coverage on phabricator
        self.upload_phabricator(report, changesets)

        # Index on Taskcluster
        self.index_task([
            "project.relman.code-coverage.{}.repo.try.{}".format(
                secrets[secrets.APP_CHANNEL], self.revision),
            "project.relman.code-coverage.{}.repo.try.latest".format(
                secrets[secrets.APP_CHANNEL]),
        ])
Esempio n. 2
0
def notify_email(revision, changesets, changesets_coverage):
    """
    Send an email to admins when low coverage for new commits is detected
    """
    notify_service = taskcluster_config.get_service("notify")

    content = ""
    for changeset in changesets:
        desc = changeset["desc"].split("\n")[0]

        if any(text in desc for text in ["r=merge", "a=merge"]):
            continue

        rev = changeset["node"]

        # Lookup changeset coverage from phabricator uploader
        rev_id = parse_revision_id(changeset["desc"])
        if rev_id is None:
            continue
        coverage = changesets_coverage.get(rev_id)
        if coverage is None:
            logger.warn("No coverage found", changeset=changeset)
            continue

        # Calc totals for all files
        covered = sum(c["lines_covered"] for c in coverage.values())
        added = sum(c["lines_added"] for c in coverage.values())

        if covered < 0.2 * added:
            content += "* [{}](https://firefox-code-coverage.herokuapp.com/#/changeset/{}): {} covered out of {} added.\n".format(
                desc, rev, covered, added
            )  # noqa

    if content == "":
        return
    elif len(content) > 102400:
        # Content is 102400 chars max
        content = content[:102000] + "\n\n... Content max limit reached!"

    for email in secrets[secrets.EMAIL_ADDRESSES]:
        notify_service.email(
            {
                "address": email,
                "subject": "Coverage patches for {}".format(revision),
                "content": content,
                "template": "fullscreen",
            }
        )

    return content
Esempio n. 3
0
def notify_email(revision, changesets, changesets_coverage):
    """
    Send an email to admins when low coverage for new commits is detected
    """
    notify_service = taskcluster_config.get_service("notify")

    content = ""
    for changeset in changesets:
        desc = changeset["desc"].split("\n")[0]

        # Lookup changeset coverage from phabricator uploader
        rev_id = parse_revision_id(changeset["desc"])
        if rev_id is None:
            continue
        coverage = changesets_coverage.get(changeset["node"])
        if coverage is None:
            logger.warn("No coverage found", changeset=changeset)
            continue

        # Calc totals for all files
        covered = sum(
            c["lines_covered"] + c["lines_unknown"] for c in coverage["paths"].values()
        )
        added = sum(c["lines_added"] for c in coverage["paths"].values())

        if covered < 0.4 * added:
            url = parse_revision_url(changeset["desc"])
            content += f"* [{desc}]({url}): {covered} covered out of {added} added.\n"

    if content == "":
        return
    elif len(content) > 102400:
        # Content is 102400 chars max
        content = content[:102000] + "\n\n... Content max limit reached!"

    for email in secrets[secrets.EMAIL_ADDRESSES]:
        notify_service.email(
            {
                "address": email,
                "subject": "Coverage patches for {}".format(revision),
                "content": content,
                "template": "fullscreen",
            }
        )

    return content
Esempio n. 4
0
    def go_from_trigger_try(self):
        phabricatorUploader = PhabricatorUploader(self.repo_dir, self.revision)

        with hgmo.HGMO(server_address=TRY_REPOSITORY) as hgmo_server:
            changesets = hgmo_server.get_automation_relevance_changesets(self.revision)

        if not any(
            parse_revision_id(changeset["desc"]) is not None for changeset in changesets
        ):
            logger.info(
                "None of the commits in the try push are linked to a Phabricator revision"
            )
            return

        self.retrieve_source_and_artifacts()

        report = self.generate_covdir()

        logger.info("Upload changeset coverage data to Phabricator")
        phabricatorUploader.upload(report, changesets)