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  }