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  }