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