@ -142,7 +142,7 @@ func (m *Manager) Build() error {
}
}
// Now we need to fetch every package here into charts/
// Now we need to fetch every package here into charts/
return m . downloadAll ( lock . Dependencies )
return m . downloadAll ( lock . Dependencies , nil )
}
}
// Update updates a local charts directory.
// Update updates a local charts directory.
@ -192,13 +192,13 @@ func (m *Manager) Update() error {
// Now we need to find out which version of a chart best satisfies the
// Now we need to find out which version of a chart best satisfies the
// dependencies in the Chart.yaml
// dependencies in the Chart.yaml
lock , err := m . resolve ( req , repoNames )
lock , urls, err := m . resolve ( req , repoNames )
if err != nil {
if err != nil {
return err
return err
}
}
// Now we need to fetch every package here into charts/
// Now we need to fetch every package here into charts/
if err := m . downloadAll ( lock . Dependencies ); err != nil {
if err := m . downloadAll ( lock . Dependencies , urls ); err != nil {
return err
return err
}
}
@ -231,7 +231,7 @@ func (m *Manager) loadChartDir() (*chart.Chart, error) {
// resolve takes a list of dependencies and translates them into an exact version to download.
// resolve takes a list of dependencies and translates them into an exact version to download.
//
//
// This returns a lock file, which has all of the dependencies normalized to a specific version.
// This returns a lock file, which has all of the dependencies normalized to a specific version.
func ( m * Manager ) resolve ( req [ ] * chart . Dependency , repoNames map [ string ] string ) ( * chart . Lock , error ) {
func ( m * Manager ) resolve ( req [ ] * chart . Dependency , repoNames map [ string ] string ) ( * chart . Lock , map [ string ] string , error ) {
res := resolver . New ( m . ChartPath , m . RepositoryCache , m . RegistryClient )
res := resolver . New ( m . ChartPath , m . RepositoryCache , m . RegistryClient )
return res . Resolve ( req , repoNames )
return res . Resolve ( req , repoNames )
}
}
@ -240,7 +240,7 @@ func (m *Manager) resolve(req []*chart.Dependency, repoNames map[string]string)
//
//
// It will delete versions of the chart that exist on disk and might cause
// It will delete versions of the chart that exist on disk and might cause
// a conflict.
// a conflict.
func ( m * Manager ) downloadAll ( deps [ ] * chart . Dependency ) error {
func ( m * Manager ) downloadAll ( deps [ ] * chart . Dependency , urls map [ string ] string ) error {
repos , err := m . loadChartRepositories ( )
repos , err := m . loadChartRepositories ( )
if err != nil {
if err != nil {
return err
return err
@ -313,7 +313,7 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error {
// Any failure to resolve/download a chart should fail:
// Any failure to resolve/download a chart should fail:
// https://github.com/helm/helm/issues/1439
// https://github.com/helm/helm/issues/1439
churl , username , password , insecureskiptlsverify , passcredentialsall , caFile , certFile , keyFile , err := m . findChartURL ( dep . Name , dep . Version , dep . Repository , repos )
churl , username , password , insecureskiptlsverify , passcredentialsall , caFile , certFile , keyFile , err := m . findChartURL ( dep . Name , dep . Version , dep . Repository , repos , urls )
if err != nil {
if err != nil {
saveError = errors . Wrapf ( err , "could not find %s" , churl )
saveError = errors . Wrapf ( err , "could not find %s" , churl )
break
break
@ -502,6 +502,7 @@ func (m *Manager) ensureMissingRepos(repoNames map[string]string, deps []*chart.
var ru [ ] * repo . Entry
var ru [ ] * repo . Entry
Outer :
for _ , dd := range deps {
for _ , dd := range deps {
// If the chart is in the local charts directory no repository needs
// If the chart is in the local charts directory no repository needs
@ -529,6 +530,14 @@ func (m *Manager) ensureMissingRepos(repoNames map[string]string, deps []*chart.
repoNames [ dd . Name ] = rn
repoNames [ dd . Name ] = rn
// If repository is already present don't add to array. This will skip
// unnecessary index file downloading improving performance.
for _ , item := range ru {
if item . URL == dd . Repository {
continue Outer
}
}
// Assuming the repository is generally available. For Helm managed
// Assuming the repository is generally available. For Helm managed
// access controls the repository needs to be added through the user
// access controls the repository needs to be added through the user
// managed system. This path will work for public charts, like those
// managed system. This path will work for public charts, like those
@ -703,7 +712,7 @@ func (m *Manager) parallelRepoUpdate(repos []*repo.Entry) error {
// repoURL is the repository to search
// repoURL is the repository to search
//
//
// If it finds a URL that is "relative", it will prepend the repoURL.
// If it finds a URL that is "relative", it will prepend the repoURL.
func ( m * Manager ) findChartURL ( name , version , repoURL string , repos map [ string ] * repo . ChartRepository ) ( url , username , password string , insecureskiptlsverify , passcredentialsall bool , caFile , certFile , keyFile string , err error ) {
func ( m * Manager ) findChartURL ( name , version , repoURL string , repos map [ string ] * repo . ChartRepository , urls map [ string ] string ) ( url , username , password string , insecureskiptlsverify , passcredentialsall bool , caFile , certFile , keyFile string , err error ) {
if registry . IsOCI ( repoURL ) {
if registry . IsOCI ( repoURL ) {
return fmt . Sprintf ( "%s/%s:%s" , repoURL , name , version ) , "" , "" , false , false , "" , "" , "" , nil
return fmt . Sprintf ( "%s/%s:%s" , repoURL , name , version ) , "" , "" , false , false , "" , "" , "" , nil
}
}
@ -735,7 +744,13 @@ func (m *Manager) findChartURL(name, version, repoURL string, repos map[string]*
return
return
}
}
}
}
url , err = repo . FindChartInRepoURL ( repoURL , name , version , certFile , keyFile , caFile , m . Getters )
if _ , ok := urls [ name ] ; ok {
url = urls [ name ]
} else {
url , err = repo . FindChartInRepoURL ( repoURL , name , version , certFile , keyFile , caFile , m . Getters )
}
if err == nil {
if err == nil {
return url , username , password , false , false , "" , "" , "" , err
return url , username , password , false , false , "" , "" , "" , err
}
}