11package store
22
33import (
4+ "context"
5+ "os"
6+ "os/exec"
7+ "strings"
8+ "time"
9+
410 breverrors "github.com/brevdev/brev-cli/pkg/errors"
511 "github.com/go-resty/resty/v2"
612)
@@ -14,15 +20,36 @@ type GithubReleaseMetadata struct {
1420}
1521
1622const (
17- cliReleaseURL = "https://api.github.com/repos/brevdev/brev-cli/releases/latest"
23+ cliReleaseURL = "https://api.github.com/repos/brevdev/brev-cli/releases/latest"
24+ ghAuthTokenTimeout = 60 * time .Second
1825)
1926
27+ // GitHubAPIToken returns GITHUB_TOKEN from the environment, or "gh auth token" with a timeout.
28+ func GitHubAPIToken () string {
29+ if token := strings .TrimSpace (os .Getenv ("GITHUB_TOKEN" )); token != "" {
30+ return token
31+ }
32+
33+ ctx , cancel := context .WithTimeout (context .Background (), ghAuthTokenTimeout )
34+ defer cancel ()
35+
36+ out , err := exec .CommandContext (ctx , "gh" , "auth" , "token" ).Output () //nolint:gosec // intentional gh probe
37+ if err != nil {
38+ return ""
39+ }
40+ return strings .TrimSpace (string (out ))
41+ }
42+
2043func (n NoAuthHTTPStore ) GetLatestReleaseMetadata () (* GithubReleaseMetadata , error ) {
2144 var result GithubReleaseMetadata
2245
2346 client := resty .New ()
47+ req := client .R ().SetResult (& result )
48+ if token := GitHubAPIToken (); token != "" {
49+ req .SetHeader ("Authorization" , "token " + token )
50+ }
2451
25- res , err := client . R (). SetResult ( & result ) .Get (cliReleaseURL )
52+ res , err := req .Get (cliReleaseURL )
2653 if err != nil {
2754 return nil , breverrors .WrapAndTrace (err )
2855 }
0 commit comments