func (ts *strutilSuite) TestSizeToStr(c *check.C) { for _, t := range []struct { size int64 str string }{ {0, "0B"}, {1, "1B"}, {400, "400B"}, {1000, "1kB"}, {1000 + 1, "1kB"}, {900 * 1000, "900kB"}, {1000 * 1000, "1MB"}, {20 * 1000 * 1000, "20MB"}, {1000 * 1000 * 1000, "1GB"}, {31 * 1000 * 1000 * 1000, "31GB"}, {math.MaxInt64, "9EB"}, } { c.Check(strutil.SizeToStr(t.size), check.Equals, t.str) } }
func (x *infoCmd) Execute([]string) error { cli := Client() w := tabwriter.NewWriter(Stdout, 2, 2, 1, ' ', 0) noneOK := true for i, snapName := range x.Positional.Snaps { snapName := string(snapName) if i > 0 { fmt.Fprintln(w, "---") } if tryDirect(w, snapName, x.Verbose) { noneOK = false continue } remote, _, _ := cli.FindOne(snapName) local, _, _ := cli.Snap(snapName) both := coalesce(local, remote) if both == nil { fmt.Fprintf(w, "argument:\t%q\nwarning:\t%s\n", snapName, i18n.G("not a valid snap")) continue } noneOK = false fmt.Fprintf(w, "name:\t%s\n", both.Name) fmt.Fprintf(w, "summary:\t%q\n", both.Summary) // TODO: have publisher; use publisher here, // and additionally print developer if publisher != developer fmt.Fprintf(w, "publisher:\t%s\n", both.Developer) // FIXME: find out for real termWidth := 77 fmt.Fprintf(w, "description: |\n%s\n", formatDescr(both.Description, termWidth)) maybePrintType(w, both.Type) maybePrintCommands(w, snapName, both.Apps, termWidth) if x.Verbose { fmt.Fprintln(w, "notes:\t") fmt.Fprintf(w, " private:\t%t\n", both.Private) fmt.Fprintf(w, " confinement:\t%s\n", both.Confinement) } if local != nil { var notes *Notes if x.Verbose { jailMode := local.Confinement == client.DevModeConfinement && !local.DevMode fmt.Fprintf(w, " devmode:\t%t\n", local.DevMode) fmt.Fprintf(w, " jailmode:\t%t\n", jailMode) fmt.Fprintf(w, " trymode:\t%t\n", local.TryMode) fmt.Fprintf(w, " enabled:\t%t\n", local.Status == client.StatusActive) if local.Broken == "" { fmt.Fprintf(w, " broken:\t%t\n", false) } else { fmt.Fprintf(w, " broken:\t%t (%s)\n", true, local.Broken) } } else { notes = NotesFromLocal(local) } fmt.Fprintf(w, "tracking:\t%s\n", local.Channel) fmt.Fprintf(w, "installed:\t%s\t(%s)\t%s\t%s\n", local.Version, local.Revision, strutil.SizeToStr(local.InstalledSize), notes) fmt.Fprintf(w, "refreshed:\t%s\n", local.InstallDate) } if remote != nil && remote.Channels != nil { // \t\t\t so we get "installed" lined up with "channels" fmt.Fprintf(w, "channels:\t\t\t\n") for _, ch := range []string{"stable", "candidate", "beta", "edge"} { m := remote.Channels[ch] if m == nil { continue } fmt.Fprintf(w, " %s:\t%s\t(%s)\t%s\t%s\n", ch, m.Version, m.Revision, strutil.SizeToStr(m.Size), NotesFromChannelSnapInfo(m)) } } } w.Flush() if noneOK { return fmt.Errorf(i18n.G("no valid snaps given")) } return nil }