mirror of https://github.com/artifacthub/hub.git
Detect versions with build md in Helm OCI repos (#3879)
Closes #3762 Signed-off-by: Sergio Castaño Arteaga <tegioz@icloud.com>
This commit is contained in:
parent
053a1c830b
commit
81ab6ab3ad
|
|
@ -63,5 +63,10 @@ type OCISignatureChecker interface {
|
||||||
// OCITagsGetter is the interface that wraps the Tags method, used to get all
|
// OCITagsGetter is the interface that wraps the Tags method, used to get all
|
||||||
// the tags available for a given repository in a OCI registry.
|
// the tags available for a given repository in a OCI registry.
|
||||||
type OCITagsGetter interface {
|
type OCITagsGetter interface {
|
||||||
Tags(ctx context.Context, r *Repository, onlySemver bool) ([]string, error)
|
Tags(
|
||||||
|
ctx context.Context,
|
||||||
|
r *Repository,
|
||||||
|
onlySemver bool,
|
||||||
|
restorePlusSign bool,
|
||||||
|
) ([]string, error)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,12 @@ type TagsGetterMock struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tags implements the OCITagsGetter interface.
|
// Tags implements the OCITagsGetter interface.
|
||||||
func (m *TagsGetterMock) Tags(ctx context.Context, r *hub.Repository, onlySemver bool) ([]string, error) {
|
func (m *TagsGetterMock) Tags(
|
||||||
|
ctx context.Context,
|
||||||
|
r *hub.Repository,
|
||||||
|
onlySemver bool,
|
||||||
|
restorePlusSign bool,
|
||||||
|
) ([]string, error) {
|
||||||
args := m.Called(ctx, r, onlySemver)
|
args := m.Called(ctx, r, onlySemver)
|
||||||
tags, _ := args.Get(0).([]string)
|
tags, _ := args.Get(0).([]string)
|
||||||
return tags, args.Error(1)
|
return tags, args.Error(1)
|
||||||
|
|
|
||||||
|
|
@ -168,7 +168,12 @@ func NewTagsGetter(cfg *viper.Viper) *TagsGetter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tags returns a list with the tags available for the provided repository.
|
// Tags returns a list with the tags available for the provided repository.
|
||||||
func (tg *TagsGetter) Tags(ctx context.Context, r *hub.Repository, onlySemver bool) ([]string, error) {
|
func (tg *TagsGetter) Tags(
|
||||||
|
ctx context.Context,
|
||||||
|
r *hub.Repository,
|
||||||
|
onlySemver bool,
|
||||||
|
restorePlusSign bool,
|
||||||
|
) ([]string, error) {
|
||||||
ref, err := name.ParseReference(strings.TrimPrefix(r.URL, hub.RepositoryOCIPrefix))
|
ref, err := name.ParseReference(strings.TrimPrefix(r.URL, hub.RepositoryOCIPrefix))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -181,6 +186,10 @@ func (tg *TagsGetter) Tags(ctx context.Context, r *hub.Repository, onlySemver bo
|
||||||
if onlySemver {
|
if onlySemver {
|
||||||
var semverTags []string
|
var semverTags []string
|
||||||
for _, tag := range tags {
|
for _, tag := range tags {
|
||||||
|
if restorePlusSign {
|
||||||
|
// See https://github.com/helm/helm/blob/14d0c13e9eefff5b4a1b511cf50643529692ec94/pkg/registry/client.go#L45C8-L50
|
||||||
|
tag = strings.Replace(tag, "_", "+", 1)
|
||||||
|
}
|
||||||
if _, err := semver.NewVersion(tag); err == nil {
|
if _, err := semver.NewVersion(tag); err == nil {
|
||||||
semverTags = append(semverTags, tag)
|
semverTags = append(semverTags, tag)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -567,7 +567,7 @@ func (m *Manager) GetRemoteDigest(ctx context.Context, r *hub.Repository) (strin
|
||||||
}
|
}
|
||||||
case SchemeIsOCI(u):
|
case SchemeIsOCI(u):
|
||||||
// Digest is obtained by hashing the list of versions available
|
// Digest is obtained by hashing the list of versions available
|
||||||
versions, err := m.tg.Tags(ctx, r, true)
|
versions, err := m.tg.Tags(ctx, r, true, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return digest, err
|
return digest, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -189,7 +189,7 @@ func (s *TrackerSource) getCharts() (map[string][]*helmrepo.ChartVersion, error)
|
||||||
}
|
}
|
||||||
case "oci":
|
case "oci":
|
||||||
// Get versions (tags) available in the repository
|
// Get versions (tags) available in the repository
|
||||||
versions, err := s.tg.Tags(s.i.Svc.Ctx, s.i.Repository, true)
|
versions, err := s.tg.Tags(s.i.Svc.Ctx, s.i.Repository, true, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error getting repository available versions: %w", err)
|
return nil, fmt.Errorf("error getting repository available versions: %w", err)
|
||||||
}
|
}
|
||||||
|
|
@ -197,12 +197,16 @@ func (s *TrackerSource) getCharts() (map[string][]*helmrepo.ChartVersion, error)
|
||||||
// Prepare chart versions using the list of versions available
|
// Prepare chart versions using the list of versions available
|
||||||
name := path.Base(s.i.Repository.URL)
|
name := path.Base(s.i.Repository.URL)
|
||||||
for _, version := range versions {
|
for _, version := range versions {
|
||||||
|
// See https://github.com/helm/helm/blob/14d0c13e9eefff5b4a1b511cf50643529692ec94/pkg/registry/client.go#L45C8-L50
|
||||||
|
versionReplacingPlusSign := strings.Replace(version, "+", "_", 1)
|
||||||
|
chartURL := fmt.Sprintf("%s:%s", s.i.Repository.URL, versionReplacingPlusSign)
|
||||||
|
|
||||||
charts[name] = append(charts[name], &helmrepo.ChartVersion{
|
charts[name] = append(charts[name], &helmrepo.ChartVersion{
|
||||||
Metadata: &chart.Metadata{
|
Metadata: &chart.Metadata{
|
||||||
Name: name,
|
Name: name,
|
||||||
Version: version,
|
Version: version,
|
||||||
},
|
},
|
||||||
URLs: []string{s.i.Repository.URL + ":" + version},
|
URLs: []string{chartURL},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue