| // 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 | |
| } |