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 }