| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package patch |
| |
| import "os" |
| |
| // An Op is a single operation to execute to apply a patch. |
| type Op struct { |
| Verb Verb // action |
| Src string // source file |
| Dst string // destination file |
| Mode int // mode for destination (if non-zero) |
| Data []byte // data for destination (if non-nil) |
| } |
| |
| // Apply applies the patch set to the files named in the patch set, |
| // constructing an in-memory copy of the new file state. |
| // It is the client's job to write the changes to the file system |
| // if desired. |
| // |
| // The function readFile should return the contents of the named file. |
| // Typically this function will be io.ReadFile. |
| // |
| func (set *Set) Apply(readFile func(string) ([]byte, os.Error)) ([]Op, os.Error) { |
| op := make([]Op, len(set.File)) |
| |
| for i, f := range set.File { |
| o := &op[i] |
| o.Verb = f.Verb |
| o.Src = f.Src |
| o.Dst = f.Dst |
| o.Mode = f.NewMode |
| if f.Diff != NoDiff || o.Verb != Edit { |
| // Clients assume o.Data == nil means no data diff. |
| // Start with a non-nil data. |
| var old []byte = make([]byte, 0) // not nil |
| var err os.Error |
| if f.Src != "" { |
| old, err = readFile(f.Src) |
| if err != nil { |
| return nil, &os.PathError{string(f.Verb), f.Src, err} |
| } |
| } |
| o.Data, err = f.Diff.Apply(old) |
| if err != nil { |
| return nil, &os.PathError{string(f.Verb), f.Src, err} |
| } |
| } |
| } |
| |
| return op, nil |
| } |