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()))
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): 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)