+
+type DepInfo struct {
+ build string
+ always bool
+ stamp string
+ ifcreates []string
+ ifchanges []map[string]string
+}
+
+func depRead(fdDep *os.File) (*DepInfo, error) {
+ r := recfile.NewReader(fdDep)
+ m, err := r.NextMap()
+ if err != nil {
+ return nil, err
+ }
+ depInfo := DepInfo{}
+ if b := m["Build"]; b == "" {
+ return nil, errors.New(".dep missing Build:")
+ } else {
+ depInfo.build = b
+ }
+ for {
+ m, err := r.NextMap()
+ if err != nil {
+ if err == io.EOF {
+ break
+ }
+ return nil, err
+ }
+ switch m["Type"] {
+ case DepTypeAlways:
+ depInfo.always = true
+ case DepTypeIfcreate:
+ dep := m["Target"]
+ if dep == "" {
+ return nil, errors.New("invalid format of .dep")
+ }
+ depInfo.ifcreates = append(depInfo.ifcreates, dep)
+ case DepTypeIfchange:
+ delete(m, "Type")
+ depInfo.ifchanges = append(depInfo.ifchanges, m)
+ case DepTypeStamp:
+ hsh := m["Hash"]
+ if hsh == "" {
+ return nil, errors.New("invalid format of .dep")
+ }
+ depInfo.stamp = hsh
+ default:
+ return nil, errors.New("invalid format of .dep")
+ }
+ }
+ return &depInfo, nil
+}