import "patch"

patchパッケージは、CVS、Git、Mercurial、Subversionなどのバージョン管理ツールに用いられるテキストまたはバイナリパッチの解析および実施を実装します。

パッケージファイル

apply.go git.go patch.go textdiff.go

変数

var ErrPatchFailure = os.NewError("patch did not apply cleanly")

Diff型

Diffは、古いバイトストリームから新しいバイトストリームへの変更点を表現するオブジェクトです。

type Diff interface {
    // Apply applies the changes listed in the diff
    // to the string s, returning the new version of the string.
    // Note that the string s need not be a text string.
    Apply(old []byte) (new []byte, err os.Error)
}

NoDiffは、no-opDiffの実装です。これはoldデータに対し何も変更を加えません。

var NoDiff Diff = noDiffType(0)

ParseGitBinary関数

func ParseGitBinary(raw []byte) (Diff, os.Error)

ParseGitBinaryは、rawをGitバイナリパッチとして解析します。

File型

Fileは、ひとつのファイルに適用されるべき変更点のコレクションを表します。

type File struct {
    Verb             Verb
    Src              string // source for Verb == Copy, Verb == Rename
    Dst              string
    OldMode, NewMode int // 0 indicates not used
    Diff                 // changes to data; == NoDiff if operation does not edit file
}

GitBinaryLiteral型

GitBinaryLiteralは、Gitバイナリリテラルの差分を表します。

type GitBinaryLiteral struct {
    OldSHA1 []byte // if non-empty, the SHA1 hash of the original
    New     []byte // the new contents
}

(*GitBinaryLiteral) Apply関数

func (d *GitBinaryLiteral) Apply(old []byte) ([]byte, os.Error)

Applyは、DiffインタフェースのApplyメソッドの実装です。

Op型

Opは、パッチ適用を実行する操作です。

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

Set型

Setは、アトミックに適用しなければならない単位にまとめられたパッチのセットです。パッチのセットの殆どは、説明文であるヘッダの後に記述されます。

type Set struct {
    Header string // free-form text
    File   []*File
}

Parse関数

func Parse(text []byte) (*Set, os.Error)

Parseは、パッチテキストからパッチセットを作成します。このパッチテキストは、CVS、Subversion、Mercurial、Gitによって作成され、一般的にテキストヘッダと一連のファイルパッチで構成されます。

(*Set) Apply関数

func (set *Set) Apply(readFile func(string) ([]byte, os.Error)) ([]Op, os.Error)

Applyは、パッチセット内で指定されているファイルに対し、メモリ内でパッチセットを適用します。呼び出し側は必要に応じてファイルシステムに適用結果を書き出す必要があります。

このreadFile関数は、指定したファイルの内容を返します。これは通常、io.ReadFileを使います。

SyntaxError型

SyntaxErrorは、パッチの解析時の文法エラーを表します。

type SyntaxError string

(SyntaxError) String関数

func (e SyntaxError) String() string

TextChunk型

TextChunkは、ファイル内のセクションの編集箇所を表します。Line行から始まるテキストOldが、Newに置き換えられることを表します。

type TextChunk struct {
    Line int
    Old  []byte
    New  []byte
}

TextDiff型

type TextDiff []TextChunk

ParseTextDiff関数

func ParseTextDiff(raw []byte) (TextDiff, os.Error)

(TextDiff) Apply関数

func (d TextDiff) Apply(data []byte) ([]byte, os.Error)

Applyは、diff内にリストされた変更点をdataに適用し、新しいバージョンを返します。

Verb型

Verbは、ファイルに対して行われるアクションです。

type Verb string
const (
    Add    Verb = "add"
    Copy   Verb = "copy"
    Delete Verb = "delete"
    Edit   Verb = "edit"
    Rename Verb = "rename"
)

バグ

Gitバイナリの増分フォーマットは実装しておらず、Gitバイナリリテラルにのみ対応しています。