- theirHsh := m["Hash"]
- fd, err := os.Open(path.Join(root, dep))
- if err != nil {
- if os.IsNotExist(err) {
- tracef(
- CDebug, "depfix: %s/%s -> %s: not exists",
- root, entry.Name(), dep,
- )
- continue
+ if err = depBuildWrite(fdDepW, build); err != nil {
+ return ErrLine(err)
+ }
+ var typ byte
+ var chunk []byte
+ for len(data) > 0 {
+ typ, chunk, data, _ = chunkRead(data)
+ switch typ {
+ case DepTypeAlways:
+ err = always(fdDepW, fdDep.Name())
+ case DepTypeStamp:
+ p := mustAbs(path.Join(root,
+ strings.TrimSuffix(entry.Name(), DepSuffix)))
+ hsh, ok := DepFixHashCache[p]
+ if !ok {
+ var fd *os.File
+ fd, err = os.Open(p)
+ if err != nil {
+ break
+ }
+ hsh, err = fileHash(fd)
+ fd.Close()
+ if err != nil {
+ break
+ }
+ DepFixHashCache[p] = hsh
+ }
+ err = stamp(fdDepW, fdDep.Name(), hsh)
+ case DepTypeIfcreate:
+ err = ifcreate(fdDepW, fdDep.Name(), string(chunk))
+ case DepTypeIfchange:
+ name := string(chunk[InodeLen+HashLen:])
+ p := mustAbs(path.Join(root, name))
+ var fd *os.File
+ fd, err = os.Open(p)
+ if err != nil {
+ break
+ }
+ var inode *Inode
+ inode, _, err = inodeFromFileByFd(fd)
+ if err != nil {
+ fd.Close()
+ break
+ }
+ hsh, ok := DepFixHashCache[p]
+ if !ok {
+ hsh, err = fileHash(fd)
+ if err != nil {
+ break
+ }
+ DepFixHashCache[p] = hsh
+ }
+ fd.Close()
+ _, err = io.Copy(fdDepW, bytes.NewBuffer(
+ chunkWrite(bytes.Join([][]byte{
+ {DepTypeIfchange},
+ inode[:],
+ []byte(hsh),
+ []byte(name),
+ }, nil))))
+ case DepTypeIfchangeNonex:
+ err = depWriteNonex(fdDepW, fdDep.Name(), string(chunk))
+ }
+ if err != nil {
+ return ErrLine(err)