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()
}