def create_review(conduit, branch):
    branch.verify_review_branch_base()

    # TODO: we should also cc other users on the branch
    # TODO: if there are emails that don't match up to users then we should
    #       note that on the review and perhaps use the mailer to notify them
    name, email, user, phid = abdt_conduitgit.getPrimaryUserDetailsFromBranch(
        conduit, branch)

    _LOGGER.debug("- author: {}".format(user))

    user_warnings = []

    message = branch.get_commit_message_from_tip()
    parsed = conduit.parse_commit_message(message)

    d = phlcon_differential
    if parsed.errors:
        error_list = phlcon_differential.parse_commit_message_errors(
            parsed.errors)
        for error in error_list:
            if isinstance(error, d.ParseCommitMessageNoTestPlanFail):
                parsed.fields["testPlan"] = _DEFAULT_TEST_PLAN
                user_warnings.append(
                    abdt_userwarning.UsedDefaultTestPlan(_DEFAULT_TEST_PLAN))
            elif isinstance(error, d.ParseCommitMessageUnknownReviewerFail):
                user_warnings.append(
                    abdt_userwarning.UnknownReviewers(
                        error.user_list, message))
            else:
                raise abdt_exception.CommitMessageParseException(
                    errors=parsed.errors,
                    fields=parsed.fields,
                    digest=branch.make_message_digest())

    # remove the author from reviewer list if present
    reviewer_phids_key = phlcon_differential.MessageFields.reviewer_phids
    if reviewer_phids_key in parsed.fields:
        reviewer_phids = parsed.fields[reviewer_phids_key]
        if phid in reviewer_phids:
            reviewer_phids.remove(phid)
            user_warnings.append(abdt_userwarning.SelfReviewer(user, message))

    diff_result = branch.make_raw_diff()
    raw_diff = diff_result.diff

    if not raw_diff:
        raise abdt_exception.AbdUserException("no difference to review")

    if diff_result.reduction_list:
        user_warnings.append(abdt_userwarning.LargeDiff(diff_result))

    revisionid = create_differential_review(
        conduit, user, parsed, branch, raw_diff)

    commenter = abdcmnt_commenter.Commenter(conduit, revisionid)

    if user_warnings:
        commenter.userWarnings(user_warnings)
    def test_D_DistinguishParseErrors(self):
        not_a_username1 = "NOTAUSER1_test_D_DistinguishParseErrors"
        not_a_username2 = "NOTAUSER2_test_D_DistinguishParseErrors"

        title = ""
        summary = ""
        test_plan = ""
        unknown_reviewers = [not_a_username1, not_a_username2, phldef_conduit.NOTAUSER.user]
        reviewers = [phldef_conduit.ALICE.user]

        message = self._make_commit_message(title, summary, test_plan, reviewers + unknown_reviewers)

        parsed = phlcon_differential.parse_commit_message(self.conduit, message)

        parsed_errors = phlcon_differential.parse_commit_message_errors(parsed.errors)

        self.assertEqual(parsed.fields["title"], title)
        self.assertEqual(parsed.fields["summary"], summary)
        self.assertEqual(parsed.fields["testPlan"], test_plan)
        self.assertListEqual(parsed.fields["reviewerPHIDs"], [])

        def all_are_instance_of(item_list, kind):
            return all([isinstance(x, kind) for x in item_list])

        def only_one_is_instance_of(item_list, kind):
            # iterate to the first one and then make sure there are no others
            i = iter([isinstance(x, kind) for x in item_list])
            return any(i) and not any(i)

        self.assertTrue(all_are_instance_of(parsed_errors, phlcon_differential.ParseCommitMessageFail))

        self.assertTrue(only_one_is_instance_of(parsed_errors, phlcon_differential.ParseCommitMessageNoTestPlanFail))

        self.assertTrue(
            only_one_is_instance_of(parsed_errors, phlcon_differential.ParseCommitMessageUnknownReviewerFail)
        )

        self.assertTrue(only_one_is_instance_of(parsed_errors, phlcon_differential.ParseCommitMessageUnknownFail))

        UnkReviewer = phlcon_differential.ParseCommitMessageUnknownReviewerFail
        did_test = False
        for error in parsed_errors:
            if isinstance(error, UnkReviewer):
                self.assertSetEqual(set(error.user_list), set(unknown_reviewers))
                did_test = True

        self.assertTrue(did_test)
def create_review(conduit, branch, plugin_manager):
    plugin_manager.hook(
        "before_create_review",
        {"conduit": conduit, "branch": branch})

    branch.verify_review_branch_base()

    # TODO: we should also cc other users on the branch
    # TODO: if there are emails that don't match up to users then we should
    #       note that on the review and perhaps use the mailer to notify them
    name, email, user, phid = abdt_conduitgit.getPrimaryUserDetailsFromBranch(
        conduit, branch)

    print "- author: " + user

    user_warnings = []

    message = branch.get_commit_message_from_tip()
    parsed = conduit.parse_commit_message(message)

    d = phlcon_differential
    if parsed.errors:
        error_list = phlcon_differential.parse_commit_message_errors(
            parsed.errors)
        for error in error_list:
            if isinstance(error, d.ParseCommitMessageNoTestPlanFail):
                parsed.fields["testPlan"] = _DEFAULT_TEST_PLAN
                user_warnings.append(
                    abdt_userwarning.UsedDefaultTestPlan(_DEFAULT_TEST_PLAN))
            elif isinstance(error, d.ParseCommitMessageUnknownReviewerFail):
                user_warnings.append(
                    abdt_userwarning.UnknownReviewers(
                        error.user_list, message))
            else:
                raise abdt_exception.CommitMessageParseException(
                    errors=parsed.errors,
                    fields=parsed.fields,
                    digest=branch.make_message_digest())

    # remove the author from reviewer list if present
    reviewer_phids_key = phlcon_differential.MessageFields.reviewer_phids
    if reviewer_phids_key in parsed.fields:
        reviewer_phids = parsed.fields[reviewer_phids_key]
        if phid in reviewer_phids:
            reviewer_phids.remove(phid)
            user_warnings.append(abdt_userwarning.SelfReviewer(user, message))

    rawDiff = branch.make_raw_diff()

    if not rawDiff:
        raise abdt_exception.AbdUserException("no difference to review")

    revisionid = create_differential_review(
        conduit, user, parsed, branch, rawDiff)

    commenter = abdcmnt_commenter.Commenter(conduit, revisionid)

    if user_warnings:
        commenter.userWarnings(user_warnings)

    plugin_manager.hook(
        "after_create_review",
        {"parsed": parsed, "conduit": conduit, "branch": branch,
            "rawDiff": rawDiff, "commenter": commenter}
    )

    abdt_logging.on_review_event(
        'createrev', '{} created {} from {}'.format(
            user, revisionid, branch.review_branch_name()))
示例#4
0
    def test_D_DistinguishParseErrors(self):
        not_a_username1 = 'NOTAUSER1_test_D_DistinguishParseErrors'
        not_a_username2 = 'NOTAUSER2_test_D_DistinguishParseErrors'

        title = ""
        summary = ""
        test_plan = ""
        unknown_reviewers = [
            not_a_username1,
            not_a_username2,
            phldef_conduit.NOTAUSER.user]
        reviewers = [phldef_conduit.ALICE.user]

        message = self._make_commit_message(
            title, summary, test_plan, reviewers + unknown_reviewers)

        parsed = phlcon_differential.parse_commit_message(
            self.conduit, message)

        parsed_errors = phlcon_differential.parse_commit_message_errors(
            parsed.errors)

        self.assertEqual(parsed.fields["title"], title)
        self.assertEqual(parsed.fields["summary"], summary)
        self.assertEqual(parsed.fields["testPlan"], test_plan)
        self.assertListEqual(parsed.fields["reviewerPHIDs"], [])

        def all_are_instance_of(item_list, kind):
            return all([isinstance(x, kind) for x in item_list])

        def only_one_is_instance_of(item_list, kind):
            # iterate to the first one and then make sure there are no others
            i = iter([isinstance(x, kind) for x in item_list])
            return any(i) and not any(i)

        self.assertTrue(
            all_are_instance_of(
                parsed_errors,
                phlcon_differential.ParseCommitMessageFail))

        self.assertTrue(
            only_one_is_instance_of(
                parsed_errors,
                phlcon_differential.ParseCommitMessageNoTestPlanFail))

        self.assertTrue(
            only_one_is_instance_of(
                parsed_errors,
                phlcon_differential.ParseCommitMessageUnknownReviewerFail))

        self.assertTrue(
            only_one_is_instance_of(
                parsed_errors,
                phlcon_differential.ParseCommitMessageUnknownFail))

        UnkReviewer = phlcon_differential.ParseCommitMessageUnknownReviewerFail
        did_test = False
        for error in parsed_errors:
            if isinstance(error, UnkReviewer):
                self.assertSetEqual(
                    set(error.user_list), set(unknown_reviewers))
                did_test = True

        self.assertTrue(did_test)
示例#5
0
def create_review(conduit, branch):
    branch.verify_review_branch_base()

    # TODO: we should also cc other users on the branch
    # TODO: if there are emails that don't match up to users then we should
    #       note that on the review and perhaps use the mailer to notify them
    name, email, user, phid = abdt_conduitgit.getPrimaryUserDetailsFromBranch(
        conduit, branch)

    _LOGGER.debug("- author: {}".format(user))

    user_warnings = []

    message = branch.get_commit_message_from_tip()

    try:
        parsed = conduit.parse_commit_message(message)
    except phlcon_differential.UnknownParseCommitMessageResponseError as e:
        raise abdt_exception.CommitMessageParseException(errors=[e],
                                                         fields=[],
                                                         digest=message)

    d = phlcon_differential
    if parsed.errors:
        error_list = phlcon_differential.parse_commit_message_errors(
            parsed.errors)
        for error in error_list:
            if isinstance(error, d.ParseCommitMessageNoTestPlanFail):
                parsed.fields["testPlan"] = _DEFAULT_TEST_PLAN
                user_warnings.append(
                    abdt_userwarning.UsedDefaultTestPlan(_DEFAULT_TEST_PLAN))
            elif isinstance(error, d.ParseCommitMessageUnknownReviewerFail):
                user_warnings.append(
                    abdt_userwarning.UnknownReviewers(error.user_list,
                                                      message))
            else:
                raise abdt_exception.CommitMessageParseException(
                    errors=parsed.errors,
                    fields=parsed.fields,
                    digest=branch.make_message_digest())

    # remove the author from reviewer list if present
    reviewer_phids_key = phlcon_differential.MessageFields.reviewer_phids
    if reviewer_phids_key in parsed.fields:
        reviewer_phids = parsed.fields[reviewer_phids_key]
        if phid in reviewer_phids:
            reviewer_phids.remove(phid)
            user_warnings.append(abdt_userwarning.SelfReviewer(user, message))

    diff_result = branch.make_raw_diff()
    raw_diff = diff_result.diff

    if not raw_diff:
        raise abdt_exception.AbdUserException("no difference to review")

    if diff_result.reduction_list:
        user_warnings.append(abdt_userwarning.LargeDiff(diff_result))

    revisionid = create_differential_review(conduit, user, parsed, branch,
                                            raw_diff)

    commenter = abdcmnt_commenter.Commenter(conduit, revisionid)

    if user_warnings:
        commenter.userWarnings(user_warnings)