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

     1  package main
     2  
     3  import (
     4  	"bufio"
     5  	"errors"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"os/exec"
    10  
    11  	"github.com/Cloud-Foundations/Dominator/lib/image"
    12  	"github.com/Cloud-Foundations/Dominator/lib/log"
    13  )
    14  
    15  func diffImagePackageListsSubcommand(args []string,
    16  	logger log.DebugLogger) error {
    17  	err := diffImagePackageLists(args[0], args[1], args[2])
    18  	if err != nil {
    19  		return fmt.Errorf("error diffing package lists: %s", err)
    20  	}
    21  	return nil
    22  }
    23  
    24  func diffImagePackageLists(tool, leftName, rightName string) error {
    25  	leftPackages, err := getTypedPackageList(leftName)
    26  	if err != nil {
    27  		return err
    28  	}
    29  	if len(leftPackages) < 1 {
    30  		return errors.New("no left image package data")
    31  	}
    32  	rightPackages, err := getTypedPackageList(rightName)
    33  	if err != nil {
    34  		return err
    35  	}
    36  	if len(rightPackages) < 1 {
    37  		return errors.New("no right image package data")
    38  	}
    39  	var nameWidth, versionWidth int
    40  	getWidthsForPackages(leftPackages, &nameWidth, &versionWidth)
    41  	getWidthsForPackages(rightPackages, &nameWidth, &versionWidth)
    42  	leftFile, err := writePackageListToTempfile(leftPackages,
    43  		nameWidth, versionWidth)
    44  	if err != nil {
    45  		return err
    46  	}
    47  	defer os.Remove(leftFile)
    48  	rightFile, err := writePackageListToTempfile(rightPackages,
    49  		nameWidth, versionWidth)
    50  	if err != nil {
    51  		return err
    52  	}
    53  	defer os.Remove(rightFile)
    54  	cmd := exec.Command(tool, leftFile, rightFile)
    55  	cmd.Stdout = os.Stdout
    56  	return cmd.Run()
    57  }
    58  
    59  func writePackageListToTempfile(packages []image.Package,
    60  	nameWidth, versionWidth int) (string, error) {
    61  	file, err := ioutil.TempFile("", "imagetool-diff")
    62  	if err != nil {
    63  		return "", err
    64  	}
    65  	writer := bufio.NewWriter(file)
    66  	defer writer.Flush()
    67  	listPackages(writer, packages, nameWidth, versionWidth)
    68  	return file.Name(), nil
    69  }