github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/diffImagePackageLists.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "errors" 6 "fmt" 7 "io/ioutil" 8 "os" 9 "os/exec" 10 11 "github.com/Cloud-Foundations/Dominator/lib/image" 12 "github.com/Cloud-Foundations/Dominator/lib/log" 13 ) 14 15 func diffImagePackageListsSubcommand(args []string, 16 logger log.DebugLogger) error { 17 err := diffImagePackageLists(args[0], args[1], args[2]) 18 if err != nil { 19 return fmt.Errorf("error diffing package lists: %s", err) 20 } 21 return nil 22 } 23 24 func diffImagePackageLists(tool, leftName, rightName string) error { 25 leftPackages, err := getTypedPackageList(leftName) 26 if err != nil { 27 return err 28 } 29 if len(leftPackages) < 1 { 30 return errors.New("no left image package data") 31 } 32 rightPackages, err := getTypedPackageList(rightName) 33 if err != nil { 34 return err 35 } 36 if len(rightPackages) < 1 { 37 return errors.New("no right image package data") 38 } 39 var nameWidth, versionWidth int 40 getWidthsForPackages(leftPackages, &nameWidth, &versionWidth) 41 getWidthsForPackages(rightPackages, &nameWidth, &versionWidth) 42 leftFile, err := writePackageListToTempfile(leftPackages, 43 nameWidth, versionWidth) 44 if err != nil { 45 return err 46 } 47 defer os.Remove(leftFile) 48 rightFile, err := writePackageListToTempfile(rightPackages, 49 nameWidth, versionWidth) 50 if err != nil { 51 return err 52 } 53 defer os.Remove(rightFile) 54 cmd := exec.Command(tool, leftFile, rightFile) 55 cmd.Stdout = os.Stdout 56 return cmd.Run() 57 } 58 59 func writePackageListToTempfile(packages []image.Package, 60 nameWidth, versionWidth int) (string, error) { 61 file, err := ioutil.TempFile("", "imagetool-diff") 62 if err != nil { 63 return "", err 64 } 65 writer := bufio.NewWriter(file) 66 defer writer.Flush() 67 listPackages(writer, packages, nameWidth, versionWidth) 68 return file.Name(), nil 69 }