From 574e5be9290c8bdff8d09067113cf842651c04af Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Mon, 9 Mar 2026 21:10:18 -0600 Subject: [PATCH] feat(releases): add source archive fetchers for GitHub, Gitea, GitLab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For packages installed from auto-generated source tarballs rather than uploaded binary assets (shell scripts, vim plugins, etc.). Each delegates to its respective forge fetcher — the distinction is organizational, signaling which fields the consumer should use. --- internal/releases/giteasrc/giteasrc.go | 25 ++++++++++++++++++++++ internal/releases/githubsrc/githubsrc.go | 27 ++++++++++++++++++++++++ internal/releases/gitlabsrc/gitlabsrc.go | 25 ++++++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 internal/releases/giteasrc/giteasrc.go create mode 100644 internal/releases/githubsrc/githubsrc.go create mode 100644 internal/releases/gitlabsrc/gitlabsrc.go diff --git a/internal/releases/giteasrc/giteasrc.go b/internal/releases/giteasrc/giteasrc.go new file mode 100644 index 0000000..da00b00 --- /dev/null +++ b/internal/releases/giteasrc/giteasrc.go @@ -0,0 +1,25 @@ +// Package giteasrc fetches source archives from Gitea/Forgejo releases. +// +// Some packages are installed from the auto-generated source tarballs +// rather than uploaded binary assets. This package fetches releases and +// exposes the tarball/zipball URLs. +// +// Use [gitea] for packages that use uploaded binary assets. +package giteasrc + +import ( + "context" + "iter" + "net/http" + + "github.com/webinstall/webi-installers/internal/releases/gitea" +) + +// Fetch retrieves releases from a Gitea instance for the given owner/repo. +// Paginates automatically, yielding one batch per API page. +// +// Callers should use [gitea.Release.TarballURL] and +// [gitea.Release.ZipballURL] rather than the Assets list. +func Fetch(ctx context.Context, client *http.Client, baseURL, owner, repo string, auth *gitea.Auth) iter.Seq2[[]gitea.Release, error] { + return gitea.Fetch(ctx, client, baseURL, owner, repo, auth) +} diff --git a/internal/releases/githubsrc/githubsrc.go b/internal/releases/githubsrc/githubsrc.go new file mode 100644 index 0000000..35b402e --- /dev/null +++ b/internal/releases/githubsrc/githubsrc.go @@ -0,0 +1,27 @@ +// Package githubsrc fetches source archives from GitHub releases. +// +// Some packages (shell scripts, vim plugins) are installed from the +// auto-generated source tarballs rather than uploaded binary assets. +// This package fetches releases and exposes the tarball/zipball URLs. +// +// Use [github] for packages that use uploaded binary assets. +package githubsrc + +import ( + "context" + "iter" + "net/http" + + "github.com/webinstall/webi-installers/internal/releases/githubish" +) + +const baseURL = "https://api.github.com" + +// Fetch retrieves releases from GitHub for the given owner/repo. +// Paginates automatically, yielding one batch per API page. +// +// Callers should use [githubish.Release.TarballURL] and +// [githubish.Release.ZipballURL] rather than the Assets list. +func Fetch(ctx context.Context, client *http.Client, owner, repo string, auth *githubish.Auth) iter.Seq2[[]githubish.Release, error] { + return githubish.Fetch(ctx, client, baseURL, owner, repo, auth) +} diff --git a/internal/releases/gitlabsrc/gitlabsrc.go b/internal/releases/gitlabsrc/gitlabsrc.go new file mode 100644 index 0000000..c4a3b43 --- /dev/null +++ b/internal/releases/gitlabsrc/gitlabsrc.go @@ -0,0 +1,25 @@ +// Package gitlabsrc fetches source archives from GitLab releases. +// +// Some packages are installed from the auto-generated source archives +// rather than attached binary links. This package fetches releases and +// exposes the source archive URLs. +// +// Use [gitlab] for packages that use attached release links (binaries). +package gitlabsrc + +import ( + "context" + "iter" + "net/http" + + "github.com/webinstall/webi-installers/internal/releases/gitlab" +) + +// Fetch retrieves releases from a GitLab instance. +// Paginates automatically, yielding one batch per API page. +// +// Callers should use [gitlab.Release.Assets.Sources] rather than +// [gitlab.Release.Assets.Links]. +func Fetch(ctx context.Context, client *http.Client, baseURL, project string, auth *gitlab.Auth) iter.Seq2[[]gitlab.Release, error] { + return gitlab.Fetch(ctx, client, baseURL, project, auth) +}