github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/diffFileInImages.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"io/ioutil"
     7  	"os"
     8  	"os/exec"
     9  
    10  	"github.com/Cloud-Foundations/Dominator/lib/log"
    11  )
    12  
    13  func diffFileInImagesSubcommand(args []string,
    14  	logger log.DebugLogger) error {
    15  	err := diffFileInImages(args[0], args[1], args[2], args[3])
    16  	if err != nil {
    17  		return fmt.Errorf("error diffing files: %s", err)
    18  	}
    19  	return nil
    20  }
    21  
    22  func diffFileInImages(tool, leftName, rightName, filename string) error {
    23  	leftReader, err := getTypedFileReader(leftName, filename)
    24  	if err != nil {
    25  		return err
    26  	}
    27  	leftFile, err := copyToTempfile(leftReader)
    28  	leftReader.Close()
    29  	if err != nil {
    30  		return err
    31  	}
    32  	defer os.Remove(leftFile)
    33  	rightReader, err := getTypedFileReader(rightName, filename)
    34  	if err != nil {
    35  		return err
    36  	}
    37  	rightFile, err := copyToTempfile(rightReader)
    38  	rightReader.Close()
    39  	if err != nil {
    40  		return err
    41  	}
    42  	defer os.Remove(rightFile)
    43  	cmd := exec.Command(tool, leftFile, rightFile)
    44  	cmd.Stdout = os.Stdout
    45  	return cmd.Run()
    46  }
    47  
    48  func copyToTempfile(reader io.Reader) (string, error) {
    49  	file, err := ioutil.TempFile("", "imagetool-diff")
    50  	if err != nil {
    51  		return "", err
    52  	}
    53  	if _, err := io.Copy(file, reader); err != nil {
    54  		return "", err
    55  	}
    56  	return file.Name(), nil
    57  }