diff --git a/internal/gh/uri.go b/internal/gh/uri.go index e2d2e570..5d558501 100644 --- a/internal/gh/uri.go +++ b/internal/gh/uri.go @@ -10,27 +10,36 @@ import ( // RepositoryOwnerAndNameFromPath is from the github-release-source branch // once that one is merged we should that one instead of this one -func RepositoryOwnerAndNameFromPath(urlStr string) (owner, repo string, err error) { +func RepositoryOwnerAndNameFromPath(urlStr string) (string, string, error) { + _, owner, repo, err := RepositoryHostOwnerAndNameFromPath(urlStr) + return owner, repo, err +} + +func RepositoryHostOwnerAndNameFromPath(urlStr string) (string, string, string, error) { wrapError := func(urlStr string, err error) error { return fmt.Errorf("failed to parse owner and repo name from URI %q: %w", urlStr, err) } - - sshReg := regexp.MustCompile(`(?m)git@(?P.*):(?P[^/]+)/(?P.*)\.git`) - if m := sshReg.FindStringSubmatch(urlStr); m != nil { - owner = m[sshReg.SubexpIndex("owner")] - repo = m[sshReg.SubexpIndex("name")] - return owner, repo, nil + if strings.HasPrefix(urlStr, "git@") { + exp := regexp.MustCompile(`git@(?P.*):(?P[^/]+)/(?P.+)\.git`) + m := exp.FindStringSubmatch(urlStr) + if m == nil { + return "", "", "", fmt.Errorf("path missing expected parts") + } + host := m[exp.SubexpIndex("host")] + owner := m[exp.SubexpIndex("owner")] + repo := m[exp.SubexpIndex("name")] + return host, owner, repo, nil } u, err := url.Parse(urlStr) if err != nil { - return "", "", wrapError(urlStr, err) + return "", "", "", wrapError(urlStr, err) } if filepath.Ext(u.Path) == ".git" { u.Path = strings.TrimSuffix(u.Path, ".git") } owner, repo, found := strings.Cut(strings.TrimPrefix(u.Path, "/"), "/") if !found || owner == "" || repo == "" { - return owner, repo, wrapError(urlStr, fmt.Errorf("path missing expected parts")) + return "", owner, repo, wrapError(urlStr, fmt.Errorf("path missing expected parts")) } - return owner, repo, nil + return u.Host, owner, repo, nil } diff --git a/internal/gh/uri_test.go b/internal/gh/uri_test.go index 1ee5be28..5e42642d 100644 --- a/internal/gh/uri_test.go +++ b/internal/gh/uri_test.go @@ -13,23 +13,29 @@ func Test_RepositoryOwnerAndNameFromPath(t *testing.T) { Name, URI, RepositoryOwner, RepositoryName, + RepositoryHost, ErrorSubstring string }{ { Name: "valid url", URI: "https://github.com/crhntr/hello-release", - RepositoryOwner: "crhntr", RepositoryName: "hello-release", + RepositoryOwner: "crhntr", RepositoryName: "hello-release", RepositoryHost: "github.com", }, { Name: "ssh url", URI: "git@github.com:crhntr/hello-release.git", - RepositoryOwner: "crhntr", RepositoryName: "hello-release", + RepositoryOwner: "crhntr", RepositoryName: "hello-release", RepositoryHost: "github.com", }, { Name: "empty ssh path", URI: "git@github.com:", ErrorSubstring: "path missing expected parts", }, + { + Name: "github enterprise", + URI: "git@example.com:x/y.git", + RepositoryOwner: "x", RepositoryName: "y", RepositoryHost: "example.com", + }, { Name: "not a valid ssh path", URI: "git@github.com:?invalid_url?", @@ -52,13 +58,24 @@ func Test_RepositoryOwnerAndNameFromPath(t *testing.T) { }, } { t.Run(tt.Name, func(t *testing.T) { - repoOwner, repoName, err := gh.RepositoryOwnerAndNameFromPath(tt.URI) + repoHost, repoOwner, repoName, err := gh.RepositoryHostOwnerAndNameFromPath(tt.URI) + if tt.ErrorSubstring != "" { + require.ErrorContains(t, err, tt.ErrorSubstring) + } else { + require.NoError(t, err) + assert.Equal(t, tt.RepositoryOwner, repoOwner) + assert.Equal(t, tt.RepositoryName, repoName) + assert.Equal(t, tt.RepositoryHost, repoHost) + } + + repoOwner, repoName, err = gh.RepositoryOwnerAndNameFromPath(tt.URI) if tt.ErrorSubstring != "" { require.ErrorContains(t, err, tt.ErrorSubstring) } else { require.NoError(t, err) assert.Equal(t, tt.RepositoryOwner, repoOwner) assert.Equal(t, tt.RepositoryName, repoName) + assert.Equal(t, tt.RepositoryHost, repoHost) } }) } diff --git a/pkg/cargo/bump.go b/pkg/cargo/bump.go index c50e659b..6b6c8e84 100644 --- a/pkg/cargo/bump.go +++ b/pkg/cargo/bump.go @@ -129,7 +129,7 @@ type repositoryReleaseLister interface { type ( RepositoryReleaseLister = repositoryReleaseLister - githubClientFunc func(Kilnfile, BOSHReleaseTarballLock) (repositoryReleaseLister, error) + githubClientFunc func(ctx context.Context, kilnfile Kilnfile, lock BOSHReleaseTarballLock) (repositoryReleaseLister, error) ) func releaseNotes(ctx context.Context, kf Kilnfile, list BumpList, client githubClientFunc) (BumpList, error) { @@ -184,9 +184,23 @@ func releaseNotes(ctx context.Context, kf Kilnfile, list BumpList, client github } func ReleaseNotes(ctx context.Context, kf Kilnfile, list BumpList) (BumpList, error) { - return releaseNotes(ctx, kf, list, func(kilnfile Kilnfile, lock BOSHReleaseTarballLock) (repositoryReleaseLister, error) { + return releaseNotes(ctx, kf, list, listerForRelease(kf)) +} + +func listerForRelease(kf Kilnfile) func(ctx context.Context, _ Kilnfile, lock BOSHReleaseTarballLock) (repositoryReleaseLister, error) { + return func(ctx context.Context, kilnfile Kilnfile, lock BOSHReleaseTarballLock) (repositoryReleaseLister, error) { + spec, err := kf.BOSHReleaseTarballSpecification(lock.Name) + if err != nil { + return nil, err + } + + _, owner, _, err := gh.RepositoryHostOwnerAndNameFromPath(spec.GitHubRepository) + if err != nil { + return nil, err + } + i := slices.IndexFunc(kf.ReleaseSources, func(config ReleaseSourceConfig) bool { - return BOSHReleaseTarballSourceID(config) == lock.RemoteSource + return config.Type == BOSHReleaseTarballSourceTypeGithub && config.Org == owner }) if i < 0 { return nil, fmt.Errorf("release source with id %s not found", lock.RemoteSource) @@ -197,7 +211,7 @@ func ReleaseNotes(ctx context.Context, kf Kilnfile, list BumpList) (BumpList, er return nil, err } return client.Repositories, err - }) + } } func fetchReleasesFromRepo(ctx context.Context, repoService RepositoryReleaseLister, repository string, from, to *semver.Version) []*github.RepositoryRelease { @@ -226,8 +240,9 @@ func fetchReleasesFromRepo(ctx context.Context, repoService RepositoryReleaseLis } func fetchReleasesForBump(ctx context.Context, kf Kilnfile, bump Bump, client githubClientFunc) Bump { - lister, err := client(kf, bump.To) + lister, err := client(ctx, kf, bump.To) if err != nil { + log.Println(err) return bump } spec, err := kf.BOSHReleaseTarballSpecification(bump.Name) diff --git a/pkg/cargo/bump_test.go b/pkg/cargo/bump_test.go index edafaba8..e1ea2d55 100644 --- a/pkg/cargo/bump_test.go +++ b/pkg/cargo/bump_test.go @@ -164,7 +164,7 @@ func TestInternal_addReleaseNotes(t *testing.T) { To: BOSHReleaseTarballLock{Version: "10"}, From: BOSHReleaseTarballLock{Version: "9"}, }, - }, func(kilnfile Kilnfile, lock BOSHReleaseTarballLock) (repositoryReleaseLister, error) { + }, func(ctx context.Context, kilnfile Kilnfile, lock BOSHReleaseTarballLock) (repositoryReleaseLister, error) { return releaseLister, nil }) please.Expect(err).NotTo(HaveOccurred())