in deb_packages/tools/update_deb_packages/src/update_deb_packages.go [268:320]
func getListField(fieldName string, fileName string, ruleName string, workspaceContents []byte) []string {
// buildozer 'print FIELDNAME_GOES_HERE' FILENAME_GOES_HERE:RULENAME_GOES_HERE <WORKSPACE
// TODO: better failure message if buildozer is not in PATH
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 getListField, command: ", cmd)
logFatalErr(err)
}
} else {
logFatalErr(err)
}
}
trimmedOut := strings.TrimSpace(out.String())
if trimmedOut == "(missing)" {
return []string{}
}
var resultlist []string
// remove trailing newline, remove [] and split at spaces
returnlist := strings.Split(strings.Replace(strings.Trim(trimmedOut, "[]"), "\n", ",", -1), " ")
// also split at commas
for _, result := range returnlist {
resultlist = append(resultlist, strings.Split(result, ",")...)
}
// Example output for querying a missing field:
// rule "//-:foo" has no attribute "bar"
// (missing)
if len(resultlist) == 2 {
if resultlist[1] == "(missing)" {
return []string{}
}
}
return resultlist
}