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