func setStringField()

in deb_packages/tools/update_deb_packages/src/update_deb_packages.go [408:453]


func setStringField(fieldName string, fieldContents string, fileName string, ruleName string, workspaceContents []byte, forceTable *string) string {
	// buildozer 'set FIELDNAME_GOES_HERE FIELDCONTENTS_GO_HERE' FILENAME_GOES_HERE:RULENAME_GOES_HERE <WORKSPACE
	// log.Printf("(setStringField) buildozer 'set %s %s' %s:%s\n", fieldName, fieldContents, fileName, ruleName)
	var cmd *exec.Cmd
	if forceTable != nil {
		dir, err := ioutil.TempDir("", "table_hack")
		defer os.RemoveAll(dir)
		if err != nil {
			logFatalErr(err)
		}
		tableFile := filepath.Join(dir, "force_table.json")
		if err := ioutil.WriteFile(tableFile, []byte(*forceTable), 0666); err != nil {
			logFatalErr(err)
		}
		cmd = exec.Command("buildozer", "-add_tables="+tableFile, "set "+fieldName+" "+fieldContents, fileName+":"+ruleName)
	} else {
		cmd = exec.Command("buildozer", "set "+fieldName+" "+fieldContents, 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 "set" commands that don't change anything
			if exitCode != 3 {
				log.Print("Error in setStringField, command: ", cmd)
				logFatalErr(err)
			}
		} else {
			logFatalErr(err)
		}
	}

	return out.String()
}