github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/diffBuildLogsInImages.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "os/exec" 8 9 "github.com/Cloud-Foundations/Dominator/lib/log" 10 ) 11 12 type printableReader struct { 13 reader io.Reader 14 } 15 16 func diffBuildLogsInImagesSubcommand(args []string, 17 logger log.DebugLogger) error { 18 err := diffBuildLogsInImages(args[0], args[1], args[2]) 19 if err != nil { 20 return fmt.Errorf("error diffing build logs: %s", err) 21 } 22 return nil 23 } 24 25 func diffBuildLogsInImages(tool, leftName, rightName string) error { 26 leftReader, err := getTypedImageBuildLogReader(leftName) 27 if err != nil { 28 return err 29 } 30 leftFile, err := copyToTempfile(&printableReader{leftReader}) 31 leftReader.Close() 32 if err != nil { 33 return err 34 } 35 defer os.Remove(leftFile) 36 rightReader, err := getTypedImageBuildLogReader(rightName) 37 if err != nil { 38 return err 39 } 40 rightFile, err := copyToTempfile(&printableReader{rightReader}) 41 rightReader.Close() 42 if err != nil { 43 return err 44 } 45 defer os.Remove(rightFile) 46 cmd := exec.Command(tool, leftFile, rightFile) 47 cmd.Stdout = os.Stdout 48 return cmd.Run() 49 } 50 51 // Read will read and replace bytes which the tkdiff tool doesn't like. 52 func (pr *printableReader) Read(p []byte) (int, error) { 53 nBytes, err := pr.reader.Read(p) 54 for index := 0; index < nBytes; index++ { 55 switch p[index] { 56 case ' ': 57 p[index] = '\n' 58 case 0xc2: 59 if index+1 < nBytes && p[index+1] == 0xb5 { 60 p[index] = ' ' 61 p[index+1] = 'u' 62 } 63 case 0xe2: 64 if index+2 < nBytes && p[index+1] == 0x86 && p[index+2] == 0x92 { 65 p[index] = ' ' 66 p[index+1] = '-' 67 p[index+2] = '>' 68 } 69 } 70 } 71 return nBytes, err 72 }