in cmd/kazel/kazel.go [276:331]
func ReconcileRules(pkgPath string, rules []*build.Rule, managedAttrs []string, dryRun bool) (bool, error) {
_, path := findBuildFile(pkgPath)
info, err := os.Stat(path)
if err != nil && os.IsNotExist(err) {
f := &build.File{}
writeRules(f, rules)
return writeFile(path, f, nil, false, dryRun)
} else if err != nil {
return false, err
}
if info.IsDir() {
return false, fmt.Errorf("%q cannot be a directory", path)
}
b, err := ioutil.ReadFile(path)
if err != nil {
return false, err
}
f, err := build.Parse(path, b)
if err != nil {
return false, err
}
oldRules := make(map[string]*build.Rule)
for _, r := range f.Rules("") {
oldRules[r.Name()] = r
}
for _, r := range rules {
o, ok := oldRules[r.Name()]
if !ok {
f.Stmt = append(f.Stmt, r.Call)
continue
}
if !RuleIsManaged(o) {
continue
}
reconcileAttr := func(o, n *build.Rule, name string) {
if e := n.Attr(name); e != nil {
o.SetAttr(name, e)
} else {
o.DelAttr(name)
}
}
for _, attr := range managedAttrs {
reconcileAttr(o, r, attr)
}
delete(oldRules, r.Name())
}
for _, r := range oldRules {
if !RuleIsManaged(r) {
continue
}
f.DelRules(r.Kind(), r.Name())
}
return writeFile(path, f, nil, true, dryRun)
}