diff --git a/releases/install.go b/releases/install.go index d9f9908..34b1bdb 100644 --- a/releases/install.go +++ b/releases/install.go @@ -2,10 +2,10 @@ package releases import ( "bytes" + "encoding/json" "fmt" "os" "os/exec" - "strings" "time" "github.com/charmbracelet/bubbles/help" @@ -273,40 +273,42 @@ func (m InstallModel) searchLocalPackage() []string { return []string{} } var stdout bytes.Buffer - cmd := exec.Command("helm", "search", "repo", m.Inputs[installChartNameStep].Value()) + cmd := exec.Command("helm", "search", "repo", m.Inputs[installChartNameStep].Value(), "--output", "json") cmd.Stdout = &stdout err := cmd.Run() if err != nil { return []string{} } - results := strings.Split(stdout.String(), "\n") - results = results[1 : len(results)-1] - + var pkgs []types.Pkg + err = json.Unmarshal(stdout.Bytes(), &pkgs) + if err != nil { + return []string{} + } var suggestions []string - for _, row := range results { - chart := strings.Fields(row) - suggestions = append(suggestions, chart[0]) + for _, p := range pkgs { + suggestions = append(suggestions, p.Name) } - m.Inputs[installChartNameStep].SetSuggestions(suggestions) return suggestions } func (m InstallModel) searchLocalPackageVersion() []string { var stdout bytes.Buffer - cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[installChartNameStep].Value()+"\v", "--versions") + cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[installChartNameStep].Value()+"\v", "--versions", "--output", "json") cmd.Stdout = &stdout err := cmd.Run() if err != nil { return []string{} } - results := strings.Split(stdout.String(), "\n") - results = results[1 : len(results)-1] + var pkgs []types.Pkg + err = json.Unmarshal(stdout.Bytes(), &pkgs) + if err != nil { + return []string{} + } var suggestions []string - for _, row := range results { - chart := strings.Fields(row) - suggestions = append(suggestions, chart[1]) + for _, pkg := range pkgs { + suggestions = append(suggestions, pkg.Version) } m.Inputs[installChartNameStep].SetSuggestions(suggestions) diff --git a/releases/overview.go b/releases/overview.go index eeebeac..7276ed8 100644 --- a/releases/overview.go +++ b/releases/overview.go @@ -2,7 +2,9 @@ package releases import ( "bytes" + "encoding/json" "errors" + "fmt" "os/exec" "strings" @@ -438,10 +440,10 @@ func (m Model) renderManifestView() string { func (m Model) list() tea.Msg { var stdout bytes.Buffer - var releases []table.Row + var releases = []table.Row{} // Create the command - cmd := exec.Command("helm", "ls", "--all-namespaces") + cmd := exec.Command("helm", "ls", "--all-namespaces", "--output", "json") cmd.Stdout = &stdout // Run the command @@ -449,23 +451,15 @@ func (m Model) list() tea.Msg { if err != nil { return types.ListReleasesMsg{Err: err} } - - lines := strings.Split(stdout.String(), "\n") - if len(lines) <= 1 { + var rls []types.Release + err = json.Unmarshal(stdout.Bytes(), &rls) + if err != nil { return types.ListReleasesMsg{Content: releases} } - // remove header and empty last line - lines = lines[1 : len(lines)-1] - - for _, line := range lines { - fields := strings.Fields(line) - updated := strings.Join(fields[3:7], " ") // Join the parts that belong to the updated field - remainingFields := append(fields[:3], updated) // Keep the first 3 columns and append the updated field - - // Add the rest of the fields after the updated part - remainingFields = append(remainingFields, fields[7:]...) - releases = append(releases, remainingFields) + for _, rel := range rls { + row := []string{rel.Name, rel.Namespace, rel.Revision, rel.Updated, rel.Status, rel.Chart, rel.AppVersion} + releases = append(releases, row) } return types.ListReleasesMsg{Content: releases, Err: nil} } @@ -478,7 +472,7 @@ func (m *Model) history() tea.Msg { } // Create the command - cmd := exec.Command("helm", "history", m.releaseTable.SelectedRow()[0], "--namespace", m.releaseTable.SelectedRow()[1]) + cmd := exec.Command("helm", "history", m.releaseTable.SelectedRow()[0], "--namespace", m.releaseTable.SelectedRow()[1], "--output", "json") cmd.Stdout = &stdout // Run the command @@ -486,26 +480,18 @@ func (m *Model) history() tea.Msg { if err != nil { return types.HistoryMsg{Err: err} } - - lines := strings.Split(stdout.String(), "\n") - if len(lines) <= 1 { - return types.HistoryMsg{Err: errors.New("no history found")} + var history []types.History + var rows = []table.Row{} + err = json.Unmarshal(stdout.Bytes(), &history) + if err != nil { + return types.HistoryMsg{Content: rows} } - // remove header and empty last line - lines = lines[1 : len(lines)-1] - - var history []table.Row - for _, line := range lines { - fields := strings.Fields(line) - updated := strings.Join(fields[1:6], " ") - description := strings.Join(fields[9:], " ") - remainingFields := append(fields[:1], updated) - remainingFields = append(remainingFields, fields[6:9]...) - remainingFields = append(remainingFields, description) - history = append(history, remainingFields) + for _, line := range history { + row := []string{fmt.Sprint(line.Revision), line.Updated, line.Status, line.Chart, line.AppVersion, line.Description} + rows = append(rows, row) } - return types.HistoryMsg{Content: history, Err: nil} + return types.HistoryMsg{Content: rows, Err: nil} } func (m *Model) delete() tea.Msg { @@ -604,7 +590,7 @@ func (m Model) getValues() tea.Msg { } lines := strings.Split(stdout.String(), "\n") if len(lines) <= 1 { - return types.ValuesMsg{Err: errors.New("no history found")} + return types.ValuesMsg{Err: errors.New("no values found")} } lines = lines[1:] diff --git a/releases/upgrade.go b/releases/upgrade.go index fd3ad00..a9a4fde 100644 --- a/releases/upgrade.go +++ b/releases/upgrade.go @@ -2,10 +2,10 @@ package releases import ( "bytes" + "encoding/json" "fmt" "os" "os/exec" - "strings" "time" "github.com/charmbracelet/bubbles/help" @@ -277,43 +277,44 @@ func (m UpgradeModel) searchLocalPackage() []string { return []string{} } var stdout bytes.Buffer - cmd := exec.Command("helm", "search", "repo", m.Inputs[upgradeReleaseChartStep].Value()) + cmd := exec.Command("helm", "search", "repo", m.Inputs[upgradeReleaseChartStep].Value(), "--output", "json") cmd.Stdout = &stdout err := cmd.Run() if err != nil { return []string{} } - results := strings.Split(stdout.String(), "\n") - results = results[1 : len(results)-1] - + var pkgs []types.Pkg + err = json.Unmarshal(stdout.Bytes(), &pkgs) + if err != nil { + return []string{} + } var suggestions []string - for _, row := range results { - chart := strings.Fields(row) - suggestions = append(suggestions, chart[0]) + for _, p := range pkgs { + suggestions = append(suggestions, p.Name) } - m.Inputs[upgradeReleaseChartStep].SetSuggestions(suggestions) return suggestions } func (m UpgradeModel) searchLocalPackageVersion() []string { var stdout bytes.Buffer - cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[upgradeReleaseChartStep].Value()+"\v", "--versions") + cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[upgradeReleaseChartStep].Value()+"\v", "--versions", "--output", "json") cmd.Stdout = &stdout err := cmd.Run() if err != nil { return []string{} } - results := strings.Split(stdout.String(), "\n") - results = results[1 : len(results)-1] + var pkgs []types.Pkg + err = json.Unmarshal(stdout.Bytes(), &pkgs) + if err != nil { + return []string{} + } var suggestions []string - for _, row := range results { - chart := strings.Fields(row) - suggestions = append(suggestions, chart[1]) + for _, pkg := range pkgs { + suggestions = append(suggestions, pkg.Version) } - m.Inputs[installChartNameStep].SetSuggestions(suggestions) return suggestions } diff --git a/repositories/overview.go b/repositories/overview.go index 294153a..d7583a5 100644 --- a/repositories/overview.go +++ b/repositories/overview.go @@ -2,10 +2,10 @@ package repositories import ( "bytes" + "encoding/json" "errors" "fmt" "os/exec" - "strings" "github.com/charmbracelet/bubbles/help" "github.com/charmbracelet/bubbles/table" @@ -310,7 +310,7 @@ func (m Model) renderDefaultValueView() string { func (m Model) list() tea.Msg { var stdout bytes.Buffer - releases := []table.Row{} + repositories := []table.Row{} // Create the command cmd := exec.Command("helm", "repo", "update") @@ -319,7 +319,7 @@ func (m Model) list() tea.Msg { if err != nil { return types.ListRepoMsg{Err: err} } - cmd = exec.Command("helm", "repo", "ls") + cmd = exec.Command("helm", "repo", "ls", "--output", "json") cmd.Stdout = &stdout // Run the command @@ -328,18 +328,17 @@ func (m Model) list() tea.Msg { return types.ListRepoMsg{Err: err} } - lines := strings.Split(stdout.String(), "\n") - if len(lines) <= 1 { - return types.ListRepoMsg{Content: releases} + var repos []types.Repository + err = json.Unmarshal(stdout.Bytes(), &repos) + if err != nil { + return []string{} } - lines = lines[1 : len(lines)-1] - - for _, line := range lines { - fields := strings.Fields(line) - releases = append(releases, fields) + for _, repo := range repos { + row := []string{repo.Name, repo.URL} + repositories = append(repositories, row) } - return types.ListRepoMsg{Content: releases, Err: nil} + return types.ListRepoMsg{Content: repositories, Err: nil} } func (m Model) update() tea.Msg { @@ -388,7 +387,7 @@ func (m Model) searchPackages() tea.Msg { } // Create the command - cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s/", m.tables[listView].SelectedRow()[0])) + cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s/", m.tables[listView].SelectedRow()[0]), "--output", "json") cmd.Stdout = &stdout // Run the command @@ -396,60 +395,45 @@ func (m Model) searchPackages() tea.Msg { if err != nil { return types.PackagesMsg{Content: releases, Err: err} } - - lines := strings.Split(stdout.String(), "\n") - if len(lines) <= 1 { - return types.PackagesMsg{Content: releases} + var pkgs []types.Pkg + err = json.Unmarshal(stdout.Bytes(), &pkgs) + if err != nil { + return []string{} } - lines = lines[1 : len(lines)-1] - - for _, line := range lines { - fields := strings.Fields(line) - if len(fields) == 0 { - continue - } - nameField := fields[0] - releases = append(releases, table.Row{nameField}) + for _, pkg := range pkgs { + releases = append(releases, table.Row{pkg.Name}) } return types.PackagesMsg{Content: releases, Err: nil} } func (m Model) searchPackageVersions() tea.Msg { var stdout bytes.Buffer - releases := []table.Row{} + versions := []table.Row{} if m.tables[packagesView].SelectedRow() == nil { - return types.PackageVersionsMsg{Content: releases, Err: errors.New("no package selected")} + return types.PackageVersionsMsg{Content: versions, Err: errors.New("no package selected")} } // Create the command - cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s", m.tables[packagesView].SelectedRow()[0]), "--versions") + cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s", m.tables[packagesView].SelectedRow()[0]), "--versions", "--output", "json") cmd.Stdout = &stdout // Run the command err := cmd.Run() if err != nil { - return types.PackageVersionsMsg{Content: releases, Err: err} + return types.PackageVersionsMsg{Content: versions, Err: err} } - - lines := strings.Split(stdout.String(), "\n") - if len(lines) <= 1 { - return types.PackageVersionsMsg{Content: releases} + var pkgs []types.Pkg + err = json.Unmarshal(stdout.Bytes(), &pkgs) + if err != nil { + return []string{} } - lines = lines[1 : len(lines)-1] - - for _, line := range lines { - allFields := strings.Fields(line) - if len(allFields) == 0 { - continue - } - joinedDescription := strings.Join(allFields[3:], " ") - fields := allFields[1:3] - fields = append(fields, joinedDescription) - releases = append(releases, fields) + for _, pkg := range pkgs { + versions = append(versions, table.Row{pkg.Version, pkg.AppVersion, pkg.Description}) } - return types.PackageVersionsMsg{Content: releases, Err: nil} + + return types.PackageVersionsMsg{Content: versions, Err: nil} } func (m Model) getDefaultValue() tea.Msg { @@ -460,6 +444,5 @@ func (m Model) getDefaultValue() tea.Msg { if err != nil { return types.DefaultValueMsg{Content: "Unable to get default values"} } - helpers.Println(stdout.String()) return types.DefaultValueMsg{Content: stdout.String()} } diff --git a/types/helm.go b/types/helm.go new file mode 100644 index 0000000..97369b6 --- /dev/null +++ b/types/helm.go @@ -0,0 +1,32 @@ +package types + +type Pkg struct { + Name string `json:"name"` + Version string `json:"version"` + AppVersion string `json:"app_version"` + Description string `json:"description"` +} + +type Release struct { + Name string `json:"name"` + Namespace string `json:"namespace"` + Revision string `json:"revision"` + Updated string `json:"updated"` + Status string `json:"status"` + Chart string `json:"chart"` + AppVersion string `json:"app_version"` +} + +type History struct { + Revision int `json:"revision"` + Updated string `json:"updated"` + Status string `json:"status"` + Chart string `json:"chart"` + AppVersion string `json:"app_version"` + Description string `json:"description"` +} + +type Repository struct { + Name string `json:"name"` + URL string `json:"url"` +}