Repository: google/go-github
Pull request #2210 (2021-11-26 09:20:16)

Add CodeScanningService.ListAnalysesForRepo and CodeScanningService.GetAnalysis
Add ListAnalysesForRepo and GetAnalysis to CodeScanningService, including unit tests. 

yogur: I just submitted a CLA. 
yogur: I noticed that most of the unit tests are prefixed with "TestActionsService", shouldn't these unit tests be prefixed with "TestCodeScanningService" instead?
codecov[bot]: # [Codecov](https://codecov.io/gh/google/go-github/pull/2210?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google) Report
> Merging [#2210](https://codecov.io/gh/google/go-github/pull/2210?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google) (94bbbe0) into [master](https://codecov.io/gh/google/go-github/commit/b26fa8ff6da0e93d614db1aa55aabb7256fcdcf9?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google) (b26fa8f) will **increase** coverage by `0.00%`.
> The diff coverage is `100.00%`.

[![Impacted file tree graph](https://codecov.io/gh/google/go-github/pull/2210/graphs/tree.svg?width=650&height=150&src=pr&token=EgYjGjZlI0&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google)](https://codecov.io/gh/google/go-github/pull/2210?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google)

```diff
@@           Coverage Diff           @@
##           master    #2210   +/-   ##
=======================================
  Coverage   97.79%   97.80%           
=======================================
  Files         112      112           
  Lines       10036    10073   +37     
=======================================
+ Hits         9815     9852   +37     
  Misses        154      154           
  Partials       67       67           
```


| [Impacted Files](https://codecov.io/gh/google/go-github/pull/2210?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google) | Coverage Δ | |
|---|---|---|
| [github/code-scanning.go](https://codecov.io/gh/google/go-github/pull/2210/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google#diff-Z2l0aHViL2NvZGUtc2Nhbm5pbmcuZ28=) | `100.00% <100.00%> (ø)` | |
| [github/actions\_workflow\_runs.go](https://codecov.io/gh/google/go-github/pull/2210/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google#diff-Z2l0aHViL2FjdGlvbnNfd29ya2Zsb3dfcnVucy5nbw==) | `100.00% <0.00%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/google/go-github/pull/2210?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/google/go-github/pull/2210?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google). Last update [b26fa8f...94bbbe0](https://codecov.io/gh/google/go-github/pull/2210?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=google).

gmlewis: > I noticed that most of the unit tests are prefixed with "TestActionsService", shouldn't these unit tests be prefixed with "TestCodeScanningService" instead?

Good catch!  Yes indeed, these should be changed.  Would you mind addressing these changes in this PR?
Thank you, @yogur !

@googlebot rescan.
yogur: > > I noticed that most of the unit tests are prefixed with "TestActionsService", shouldn't these unit tests be prefixed with "TestCodeScanningService" instead?
> 
> Good catch! Yes indeed, these should be changed. Would you mind addressing these changes in this PR? Thank you, @yogur !
> 
> @googlebot rescan.

@gmlewis No problem! I committed the name change. 

Patch:
diff --git a/README.md b/README.md
index 3e893a69..1eb9054c 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # go-github #
 
 [![go-github release (latest SemVer)](https://img.shields.io/github/v/release/google/go-github?sort=semver)](https://github.com/google/go-github/releases)
-[![GoDoc](https://img.shields.io/static/v1?label=godoc&message=reference&color=blue)](https://pkg.go.dev/github.com/google/go-github/v40/github)
+[![GoDoc](https://img.shields.io/static/v1?label=godoc&message=reference&color=blue)](https://pkg.go.dev/github.com/google/go-github/v41/github)
 [![Test Status](https://github.com/google/go-github/workflows/tests/badge.svg)](https://github.com/google/go-github/actions?query=workflow%3Atests)
 [![Test Coverage](https://codecov.io/gh/google/go-github/branch/master/graph/badge.svg)](https://codecov.io/gh/google/go-github)
 [![Discuss at go-github@googlegroups.com](https://img.shields.io/badge/discuss-go--github%40googlegroups.com-blue.svg)](https://groups.google.com/group/go-github)
@@ -24,7 +24,7 @@ If you're interested in using the [GraphQL API v4][], the recommended library is
 go-github is compatible with modern Go releases in module mode, with Go installed:
 
 ```bash
-go get github.com/google/go-github/v40
+go get github.com/google/go-github/v41
 ```
 
 will resolve and add the package to the current development module, along with its dependencies.
@@ -32,7 +32,7 @@ will resolve and add the package to the current development module, along with i
 Alternatively the same can be achieved if you use import in a package:
 
 ```go
-import "github.com/google/go-github/v40/github"
+import "github.com/google/go-github/v41/github"
 ```
 
 and run `go get` without parameters.
@@ -40,13 +40,13 @@ and run `go get` without parameters.
 Finally, to use the top-of-trunk version of this repo, use the following command:
 
 ```bash
-go get github.com/google/go-github/v40@master
+go get github.com/google/go-github/v41@master
 ```
 
 ## Usage ##
 
 ```go
-import "github.com/google/go-github/v40/github"	// with go modules enabled (GO111MODULE=on or outside GOPATH)
+import "github.com/google/go-github/v41/github"	// with go modules enabled (GO111MODULE=on or outside GOPATH)
 import "github.com/google/go-github/github" // with go modules disabled
 ```
 
@@ -246,7 +246,7 @@ For complete usage of go-github, see the full [package docs][].
 [oauth2]: https://github.com/golang/oauth2
 [oauth2 docs]: https://godoc.org/golang.org/x/oauth2
 [personal API token]: https://github.com/blog/1509-personal-api-tokens
-[package docs]: https://pkg.go.dev/github.com/google/go-github/v40/github
+[package docs]: https://pkg.go.dev/github.com/google/go-github/v41/github
 [GraphQL API v4]: https://developer.github.com/v4/
 [shurcooL/githubv4]: https://github.com/shurcooL/githubv4
 
diff --git a/example/appengine/app.go b/example/appengine/app.go
index 1415f0af..af65b223 100644
--- a/example/appengine/app.go
+++ b/example/appengine/app.go
@@ -12,7 +12,7 @@ import (
 	"net/http"
 	"os"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 	"golang.org/x/oauth2"
 	"google.golang.org/appengine"
 	"google.golang.org/appengine/log"
diff --git a/example/basicauth/main.go b/example/basicauth/main.go
index 8ad613f0..d98a3221 100644
--- a/example/basicauth/main.go
+++ b/example/basicauth/main.go
@@ -22,7 +22,7 @@ import (
 	"strings"
 	"syscall"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 	"golang.org/x/crypto/ssh/terminal"
 )
 
diff --git a/example/commitpr/main.go b/example/commitpr/main.go
index c82a05dd..af85d7b7 100644
--- a/example/commitpr/main.go
+++ b/example/commitpr/main.go
@@ -31,7 +31,7 @@ import (
 	"strings"
 	"time"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 	"golang.org/x/oauth2"
 )
 
diff --git a/example/migrations/main.go b/example/migrations/main.go
index 3f37b2ba..38be5727 100644
--- a/example/migrations/main.go
+++ b/example/migrations/main.go
@@ -12,7 +12,7 @@ import (
 	"context"
 	"fmt"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 	"golang.org/x/oauth2"
 )
 
diff --git a/example/newrepo/main.go b/example/newrepo/main.go
index cad89fac..318f09af 100644
--- a/example/newrepo/main.go
+++ b/example/newrepo/main.go
@@ -16,7 +16,7 @@ import (
 	"log"
 	"os"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 	"golang.org/x/oauth2"
 )
 
diff --git a/example/newreposecretwithlibsodium/go.mod b/example/newreposecretwithlibsodium/go.mod
index dc2a6ede..0f6d0640 100644
--- a/example/newreposecretwithlibsodium/go.mod
+++ b/example/newreposecretwithlibsodium/go.mod
@@ -4,6 +4,6 @@ go 1.15
 
 require (
 	github.com/GoKillers/libsodium-go v0.0.0-20171022220152-dd733721c3cb
-	github.com/google/go-github/v40 v40.0.0
+	github.com/google/go-github/v41 v41.0.0
 	golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
 )
diff --git a/example/newreposecretwithlibsodium/go.sum b/example/newreposecretwithlibsodium/go.sum
index 64499908..e791dfeb 100644
--- a/example/newreposecretwithlibsodium/go.sum
+++ b/example/newreposecretwithlibsodium/go.sum
@@ -86,8 +86,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-github/v40 v40.0.0 h1:oBPVDaIhdUmwDWRRH8XJ/dZG+Rn755i08+Hp1uJHlR0=
-github.com/google/go-github/v40 v40.0.0/go.mod h1:G8wWKTEjUCL0zdbaQvpwDk0hqf6KZgPQH+ssJa+/NVc=
+github.com/google/go-github/v41 v41.0.0 h1:oBPVDaIhdUmwDWRRH8XJ/dZG+Rn755i08+Hp1uJHlR0=
+github.com/google/go-github/v41 v41.0.0/go.mod h1:G8wWKTEjUCL0zdbaQvpwDk0hqf6KZgPQH+ssJa+/NVc=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
diff --git a/example/newreposecretwithlibsodium/main.go b/example/newreposecretwithlibsodium/main.go
index 080950d7..26149988 100644
--- a/example/newreposecretwithlibsodium/main.go
+++ b/example/newreposecretwithlibsodium/main.go
@@ -34,7 +34,7 @@ import (
 	"os"
 
 	sodium "github.com/GoKillers/libsodium-go/cryptobox"
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 	"golang.org/x/oauth2"
 )
 
diff --git a/example/newreposecretwithxcrypto/go.mod b/example/newreposecretwithxcrypto/go.mod
index c11c2fd7..b1fd24dd 100644
--- a/example/newreposecretwithxcrypto/go.mod
+++ b/example/newreposecretwithxcrypto/go.mod
@@ -3,7 +3,7 @@ module newreposecretwithxcrypto
 go 1.15
 
 require (
-	github.com/google/go-github/v40 v40.0.0
+	github.com/google/go-github/v41 v41.0.0
 	golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
 	golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect
 	golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
diff --git a/example/newreposecretwithxcrypto/go.sum b/example/newreposecretwithxcrypto/go.sum
index 8ad570a3..bb150224 100644
--- a/example/newreposecretwithxcrypto/go.sum
+++ b/example/newreposecretwithxcrypto/go.sum
@@ -84,8 +84,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-github/v40 v40.0.0 h1:oBPVDaIhdUmwDWRRH8XJ/dZG+Rn755i08+Hp1uJHlR0=
-github.com/google/go-github/v40 v40.0.0/go.mod h1:G8wWKTEjUCL0zdbaQvpwDk0hqf6KZgPQH+ssJa+/NVc=
+github.com/google/go-github/v41 v41.0.0 h1:oBPVDaIhdUmwDWRRH8XJ/dZG+Rn755i08+Hp1uJHlR0=
+github.com/google/go-github/v41 v41.0.0/go.mod h1:G8wWKTEjUCL0zdbaQvpwDk0hqf6KZgPQH+ssJa+/NVc=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
diff --git a/example/newreposecretwithxcrypto/main.go b/example/newreposecretwithxcrypto/main.go
index 88b52ff4..75dbf756 100644
--- a/example/newreposecretwithxcrypto/main.go
+++ b/example/newreposecretwithxcrypto/main.go
@@ -34,7 +34,7 @@ import (
 	"log"
 	"os"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 	"golang.org/x/crypto/nacl/box"
 	"golang.org/x/oauth2"
 )
diff --git a/example/simple/main.go b/example/simple/main.go
index 22658961..1988b379 100644
--- a/example/simple/main.go
+++ b/example/simple/main.go
@@ -12,7 +12,7 @@ import (
 	"context"
 	"fmt"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 )
 
 // Fetch all the public organizations' membership of a user.
diff --git a/example/tokenauth/main.go b/example/tokenauth/main.go
index 375a8ea1..49e38853 100644
--- a/example/tokenauth/main.go
+++ b/example/tokenauth/main.go
@@ -14,7 +14,7 @@ import (
 	"log"
 	"syscall"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 	"golang.org/x/crypto/ssh/terminal"
 	"golang.org/x/oauth2"
 )
diff --git a/example/topics/main.go b/example/topics/main.go
index 6c5948de..ebb051ec 100644
--- a/example/topics/main.go
+++ b/example/topics/main.go
@@ -12,7 +12,7 @@ import (
 	"context"
 	"fmt"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 )
 
 // Fetch and lists all the public topics associated with the specified GitHub topic
diff --git a/github/billing.go b/github/billing.go
index 190140a4..12a79fa6 100644
--- a/github/billing.go
+++ b/github/billing.go
@@ -44,6 +44,25 @@ type StorageBilling struct {
 	EstimatedStorageForMonth     int     `json:"estimated_storage_for_month"`
 }
 
+// ActiveCommitters represents the total active committers across all repositories in an Organization.
+type ActiveCommitters struct {
+	TotalAdvancedSecurityCommitters int                           `json:"total_advanced_security_committers"`
+	Repositories                    []*RepositoryActiveCommitters `json:"repositories,omitempty"`
+}
+
+// RepositoryActiveCommitters represents active committers on each repository.
+type RepositoryActiveCommitters struct {
+	Name                                *string                                `json:"name,omitempty"`
+	AdvancedSecurityCommitters          *int                                   `json:"advanced_security_committers,omitempty"`
+	AdvancedSecurityCommittersBreakdown []*AdvancedSecurityCommittersBreakdown `json:"advanced_security_committers_breakdown,omitempty"`
+}
+
+// AdvancedSecurityCommittersBreakdown represents the user activity breakdown for ActiveCommitters.
+type AdvancedSecurityCommittersBreakdown struct {
+	UserLogin      *string `json:"user_login,omitempty"`
+	LastPushedDate *string `json:"last_pushed_date,omitempty"`
+}
+
 // GetActionsBillingOrg returns the summary of the free and paid GitHub Actions minutes used for an Org.
 //
 // GitHub API docs: https://docs.github.com/en/rest/reference/billing#get-github-actions-billing-for-an-organization
@@ -53,8 +72,13 @@ func (s *BillingService) GetActionsBillingOrg(ctx context.Context, org string) (
 	if err != nil {
 		return nil, nil, err
 	}
+
 	actionsOrgBilling := new(ActionBilling)
 	resp, err := s.client.Do(ctx, req, actionsOrgBilling)
+	if err != nil {
+		return nil, resp, err
+	}
+
 	return actionsOrgBilling, resp, err
 }
 
@@ -67,8 +91,13 @@ func (s *BillingService) GetPackagesBillingOrg(ctx context.Context, org string)
 	if err != nil {
 		return nil, nil, err
 	}
+
 	packagesOrgBilling := new(PackageBilling)
 	resp, err := s.client.Do(ctx, req, packagesOrgBilling)
+	if err != nil {
+		return nil, resp, err
+	}
+
 	return packagesOrgBilling, resp, err
 }
 
@@ -82,11 +111,35 @@ func (s *BillingService) GetStorageBillingOrg(ctx context.Context, org string) (
 	if err != nil {
 		return nil, nil, err
 	}
+
 	storageOrgBilling := new(StorageBilling)
 	resp, err := s.client.Do(ctx, req, storageOrgBilling)
+	if err != nil {
+		return nil, resp, err
+	}
+
 	return storageOrgBilling, resp, err
 }
 
+// GetAdvancedSecurityActiveCommittersOrg returns the GitHub Advanced Security active committers for an organization per repository.
+//
+// GitHub API docs: https://docs.github.com/en/rest/reference/billing#get-github-advanced-security-active-committers-for-an-organization
+func (s *BillingService) GetAdvancedSecurityActiveCommittersOrg(ctx context.Context, org string) (*ActiveCommitters, *Response, error) {
+	u := fmt.Sprintf("orgs/%v/settings/billing/advanced-security", org)
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	activeOrgCommitters := new(ActiveCommitters)
+	resp, err := s.client.Do(ctx, req, activeOrgCommitters)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return activeOrgCommitters, resp, err
+}
+
 // GetActionsBillingUser returns the summary of the free and paid GitHub Actions minutes used for a user.
 //
 // GitHub API docs: https://docs.github.com/en/rest/reference/billing#get-github-actions-billing-for-a-user
@@ -96,8 +149,13 @@ func (s *BillingService) GetActionsBillingUser(ctx context.Context, user string)
 	if err != nil {
 		return nil, nil, err
 	}
+
 	actionsUserBilling := new(ActionBilling)
 	resp, err := s.client.Do(ctx, req, actionsUserBilling)
+	if err != nil {
+		return nil, resp, err
+	}
+
 	return actionsUserBilling, resp, err
 }
 
@@ -110,8 +168,13 @@ func (s *BillingService) GetPackagesBillingUser(ctx context.Context, user string
 	if err != nil {
 		return nil, nil, err
 	}
+
 	packagesUserBilling := new(PackageBilling)
 	resp, err := s.client.Do(ctx, req, packagesUserBilling)
+	if err != nil {
+		return nil, resp, err
+	}
+
 	return packagesUserBilling, resp, err
 }
 
@@ -125,7 +188,12 @@ func (s *BillingService) GetStorageBillingUser(ctx context.Context, user string)
 	if err != nil {
 		return nil, nil, err
 	}
+
 	storageUserBilling := new(StorageBilling)
 	resp, err := s.client.Do(ctx, req, storageUserBilling)
+	if err != nil {
+		return nil, resp, err
+	}
+
 	return storageUserBilling, resp, err
 }
diff --git a/github/code-scanning.go b/github/code-scanning.go
index 4508c339..9616f3a2 100644
--- a/github/code-scanning.go
+++ b/github/code-scanning.go
@@ -119,6 +119,38 @@ type AlertListOptions struct {
 	ListOptions
 }
 
+// AnalysesListOptions specifies optional parameters to the CodeScanningService.ListAnalysesForRepo method.
+type AnalysesListOptions struct {
+	// Return code scanning analyses belonging to the same SARIF upload.
+	SarifID *string `url:"sarif_id,omitempty"`
+
+	// Return code scanning analyses for a specific branch reference. The ref can be formatted as refs/heads/<branch name> or simply <branch name>.
+	Ref *string `url:"ref,omitempty"`
+
+	ListOptions
+}
+
+// ScanningAnalysis represents an individual GitHub Code Scanning ScanningAnalysis on a single repository.
+//
+// GitHub API docs: https://docs.github.com/en/rest/reference/code-scanning#list-code-scanning-analyses-for-a-repository
+type ScanningAnalysis struct {
+	ID           *int64     `json:"id,omitempty"`
+	Ref          *string    `json:"ref,omitempty"`
+	CommitSHA    *string    `json:"commit_sha,omitempty"`
+	AnalysisKey  *string    `json:"analysis_key,omitempty"`
+	Environment  *string    `json:"environment,omitempty"`
+	Error        *string    `json:"error,omitempty"`
+	Category     *string    `json:"category,omitempty"`
+	CreatedAt    *Timestamp `json:"created_at,omitempty"`
+	ResultsCount *int       `json:"results_count,omitempty"`
+	RulesCount   *int       `json:"rules_count,omitempty"`
+	URL          *string    `json:"url,omitempty"`
+	SarifID      *string    `json:"sarif_id,omitempty"`
+	Tool         *Tool      `json:"tool,omitempty"`
+	Deletable    *bool      `json:"deletable,omitempty"`
+	Warning      *string    `json:"warning,omitempty"`
+}
+
 // SarifAnalysis specifies the results of a code scanning job.
 //
 // GitHub API docs: https://docs.github.com/en/rest/reference/code-scanning#upload-an-analysis-as-sarif-data
@@ -215,3 +247,56 @@ func (s *CodeScanningService) UploadSarif(ctx context.Context, owner, repo strin
 
 	return sarifID, resp, nil
 }
+
+// ListAnalysesForRepo lists code scanning analyses for a repository.
+//
+// Lists the details of all code scanning analyses for a repository, starting with the most recent.
+// You must use an access token with the security_events scope to use this endpoint.
+// GitHub Apps must have the security_events read permission to use this endpoint.
+//
+// GitHub API docs: https://docs.github.com/en/rest/reference/code-scanning#list-code-scanning-analyses-for-a-repository
+func (s *CodeScanningService) ListAnalysesForRepo(ctx context.Context, owner, repo string, opts *AnalysesListOptions) ([]*ScanningAnalysis, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/code-scanning/analyses", owner, repo)
+	u, err := addOptions(u, opts)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var analyses []*ScanningAnalysis
+	resp, err := s.client.Do(ctx, req, &analyses)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return analyses, resp, nil
+}
+
+// GetAnalysis gets a single code scanning analysis for a repository.
+//
+// You must use an access token with the security_events scope to use this endpoint.
+// GitHub Apps must have the security_events read permission to use this endpoint.
+//
+// The security analysis_id is the ID of the analysis, as returned from the ListAnalysesForRepo operation.
+//
+// GitHub API docs: https://docs.github.com/en/rest/reference/code-scanning#get-a-code-scanning-analysis-for-a-repository
+func (s *CodeScanningService) GetAnalysis(ctx context.Context, owner, repo string, id int64) (*ScanningAnalysis, *Response, error) {
+	u := fmt.Sprintf("repos/%v/%v/code-scanning/analyses/%v", owner, repo, id)
+
+	req, err := s.client.NewRequest("GET", u, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	analysis := new(ScanningAnalysis)
+	resp, err := s.client.Do(ctx, req, analysis)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return analysis, resp, nil
+}
diff --git a/github/doc.go b/github/doc.go
index 845d3062..d67e2869 100644
--- a/github/doc.go
+++ b/github/doc.go
@@ -8,7 +8,7 @@ Package github provides a client for using the GitHub API.
 
 Usage:
 
-	import "github.com/google/go-github/v40/github"	// with go modules enabled (GO111MODULE=on or outside GOPATH)
+	import "github.com/google/go-github/v41/github"	// with go modules enabled (GO111MODULE=on or outside GOPATH)
 	import "github.com/google/go-github/github"     // with go modules disabled
 
 Construct a new GitHub client, then use the various services on the client to
diff --git a/github/github-accessors.go b/github/github-accessors.go
index 7bd87016..dd9ef9cf 100644
--- a/github/github-accessors.go
+++ b/github/github-accessors.go
@@ -156,6 +156,22 @@ func (a *AdvancedSecurity) GetStatus() string {
 	return *a.Status
 }
 
+// GetLastPushedDate returns the LastPushedDate field if it's non-nil, zero value otherwise.
+func (a *AdvancedSecurityCommittersBreakdown) GetLastPushedDate() string {
+	if a == nil || a.LastPushedDate == nil {
+		return ""
+	}
+	return *a.LastPushedDate
+}
+
+// GetUserLogin returns the UserLogin field if it's non-nil, zero value otherwise.
+func (a *AdvancedSecurityCommittersBreakdown) GetUserLogin() string {
+	if a == nil || a.UserLogin == nil {
+		return ""
+	}
+	return *a.UserLogin
+}
+
 // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise.
 func (a *Alert) GetClosedAt() Timestamp {
 	if a == nil || a.ClosedAt == nil {
@@ -284,6 +300,22 @@ func (a *Alert) GetURL() string {
 	return *a.URL
 }
 
+// GetRef returns the Ref field if it's non-nil, zero value otherwise.
+func (a *AnalysesListOptions) GetRef() string {
+	if a == nil || a.Ref == nil {
+		return ""
+	}
+	return *a.Ref
+}
+
+// GetSarifID returns the SarifID field if it's non-nil, zero value otherwise.
+func (a *AnalysesListOptions) GetSarifID() string {
+	if a == nil || a.SarifID == nil {
+		return ""
+	}
+	return *a.SarifID
+}
+
 // GetVerifiablePasswordAuthentication returns the VerifiablePasswordAuthentication field if it's non-nil, zero value otherwise.
 func (a *APIMeta) GetVerifiablePasswordAuthentication() bool {
 	if a == nil || a.VerifiablePasswordAuthentication == nil {
@@ -10276,6 +10308,14 @@ func (p *Project) GetNumber() int {
 	return *p.Number
 }
 
+// GetOrganizationPermission returns the OrganizationPermission field if it's non-nil, zero value otherwise.
+func (p *Project) GetOrganizationPermission() string {
+	if p == nil || p.OrganizationPermission == nil {
+		return ""
+	}
+	return *p.OrganizationPermission
+}
+
 // GetOwnerURL returns the OwnerURL field if it's non-nil, zero value otherwise.
 func (p *Project) GetOwnerURL() string {
 	if p == nil || p.OwnerURL == nil {
@@ -10284,6 +10324,14 @@ func (p *Project) GetOwnerURL() string {
 	return *p.OwnerURL
 }
 
+// GetPrivate returns the Private field if it's non-nil, zero value otherwise.
+func (p *Project) GetPrivate() bool {
+	if p == nil || p.Private == nil {
+		return false
+	}
+	return *p.Private
+}
+
 // GetState returns the State field if it's non-nil, zero value otherwise.
 func (p *Project) GetState() string {
 	if p == nil || p.State == nil {
@@ -10788,12 +10836,12 @@ func (p *ProjectOptions) GetOrganizationPermission() string {
 	return *p.OrganizationPermission
 }
 
-// GetPublic returns the Public field if it's non-nil, zero value otherwise.
-func (p *ProjectOptions) GetPublic() bool {
-	if p == nil || p.Public == nil {
+// GetPrivate returns the Private field if it's non-nil, zero value otherwise.
+func (p *ProjectOptions) GetPrivate() bool {
+	if p == nil || p.Private == nil {
 		return false
 	}
-	return *p.Public
+	return *p.Private
 }
 
 // GetState returns the State field if it's non-nil, zero value otherwise.
@@ -13852,6 +13900,22 @@ func (r *Repository) GetWatchersCount() int {
 	return *r.WatchersCount
 }
 
+// GetAdvancedSecurityCommitters returns the AdvancedSecurityCommitters field if it's non-nil, zero value otherwise.
+func (r *RepositoryActiveCommitters) GetAdvancedSecurityCommitters() int {
+	if r == nil || r.AdvancedSecurityCommitters == nil {
+		return 0
+	}
+	return *r.AdvancedSecurityCommitters
+}
+
+// GetName returns the Name field if it's non-nil, zero value otherwise.
+func (r *RepositoryActiveCommitters) GetName() string {
+	if r == nil || r.Name == nil {
+		return ""
+	}
+	return *r.Name
+}
+
 // GetBody returns the Body field if it's non-nil, zero value otherwise.
 func (r *RepositoryComment) GetBody() string {
 	if r == nil || r.Body == nil {
@@ -15212,6 +15276,126 @@ func (s *SarifID) GetURL() string {
 	return *s.URL
 }
 
+// GetAnalysisKey returns the AnalysisKey field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetAnalysisKey() string {
+	if s == nil || s.AnalysisKey == nil {
+		return ""
+	}
+	return *s.AnalysisKey
+}
+
+// GetCategory returns the Category field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetCategory() string {
+	if s == nil || s.Category == nil {
+		return ""
+	}
+	return *s.Category
+}
+
+// GetCommitSHA returns the CommitSHA field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetCommitSHA() string {
+	if s == nil || s.CommitSHA == nil {
+		return ""
+	}
+	return *s.CommitSHA
+}
+
+// GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetCreatedAt() Timestamp {
+	if s == nil || s.CreatedAt == nil {
+		return Timestamp{}
+	}
+	return *s.CreatedAt
+}
+
+// GetDeletable returns the Deletable field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetDeletable() bool {
+	if s == nil || s.Deletable == nil {
+		return false
+	}
+	return *s.Deletable
+}
+
+// GetEnvironment returns the Environment field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetEnvironment() string {
+	if s == nil || s.Environment == nil {
+		return ""
+	}
+	return *s.Environment
+}
+
+// GetError returns the Error field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetError() string {
+	if s == nil || s.Error == nil {
+		return ""
+	}
+	return *s.Error
+}
+
+// GetID returns the ID field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetID() int64 {
+	if s == nil || s.ID == nil {
+		return 0
+	}
+	return *s.ID
+}
+
+// GetRef returns the Ref field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetRef() string {
+	if s == nil || s.Ref == nil {
+		return ""
+	}
+	return *s.Ref
+}
+
+// GetResultsCount returns the ResultsCount field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetResultsCount() int {
+	if s == nil || s.ResultsCount == nil {
+		return 0
+	}
+	return *s.ResultsCount
+}
+
+// GetRulesCount returns the RulesCount field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetRulesCount() int {
+	if s == nil || s.RulesCount == nil {
+		return 0
+	}
+	return *s.RulesCount
+}
+
+// GetSarifID returns the SarifID field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetSarifID() string {
+	if s == nil || s.SarifID == nil {
+		return ""
+	}
+	return *s.SarifID
+}
+
+// GetTool returns the Tool field.
+func (s *ScanningAnalysis) GetTool() *Tool {
+	if s == nil {
+		return nil
+	}
+	return s.Tool
+}
+
+// GetURL returns the URL field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetURL() string {
+	if s == nil || s.URL == nil {
+		return ""
+	}
+	return *s.URL
+}
+
+// GetWarning returns the Warning field if it's non-nil, zero value otherwise.
+func (s *ScanningAnalysis) GetWarning() string {
+	if s == nil || s.Warning == nil {
+		return ""
+	}
+	return *s.Warning
+}
+
 // GetActive returns the Active field if it's non-nil, zero value otherwise.
 func (s *SCIMUserAttributes) GetActive() bool {
 	if s == nil || s.Active == nil {
diff --git a/github/github.go b/github/github.go
index 56f1be89..a7afd834 100644
--- a/github/github.go
+++ b/github/github.go
@@ -536,12 +536,18 @@ func (r *Response) populatePageValues() {
 			}
 
 			page := q.Get("page")
+			since := q.Get("since")
 			before := q.Get("before")
 			after := q.Get("after")
-			if page == "" && before == "" && after == "" {
+
+			if page == "" && before == "" && after == "" && since == "" {
 				continue
 			}
 
+			if since != "" {
+				page = since
+			}
+
 			for _, segment := range segments[1:] {
 				switch strings.TrimSpace(segment) {
 				case `rel="next"`:
diff --git a/github/projects.go b/github/projects.go
index 12c00bc3..2886c3a3 100644
--- a/github/projects.go
+++ b/github/projects.go
@@ -18,18 +18,20 @@ type ProjectsService service
 
 // Project represents a GitHub Project.
 type Project struct {
-	ID         *int64     `json:"id,omitempty"`
-	URL        *string    `json:"url,omitempty"`
-	HTMLURL    *string    `json:"html_url,omitempty"`
-	ColumnsURL *string    `json:"columns_url,omitempty"`
-	OwnerURL   *string    `json:"owner_url,omitempty"`
-	Name       *string    `json:"name,omitempty"`
-	Body       *string    `json:"body,omitempty"`
-	Number     *int       `json:"number,omitempty"`
-	State      *string    `json:"state,omitempty"`
-	CreatedAt  *Timestamp `json:"created_at,omitempty"`
-	UpdatedAt  *Timestamp `json:"updated_at,omitempty"`
-	NodeID     *string    `json:"node_id,omitempty"`
+	ID                     *int64     `json:"id,omitempty"`
+	URL                    *string    `json:"url,omitempty"`
+	HTMLURL                *string    `json:"html_url,omitempty"`
+	ColumnsURL             *string    `json:"columns_url,omitempty"`
+	OwnerURL               *string    `json:"owner_url,omitempty"`
+	Name                   *string    `json:"name,omitempty"`
+	Body                   *string    `json:"body,omitempty"`
+	Number                 *int       `json:"number,omitempty"`
+	State                  *string    `json:"state,omitempty"`
+	CreatedAt              *Timestamp `json:"created_at,omitempty"`
+	UpdatedAt              *Timestamp `json:"updated_at,omitempty"`
+	NodeID                 *string    `json:"node_id,omitempty"`
+	OrganizationPermission *string    `json:"organization_permission,omitempty"`
+	Private                *bool      `json:"private,omitempty"`
 
 	// The User object that generated the project.
 	Creator *User `json:"creator,omitempty"`
@@ -83,7 +85,7 @@ type ProjectOptions struct {
 	// Sets visibility of the project within the organization.
 	// Setting visibility is only available
 	// for organization projects.(Optional.)
-	Public *bool `json:"public,omitempty"`
+	Private *bool `json:"private,omitempty"`
 }
 
 // UpdateProject updates a repository project.
diff --git a/go.mod b/go.mod
index 9c6b43d0..fd327a51 100644
--- a/go.mod
+++ b/go.mod
@@ -1,4 +1,4 @@
-module github.com/google/go-github/v40
+module github.com/google/go-github/v41
 
 require (
 	github.com/golang/protobuf v1.3.2 // indirect
diff --git a/scrape/apps.go b/scrape/apps.go
index 30f704cb..4ce8c772 100644
--- a/scrape/apps.go
+++ b/scrape/apps.go
@@ -17,7 +17,7 @@ import (
 	"strings"
 
 	"github.com/PuerkitoBio/goquery"
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 )
 
 // AppRestrictionsEnabled returns whether the specified organization has
diff --git a/scrape/go.mod b/scrape/go.mod
index 0149b8f2..86ad2e55 100644
--- a/scrape/go.mod
+++ b/scrape/go.mod
@@ -5,7 +5,7 @@ go 1.13
 require (
 	github.com/PuerkitoBio/goquery v1.8.0
 	github.com/google/go-cmp v0.5.6
-	github.com/google/go-github/v40 v40.0.0
+	github.com/google/go-github/v41 v41.0.0
 	github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119
 	golang.org/x/net v0.0.0-20210916014120-12bc252f5db8
 )
diff --git a/scrape/go.sum b/scrape/go.sum
index 7ccfd213..6d8631d1 100644
--- a/scrape/go.sum
+++ b/scrape/go.sum
@@ -7,8 +7,8 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-github/v40 v40.0.0 h1:oBPVDaIhdUmwDWRRH8XJ/dZG+Rn755i08+Hp1uJHlR0=
-github.com/google/go-github/v40 v40.0.0/go.mod h1:G8wWKTEjUCL0zdbaQvpwDk0hqf6KZgPQH+ssJa+/NVc=
+github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg=
+github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
 github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119 h1:YyPWX3jLOtYKulBR6AScGIs74lLrJcgeKRwcbAuQOG4=


Test patch:
diff --git a/github/billing_test.go b/github/billing_test.go
index 2693e68a..11acd623 100644
--- a/github/billing_test.go
+++ b/github/billing_test.go
@@ -57,6 +57,14 @@ func TestBillingService_GetActionsBillingOrg(t *testing.T) {
 		_, _, err = client.Billing.GetActionsBillingOrg(ctx, "\n")
 		return err
 	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Billing.GetActionsBillingOrg(ctx, "o")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
 }
 
 func TestBillingService_GetActionsBillingOrg_invalidOrg(t *testing.T) {
@@ -101,6 +109,14 @@ func TestBillingService_GetPackagesBillingOrg(t *testing.T) {
 		_, _, err = client.Billing.GetPackagesBillingOrg(ctx, "\n")
 		return err
 	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Billing.GetPackagesBillingOrg(ctx, "o")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
 }
 
 func TestBillingService_GetPackagesBillingOrg_invalidOrg(t *testing.T) {
@@ -145,6 +161,14 @@ func TestBillingService_GetStorageBillingOrg(t *testing.T) {
 		_, _, err = client.Billing.GetStorageBillingOrg(ctx, "\n")
 		return err
 	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Billing.GetStorageBillingOrg(ctx, "o")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
 }
 
 func TestBillingService_GetStorageBillingOrg_invalidOrg(t *testing.T) {
@@ -199,6 +223,14 @@ func TestBillingService_GetActionsBillingUser(t *testing.T) {
 		_, _, err = client.Billing.GetActionsBillingOrg(ctx, "\n")
 		return err
 	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Billing.GetActionsBillingUser(ctx, "o")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
 }
 
 func TestBillingService_GetActionsBillingUser_invalidUser(t *testing.T) {
@@ -243,6 +275,14 @@ func TestBillingService_GetPackagesBillingUser(t *testing.T) {
 		_, _, err = client.Billing.GetPackagesBillingUser(ctx, "\n")
 		return err
 	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Billing.GetPackagesBillingUser(ctx, "o")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
 }
 
 func TestBillingService_GetPackagesBillingUser_invalidUser(t *testing.T) {
@@ -287,6 +327,14 @@ func TestBillingService_GetStorageBillingUser(t *testing.T) {
 		_, _, err = client.Billing.GetStorageBillingUser(ctx, "\n")
 		return err
 	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Billing.GetStorageBillingUser(ctx, "o")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
 }
 
 func TestBillingService_GetStorageBillingUser_invalidUser(t *testing.T) {
@@ -379,3 +427,75 @@ func TestStorageBilling_Marshal(t *testing.T) {
 
 	testJSONMarshal(t, u, want)
 }
+
+func TestBillingService_GetAdvancedSecurityActiveCommittersOrg(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/orgs/o/settings/billing/advanced-security", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w, `{
+  "total_advanced_security_committers": 2,
+  "repositories": [
+    {
+      "name": "octocat-org/Hello-World",
+      "advanced_security_committers": 2,
+      "advanced_security_committers_breakdown": [
+        {
+          "user_login": "octokitten",
+          "last_pushed_date": "2021-10-25"
+        }
+      ]
+    }
+  ]
+}`)
+	})
+
+	ctx := context.Background()
+	hook, _, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "o")
+	if err != nil {
+		t.Errorf("Billing.GetAdvancedSecurityActiveCommittersOrg	 returned error: %v", err)
+	}
+
+	want := &ActiveCommitters{
+		TotalAdvancedSecurityCommitters: 2,
+		Repositories: []*RepositoryActiveCommitters{
+			{
+				Name:                       String("octocat-org/Hello-World"),
+				AdvancedSecurityCommitters: Int(2),
+				AdvancedSecurityCommittersBreakdown: []*AdvancedSecurityCommittersBreakdown{
+					{
+						UserLogin:      String("octokitten"),
+						LastPushedDate: String("2021-10-25"),
+					},
+				},
+			},
+		},
+	}
+	if !cmp.Equal(hook, want) {
+		t.Errorf("Billing.GetAdvancedSecurityActiveCommittersOrg returned %+v, want %+v", hook, want)
+	}
+
+	const methodName = "GetAdvancedSecurityActiveCommittersOrg"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "\n")
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "o")
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestBillingService_GetAdvancedSecurityActiveCommittersOrg_invalidOrg(t *testing.T) {
+	client, _, _, teardown := setup()
+	defer teardown()
+
+	ctx := context.Background()
+	_, _, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "%")
+	testURLParseError(t, err)
+}
diff --git a/github/code-scanning_test.go b/github/code-scanning_test.go
index e96d0a0d..0be58153 100644
--- a/github/code-scanning_test.go
+++ b/github/code-scanning_test.go
@@ -16,7 +16,7 @@ import (
 	"github.com/google/go-cmp/cmp"
 )
 
-func TestActionsService_Alert_ID(t *testing.T) {
+func TestCodeScanningService_Alert_ID(t *testing.T) {
 	// Test: nil Alert ID == 0
 	var a *Alert
 	id := a.ID()
@@ -54,7 +54,7 @@ func TestActionsService_Alert_ID(t *testing.T) {
 	}
 }
 
-func TestActionsService_UploadSarif(t *testing.T) {
+func TestCodeScanningService_UploadSarif(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
@@ -89,7 +89,7 @@ func TestActionsService_UploadSarif(t *testing.T) {
 	})
 }
 
-func TestActionsService_ListAlertsForRepo(t *testing.T) {
+func TestCodeScanningService_ListAlertsForRepo(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
@@ -283,7 +283,7 @@ func TestActionsService_ListAlertsForRepo(t *testing.T) {
 	})
 }
 
-func TestActionsService_GetAlert(t *testing.T) {
+func TestCodeScanningService_GetAlert(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
 
@@ -530,3 +530,203 @@ func TestMessage_Marshal(t *testing.T) {
 
 	testJSONMarshal(t, u, want)
 }
+
+func TestCodeScanningService_ListAnalysesForRepo(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/code-scanning/analyses", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		testFormValues(t, r, values{"sarif_id": "8981cd8e-b078-4ac3-a3be-1dad7dbd0b582", "ref": "heads/master"})
+		fmt.Fprint(w, `[
+			  {
+				"ref": "refs/heads/main",
+				"commit_sha": "d99612c3e1f2970085cfbaeadf8f010ef69bad83",
+				"analysis_key": ".github/workflows/codeql-analysis.yml:analyze",
+				"environment": "{\"language\":\"python\"}",
+				"error": "",
+				"category": ".github/workflows/codeql-analysis.yml:analyze/language:python",
+				"created_at": "2020-08-27T15:05:21Z",
+				"results_count": 17,
+				"rules_count": 49,
+				"id": 201,
+				"url": "https://api.github.com/repos/o/r/code-scanning/analyses/201",
+				"sarif_id": "8981cd8e-b078-4ac3-a3be-1dad7dbd0b582",
+				"tool": {
+				  "name": "CodeQL",
+				  "guid": null,
+				  "version": "2.4.0"
+				},
+				"deletable": true,
+				"warning": ""
+			  },
+			  {
+				"ref": "refs/heads/my-branch",
+				"commit_sha": "c8cff6510d4d084fb1b4aa13b64b97ca12b07321",
+				"analysis_key": ".github/workflows/shiftleft.yml:build",
+				"environment": "{}",
+				"error": "",
+				"category": ".github/workflows/shiftleft.yml:build/",
+				"created_at": "2020-08-27T15:05:21Z",
+				"results_count": 17,
+				"rules_count": 32,
+				"id": 200,
+				"url": "https://api.github.com/repos/o/r/code-scanning/analyses/200",
+				"sarif_id": "8981cd8e-b078-4ac3-a3be-1dad7dbd0b582",
+				"tool": {
+				  "name": "Python Security ScanningAnalysis",
+				  "guid": null,
+				  "version": "1.2.0"
+				},
+				"deletable": true,
+				"warning": ""
+			  }
+			]`)
+	})
+
+	opts := &AnalysesListOptions{SarifID: String("8981cd8e-b078-4ac3-a3be-1dad7dbd0b582"), Ref: String("heads/master")}
+	ctx := context.Background()
+	analyses, _, err := client.CodeScanning.ListAnalysesForRepo(ctx, "o", "r", opts)
+	if err != nil {
+		t.Errorf("CodeScanning.ListAnalysesForRepo returned error: %v", err)
+	}
+
+	date := &Timestamp{time.Date(2020, time.August, 27, 15, 05, 21, 0, time.UTC)}
+	want := []*ScanningAnalysis{
+		{
+			ID:           Int64(201),
+			Ref:          String("refs/heads/main"),
+			CommitSHA:    String("d99612c3e1f2970085cfbaeadf8f010ef69bad83"),
+			AnalysisKey:  String(".github/workflows/codeql-analysis.yml:analyze"),
+			Environment:  String("{\"language\":\"python\"}"),
+			Error:        String(""),
+			Category:     String(".github/workflows/codeql-analysis.yml:analyze/language:python"),
+			CreatedAt:    date,
+			ResultsCount: Int(17),
+			RulesCount:   Int(49),
+			URL:          String("https://api.github.com/repos/o/r/code-scanning/analyses/201"),
+			SarifID:      String("8981cd8e-b078-4ac3-a3be-1dad7dbd0b582"),
+			Tool: &Tool{
+				Name:    String("CodeQL"),
+				GUID:    nil,
+				Version: String("2.4.0"),
+			},
+			Deletable: Bool(true),
+			Warning:   String(""),
+		},
+		{
+			ID:           Int64(200),
+			Ref:          String("refs/heads/my-branch"),
+			CommitSHA:    String("c8cff6510d4d084fb1b4aa13b64b97ca12b07321"),
+			AnalysisKey:  String(".github/workflows/shiftleft.yml:build"),
+			Environment:  String("{}"),
+			Error:        String(""),
+			Category:     String(".github/workflows/shiftleft.yml:build/"),
+			CreatedAt:    date,
+			ResultsCount: Int(17),
+			RulesCount:   Int(32),
+			URL:          String("https://api.github.com/repos/o/r/code-scanning/analyses/200"),
+			SarifID:      String("8981cd8e-b078-4ac3-a3be-1dad7dbd0b582"),
+			Tool: &Tool{
+				Name:    String("Python Security ScanningAnalysis"),
+				GUID:    nil,
+				Version: String("1.2.0"),
+			},
+			Deletable: Bool(true),
+			Warning:   String(""),
+		},
+	}
+	if !cmp.Equal(analyses, want) {
+		t.Errorf("CodeScanning.ListAnalysesForRepo returned %+v, want %+v", analyses, want)
+	}
+
+	const methodName = "ListAnalysesForRepo"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.CodeScanning.ListAnalysesForRepo(ctx, "\n", "\n", opts)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.CodeScanning.ListAnalysesForRepo(ctx, "o", "r", opts)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
+
+func TestCodeScanningService_GetAnalysis(t *testing.T) {
+	client, mux, _, teardown := setup()
+	defer teardown()
+
+	mux.HandleFunc("/repos/o/r/code-scanning/analyses/3602840", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, "GET")
+		fmt.Fprint(w, `{
+			  "ref": "refs/heads/main",
+			  "commit_sha": "c18c69115654ff0166991962832dc2bd7756e655",
+			  "analysis_key": ".github/workflows/codeql-analysis.yml:analyze",
+			  "environment": "{\"language\":\"javascript\"}",
+			  "error": "",
+			  "category": ".github/workflows/codeql-analysis.yml:analyze/language:javascript",
+			  "created_at": "2021-01-13T11:55:49Z",
+			  "results_count": 3,
+			  "rules_count": 67,
+			  "id": 3602840,
+			  "url": "https://api.github.com/repos/o/r/code-scanning/analyses/201",
+			  "sarif_id": "47177e22-5596-11eb-80a1-c1e54ef945c6",
+			  "tool": {
+				"name": "CodeQL",
+				"guid": null,
+				"version": "2.4.0"
+			  },
+			  "deletable": true,
+			  "warning": ""
+			}`)
+	})
+
+	ctx := context.Background()
+	analysis, _, err := client.CodeScanning.GetAnalysis(ctx, "o", "r", 3602840)
+	if err != nil {
+		t.Errorf("CodeScanning.GetAnalysis returned error: %v", err)
+	}
+
+	date := &Timestamp{time.Date(2021, time.January, 13, 11, 55, 49, 0, time.UTC)}
+	want := &ScanningAnalysis{
+		ID:           Int64(3602840),
+		Ref:          String("refs/heads/main"),
+		CommitSHA:    String("c18c69115654ff0166991962832dc2bd7756e655"),
+		AnalysisKey:  String(".github/workflows/codeql-analysis.yml:analyze"),
+		Environment:  String("{\"language\":\"javascript\"}"),
+		Error:        String(""),
+		Category:     String(".github/workflows/codeql-analysis.yml:analyze/language:javascript"),
+		CreatedAt:    date,
+		ResultsCount: Int(3),
+		RulesCount:   Int(67),
+		URL:          String("https://api.github.com/repos/o/r/code-scanning/analyses/201"),
+		SarifID:      String("47177e22-5596-11eb-80a1-c1e54ef945c6"),
+		Tool: &Tool{
+			Name:    String("CodeQL"),
+			GUID:    nil,
+			Version: String("2.4.0"),
+		},
+		Deletable: Bool(true),
+		Warning:   String(""),
+	}
+	if !cmp.Equal(analysis, want) {
+		t.Errorf("CodeScanning.GetAnalysis returned %+v, want %+v", analysis, want)
+	}
+
+	const methodName = "GetAnalysis"
+	testBadOptions(t, methodName, func() (err error) {
+		_, _, err = client.CodeScanning.GetAnalysis(ctx, "\n", "\n", -123)
+		return err
+	})
+
+	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
+		got, resp, err := client.CodeScanning.GetAnalysis(ctx, "o", "r", 3602840)
+		if got != nil {
+			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
+		}
+		return resp, err
+	})
+}
diff --git a/github/examples_test.go b/github/examples_test.go
index 9cfba6fa..aa12a3e5 100644
--- a/github/examples_test.go
+++ b/github/examples_test.go
@@ -12,7 +12,7 @@ import (
 	"fmt"
 	"log"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 )
 
 func ExampleClient_Markdown() {
diff --git a/github/github-accessors_test.go b/github/github-accessors_test.go
index bbdff0ad..35e6b8b5 100644
--- a/github/github-accessors_test.go
+++ b/github/github-accessors_test.go
@@ -163,6 +163,26 @@ func TestAdvancedSecurity_GetStatus(tt *testing.T) {
 	a.GetStatus()
 }
 
+func TestAdvancedSecurityCommittersBreakdown_GetLastPushedDate(tt *testing.T) {
+	var zeroValue string
+	a := &AdvancedSecurityCommittersBreakdown{LastPushedDate: &zeroValue}
+	a.GetLastPushedDate()
+	a = &AdvancedSecurityCommittersBreakdown{}
+	a.GetLastPushedDate()
+	a = nil
+	a.GetLastPushedDate()
+}
+
+func TestAdvancedSecurityCommittersBreakdown_GetUserLogin(tt *testing.T) {
+	var zeroValue string
+	a := &AdvancedSecurityCommittersBreakdown{UserLogin: &zeroValue}
+	a.GetUserLogin()
+	a = &AdvancedSecurityCommittersBreakdown{}
+	a.GetUserLogin()
+	a = nil
+	a.GetUserLogin()
+}
+
 func TestAlert_GetClosedAt(tt *testing.T) {
 	var zeroValue Timestamp
 	a := &Alert{ClosedAt: &zeroValue}
@@ -308,6 +328,26 @@ func TestAlert_GetURL(tt *testing.T) {
 	a.GetURL()
 }
 
+func TestAnalysesListOptions_GetRef(tt *testing.T) {
+	var zeroValue string
+	a := &AnalysesListOptions{Ref: &zeroValue}
+	a.GetRef()
+	a = &AnalysesListOptions{}
+	a.GetRef()
+	a = nil
+	a.GetRef()
+}
+
+func TestAnalysesListOptions_GetSarifID(tt *testing.T) {
+	var zeroValue string
+	a := &AnalysesListOptions{SarifID: &zeroValue}
+	a.GetSarifID()
+	a = &AnalysesListOptions{}
+	a.GetSarifID()
+	a = nil
+	a.GetSarifID()
+}
+
 func TestAPIMeta_GetVerifiablePasswordAuthentication(tt *testing.T) {
 	var zeroValue bool
 	a := &APIMeta{VerifiablePasswordAuthentication: &zeroValue}
@@ -12045,6 +12085,16 @@ func TestProject_GetNumber(tt *testing.T) {
 	p.GetNumber()
 }
 
+func TestProject_GetOrganizationPermission(tt *testing.T) {
+	var zeroValue string
+	p := &Project{OrganizationPermission: &zeroValue}
+	p.GetOrganizationPermission()
+	p = &Project{}
+	p.GetOrganizationPermission()
+	p = nil
+	p.GetOrganizationPermission()
+}
+
 func TestProject_GetOwnerURL(tt *testing.T) {
 	var zeroValue string
 	p := &Project{OwnerURL: &zeroValue}
@@ -12055,6 +12105,16 @@ func TestProject_GetOwnerURL(tt *testing.T) {
 	p.GetOwnerURL()
 }
 
+func TestProject_GetPrivate(tt *testing.T) {
+	var zeroValue bool
+	p := &Project{Private: &zeroValue}
+	p.GetPrivate()
+	p = &Project{}
+	p.GetPrivate()
+	p = nil
+	p.GetPrivate()
+}
+
 func TestProject_GetState(tt *testing.T) {
 	var zeroValue string
 	p := &Project{State: &zeroValue}
@@ -12616,14 +12676,14 @@ func TestProjectOptions_GetOrganizationPermission(tt *testing.T) {
 	p.GetOrganizationPermission()
 }
 
-func TestProjectOptions_GetPublic(tt *testing.T) {
+func TestProjectOptions_GetPrivate(tt *testing.T) {
 	var zeroValue bool
-	p := &ProjectOptions{Public: &zeroValue}
-	p.GetPublic()
+	p := &ProjectOptions{Private: &zeroValue}
+	p.GetPrivate()
 	p = &ProjectOptions{}
-	p.GetPublic()
+	p.GetPrivate()
 	p = nil
-	p.GetPublic()
+	p.GetPrivate()
 }
 
 func TestProjectOptions_GetState(tt *testing.T) {
@@ -16176,6 +16236,26 @@ func TestRepository_GetWatchersCount(tt *testing.T) {
 	r.GetWatchersCount()
 }
 
+func TestRepositoryActiveCommitters_GetAdvancedSecurityCommitters(tt *testing.T) {
+	var zeroValue int
+	r := &RepositoryActiveCommitters{AdvancedSecurityCommitters: &zeroValue}
+	r.GetAdvancedSecurityCommitters()
+	r = &RepositoryActiveCommitters{}
+	r.GetAdvancedSecurityCommitters()
+	r = nil
+	r.GetAdvancedSecurityCommitters()
+}
+
+func TestRepositoryActiveCommitters_GetName(tt *testing.T) {
+	var zeroValue string
+	r := &RepositoryActiveCommitters{Name: &zeroValue}
+	r.GetName()
+	r = &RepositoryActiveCommitters{}
+	r.GetName()
+	r = nil
+	r.GetName()
+}
+
 func TestRepositoryComment_GetBody(tt *testing.T) {
 	var zeroValue string
 	r := &RepositoryComment{Body: &zeroValue}
@@ -17789,6 +17869,153 @@ func TestSarifID_GetURL(tt *testing.T) {
 	s.GetURL()
 }
 
+func TestScanningAnalysis_GetAnalysisKey(tt *testing.T) {
+	var zeroValue string
+	s := &ScanningAnalysis{AnalysisKey: &zeroValue}
+	s.GetAnalysisKey()
+	s = &ScanningAnalysis{}
+	s.GetAnalysisKey()
+	s = nil
+	s.GetAnalysisKey()
+}
+
+func TestScanningAnalysis_GetCategory(tt *testing.T) {
+	var zeroValue string
+	s := &ScanningAnalysis{Category: &zeroValue}
+	s.GetCategory()
+	s = &ScanningAnalysis{}
+	s.GetCategory()
+	s = nil
+	s.GetCategory()
+}
+
+func TestScanningAnalysis_GetCommitSHA(tt *testing.T) {
+	var zeroValue string
+	s := &ScanningAnalysis{CommitSHA: &zeroValue}
+	s.GetCommitSHA()
+	s = &ScanningAnalysis{}
+	s.GetCommitSHA()
+	s = nil
+	s.GetCommitSHA()
+}
+
+func TestScanningAnalysis_GetCreatedAt(tt *testing.T) {
+	var zeroValue Timestamp
+	s := &ScanningAnalysis{CreatedAt: &zeroValue}
+	s.GetCreatedAt()
+	s = &ScanningAnalysis{}
+	s.GetCreatedAt()
+	s = nil
+	s.GetCreatedAt()
+}
+
+func TestScanningAnalysis_GetDeletable(tt *testing.T) {
+	var zeroValue bool
+	s := &ScanningAnalysis{Deletable: &zeroValue}
+	s.GetDeletable()
+	s = &ScanningAnalysis{}
+	s.GetDeletable()
+	s = nil
+	s.GetDeletable()
+}
+
+func TestScanningAnalysis_GetEnvironment(tt *testing.T) {
+	var zeroValue string
+	s := &ScanningAnalysis{Environment: &zeroValue}
+	s.GetEnvironment()
+	s = &ScanningAnalysis{}
+	s.GetEnvironment()
+	s = nil
+	s.GetEnvironment()
+}
+
+func TestScanningAnalysis_GetError(tt *testing.T) {
+	var zeroValue string
+	s := &ScanningAnalysis{Error: &zeroValue}
+	s.GetError()
+	s = &ScanningAnalysis{}
+	s.GetError()
+	s = nil
+	s.GetError()
+}
+
+func TestScanningAnalysis_GetID(tt *testing.T) {
+	var zeroValue int64
+	s := &ScanningAnalysis{ID: &zeroValue}
+	s.GetID()
+	s = &ScanningAnalysis{}
+	s.GetID()
+	s = nil
+	s.GetID()
+}
+
+func TestScanningAnalysis_GetRef(tt *testing.T) {
+	var zeroValue string
+	s := &ScanningAnalysis{Ref: &zeroValue}
+	s.GetRef()
+	s = &ScanningAnalysis{}
+	s.GetRef()
+	s = nil
+	s.GetRef()
+}
+
+func TestScanningAnalysis_GetResultsCount(tt *testing.T) {
+	var zeroValue int
+	s := &ScanningAnalysis{ResultsCount: &zeroValue}
+	s.GetResultsCount()
+	s = &ScanningAnalysis{}
+	s.GetResultsCount()
+	s = nil
+	s.GetResultsCount()
+}
+
+func TestScanningAnalysis_GetRulesCount(tt *testing.T) {
+	var zeroValue int
+	s := &ScanningAnalysis{RulesCount: &zeroValue}
+	s.GetRulesCount()
+	s = &ScanningAnalysis{}
+	s.GetRulesCount()
+	s = nil
+	s.GetRulesCount()
+}
+
+func TestScanningAnalysis_GetSarifID(tt *testing.T) {
+	var zeroValue string
+	s := &ScanningAnalysis{SarifID: &zeroValue}
+	s.GetSarifID()
+	s = &ScanningAnalysis{}
+	s.GetSarifID()
+	s = nil
+	s.GetSarifID()
+}
+
+func TestScanningAnalysis_GetTool(tt *testing.T) {
+	s := &ScanningAnalysis{}
+	s.GetTool()
+	s = nil
+	s.GetTool()
+}
+
+func TestScanningAnalysis_GetURL(tt *testing.T) {
+	var zeroValue string
+	s := &ScanningAnalysis{URL: &zeroValue}
+	s.GetURL()
+	s = &ScanningAnalysis{}
+	s.GetURL()
+	s = nil
+	s.GetURL()
+}
+
+func TestScanningAnalysis_GetWarning(tt *testing.T) {
+	var zeroValue string
+	s := &ScanningAnalysis{Warning: &zeroValue}
+	s.GetWarning()
+	s = &ScanningAnalysis{}
+	s.GetWarning()
+	s = nil
+	s.GetWarning()
+}
+
 func TestSCIMUserAttributes_GetActive(tt *testing.T) {
 	var zeroValue bool
 	s := &SCIMUserAttributes{Active: &zeroValue}
diff --git a/github/github-stringify_test.go b/github/github-stringify_test.go
index 2db35cd6..41228378 100644
--- a/github/github-stringify_test.go
+++ b/github/github-stringify_test.go
@@ -1126,21 +1126,23 @@ func TestPreReceiveHook_String(t *testing.T) {
 
 func TestProject_String(t *testing.T) {
 	v := Project{
-		ID:         Int64(0),
-		URL:        String(""),
-		HTMLURL:    String(""),
-		ColumnsURL: String(""),
-		OwnerURL:   String(""),
-		Name:       String(""),
-		Body:       String(""),
-		Number:     Int(0),
-		State:      String(""),
-		CreatedAt:  &Timestamp{},
-		UpdatedAt:  &Timestamp{},
-		NodeID:     String(""),
-		Creator:    &User{},
+		ID:                     Int64(0),
+		URL:                    String(""),
+		HTMLURL:                String(""),
+		ColumnsURL:             String(""),
+		OwnerURL:               String(""),
+		Name:                   String(""),
+		Body:                   String(""),
+		Number:                 Int(0),
+		State:                  String(""),
+		CreatedAt:              &Timestamp{},
+		UpdatedAt:              &Timestamp{},
+		NodeID:                 String(""),
+		OrganizationPermission: String(""),
+		Private:                Bool(false),
+		Creator:                &User{},
 	}
-	want := `github.Project{ID:0, URL:"", HTMLURL:"", ColumnsURL:"", OwnerURL:"", Name:"", Body:"", Number:0, State:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, NodeID:"", Creator:github.User{}}`
+	want := `github.Project{ID:0, URL:"", HTMLURL:"", ColumnsURL:"", OwnerURL:"", Name:"", Body:"", Number:0, State:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, NodeID:"", OrganizationPermission:"", Private:false, Creator:github.User{}}`
 	if got := v.String(); got != want {
 		t.Errorf("Project.String = %v, want %v", got, want)
 	}
diff --git a/github/github_test.go b/github/github_test.go
index dfa0d338..3a0c2931 100644
--- a/github/github_test.go
+++ b/github/github_test.go
@@ -648,6 +648,35 @@ func TestResponse_populatePageValues(t *testing.T) {
 	}
 }
 
+func TestResponse_populateSinceValues(t *testing.T) {
+	r := http.Response{
+		Header: http.Header{
+			"Link": {`<https://api.github.com/?since=1>; rel="first",` +
+				` <https://api.github.com/?since=2>; rel="prev",` +
+				` <https://api.github.com/?since=4>; rel="next",` +
+				` <https://api.github.com/?since=5>; rel="last"`,
+			},
+		},
+	}
+
+	response := newResponse(&r)
+	if got, want := response.FirstPage, 1; got != want {
+		t.Errorf("response.FirstPage: %v, want %v", got, want)
+	}
+	if got, want := response.PrevPage, 2; want != got {
+		t.Errorf("response.PrevPage: %v, want %v", got, want)
+	}
+	if got, want := response.NextPage, 4; want != got {
+		t.Errorf("response.NextPage: %v, want %v", got, want)
+	}
+	if got, want := response.LastPage, 5; want != got {
+		t.Errorf("response.LastPage: %v, want %v", got, want)
+	}
+	if got, want := response.NextPageToken, ""; want != got {
+		t.Errorf("response.NextPageToken: %v, want %v", got, want)
+	}
+}
+
 func TestResponse_cursorPagination(t *testing.T) {
 	r := http.Response{
 		Header: http.Header{
@@ -761,6 +790,45 @@ func TestResponse_populatePageValues_invalid(t *testing.T) {
 	}
 }
 
+func TestResponse_populateSinceValues_invalid(t *testing.T) {
+	r := http.Response{
+		Header: http.Header{
+			"Link": {`<https://api.github.com/?since=1>,` +
+				`<https://api.github.com/?since=abc>; rel="first",` +
+				`https://api.github.com/?since=2; rel="prev",` +
+				`<https://api.github.com/>; rel="next",` +
+				`<https://api.github.com/?since=>; rel="last"`,
+			},
+		},
+	}
+
+	response := newResponse(&r)
+	if got, want := response.FirstPage, 0; got != want {
+		t.Errorf("response.FirstPage: %v, want %v", got, want)
+	}
+	if got, want := response.PrevPage, 0; got != want {
+		t.Errorf("response.PrevPage: %v, want %v", got, want)
+	}
+	if got, want := response.NextPage, 0; got != want {
+		t.Errorf("response.NextPage: %v, want %v", got, want)
+	}
+	if got, want := response.LastPage, 0; got != want {
+		t.Errorf("response.LastPage: %v, want %v", got, want)
+	}
+
+	// more invalid URLs
+	r = http.Response{
+		Header: http.Header{
+			"Link": {`<https://api.github.com/%?since=2>; rel="first"`},
+		},
+	}
+
+	response = newResponse(&r)
+	if got, want := response.FirstPage, 0; got != want {
+		t.Errorf("response.FirstPage: %v, want %v", got, want)
+	}
+}
+
 func TestDo(t *testing.T) {
 	client, mux, _, teardown := setup()
 	defer teardown()
diff --git a/github/projects_test.go b/github/projects_test.go
index 6960ce90..c4ccbd09 100644
--- a/github/projects_test.go
+++ b/github/projects_test.go
@@ -89,10 +89,10 @@ func TestProjectsService_UpdateProject(t *testing.T) {
 	defer teardown()
 
 	input := &ProjectOptions{
-		Name:   String("Project Name"),
-		Body:   String("Project body."),
-		State:  String("open"),
-		Public: Bool(true),
+		Name:    String("Project Name"),
+		Body:    String("Project body."),
+		State:   String("open"),
+		Private: Bool(false),
 
 		OrganizationPermission: String("read"),
 	}
@@ -857,7 +857,7 @@ func TestProjectOptions_Marshal(t *testing.T) {
 		Body:                   String("body"),
 		State:                  String("state"),
 		OrganizationPermission: String("op"),
-		Public:                 Bool(true),
+		Private:                Bool(false),
 	}
 
 	want := `{
@@ -865,7 +865,7 @@ func TestProjectOptions_Marshal(t *testing.T) {
 		"body": "body",
 		"state": "state",
 		"organization_permission": "op",
-		"public": true
+		"private": false
 	}`
 
 	testJSONMarshal(t, u, want)
diff --git a/github/repos_test.go b/github/repos_test.go
index dae6d221..57f31f9c 100644
--- a/github/repos_test.go
+++ b/github/repos_test.go
@@ -2412,3 +2412,17 @@ func TestAdvancedSecurity_Marshal(t *testing.T) {
 
 	testJSONMarshal(t, u, want)
 }
+
+func TestAuthorizedActorsOnly_Marshal(t *testing.T) {
+	testJSONMarshal(t, &AuthorizedActorsOnly{}, "{}")
+
+	u := &AuthorizedActorsOnly{
+		From: Bool(true),
+	}
+
+	want := `{
+		"from" : true
+	}`
+
+	testJSONMarshal(t, u, want)
+}
diff --git a/scrape/apps_test.go b/scrape/apps_test.go
index 5390f7ed..c5655dc8 100644
--- a/scrape/apps_test.go
+++ b/scrape/apps_test.go
@@ -5,7 +5,7 @@ import (
 	"testing"
 
 	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 )
 
 func Test_AppRestrictionsEnabled(t *testing.T) {
diff --git a/test/fields/fields.go b/test/fields/fields.go
index b69b08c0..64b8c737 100644
--- a/test/fields/fields.go
+++ b/test/fields/fields.go
@@ -25,7 +25,7 @@ import (
 	"reflect"
 	"strings"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 	"golang.org/x/oauth2"
 )
 
diff --git a/test/integration/activity_test.go b/test/integration/activity_test.go
index 1c257ef9..41954609 100644
--- a/test/integration/activity_test.go
+++ b/test/integration/activity_test.go
@@ -12,7 +12,7 @@ import (
 	"context"
 	"testing"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 )
 
 const (
diff --git a/test/integration/authorizations_test.go b/test/integration/authorizations_test.go
index 860a358a..aa84324c 100644
--- a/test/integration/authorizations_test.go
+++ b/test/integration/authorizations_test.go
@@ -17,7 +17,7 @@ import (
 	"testing"
 	"time"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 )
 
 const msgEnvMissing = "Skipping test because the required environment variable (%v) is not present."
diff --git a/test/integration/github_test.go b/test/integration/github_test.go
index c99b8957..f589e308 100644
--- a/test/integration/github_test.go
+++ b/test/integration/github_test.go
@@ -15,7 +15,7 @@ import (
 	"net/http"
 	"os"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 	"golang.org/x/oauth2"
 )
 
diff --git a/test/integration/repos_test.go b/test/integration/repos_test.go
index 77f9fb52..26af722b 100644
--- a/test/integration/repos_test.go
+++ b/test/integration/repos_test.go
@@ -16,7 +16,7 @@ import (
 	"testing"
 
 	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 )
 
 func TestRepositories_CRUD(t *testing.T) {
diff --git a/test/integration/users_test.go b/test/integration/users_test.go
index f25fa8f0..6c239e22 100644
--- a/test/integration/users_test.go
+++ b/test/integration/users_test.go
@@ -14,7 +14,7 @@ import (
 	"math/rand"
 	"testing"
 
-	"github.com/google/go-github/v40/github"
+	"github.com/google/go-github/v41/github"
 )
 
 func TestUsers_Get(t *testing.T) {