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

     1  package main
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"io"
     7  	"io/ioutil"
     8  	"os"
     9  	"os/exec"
    10  
    11  	"github.com/Cloud-Foundations/Dominator/lib/log"
    12  )
    13  
    14  func diffFilterInImagesSubcommand(args []string,
    15  	logger log.DebugLogger) error {
    16  	err := diffFilterInImages(args[0], args[1], args[2])
    17  	if err != nil {
    18  		return fmt.Errorf("error diffing filters: %s", err)
    19  	}
    20  	return nil
    21  }
    22  
    23  func diffFilterInImages(tool, leftName, rightName string) error {
    24  	leftFilter, err := getTypedImageFilter(leftName)
    25  	if err != nil {
    26  		return err
    27  	}
    28  	rightFilter, err := getTypedImageFilter(rightName)
    29  	if err != nil {
    30  		return err
    31  	}
    32  	leftFile, err := writeToTempfile(leftFilter.Write)
    33  	if err != nil {
    34  		return err
    35  	}
    36  	defer os.Remove(leftFile)
    37  	rightFile, err := writeToTempfile(rightFilter.Write)
    38  	if err != nil {
    39  		return err
    40  	}
    41  	defer os.Remove(rightFile)
    42  	cmd := exec.Command(tool, leftFile, rightFile)
    43  	cmd.Stdout = os.Stdout
    44  	return cmd.Run()
    45  }
    46  
    47  func writeToTempfile(writerFunc func(io.Writer) error) (string, error) {
    48  	file, err := ioutil.TempFile("", "imagetool-diff")
    49  	if err != nil {
    50  		return "", err
    51  	}
    52  	doCleanup := true
    53  	defer func() {
    54  		if doCleanup {
    55  			os.Remove(file.Name())
    56  			file.Close()
    57  		}
    58  	}()
    59  	writer := bufio.NewWriter(file)
    60  	defer writer.Flush()
    61  	if err := writerFunc(writer); err != nil {
    62  		return "", err
    63  	}
    64  	doCleanup = false
    65  	return file.Name(), nil
    66  }