Skip to content

Commit f3e0fd9

Browse files
committed
Render a better install overview table
In order to make it easier to see what gets installed and what size the package will have, print an DNF like table. Signed-off-by: Roman Mohr <[email protected]>
1 parent b162b9d commit f3e0fd9

File tree

6 files changed

+93
-13
lines changed

6 files changed

+93
-13
lines changed

cmd/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ go_library(
2020
importpath = "github.com/rmohr/bazeldnf/cmd",
2121
visibility = ["//visibility:private"],
2222
deps = [
23+
"//cmd/template",
2324
"//pkg/api",
2425
"//pkg/api/bazeldnf",
2526
"//pkg/bazel",

cmd/resolve.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package main
22

33
import (
4-
"fmt"
4+
"os"
55

6+
"github.com/rmohr/bazeldnf/cmd/template"
67
"github.com/rmohr/bazeldnf/pkg/api/bazeldnf"
78
"github.com/rmohr/bazeldnf/pkg/reducer"
89
"github.com/rmohr/bazeldnf/pkg/repo"
@@ -65,13 +66,9 @@ func NewResolveCmd() *cobra.Command {
6566
if err != nil {
6667
return err
6768
}
68-
fmt.Println("Installing:")
69-
fmt.Println(install)
70-
fmt.Println(len(install))
71-
fmt.Println("Force-ignoring:")
72-
fmt.Println(forceIgnored)
73-
fmt.Println(len(forceIgnored))
74-
logrus.Info("Done.")
69+
if err := template.Render(os.Stdout, install, forceIgnored); err != nil {
70+
return err
71+
}
7572
return nil
7673
},
7774
}

cmd/rpmtree.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package main
22

33
import (
4+
"os"
5+
6+
"github.com/rmohr/bazeldnf/cmd/template"
47
"github.com/rmohr/bazeldnf/pkg/bazel"
58
"github.com/rmohr/bazeldnf/pkg/reducer"
69
"github.com/rmohr/bazeldnf/pkg/repo"
@@ -57,7 +60,7 @@ func NewRpmTreeCmd() *cobra.Command {
5760
return err
5861
}
5962
logrus.Info("Solving.")
60-
install, _, _, err := solver.Resolve()
63+
install, _, forceIgnored, err := solver.Resolve()
6164
if err != nil {
6265
return err
6366
}
@@ -81,7 +84,9 @@ func NewRpmTreeCmd() *cobra.Command {
8184
if err != nil {
8285
return err
8386
}
84-
logrus.Info("Done.")
87+
if err := template.Render(os.Stdout, install, forceIgnored); err != nil {
88+
return err
89+
}
8590

8691
return nil
8792
},

cmd/template/BUILD.bazel

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
load("@io_bazel_rules_go//go:def.bzl", "go_library")
2+
3+
go_library(
4+
name = "template",
5+
srcs = ["install.go"],
6+
importpath = "github.com/rmohr/bazeldnf/cmd/template",
7+
visibility = ["//visibility:public"],
8+
deps = ["//pkg/api"],
9+
)

cmd/template/install.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package template
2+
3+
import (
4+
"fmt"
5+
"io"
6+
"text/tabwriter"
7+
8+
"github.com/rmohr/bazeldnf/pkg/api"
9+
)
10+
11+
func Render(writer io.Writer, installed []*api.Package, forceIgnored []*api.Package) error {
12+
totalDownloadSize := 0
13+
totalInstallSize := 0
14+
15+
tabWriter := tabwriter.NewWriter(writer, 0, 8, 1, '\t', 0)
16+
if _, err := fmt.Fprintln(tabWriter, "Package\tVersion\tSize\tDownload Size"); err != nil {
17+
return fmt.Errorf("failed to write header: %v", err)
18+
}
19+
if _, err := fmt.Fprintln(tabWriter, "Installing:\t\t\t"); err != nil {
20+
return fmt.Errorf("failed to write header: %v", err)
21+
}
22+
for _, pkg := range installed {
23+
totalInstallSize += pkg.Size.Archive
24+
totalDownloadSize += pkg.Size.Package
25+
if _, err := fmt.Fprintf(tabWriter, " %v\t%v\t%s\t%s\n", pkg.Name, pkg.Version.String(), toReadableQuantity(pkg.Size.Archive), toReadableQuantity(pkg.Size.Package)); err != nil {
26+
return fmt.Errorf("failed to write entry: %v", err)
27+
}
28+
}
29+
if _, err := fmt.Fprintln(tabWriter, "Ignoring:\t\t\t"); err != nil {
30+
return fmt.Errorf("failed to write header: %v", err)
31+
}
32+
for _, pkg := range forceIgnored {
33+
if _, err := fmt.Fprintf(tabWriter, " %v\t%v\t%s\t%s\n", pkg.Name, pkg.Version.String(), toReadableQuantity(pkg.Size.Archive), toReadableQuantity(pkg.Size.Package)); err != nil {
34+
return fmt.Errorf("failed to write entry: %v", err)
35+
}
36+
}
37+
if _, err := fmt.Fprintln(tabWriter, "\t\t\t\nTransaction Summary:\t\t\t"); err != nil {
38+
return fmt.Errorf("failed to write header: %v", err)
39+
}
40+
if _, err := fmt.Fprintf(tabWriter, "Installing %d Packages \t\t\t\n", len(installed)); err != nil {
41+
return fmt.Errorf("failed to write header: %v", err)
42+
}
43+
if _, err := fmt.Fprintf(tabWriter, "Total download size: %s\t\t\t\n", toReadableQuantity(totalDownloadSize)); err != nil {
44+
return fmt.Errorf("failed to write header: %v", err)
45+
}
46+
if _, err := fmt.Fprintf(tabWriter, "Total install size: %s\t\t\t\n", toReadableQuantity(totalInstallSize)); err != nil {
47+
return fmt.Errorf("failed to write header: %v", err)
48+
}
49+
if err := tabWriter.Flush(); err != nil {
50+
return fmt.Errorf("failed to flush table: %v", err)
51+
}
52+
return nil
53+
}
54+
55+
func toReadableQuantity(bytes int) string {
56+
if bytes > 1000*1000*1000 {
57+
q := float64(bytes) / 1000 / 1000 / 1000
58+
return fmt.Sprintf("%.2f G", q)
59+
} else if bytes > 1000*1000 {
60+
q := float64(bytes) / 1000 / 1000
61+
return fmt.Sprintf("%.2f M", q)
62+
} else if bytes > 1000 {
63+
q := float64(bytes) / 1000
64+
return fmt.Sprintf("%.2f K", q)
65+
} else {
66+
return fmt.Sprintf("%d", bytes)
67+
}
68+
}

pkg/api/api.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,9 @@ type Package struct {
233233
} `xml:"time"`
234234
Size struct {
235235
Text string `xml:",chardata"`
236-
Package string `xml:"package,attr"`
237-
Installed string `xml:"installed,attr"`
238-
Archive string `xml:"archive,attr"`
236+
Package int `xml:"package,attr"`
237+
Installed int `xml:"installed,attr"`
238+
Archive int `xml:"archive,attr"`
239239
} `xml:"size"`
240240
Location Location `xml:"location"`
241241
Format struct {

0 commit comments

Comments
 (0)