Changeset - 6b1e1437c026
[Not reviewed]
default
0 2 0
Thomas De Schampheleire - 11 years ago 2015-04-17 15:01:40
thomas.de.schampheleire@gmail.com
changeset status: set status to rejected if at least one reviewer rejected

Currently, a reject of a change by a reviewer does not affect the overall
status at all. A logical policy is to reject the change if at least one
reviewer rejects it.

Note: different repositories/organizations may require different policies
for the overall status. Currently, the policies for approve/reject are
fixed. A possible improvement is to provide several alternative
policies and allow selecting the policy per instance or per repo.
2 files changed with 8 insertions and 5 deletions:
0 comments (0 inline, 0 general)
kallithea/model/changeset_status.py
Show inline comments
 
@@ -60,33 +60,36 @@ class ChangesetStatusModel(BaseModel):
 
            q = q.filter(ChangesetStatus.revision == revision)
 
        elif pull_request:
 
            pull_request = self.__get_pull_request(pull_request)
 
            q = q.filter(ChangesetStatus.pull_request == pull_request)
 
        else:
 
            raise Exception('Please specify revision or pull_request')
 
        q = q.order_by(ChangesetStatus.version.asc())
 
        return q
 

	
 
    def _calculate_status(self, statuses):
 
        """
 
        Given a list of statuses, calculate the resulting status, according to
 
        the policy: approve if consensus.
 
        the policy: approve if consensus, reject when at least one reject.
 
        """
 

	
 
        if not statuses:
 
            return ChangesetStatus.STATUS_UNDER_REVIEW
 

	
 
        if all(st.status == ChangesetStatus.STATUS_APPROVED for st in statuses):
 
            return ChangesetStatus.STATUS_APPROVED
 

	
 
        if any(st.status == ChangesetStatus.STATUS_REJECTED for st in statuses):
 
            return ChangesetStatus.STATUS_REJECTED
 

	
 
        return ChangesetStatus.STATUS_UNDER_REVIEW
 

	
 
    def calculate_pull_request_result(self, pull_request):
 
        """
 
        Return a tuple (reviewers, pending reviewers, pull request status)
 
        Only approve and reject counts as valid votes.
 
        """
 

	
 
        # collect latest votes from all voters
 
        cs_statuses = dict()
 
        for st in reversed(self.get_statuses(pull_request.org_repo,
 
                                             pull_request=pull_request,
kallithea/tests/models/test_changeset_status.py
Show inline comments
 
@@ -15,24 +15,24 @@ class ChangesetStatusMock(object):
 

	
 
S = ChangesetStatusMock
 

	
 
class TestChangesetStatusCalculation(BaseTestCase):
 

	
 
    def setUp(self):
 
        self.m = ChangesetStatusModel()
 

	
 
    @parameterized.expand([
 
        ('empty list', STATUS_UNDER_REVIEW, []),
 
        ('approve', STATUS_APPROVED, [S(STATUS_APPROVED)]),
 
        ('approve2', STATUS_APPROVED, [S(STATUS_APPROVED), S(STATUS_APPROVED)]),
 
        ('approve_reject', STATUS_UNDER_REVIEW, [S(STATUS_APPROVED), S(STATUS_REJECTED)]),
 
        ('approve_reject', STATUS_REJECTED, [S(STATUS_APPROVED), S(STATUS_REJECTED)]),
 
        ('approve_underreview', STATUS_UNDER_REVIEW, [S(STATUS_APPROVED), S(STATUS_UNDER_REVIEW)]),
 
        ('approve_notreviewed', STATUS_UNDER_REVIEW, [S(STATUS_APPROVED), S(STATUS_NOT_REVIEWED)]),
 
        ('underreview', STATUS_UNDER_REVIEW, [S(STATUS_UNDER_REVIEW), S(STATUS_UNDER_REVIEW)]),
 
        ('reject', STATUS_UNDER_REVIEW, [S(STATUS_REJECTED)]),
 
        ('reject_underreview', STATUS_UNDER_REVIEW, [S(STATUS_REJECTED), S(STATUS_UNDER_REVIEW)]),
 
        ('reject_notreviewed', STATUS_UNDER_REVIEW, [S(STATUS_REJECTED), S(STATUS_NOT_REVIEWED)]),
 
        ('reject', STATUS_REJECTED, [S(STATUS_REJECTED)]),
 
        ('reject_underreview', STATUS_REJECTED, [S(STATUS_REJECTED), S(STATUS_UNDER_REVIEW)]),
 
        ('reject_notreviewed', STATUS_REJECTED, [S(STATUS_REJECTED), S(STATUS_NOT_REVIEWED)]),
 
        ('notreviewed', STATUS_UNDER_REVIEW, [S(STATUS_NOT_REVIEWED)]),
 
    ])
 
    def test_result(self, name, expected_result, statuses):
 
        result = self.m._calculate_status(statuses)
 
        self.assertEqual(result, expected_result)
0 comments (0 inline, 0 general)