diff --git a/cmd/install.go b/cmd/install.go index e141cee..a7c0187 100644 --- a/cmd/install.go +++ b/cmd/install.go @@ -32,7 +32,7 @@ func newInstall(installOpts installOpts, release string) error { } if release == "" { client := gh.NewClient(os.Getenv("GITHUB_PAT")) - releases, err := gh.GetReleases(client, false) + releases, err := gh.GetReleases(client, 100) if err != nil { return err } @@ -55,7 +55,10 @@ func newInstall(installOpts installOpts, release string) error { return err } } - if release == "latest" { + + // github's latest release is literally their latest release, + // not the latest tagged version + if release == "release" { client := gh.NewClient(os.Getenv("GITHUB_PAT")) latestRelease, err := gh.GetLatestRelease(client) if err != nil { @@ -63,6 +66,16 @@ func newInstall(installOpts installOpts, release string) error { } release = latestRelease.GetTagName() } + + if release == "latest" { + client := gh.NewClient(os.Getenv("GITHUB_PAT")) + releases, err := gh.GetReleases(client, 1) + if err != nil { + return err + } + release = releases[0].GetTagName() + } + _, ok := iv[release] if ok { log.Infof("quarto version %s is already installed\n", release) diff --git a/internal/gh/releases.go b/internal/gh/releases.go index d3283c5..2551c9c 100644 --- a/internal/gh/releases.go +++ b/internal/gh/releases.go @@ -32,11 +32,19 @@ func GetLatestRelease(client *github.Client) (*github.RepositoryRelease, error) return rel, err } -func GetReleases(client *github.Client, paginate bool) ([]*github.RepositoryRelease, error) { - opts := &github.ListOptions{PerPage: 50} +func GetReleases(client *github.Client, n int) ([]*github.RepositoryRelease, error) { + // max of 50 per page + perPage := 50 + remaining := n - perPage + if n < 50 { + remaining = 0 + perPage = n + } var releases []*github.RepositoryRelease + opts := &github.ListOptions{PerPage: perPage} for { start := time.Now() + log.Tracef("perpage: %d, remaining: %d", opts.PerPage, remaining) rel, resp, err := client.Repositories.ListReleases( context.Background(), "quarto-dev", @@ -48,9 +56,15 @@ func GetReleases(client *github.Client, paginate bool) ([]*github.RepositoryRele } releases = append(releases, rel...) log.Tracef("repository release paginator: %s, page: %d", time.Since(start), resp.NextPage) - if !paginate || resp.NextPage == 0 { + if remaining <= 0 || resp.NextPage == 0 { break } + if remaining <= perPage { + opts.PerPage = remaining + remaining = 0 + } else { + remaining -= perPage + } opts.Page = resp.NextPage } return releases, nil