github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/diffImages.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "os/exec" 9 10 "github.com/Cloud-Foundations/Dominator/lib/filesystem" 11 "github.com/Cloud-Foundations/Dominator/lib/filter" 12 "github.com/Cloud-Foundations/Dominator/lib/log" 13 ) 14 15 func diffSubcommand(args []string, logger log.DebugLogger) error { 16 return diffTypedImages(args[0], args[1], args[2]) 17 } 18 19 func diffTypedImages(tool string, lName string, rName string) error { 20 lfs, lFilter, err := getTypedFileSystemAndFilter(lName) 21 if err != nil { 22 return fmt.Errorf("error getting left image: %s", err) 23 } 24 rfs, rFilter, err := getTypedFileSystemAndFilter(rName) 25 if err != nil { 26 return fmt.Errorf("error getting right image: %s", err) 27 } 28 if !*ignoreFilters { 29 var filt *filter.Filter 30 if lFilter != nil && rFilter == nil { 31 filt = lFilter 32 } else if lFilter == nil && rFilter != nil { 33 filt = rFilter 34 } else if lFilter.Equal(rFilter) { 35 filt = lFilter 36 } 37 if lfs, err = applyDeleteFilter(lfs, filt); err != nil { 38 return fmt.Errorf("error filtering left image: %s", err) 39 } 40 if rfs, err = applyDeleteFilter(rfs, filt); err != nil { 41 return fmt.Errorf("error filtering right image: %s", err) 42 } 43 } 44 err = diffImages(tool, lfs, rfs) 45 if err != nil { 46 return fmt.Errorf("error diffing images: %s", err) 47 } 48 return nil 49 } 50 51 func diffImages(tool string, lfs, rfs *filesystem.FileSystem) error { 52 lname, err := writeImage(lfs) 53 defer os.Remove(lname) 54 if err != nil { 55 return err 56 } 57 rname, err := writeImage(rfs) 58 defer os.Remove(rname) 59 if err != nil { 60 return err 61 } 62 cmd := exec.Command(tool, lname, rname) 63 cmd.Stdout = os.Stdout 64 return cmd.Run() 65 } 66 67 func writeImage(fs *filesystem.FileSystem) (string, error) { 68 file, err := ioutil.TempFile("", "imagetool") 69 if err != nil { 70 return "", err 71 } 72 defer file.Close() 73 writer := bufio.NewWriter(file) 74 defer writer.Flush() 75 return file.Name(), fs.Listf(writer, listSelector, listFilter) 76 }