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

     1  package main
     2  
     3  import (
     4  	"bufio"
     5  	"errors"
     6  	"fmt"
     7  	"io"
     8  	"os"
     9  
    10  	"github.com/Cloud-Foundations/Dominator/lib/format"
    11  	"github.com/Cloud-Foundations/Dominator/lib/fsutil"
    12  	"github.com/Cloud-Foundations/Dominator/lib/image"
    13  	"github.com/Cloud-Foundations/Dominator/lib/log"
    14  )
    15  
    16  func getImagePackageListSubcommand(args []string,
    17  	logger log.DebugLogger) error {
    18  	var outFileName string
    19  	if len(args) > 1 {
    20  		outFileName = args[1]
    21  	}
    22  	err := getImagePackageList(args[0], outFileName)
    23  	if err != nil {
    24  		return fmt.Errorf("error getting image package list: %s", err)
    25  	}
    26  	return nil
    27  }
    28  
    29  func getImagePackageList(imageName, outFileName string) error {
    30  	packages, err := getTypedPackageList(imageName)
    31  	if err != nil {
    32  		return err
    33  	}
    34  	if len(packages) < 1 {
    35  		return errors.New("no package data")
    36  	}
    37  	var writer io.Writer
    38  	if outFileName == "" {
    39  		writer = os.Stdout
    40  	} else {
    41  		w, err := os.OpenFile(outFileName, os.O_CREATE|os.O_TRUNC|os.O_WRONLY,
    42  			fsutil.PublicFilePerms)
    43  		if err != nil {
    44  			return err
    45  		}
    46  		defer w.Close()
    47  		bw := bufio.NewWriter(w)
    48  		defer bw.Flush()
    49  		writer = bw
    50  	}
    51  	var nameWidth, versionWidth int
    52  	getWidthsForPackages(packages, &nameWidth, &versionWidth)
    53  	listPackages(writer, packages, nameWidth, versionWidth)
    54  	return nil
    55  }
    56  
    57  func getWidthsForPackages(packages []image.Package,
    58  	nameWidth, versionWidth *int) {
    59  	for _, pkg := range packages {
    60  		if len(pkg.Name) > *nameWidth {
    61  			*nameWidth = len(pkg.Name)
    62  		}
    63  		if len(pkg.Version) > *versionWidth {
    64  			*versionWidth = len(pkg.Version)
    65  		}
    66  	}
    67  }
    68  
    69  func listPackages(writer io.Writer, packages []image.Package,
    70  	nameWidth, versionWidth int) {
    71  	for _, pkg := range packages {
    72  		fmt.Fprintf(writer, "%-*s %-*s %s\n",
    73  			nameWidth, pkg.Name,
    74  			versionWidth, pkg.Version,
    75  			format.FormatBytes(pkg.Size))
    76  	}
    77  }