AppManager: Cache helm charts locally during update

Change-Id: I663e923bc6560c9a75318025178d5701e969074d
diff --git a/core/installer/app_manager.go b/core/installer/app_manager.go
index 8257d27..0965507 100644
--- a/core/installer/app_manager.go
+++ b/core/installer/app_manager.go
@@ -635,11 +635,17 @@
 	overrides CueAppData,
 	opts ...InstallOption,
 ) (ReleaseResources, error) {
+	o := &installOptions{}
+	for _, i := range opts {
+		i(o)
+	}
+	if !o.NoLock {
+		m.l.Lock()
+		defer m.l.Unlock()
+	}
 	if values == nil {
 		values = map[string]any{}
 	}
-	m.l.Lock()
-	defer m.l.Unlock()
 	if err := m.repo.Pull(); err != nil {
 		return ReleaseResources{}, err
 	}
@@ -688,7 +694,13 @@
 	if err != nil {
 		return ReleaseResources{}, err
 	}
-	rendered, err := newApp.Render(config.Release, env, networks, ToAccessConfigs(clusters), merge(config.Input, values), renderedCfg.LocalCharts, m.vpnAPIClient)
+	var lg LocalChartGenerator
+	if o.LG != nil {
+		lg = o.LG
+	} else {
+		lg = GitRepositoryLocalChartGenerator{env.Id, env.Id}
+	}
+	rendered, err := newApp.Render(config.Release, env, networks, ToAccessConfigs(clusters), merge(config.Input, values), nil, m.vpnAPIClient)
 	if err != nil {
 		return ReleaseResources{}, err
 	}
@@ -717,7 +729,12 @@
 	if err := setPortFields(values, portReservations); err != nil {
 		return ReleaseResources{}, err
 	}
-	rendered, err = newApp.Render(config.Release, env, networks, ToAccessConfigs(clusters), merge(config.Input, values), renderedCfg.LocalCharts, m.vpnAPIClient)
+	charts, err := pullHelmCharts(m.hf, rendered.HelmCharts, m.repo, "/helm-charts")
+	if err != nil {
+		return ReleaseResources{}, err
+	}
+	localCharts := generateLocalCharts(lg, charts)
+	rendered, err = newApp.Render(config.Release, env, networks, ToAccessConfigs(clusters), merge(config.Input, values), localCharts, m.vpnAPIClient)
 	if err != nil {
 		return ReleaseResources{}, err
 	}