in deb_packages/tools/update_deb_packages/src/update_deb_packages.go [322:365]
func getMapField(fieldName string, fileName string, ruleName string, workspaceContents []byte) map[string]string {
// buildozer 'print FIELDNAME_GOES_HERE' FILENAME_GOES_HERE:RULENAME_GOES_HERE <WORKSPACE
cmd := exec.Command("buildozer", "print "+fieldName, fileName+":"+ruleName)
wsreader := bytes.NewReader(workspaceContents)
if fileName == "-" {
// see edit.stdinPackageName why this is a "-"
cmd.Stdin = wsreader
}
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
exiterr, ok := err.(*exec.ExitError)
if ok == true {
// not every platform might have exit codes
// see https://groups.google.com/forum/#!topic/golang-nuts/MI4TyIkQqqg
exitCode := exiterr.Sys().(interface {
ExitStatus() int
}).ExitStatus()
// Return code 3 is the intended behaviour for buildozer when using "print" commands
if exitCode != 3 {
log.Print("Error in getMapField, command: ", cmd)
logFatalErr(err)
}
} else {
logFatalErr(err)
}
}
m := make(map[string]string)
for _, line := range strings.Split(out.String(), "\n") {
var key string
for i, token := range strings.Split(strings.Trim(strings.TrimSpace(line), ",{}"), ":") {
if i%2 == 0 {
// new key
key = strings.Trim(token, " \"")
} else {
// value (new key was set in previous iteration)
m[key] = strings.Trim(token, " \"")
}
}
}
return m
}