Skip to content

Commit a021c14

Browse files
Dennis Webbgmlewis
Dennis Webb
authored andcommitted
Adds RequireCodeOwnerReviews to PullRequestReviewsEnforcement (#744)
GitHub.com support page about feature https://developer.github.com/v3/repos/branches/#update-branch-protection
1 parent 99750d1 commit a021c14

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

github/repos.go

+10
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,8 @@ type PullRequestReviewsEnforcement struct {
560560
DismissalRestrictions DismissalRestrictions `json:"dismissal_restrictions"`
561561
// Specifies if approved reviews are dismissed automatically, when a new commit is pushed.
562562
DismissStaleReviews bool `json:"dismiss_stale_reviews"`
563+
// RequireCodeOwnerReviews specifies if an approved review is required in pull requests including files with a designated code owner.
564+
RequireCodeOwnerReviews bool `json:"require_code_owner_reviews"`
563565
}
564566

565567
// PullRequestReviewsEnforcementRequest represents request to set the pull request review
@@ -570,6 +572,8 @@ type PullRequestReviewsEnforcementRequest struct {
570572
DismissalRestrictionsRequest *DismissalRestrictionsRequest `json:"dismissal_restrictions"`
571573
// Specifies if approved reviews can be dismissed automatically, when a new commit is pushed. (Required)
572574
DismissStaleReviews bool `json:"dismiss_stale_reviews"`
575+
// RequireCodeOwnerReviews specifies if an approved review is required in pull requests including files with a designated code owner.
576+
RequireCodeOwnerReviews bool `json:"require_code_owner_reviews"`
573577
}
574578

575579
// MarshalJSON implements the json.Marshaler interface.
@@ -579,18 +583,22 @@ func (req PullRequestReviewsEnforcementRequest) MarshalJSON() ([]byte, error) {
579583
newReq := struct {
580584
R []interface{} `json:"dismissal_restrictions"`
581585
D bool `json:"dismiss_stale_reviews"`
586+
O bool `json:"require_code_owner_reviews"`
582587
}{
583588
R: []interface{}{},
584589
D: req.DismissStaleReviews,
590+
O: req.RequireCodeOwnerReviews,
585591
}
586592
return json.Marshal(newReq)
587593
}
588594
newReq := struct {
589595
R *DismissalRestrictionsRequest `json:"dismissal_restrictions"`
590596
D bool `json:"dismiss_stale_reviews"`
597+
O bool `json:"require_code_owner_reviews"`
591598
}{
592599
R: req.DismissalRestrictionsRequest,
593600
D: req.DismissStaleReviews,
601+
O: req.RequireCodeOwnerReviews,
594602
}
595603
return json.Marshal(newReq)
596604
}
@@ -603,6 +611,8 @@ type PullRequestReviewsEnforcementUpdate struct {
603611
DismissalRestrictionsRequest *DismissalRestrictionsRequest `json:"dismissal_restrictions,omitempty"`
604612
// Specifies if approved reviews can be dismissed automatically, when a new commit is pushed. Can be omitted.
605613
DismissStaleReviews *bool `json:"dismiss_stale_reviews,omitempty"`
614+
// RequireCodeOwnerReviews specifies if an approved review is required in pull requests including files with a designated code owner.
615+
RequireCodeOwnerReviews bool `json:"require_code_owner_reviews,omitempty"`
606616
}
607617

608618
// AdminEnforcement represents the configuration to enforce required status checks for repository administrators.

github/repos_test.go

+11-6
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ func TestRepositoriesService_GetBranchProtection(t *testing.T) {
516516

517517
testMethod(t, r, "GET")
518518
testHeader(t, r, "Accept", mediaTypeProtectedBranchesPreview)
519-
fmt.Fprintf(w, `{"required_status_checks":{"strict":true,"contexts":["continuous-integration"]},"required_pull_request_reviews":{"dismissal_restrictions":{"users":[{"id":3,"login":"u"}],"teams":[{"id":4,"slug":"t"}]},"dismiss_stale_reviews":true},"enforce_admins":{"url":"/repos/o/r/branches/b/protection/enforce_admins","enabled":true},"restrictions":{"users":[{"id":1,"login":"u"}],"teams":[{"id":2,"slug":"t"}]}}`)
519+
fmt.Fprintf(w, `{"required_status_checks":{"strict":true,"contexts":["continuous-integration"]},"required_pull_request_reviews":{"dismissal_restrictions":{"users":[{"id":3,"login":"u"}],"teams":[{"id":4,"slug":"t"}]},"dismiss_stale_reviews":true,"require_code_owner_reviews":true},"enforce_admins":{"url":"/repos/o/r/branches/b/protection/enforce_admins","enabled":true},"restrictions":{"users":[{"id":1,"login":"u"}],"teams":[{"id":2,"slug":"t"}]}}`)
520520
})
521521

522522
protection, _, err := client.Repositories.GetBranchProtection(context.Background(), "o", "r", "b")
@@ -539,6 +539,7 @@ func TestRepositoriesService_GetBranchProtection(t *testing.T) {
539539
{Slug: String("t"), ID: Int(4)},
540540
},
541541
},
542+
RequireCodeOwnerReviews: true,
542543
},
543544
EnforceAdmins: &AdminEnforcement{
544545
URL: String("/repos/o/r/branches/b/protection/enforce_admins"),
@@ -589,7 +590,7 @@ func TestRepositoriesService_UpdateBranchProtection(t *testing.T) {
589590
t.Errorf("Request body = %+v, want %+v", v, input)
590591
}
591592
testHeader(t, r, "Accept", mediaTypeProtectedBranchesPreview)
592-
fmt.Fprintf(w, `{"required_status_checks":{"strict":true,"contexts":["continuous-integration"]},"required_pull_request_reviews":{"dismissal_restrictions":{"users":[{"id":3,"login":"uu"}],"teams":[{"id":4,"slug":"tt"}]},"dismiss_stale_reviews":true},"restrictions":{"users":[{"id":1,"login":"u"}],"teams":[{"id":2,"slug":"t"}]}}`)
593+
fmt.Fprintf(w, `{"required_status_checks":{"strict":true,"contexts":["continuous-integration"]},"required_pull_request_reviews":{"dismissal_restrictions":{"users":[{"id":3,"login":"uu"}],"teams":[{"id":4,"slug":"tt"}]},"dismiss_stale_reviews":true,"require_code_owner_reviews":true},"restrictions":{"users":[{"id":1,"login":"u"}],"teams":[{"id":2,"slug":"t"}]}}`)
593594
})
594595

595596
protection, _, err := client.Repositories.UpdateBranchProtection(context.Background(), "o", "r", "b", input)
@@ -612,6 +613,7 @@ func TestRepositoriesService_UpdateBranchProtection(t *testing.T) {
612613
{Slug: String("tt"), ID: Int(4)},
613614
},
614615
},
616+
RequireCodeOwnerReviews: true,
615617
},
616618
Restrictions: &BranchRestrictions{
617619
Users: []*User{
@@ -737,7 +739,7 @@ func TestRepositoriesService_GetPullRequestReviewEnforcement(t *testing.T) {
737739
mux.HandleFunc("/repos/o/r/branches/b/protection/required_pull_request_reviews", func(w http.ResponseWriter, r *http.Request) {
738740
testMethod(t, r, "GET")
739741
testHeader(t, r, "Accept", mediaTypeProtectedBranchesPreview)
740-
fmt.Fprintf(w, `{"dismissal_restrictions":{"users":[{"id":1,"login":"u"}],"teams":[{"id":2,"slug":"t"}]},"dismiss_stale_reviews":true}`)
742+
fmt.Fprintf(w, `{"dismissal_restrictions":{"users":[{"id":1,"login":"u"}],"teams":[{"id":2,"slug":"t"}]},"dismiss_stale_reviews":true,"require_code_owner_reviews":true}`)
741743
})
742744

743745
enforcement, _, err := client.Repositories.GetPullRequestReviewEnforcement(context.Background(), "o", "r", "b")
@@ -755,6 +757,7 @@ func TestRepositoriesService_GetPullRequestReviewEnforcement(t *testing.T) {
755757
{Slug: String("t"), ID: Int(2)},
756758
},
757759
},
760+
RequireCodeOwnerReviews: true,
758761
}
759762

760763
if !reflect.DeepEqual(enforcement, want) {
@@ -782,7 +785,7 @@ func TestRepositoriesService_UpdatePullRequestReviewEnforcement(t *testing.T) {
782785
t.Errorf("Request body = %+v, want %+v", v, input)
783786
}
784787
testHeader(t, r, "Accept", mediaTypeProtectedBranchesPreview)
785-
fmt.Fprintf(w, `{"dismissal_restrictions":{"users":[{"id":1,"login":"u"}],"teams":[{"id":2,"slug":"t"}]},"dismiss_stale_reviews":true}`)
788+
fmt.Fprintf(w, `{"dismissal_restrictions":{"users":[{"id":1,"login":"u"}],"teams":[{"id":2,"slug":"t"}]},"dismiss_stale_reviews":true,"require_code_owner_reviews":true}`)
786789
})
787790

788791
enforcement, _, err := client.Repositories.UpdatePullRequestReviewEnforcement(context.Background(), "o", "r", "b", input)
@@ -800,6 +803,7 @@ func TestRepositoriesService_UpdatePullRequestReviewEnforcement(t *testing.T) {
800803
{Slug: String("t"), ID: Int(2)},
801804
},
802805
},
806+
RequireCodeOwnerReviews: true,
803807
}
804808
if !reflect.DeepEqual(enforcement, want) {
805809
t.Errorf("Repositories.UpdatePullRequestReviewEnforcement returned %+v, want %+v", enforcement, want)
@@ -814,7 +818,7 @@ func TestRepositoriesService_DisableDismissalRestrictions(t *testing.T) {
814818
testMethod(t, r, "PATCH")
815819
testHeader(t, r, "Accept", mediaTypeProtectedBranchesPreview)
816820
testBody(t, r, `{"dismissal_restrictions":[]}`+"\n")
817-
fmt.Fprintf(w, `{"dismissal_restrictions":{"users":[],"teams":[]},"dismiss_stale_reviews":true}`)
821+
fmt.Fprintf(w, `{"dismissal_restrictions":{"users":[],"teams":[]},"dismiss_stale_reviews":true,"require_code_owner_reviews":true}`)
818822
})
819823

820824
enforcement, _, err := client.Repositories.DisableDismissalRestrictions(context.Background(), "o", "r", "b")
@@ -828,6 +832,7 @@ func TestRepositoriesService_DisableDismissalRestrictions(t *testing.T) {
828832
Users: []*User{},
829833
Teams: []*Team{},
830834
},
835+
RequireCodeOwnerReviews: true,
831836
}
832837
if !reflect.DeepEqual(enforcement, want) {
833838
t.Errorf("Repositories.DisableDismissalRestrictions returned %+v, want %+v", enforcement, want)
@@ -923,7 +928,7 @@ func TestPullRequestReviewsEnforcementRequest_MarshalJSON_nilDismissalRestirctio
923928
t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned error: %v", err)
924929
}
925930

926-
want := `{"dismissal_restrictions":[],"dismiss_stale_reviews":false}`
931+
want := `{"dismissal_restrictions":[],"dismiss_stale_reviews":false,"require_code_owner_reviews":false}`
927932
if want != string(json) {
928933
t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned %+v, want %+v", string(json), want)
929934
}

0 commit comments

Comments
 (0)