Skip to content

Commit 351b925

Browse files
authored
fix: Use JSON output from helm commands (#14)
* change package search to json output * change helm request output from table to json
1 parent 58122ab commit 351b925

File tree

5 files changed

+117
-113
lines changed

5 files changed

+117
-113
lines changed

releases/install.go

+17-15
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package releases
22

33
import (
44
"bytes"
5+
"encoding/json"
56
"fmt"
67
"os"
78
"os/exec"
8-
"strings"
99
"time"
1010

1111
"github.com/charmbracelet/bubbles/help"
@@ -273,40 +273,42 @@ func (m InstallModel) searchLocalPackage() []string {
273273
return []string{}
274274
}
275275
var stdout bytes.Buffer
276-
cmd := exec.Command("helm", "search", "repo", m.Inputs[installChartNameStep].Value())
276+
cmd := exec.Command("helm", "search", "repo", m.Inputs[installChartNameStep].Value(), "--output", "json")
277277
cmd.Stdout = &stdout
278278
err := cmd.Run()
279279
if err != nil {
280280
return []string{}
281281
}
282-
results := strings.Split(stdout.String(), "\n")
283-
results = results[1 : len(results)-1]
284-
282+
var pkgs []types.Pkg
283+
err = json.Unmarshal(stdout.Bytes(), &pkgs)
284+
if err != nil {
285+
return []string{}
286+
}
285287
var suggestions []string
286-
for _, row := range results {
287-
chart := strings.Fields(row)
288-
suggestions = append(suggestions, chart[0])
288+
for _, p := range pkgs {
289+
suggestions = append(suggestions, p.Name)
289290
}
290291

291-
m.Inputs[installChartNameStep].SetSuggestions(suggestions)
292292
return suggestions
293293
}
294294

295295
func (m InstallModel) searchLocalPackageVersion() []string {
296296
var stdout bytes.Buffer
297-
cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[installChartNameStep].Value()+"\v", "--versions")
297+
cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[installChartNameStep].Value()+"\v", "--versions", "--output", "json")
298298
cmd.Stdout = &stdout
299299
err := cmd.Run()
300300
if err != nil {
301301
return []string{}
302302
}
303-
results := strings.Split(stdout.String(), "\n")
304-
results = results[1 : len(results)-1]
303+
var pkgs []types.Pkg
304+
err = json.Unmarshal(stdout.Bytes(), &pkgs)
305+
if err != nil {
306+
return []string{}
307+
}
305308

306309
var suggestions []string
307-
for _, row := range results {
308-
chart := strings.Fields(row)
309-
suggestions = append(suggestions, chart[1])
310+
for _, pkg := range pkgs {
311+
suggestions = append(suggestions, pkg.Version)
310312
}
311313

312314
m.Inputs[installChartNameStep].SetSuggestions(suggestions)

releases/overview.go

+21-35
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package releases
22

33
import (
44
"bytes"
5+
"encoding/json"
56
"errors"
7+
"fmt"
68
"os/exec"
79
"strings"
810

@@ -438,34 +440,26 @@ func (m Model) renderManifestView() string {
438440

439441
func (m Model) list() tea.Msg {
440442
var stdout bytes.Buffer
441-
var releases []table.Row
443+
var releases = []table.Row{}
442444

443445
// Create the command
444-
cmd := exec.Command("helm", "ls", "--all-namespaces")
446+
cmd := exec.Command("helm", "ls", "--all-namespaces", "--output", "json")
445447
cmd.Stdout = &stdout
446448

447449
// Run the command
448450
err := cmd.Run()
449451
if err != nil {
450452
return types.ListReleasesMsg{Err: err}
451453
}
452-
453-
lines := strings.Split(stdout.String(), "\n")
454-
if len(lines) <= 1 {
454+
var rls []types.Release
455+
err = json.Unmarshal(stdout.Bytes(), &rls)
456+
if err != nil {
455457
return types.ListReleasesMsg{Content: releases}
456458
}
457459

458-
// remove header and empty last line
459-
lines = lines[1 : len(lines)-1]
460-
461-
for _, line := range lines {
462-
fields := strings.Fields(line)
463-
updated := strings.Join(fields[3:7], " ") // Join the parts that belong to the updated field
464-
remainingFields := append(fields[:3], updated) // Keep the first 3 columns and append the updated field
465-
466-
// Add the rest of the fields after the updated part
467-
remainingFields = append(remainingFields, fields[7:]...)
468-
releases = append(releases, remainingFields)
460+
for _, rel := range rls {
461+
row := []string{rel.Name, rel.Namespace, rel.Revision, rel.Updated, rel.Status, rel.Chart, rel.AppVersion}
462+
releases = append(releases, row)
469463
}
470464
return types.ListReleasesMsg{Content: releases, Err: nil}
471465
}
@@ -478,34 +472,26 @@ func (m *Model) history() tea.Msg {
478472
}
479473

480474
// Create the command
481-
cmd := exec.Command("helm", "history", m.releaseTable.SelectedRow()[0], "--namespace", m.releaseTable.SelectedRow()[1])
475+
cmd := exec.Command("helm", "history", m.releaseTable.SelectedRow()[0], "--namespace", m.releaseTable.SelectedRow()[1], "--output", "json")
482476
cmd.Stdout = &stdout
483477

484478
// Run the command
485479
err := cmd.Run()
486480
if err != nil {
487481
return types.HistoryMsg{Err: err}
488482
}
489-
490-
lines := strings.Split(stdout.String(), "\n")
491-
if len(lines) <= 1 {
492-
return types.HistoryMsg{Err: errors.New("no history found")}
483+
var history []types.History
484+
var rows = []table.Row{}
485+
err = json.Unmarshal(stdout.Bytes(), &history)
486+
if err != nil {
487+
return types.HistoryMsg{Content: rows}
493488
}
494489

495-
// remove header and empty last line
496-
lines = lines[1 : len(lines)-1]
497-
498-
var history []table.Row
499-
for _, line := range lines {
500-
fields := strings.Fields(line)
501-
updated := strings.Join(fields[1:6], " ")
502-
description := strings.Join(fields[9:], " ")
503-
remainingFields := append(fields[:1], updated)
504-
remainingFields = append(remainingFields, fields[6:9]...)
505-
remainingFields = append(remainingFields, description)
506-
history = append(history, remainingFields)
490+
for _, line := range history {
491+
row := []string{fmt.Sprint(line.Revision), line.Updated, line.Status, line.Chart, line.AppVersion, line.Description}
492+
rows = append(rows, row)
507493
}
508-
return types.HistoryMsg{Content: history, Err: nil}
494+
return types.HistoryMsg{Content: rows, Err: nil}
509495
}
510496

511497
func (m *Model) delete() tea.Msg {
@@ -604,7 +590,7 @@ func (m Model) getValues() tea.Msg {
604590
}
605591
lines := strings.Split(stdout.String(), "\n")
606592
if len(lines) <= 1 {
607-
return types.ValuesMsg{Err: errors.New("no history found")}
593+
return types.ValuesMsg{Err: errors.New("no values found")}
608594
}
609595
lines = lines[1:]
610596

releases/upgrade.go

+17-16
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package releases
22

33
import (
44
"bytes"
5+
"encoding/json"
56
"fmt"
67
"os"
78
"os/exec"
8-
"strings"
99
"time"
1010

1111
"github.com/charmbracelet/bubbles/help"
@@ -277,43 +277,44 @@ func (m UpgradeModel) searchLocalPackage() []string {
277277
return []string{}
278278
}
279279
var stdout bytes.Buffer
280-
cmd := exec.Command("helm", "search", "repo", m.Inputs[upgradeReleaseChartStep].Value())
280+
cmd := exec.Command("helm", "search", "repo", m.Inputs[upgradeReleaseChartStep].Value(), "--output", "json")
281281
cmd.Stdout = &stdout
282282
err := cmd.Run()
283283
if err != nil {
284284
return []string{}
285285
}
286-
results := strings.Split(stdout.String(), "\n")
287-
results = results[1 : len(results)-1]
288-
286+
var pkgs []types.Pkg
287+
err = json.Unmarshal(stdout.Bytes(), &pkgs)
288+
if err != nil {
289+
return []string{}
290+
}
289291
var suggestions []string
290-
for _, row := range results {
291-
chart := strings.Fields(row)
292-
suggestions = append(suggestions, chart[0])
292+
for _, p := range pkgs {
293+
suggestions = append(suggestions, p.Name)
293294
}
294295

295-
m.Inputs[upgradeReleaseChartStep].SetSuggestions(suggestions)
296296
return suggestions
297297
}
298298

299299
func (m UpgradeModel) searchLocalPackageVersion() []string {
300300
var stdout bytes.Buffer
301-
cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[upgradeReleaseChartStep].Value()+"\v", "--versions")
301+
cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[upgradeReleaseChartStep].Value()+"\v", "--versions", "--output", "json")
302302
cmd.Stdout = &stdout
303303
err := cmd.Run()
304304
if err != nil {
305305
return []string{}
306306
}
307-
results := strings.Split(stdout.String(), "\n")
308-
results = results[1 : len(results)-1]
307+
var pkgs []types.Pkg
308+
err = json.Unmarshal(stdout.Bytes(), &pkgs)
309+
if err != nil {
310+
return []string{}
311+
}
309312

310313
var suggestions []string
311-
for _, row := range results {
312-
chart := strings.Fields(row)
313-
suggestions = append(suggestions, chart[1])
314+
for _, pkg := range pkgs {
315+
suggestions = append(suggestions, pkg.Version)
314316
}
315317

316-
m.Inputs[installChartNameStep].SetSuggestions(suggestions)
317318
return suggestions
318319
}
319320

repositories/overview.go

+30-47
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package repositories
22

33
import (
44
"bytes"
5+
"encoding/json"
56
"errors"
67
"fmt"
78
"os/exec"
8-
"strings"
99

1010
"github.com/charmbracelet/bubbles/help"
1111
"github.com/charmbracelet/bubbles/table"
@@ -310,7 +310,7 @@ func (m Model) renderDefaultValueView() string {
310310

311311
func (m Model) list() tea.Msg {
312312
var stdout bytes.Buffer
313-
releases := []table.Row{}
313+
repositories := []table.Row{}
314314

315315
// Create the command
316316
cmd := exec.Command("helm", "repo", "update")
@@ -319,7 +319,7 @@ func (m Model) list() tea.Msg {
319319
if err != nil {
320320
return types.ListRepoMsg{Err: err}
321321
}
322-
cmd = exec.Command("helm", "repo", "ls")
322+
cmd = exec.Command("helm", "repo", "ls", "--output", "json")
323323
cmd.Stdout = &stdout
324324

325325
// Run the command
@@ -328,18 +328,17 @@ func (m Model) list() tea.Msg {
328328
return types.ListRepoMsg{Err: err}
329329
}
330330

331-
lines := strings.Split(stdout.String(), "\n")
332-
if len(lines) <= 1 {
333-
return types.ListRepoMsg{Content: releases}
331+
var repos []types.Repository
332+
err = json.Unmarshal(stdout.Bytes(), &repos)
333+
if err != nil {
334+
return []string{}
334335
}
335336

336-
lines = lines[1 : len(lines)-1]
337-
338-
for _, line := range lines {
339-
fields := strings.Fields(line)
340-
releases = append(releases, fields)
337+
for _, repo := range repos {
338+
row := []string{repo.Name, repo.URL}
339+
repositories = append(repositories, row)
341340
}
342-
return types.ListRepoMsg{Content: releases, Err: nil}
341+
return types.ListRepoMsg{Content: repositories, Err: nil}
343342
}
344343

345344
func (m Model) update() tea.Msg {
@@ -388,68 +387,53 @@ func (m Model) searchPackages() tea.Msg {
388387
}
389388

390389
// Create the command
391-
cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s/", m.tables[listView].SelectedRow()[0]))
390+
cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s/", m.tables[listView].SelectedRow()[0]), "--output", "json")
392391
cmd.Stdout = &stdout
393392

394393
// Run the command
395394
err := cmd.Run()
396395
if err != nil {
397396
return types.PackagesMsg{Content: releases, Err: err}
398397
}
399-
400-
lines := strings.Split(stdout.String(), "\n")
401-
if len(lines) <= 1 {
402-
return types.PackagesMsg{Content: releases}
398+
var pkgs []types.Pkg
399+
err = json.Unmarshal(stdout.Bytes(), &pkgs)
400+
if err != nil {
401+
return []string{}
403402
}
404403

405-
lines = lines[1 : len(lines)-1]
406-
407-
for _, line := range lines {
408-
fields := strings.Fields(line)
409-
if len(fields) == 0 {
410-
continue
411-
}
412-
nameField := fields[0]
413-
releases = append(releases, table.Row{nameField})
404+
for _, pkg := range pkgs {
405+
releases = append(releases, table.Row{pkg.Name})
414406
}
415407
return types.PackagesMsg{Content: releases, Err: nil}
416408
}
417409

418410
func (m Model) searchPackageVersions() tea.Msg {
419411
var stdout bytes.Buffer
420-
releases := []table.Row{}
412+
versions := []table.Row{}
421413
if m.tables[packagesView].SelectedRow() == nil {
422-
return types.PackageVersionsMsg{Content: releases, Err: errors.New("no package selected")}
414+
return types.PackageVersionsMsg{Content: versions, Err: errors.New("no package selected")}
423415
}
424416

425417
// Create the command
426-
cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s", m.tables[packagesView].SelectedRow()[0]), "--versions")
418+
cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s", m.tables[packagesView].SelectedRow()[0]), "--versions", "--output", "json")
427419
cmd.Stdout = &stdout
428420

429421
// Run the command
430422
err := cmd.Run()
431423
if err != nil {
432-
return types.PackageVersionsMsg{Content: releases, Err: err}
424+
return types.PackageVersionsMsg{Content: versions, Err: err}
433425
}
434-
435-
lines := strings.Split(stdout.String(), "\n")
436-
if len(lines) <= 1 {
437-
return types.PackageVersionsMsg{Content: releases}
426+
var pkgs []types.Pkg
427+
err = json.Unmarshal(stdout.Bytes(), &pkgs)
428+
if err != nil {
429+
return []string{}
438430
}
439431

440-
lines = lines[1 : len(lines)-1]
441-
442-
for _, line := range lines {
443-
allFields := strings.Fields(line)
444-
if len(allFields) == 0 {
445-
continue
446-
}
447-
joinedDescription := strings.Join(allFields[3:], " ")
448-
fields := allFields[1:3]
449-
fields = append(fields, joinedDescription)
450-
releases = append(releases, fields)
432+
for _, pkg := range pkgs {
433+
versions = append(versions, table.Row{pkg.Version, pkg.AppVersion, pkg.Description})
451434
}
452-
return types.PackageVersionsMsg{Content: releases, Err: nil}
435+
436+
return types.PackageVersionsMsg{Content: versions, Err: nil}
453437
}
454438

455439
func (m Model) getDefaultValue() tea.Msg {
@@ -460,6 +444,5 @@ func (m Model) getDefaultValue() tea.Msg {
460444
if err != nil {
461445
return types.DefaultValueMsg{Content: "Unable to get default values"}
462446
}
463-
helpers.Println(stdout.String())
464447
return types.DefaultValueMsg{Content: stdout.String()}
465448
}

0 commit comments

Comments
 (0)