func getListField()

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
}