From 3b8315485a7c16e4e15e9ec9d980c2bb230c266a Mon Sep 17 00:00:00 2001 From: qvalentin Date: Sat, 30 Mar 2024 20:59:25 +0100 Subject: [PATCH] fix(linting): use parent chart for linting subchart files --- internal/charts/chart_for_document.go | 16 +++++++++ internal/charts/chart_for_document_test.go | 41 ++++++++++++++++++++++ internal/charts/parent_chart.go | 12 +++++++ internal/handler/text_document.go | 9 ++--- 4 files changed, 71 insertions(+), 7 deletions(-) diff --git a/internal/charts/chart_for_document.go b/internal/charts/chart_for_document.go index 362d4991..c6f46915 100644 --- a/internal/charts/chart_for_document.go +++ b/internal/charts/chart_for_document.go @@ -27,6 +27,22 @@ func (s *ChartStore) GetChartForDoc(uri lsp.DocumentURI) (*Chart, error) { return chart, nil } +func (s *ChartStore) GetChartOrParentForDoc(uri lsp.DocumentURI) (*Chart, error) { + chart, err := s.GetChartForDoc(uri) + if err != nil { + return chart, err + } + + if chart.ParentChart.HasParent { + parentChart := chart.ParentChart.GetParentChartRecursive(s) + if parentChart == nil { + return chart, err + } + return parentChart, nil + } + return chart, nil +} + func (s *ChartStore) getChartFromCache(uri lsp.DocumentURI) *Chart { for chartURI, chart := range s.Charts { if strings.HasPrefix(uri.Filename(), filepath.Join(chartURI.Filename(), "template")) { diff --git a/internal/charts/chart_for_document_test.go b/internal/charts/chart_for_document_test.go index e0589c08..d3996338 100644 --- a/internal/charts/chart_for_document_test.go +++ b/internal/charts/chart_for_document_test.go @@ -94,3 +94,44 @@ func TestGetChartForDocumentWorksForNewToAddChartWithNestedFile(t *testing.T) { assert.Same(t, expectedChart, chartStore.Charts[uri.File(expectedChartDirectory)]) } + +func TestGetChartOrParentForDocWorks(t *testing.T) { + chartStore := charts.NewChartStore("file:///tmp", func(uri uri.URI, _ util.ValuesFilesConfig) *charts.Chart { + return &charts.Chart{RootURI: uri} + }) + + chart := &charts.Chart{} + chartStore.Charts["file:///tmp/chart"] = chart + subchart := &charts.Chart{ + ValuesFiles: &charts.ValuesFiles{}, + ChartMetadata: &charts.ChartMetadata{}, + RootURI: "file:///tmp/chart/charts/subchart", + ParentChart: charts.ParentChart{ + ParentChartURI: "file:///tmp/chart", + HasParent: true, + }, + } + chartStore.Charts["file:///tmp/chart/charts/subchart"] = subchart + otherchart := &charts.Chart{} + chartStore.Charts["file:///tmp/otherChart"] = otherchart + + result1, error := chartStore.GetChartOrParentForDoc("file:///tmp/chart/templates/deployment.yaml") + assert.NoError(t, error) + assert.Same(t, chart, result1) + + result2, error := chartStore.GetChartOrParentForDoc("file:///tmp/chart/templates/directory/deployment.yaml") + assert.NoError(t, error) + assert.Same(t, chart, result2) + + result3, error := chartStore.GetChartOrParentForDoc("file:///tmp/chart/charts/subchart/templates/directory/deployment.yaml") + assert.NoError(t, error) + assert.Same(t, chart, result3) + + result4, error := chartStore.GetChartOrParentForDoc("file:///tmp/otherChart/templates/directory/deployment.yaml") + assert.NoError(t, error) + assert.Same(t, otherchart, result4) + + result5, error := chartStore.GetChartOrParentForDoc("file:///tmp/directory/deployment.yaml") + assert.Error(t, error) + assert.Equal(t, &charts.Chart{RootURI: uri.File("/tmp")}, result5) +} diff --git a/internal/charts/parent_chart.go b/internal/charts/parent_chart.go index 5925826a..d182e493 100644 --- a/internal/charts/parent_chart.go +++ b/internal/charts/parent_chart.go @@ -30,3 +30,15 @@ func (p *ParentChart) GetParentChart(chartStore *ChartStore) *Chart { } return chart } + +func (p *ParentChart) GetParentChartRecursive(chartStore *ChartStore) *Chart { + chart := p.GetParentChart(chartStore) + if chart == nil { + return nil + } + parentChart := chart.ParentChart.GetParentChartRecursive(chartStore) + if parentChart == nil { + return chart + } + return parentChart +} diff --git a/internal/handler/text_document.go b/internal/handler/text_document.go index 53033d49..d9752110 100644 --- a/internal/handler/text_document.go +++ b/internal/handler/text_document.go @@ -18,16 +18,11 @@ func (h *langHandler) DidOpen(ctx context.Context, params *lsp.DidOpenTextDocume h.yamllsConnector.DocumentDidOpen(doc.Ast, *params) - _, err = h.chartStore.GetChartForDoc(doc.URI) - if err != nil { - logger.Error("Error getting chart info for file", doc.URI, err) - } - doc, ok := h.documents.Get(params.TextDocument.URI) if !ok { return errors.New("Could not get document: " + params.TextDocument.URI.Filename()) } - chart, err := h.chartStore.GetChartForDoc(doc.URI) + chart, err := h.chartStore.GetChartOrParentForDoc(doc.URI) if err != nil { logger.Error("Error getting chart info for file", doc.URI, err) } @@ -45,7 +40,7 @@ func (h *langHandler) DidSave(ctx context.Context, params *lsp.DidSaveTextDocume if !ok { return errors.New("Could not get document: " + params.TextDocument.URI.Filename()) } - chart, err := h.chartStore.GetChartForDoc(doc.URI) + chart, err := h.chartStore.GetChartOrParentForDoc(doc.URI) if err != nil { logger.Error("Error getting chart info for file", doc.URI, err) }