func merge()

in templating/values.go [65:99]


func merge(c *Config, merged map[string]interface{}) (map[string]interface{}, error) {
	if !c.IsValidConfig() {
		return merged, nil
	}

	vals, err := Deserialize([]byte(c.GetRawValue()))
	if err != nil {
		return merged, fmt.Errorf("failed to deserialize values. Try rendering your template locally using the instructions found at https://github.com/Azure/acr-builder. Err: %v", err)
	}

	for k, v := range vals {
		if lookup, ok := merged[k]; ok {

			// If the lookup is nil, remove the key.
			// This allows us to remove keys during overrides if they no longer exist.
			// I.e., someone broke compatibility in a future template.
			if lookup == nil {
				delete(merged, k)
			} else if sink, ok := lookup.(map[string]interface{}); ok {
				source, ok := v.(map[string]interface{})
				if !ok {
					log.Printf("Skip merging: %s. Not a map\n", k)
					continue
				}

				// The to-be-merged value has precedence over the start value.
				mergeMaps(sink, source)
			}
		} else {
			// If the key doesn't exist, copy it.
			merged[k] = v
		}
	}
	return merged, nil
}