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