github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/getImagePackageList.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "errors" 6 "fmt" 7 "io" 8 "os" 9 10 "github.com/Cloud-Foundations/Dominator/lib/format" 11 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 12 "github.com/Cloud-Foundations/Dominator/lib/image" 13 "github.com/Cloud-Foundations/Dominator/lib/log" 14 ) 15 16 func getImagePackageListSubcommand(args []string, 17 logger log.DebugLogger) error { 18 var outFileName string 19 if len(args) > 1 { 20 outFileName = args[1] 21 } 22 err := getImagePackageList(args[0], outFileName) 23 if err != nil { 24 return fmt.Errorf("error getting image package list: %s", err) 25 } 26 return nil 27 } 28 29 func getImagePackageList(imageName, outFileName string) error { 30 packages, err := getTypedPackageList(imageName) 31 if err != nil { 32 return err 33 } 34 if len(packages) < 1 { 35 return errors.New("no package data") 36 } 37 var writer io.Writer 38 if outFileName == "" { 39 writer = os.Stdout 40 } else { 41 w, err := os.OpenFile(outFileName, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 42 fsutil.PublicFilePerms) 43 if err != nil { 44 return err 45 } 46 defer w.Close() 47 bw := bufio.NewWriter(w) 48 defer bw.Flush() 49 writer = bw 50 } 51 var nameWidth, versionWidth int 52 getWidthsForPackages(packages, &nameWidth, &versionWidth) 53 listPackages(writer, packages, nameWidth, versionWidth) 54 return nil 55 } 56 57 func getWidthsForPackages(packages []image.Package, 58 nameWidth, versionWidth *int) { 59 for _, pkg := range packages { 60 if len(pkg.Name) > *nameWidth { 61 *nameWidth = len(pkg.Name) 62 } 63 if len(pkg.Version) > *versionWidth { 64 *versionWidth = len(pkg.Version) 65 } 66 } 67 } 68 69 func listPackages(writer io.Writer, packages []image.Package, 70 nameWidth, versionWidth int) { 71 for _, pkg := range packages { 72 fmt.Fprintf(writer, "%-*s %-*s %s\n", 73 nameWidth, pkg.Name, 74 versionWidth, pkg.Version, 75 format.FormatBytes(pkg.Size)) 76 } 77 }