X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=dep.go;h=b4dd7a1a54c22b718f1cc4a2105733feac91ba9a;hb=dbe306cfed4fad3da80cc2d351c9f9085bd900b2;hp=279e55dddbc1a736e950b8788394121651763307;hpb=67820ebca7f7cbdde974922960682119eb50a456;p=goredo.git diff --git a/dep.go b/dep.go index 279e55d..b4dd7a1 100644 --- a/dep.go +++ b/dep.go @@ -67,11 +67,12 @@ func chunkWrite(in []byte) (out []byte) { type Ifchange struct { tgt *Tgt - meta string + meta [InodeLen + HashLen]byte } -func (ifchange *Ifchange) Inode() Inode { - return Inode(ifchange.meta[:InodeLen]) +func (ifchange *Ifchange) Inode() *Inode { + inode := Inode(ifchange.meta[:InodeLen]) + return &inode } func (ifchange *Ifchange) Hash() Hash { @@ -140,7 +141,7 @@ func depWrite(w io.Writer, fdDepName, cwd string, tgt *Tgt, hsh Hash) (err error } _, err = io.Copy(w, bytes.NewBuffer(chunkWrite(bytes.Join([][]byte{ {DepTypeIfchange}, - []byte(inode), + inode[:], []byte(hsh), []byte(tgt.RelTo(cwd)), }, nil)))) @@ -226,20 +227,19 @@ func depBinIfchangeParse(tgt *Tgt, chunk []byte) (*Ifchange, string, error) { if len(chunk) < InodeLen+HashLen+1 { return nil, "", errors.New("too short \"ifchange\" format") } - name := string(chunk[InodeLen+HashLen:]) - meta := string(chunk[:InodeLen+HashLen]) tgtH, _ := pathSplit(tgt.a) - ifchange := &Ifchange{tgt: NewTgt(path.Join(tgtH, name)), meta: meta} - cachedFound := false + name := string(chunk[InodeLen+HashLen:]) + ifchange := &Ifchange{ + tgt: NewTgt(path.Join(tgtH, name)), + meta: ([InodeLen + HashLen]byte)(chunk), + } for _, cached := range IfchangeCache[ifchange.tgt.rel] { if ifchange.meta == cached.meta { - ifchange = cached - cachedFound = true - break + return cached, name, nil } } - if IfchangeCache != nil && !cachedFound { + if IfchangeCache != nil { IfchangeCache[ifchange.tgt.rel] = append(IfchangeCache[ifchange.tgt.rel], ifchange) } return ifchange, name, nil