github.com/Cloud-Foundations/Dominator@v0.3.4/lib/image/packageutil/impl.go (about)

     1  package packageutil
     2  
     3  import (
     4  	"bufio"
     5  	"bytes"
     6  	"errors"
     7  	"fmt"
     8  	"io"
     9  	"os"
    10  	"sort"
    11  	"strconv"
    12  	"strings"
    13  
    14  	"github.com/Cloud-Foundations/Dominator/lib/image"
    15  )
    16  
    17  func getPackageList(packager func(cmd string, w io.Writer) error) (
    18  	[]image.Package, error) {
    19  	output := new(bytes.Buffer)
    20  	if err := packager("show-size-multiplier", output); err != nil {
    21  		return nil, fmt.Errorf("error getting size multiplier: %s", err)
    22  	}
    23  	sizeMultiplier := uint64(1)
    24  	nScanned, err := fmt.Fscanf(output, "%d", &sizeMultiplier)
    25  	if err != nil {
    26  		if err != io.EOF {
    27  			return nil, fmt.Errorf(
    28  				"error decoding size multiplier: %s", err)
    29  		}
    30  	} else if nScanned != 1 {
    31  		return nil, errors.New("malformed size multiplier")
    32  	}
    33  	output.Reset()
    34  	if err := packager("list", output); err != nil {
    35  		return nil, fmt.Errorf("error running package lister: %s", err)
    36  	}
    37  	packageMap := make(map[string]image.Package)
    38  	scanner := bufio.NewScanner(output)
    39  	for scanner.Scan() {
    40  		line := scanner.Text()
    41  		fields := strings.Fields(line)
    42  		if len(fields) < 2 {
    43  			return nil, fmt.Errorf("malformed line: %s", line)
    44  		}
    45  		name := fields[0]
    46  		version := fields[1]
    47  		pkg := image.Package{
    48  			Name:    name,
    49  			Version: version,
    50  		}
    51  		if len(fields) > 2 {
    52  			if size, err := strconv.ParseUint(fields[2], 10, 64); err != nil {
    53  				return nil, fmt.Errorf("malformed size: %s", fields[2])
    54  			} else {
    55  				pkg.Size = size * sizeMultiplier
    56  			}
    57  		}
    58  		packageMap[name] = pkg
    59  	}
    60  	if err := scanner.Err(); err != nil {
    61  		if err != io.EOF {
    62  			fmt.Fprintln(os.Stderr, "reading standard input:", err)
    63  		}
    64  	}
    65  	packageNames := make([]string, 0, len(packageMap))
    66  	for name := range packageMap {
    67  		packageNames = append(packageNames, name)
    68  	}
    69  	sort.Strings(packageNames)
    70  	var packages []image.Package
    71  	for _, name := range packageNames {
    72  		packages = append(packages, packageMap[name])
    73  	}
    74  	return packages, nil
    75  }