+ return dir.Close()
+}
+
+func targetsWalker(tgts []string) ([]string, error) {
+ tgtsMap := map[string]struct{}{}
+ for _, tgt := range tgts {
+ if err := targetsCollect(tgt, tgtsMap); err != nil {
+ return nil, err
+ }
+ }
+ tgts = make([]string, 0, len(tgtsMap))
+ for tgt := range tgtsMap {
+ tgts = append(tgts, tgt)
+ }
+ return tgts, nil
+}
+
+func collectWholeDeps(
+ tgts map[string]struct{},
+ deps map[string]map[string]struct{},
+ seen map[string]struct{},
+) {
+ for tgt := range tgts {
+ seen[tgt] = struct{}{}
+ collectWholeDeps(deps[tgt], deps, seen)
+ }