func getMapField()

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
}