Skip to content

Commit ca77997

Browse files
authored
Implement buffered channel for pull requests (#67)
* Implement functionality to honor GitHub API rate limits - Flow all open pr requests through a buffered channel - Implement flags for tuning git-xargs behavior when rate limited - Implement automatic rate-limit aware retries for failed pull requests
1 parent 3dc1d1a commit ca77997

19 files changed

+353
-111
lines changed

.circleci/config.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ jobs:
4545
git config --global user.name "Grunty"
4646
- run:
4747
name: run git-xargs tests
48-
command: run-go-tests --timeout 45m
48+
command: run-go-tests --timeout 5m
4949
no_output_timeout: 45m
5050
when: always
5151
build-and-deploy:

README.md

+56-14
Large diffs are not rendered by default.

auth/auth.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55
"os"
66

7-
"github.com/google/go-github/v32/github"
7+
"github.com/google/go-github/v43/github"
88
"github.com/gruntwork-io/git-xargs/types"
99
"github.com/gruntwork-io/go-commons/errors"
1010

cmd/git-xargs.go

+13
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import (
55
"io"
66
"os"
77
"strings"
8+
"time"
89

910
"github.com/gruntwork-io/git-xargs/auth"
11+
"github.com/gruntwork-io/git-xargs/common"
1012
"github.com/gruntwork-io/git-xargs/config"
1113
gitxargs_io "github.com/gruntwork-io/git-xargs/io"
1214
"github.com/gruntwork-io/git-xargs/repository"
@@ -33,6 +35,17 @@ func parseGitXargsConfig(c *cli.Context) (*config.GitXargsConfig, error) {
3335
config.GithubOrg = c.String("github-org")
3436
config.RepoSlice = c.StringSlice("repo")
3537
config.MaxConcurrentRepos = c.Int("max-concurrent-repos")
38+
config.SecondsToSleepBetweenPRs = c.Int("seconds-between-prs")
39+
config.PullRequestRetries = c.Int("max-pr-retries")
40+
config.SecondsToSleepWhenRateLimited = c.Int("seconds-to-wait-when-rate-limited")
41+
42+
// A non-positive ticker value won't work, so set to the default minimum if user passed a bad value
43+
tickerVal := c.Int("seconds-between-prs")
44+
if tickerVal < 1 {
45+
tickerVal = common.DefaultSecondsBetweenPRs
46+
}
47+
48+
config.Ticker = time.NewTicker(time.Duration(tickerVal) * time.Second)
3649
config.Args = c.Args()
3750

3851
shouldReadStdIn, err := dataBeingPipedToStdIn()

cmd/git-xargs_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ func TestHandleRepoProcessing(t *testing.T) {
2222
testConfig.CommitMessage = "test-commit-name"
2323
testConfig.Args = []string{"touch", "test.txt"}
2424
testConfig.GithubClient = mocks.ConfigureMockGithubClient()
25-
err := handleRepoProcessing(testConfig)
25+
testConfig.PullRequestRetries = 0
26+
testConfig.SecondsToSleepBetweenPRs = 1
2627

28+
err := handleRepoProcessing(testConfig)
2729
assert.NoError(t, err)
2830
}
2931

common/common.go

+38-17
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,29 @@ package common
33
import "github.com/urfave/cli"
44

55
const (
6-
GithubOrgFlagName = "github-org"
7-
DraftPullRequestFlagName = "draft"
8-
DryRunFlagName = "dry-run"
9-
SkipPullRequestsFlagName = "skip-pull-requests"
10-
SkipArchivedReposFlagName = "skip-archived-repos"
11-
RepoFlagName = "repo"
12-
ReposFileFlagName = "repos"
13-
CommitMessageFlagName = "commit-message"
14-
BranchFlagName = "branch-name"
15-
BaseBranchFlagName = "base-branch-name"
16-
PullRequestTitleFlagName = "pull-request-title"
17-
PullRequestDescriptionFlagName = "pull-request-description"
18-
MaxConcurrentReposFlagName = "max-concurrent-repos"
19-
DefaultCommitMessage = "git-xargs programmatic commit"
20-
DefaultPullRequestTitle = "git-xargs programmatic pull request"
21-
DefaultPullRequestDescription = "git-xargs programmatic pull request"
22-
DefaultMaxConcurrentRepos = 0
6+
GithubOrgFlagName = "github-org"
7+
DraftPullRequestFlagName = "draft"
8+
DryRunFlagName = "dry-run"
9+
SkipPullRequestsFlagName = "skip-pull-requests"
10+
SkipArchivedReposFlagName = "skip-archived-repos"
11+
RepoFlagName = "repo"
12+
ReposFileFlagName = "repos"
13+
CommitMessageFlagName = "commit-message"
14+
BranchFlagName = "branch-name"
15+
BaseBranchFlagName = "base-branch-name"
16+
PullRequestTitleFlagName = "pull-request-title"
17+
PullRequestDescriptionFlagName = "pull-request-description"
18+
MaxConcurrentReposFlagName = "max-concurrent-repos"
19+
SecondsToWaitBetweenPrsFlagName = "seconds-between-prs"
20+
DefaultCommitMessage = "git-xargs programmatic commit"
21+
DefaultPullRequestTitle = "git-xargs programmatic pull request"
22+
DefaultPullRequestDescription = "git-xargs programmatic pull request"
23+
MaxPullRequestRetriesFlagName = "max-pr-retries"
24+
SecondsToWaitWhenRateLimitedFlagName = "seconds-to-wait-when-rate-limited"
25+
DefaultMaxConcurrentRepos = 0
26+
DefaultSecondsBetweenPRs = 1
27+
DefaultMaxPullRequestRetries = 3
28+
DefaultSecondsToWaitWhenRateLimited = 60
2329
)
2430

2531
var (
@@ -79,4 +85,19 @@ var (
7985
Usage: "Limits the number of concurrent processed repositories. This is only useful if you encounter issues and need throttling when running on a very large number of repos. Default is 0 (Unlimited)",
8086
Value: DefaultMaxConcurrentRepos,
8187
}
88+
GenericSecondsToWaitFlag = cli.IntFlag{
89+
Name: SecondsToWaitBetweenPrsFlagName,
90+
Usage: "The number of seconds to sleep between pull requests in order to respect GitHub API rate limits. Increase this number if you are being rate limited regularly. Defaults to 12 seconds.",
91+
Value: DefaultSecondsBetweenPRs,
92+
}
93+
GenericMaxPullRequestRetriesFlag = cli.IntFlag{
94+
Name: MaxPullRequestRetriesFlagName,
95+
Usage: "The number of times to re-try a failed pull request. Defaults to 3.",
96+
Value: DefaultMaxPullRequestRetries,
97+
}
98+
GenericSecondsToWaitWhenRateLimitedFlag = cli.IntFlag{
99+
Name: SecondsToWaitWhenRateLimitedFlagName,
100+
Usage: "The number of additional seconds to sleep before attempting to open a PR again, when rate limited by GitHub. Defaults to 60.",
101+
Value: DefaultSecondsToWaitWhenRateLimited,
102+
}
82103
)

config/config.go

+49-36
Original file line numberDiff line numberDiff line change
@@ -2,57 +2,68 @@ package config
22

33
import (
44
"fmt"
5+
"time"
56

67
"github.com/gruntwork-io/git-xargs/auth"
78
"github.com/gruntwork-io/git-xargs/common"
89
"github.com/gruntwork-io/git-xargs/local"
910
"github.com/gruntwork-io/git-xargs/stats"
11+
"github.com/gruntwork-io/git-xargs/types"
1012
"github.com/gruntwork-io/git-xargs/util"
1113
)
1214

1315
// GitXargsConfig is the internal representation of a given git-xargs run as specified by the user
1416
type GitXargsConfig struct {
15-
Draft bool
16-
DryRun bool
17-
SkipPullRequests bool
18-
SkipArchivedRepos bool
19-
MaxConcurrentRepos int
20-
BranchName string
21-
BaseBranchName string
22-
CommitMessage string
23-
PullRequestTitle string
24-
PullRequestDescription string
25-
ReposFile string
26-
GithubOrg string
27-
RepoSlice []string
28-
RepoFromStdIn []string
29-
Args []string
30-
GithubClient auth.GithubClient
31-
GitClient local.GitClient
32-
Stats *stats.RunStats
17+
Draft bool
18+
DryRun bool
19+
SkipPullRequests bool
20+
SkipArchivedRepos bool
21+
MaxConcurrentRepos int
22+
BranchName string
23+
BaseBranchName string
24+
CommitMessage string
25+
PullRequestTitle string
26+
PullRequestDescription string
27+
ReposFile string
28+
GithubOrg string
29+
RepoSlice []string
30+
RepoFromStdIn []string
31+
Args []string
32+
GithubClient auth.GithubClient
33+
GitClient local.GitClient
34+
Stats *stats.RunStats
35+
PRChan chan types.OpenPrRequest
36+
SecondsToSleepBetweenPRs int
37+
PullRequestRetries int
38+
SecondsToSleepWhenRateLimited int
39+
Ticker *time.Ticker
3340
}
3441

3542
// NewGitXargsConfig sets reasonable defaults for a GitXargsConfig and returns a pointer to the config
3643
func NewGitXargsConfig() *GitXargsConfig {
3744
return &GitXargsConfig{
38-
Draft: false,
39-
DryRun: false,
40-
SkipPullRequests: false,
41-
SkipArchivedRepos: false,
42-
MaxConcurrentRepos: 0,
43-
BranchName: "",
44-
BaseBranchName: "",
45-
CommitMessage: common.DefaultCommitMessage,
46-
PullRequestTitle: common.DefaultPullRequestTitle,
47-
PullRequestDescription: common.DefaultPullRequestDescription,
48-
ReposFile: "",
49-
GithubOrg: "",
50-
RepoSlice: []string{},
51-
RepoFromStdIn: []string{},
52-
Args: []string{},
53-
GithubClient: auth.ConfigureGithubClient(),
54-
GitClient: local.NewGitClient(local.GitProductionProvider{}),
55-
Stats: stats.NewStatsTracker(),
45+
Draft: false,
46+
DryRun: false,
47+
SkipPullRequests: false,
48+
SkipArchivedRepos: false,
49+
MaxConcurrentRepos: 0,
50+
BranchName: "",
51+
BaseBranchName: "",
52+
CommitMessage: common.DefaultCommitMessage,
53+
PullRequestTitle: common.DefaultPullRequestTitle,
54+
PullRequestDescription: common.DefaultPullRequestDescription,
55+
ReposFile: "",
56+
GithubOrg: "",
57+
RepoSlice: []string{},
58+
RepoFromStdIn: []string{},
59+
Args: []string{},
60+
GithubClient: auth.ConfigureGithubClient(),
61+
GitClient: local.NewGitClient(local.GitProductionProvider{}),
62+
Stats: stats.NewStatsTracker(),
63+
PRChan: make(chan types.OpenPrRequest),
64+
SecondsToSleepBetweenPRs: common.DefaultSecondsBetweenPRs,
65+
SecondsToSleepWhenRateLimited: common.DefaultSecondsToWaitWhenRateLimited,
66+
PullRequestRetries: common.DefaultMaxPullRequestRetries,
5667
}
5768
}
5869

@@ -65,5 +76,7 @@ func NewGitXargsTestConfig() *GitXargsConfig {
6576
config.CommitMessage = fmt.Sprintf("commit-message-%s", uniqueID)
6677
config.GitClient = local.NewGitClient(local.MockGitProvider{})
6778

79+
config.Ticker = time.NewTicker(time.Duration(1) * time.Second)
80+
6881
return config
6982
}

go.mod

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.14
55
require (
66
github.com/go-git/go-git/v5 v5.3.0
77
github.com/golang/protobuf v1.4.3 // indirect
8-
github.com/google/go-github/v32 v32.1.0
8+
github.com/google/go-github/v43 v43.0.0
99
github.com/gruntwork-io/go-commons v0.8.2
1010
github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23
1111
github.com/landoop/tableprinter v0.0.0-20200805134727-ea32388e35c1
@@ -15,5 +15,4 @@ require (
1515
github.com/stretchr/testify v1.7.0
1616
github.com/urfave/cli v1.22.5
1717
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
18-
google.golang.org/appengine v1.6.7 // indirect
1918
)

go.sum

+15-7
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
103103
github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
104104
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
105105
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
106+
github.com/bradleyfalzon/ghinstallation/v2 v2.0.4/go.mod h1:B40qPqJxWE0jDZgOR1JmaMy+4AY1eBP+IByOvqyAKp0=
106107
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
107108
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
108109
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -217,6 +218,7 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a
217218
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
218219
github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
219220
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
221+
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
220222
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
221223
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
222224
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -255,13 +257,17 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
255257
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
256258
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
257259
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
258-
github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
259260
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
261+
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
262+
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
263+
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
264+
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
260265
github.com/google/go-containerregistry v0.0.0-20200110202235-f4fb41bf00a3/go.mod h1:2wIuQute9+hhWqvL3vEI7YB0EKluF4WcPzI1eAliazk=
261-
github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II=
262-
github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI=
263-
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
264-
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
266+
github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg=
267+
github.com/google/go-github/v43 v43.0.0 h1:y+GL7LIsAIF2NZlJ46ZoC/D1W1ivZasT0lnWHMYPZ+U=
268+
github.com/google/go-github/v43 v43.0.0/go.mod h1:ZkTvvmCXBvsfPpTHXnH/d2hP9Y0cTbvN9kr5xqyXOIc=
269+
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
270+
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
265271
github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
266272
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
267273
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -530,8 +536,9 @@ golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPh
530536
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
531537
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
532538
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
533-
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
534539
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
540+
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
541+
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
535542
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
536543
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
537544
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -671,8 +678,9 @@ golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7w
671678
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
672679
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
673680
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
674-
golang.org/x/sys v0.0.0-20210324051608-47abb6519492 h1:Paq34FxTluEPvVyayQqMPgHm+vTOrIifmcYxFBx9TLg=
675681
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
682+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
683+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
676684
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
677685
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
678686
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=

main.go

+3
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ func setupApp() *cli.App {
7474
common.GenericPullRequestTitleFlag,
7575
common.GenericPullRequestDescriptionFlag,
7676
common.GenericMaxConcurrentReposFlag,
77+
common.GenericSecondsToWaitFlag,
78+
common.GenericMaxPullRequestRetriesFlag,
79+
common.GenericSecondsToWaitWhenRateLimitedFlag,
7780
}
7881

7982
app.Action = cmd.RunGitXargs

mocks/mocks.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55
"net/http"
66

7-
"github.com/google/go-github/v32/github"
7+
"github.com/google/go-github/v43/github"
88
"github.com/gruntwork-io/git-xargs/auth"
99
)
1010

repository/fetch-repos.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/gruntwork-io/git-xargs/types"
1111
"github.com/gruntwork-io/go-commons/errors"
1212

13-
"github.com/google/go-github/v32/github"
13+
"github.com/google/go-github/v43/github"
1414
"github.com/gruntwork-io/go-commons/logging"
1515
"github.com/sirupsen/logrus"
1616
)

0 commit comments

Comments
 (0)