git

package
v1.4.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 18, 2026 License: MIT Imports: 24 Imported by: 0

Documentation

Overview

Package git は、review.DiffSource の Git 実装を 2 種類提供します。

  • GoGit: go-git による純 Go 実装。git バイナリを必要とせず、実行のたびに作業ディレクトリを 破棄するため、サーバーレスのような使い捨て環境に向きます。
  • CLI: ローカルの git コマンドを呼ぶ実装。チェックアウトを再利用して差分取得が速いため、 永続的な作業ディレクトリを持てるローカル開発や CI に向きます。

どちらを使うかは呼び出し側が選びます(本パッケージは選択しません)。

Index

Constants

View Source
const DefaultContextLines = 10

DefaultContextLines は、CLI 実装が git diff に渡す既定の前後行数です。

Variables

This section is empty.

Functions

func RepoDirName

func RepoDirName(repoURL string) string

RepoDirName は、リポジトリURLから作業ディレクトリ名を組み立てる既定の実装です。

スキーム・認証情報・末尾の .git を落とし、パス区切りなど扱いにくい文字をハイフンへ 畳み込みます。同じURLからは常に同じ名前が得られるため、CLI 実装がチェックアウトを 再利用できます。

Types

type CLI

type CLI struct {
	// contains filtered or unexported fields
}

CLI は、ローカルの git コマンドを呼び出す review.DiffSource 実装です。

Close で作業ディレクトリを消さず、基準参照へ戻して掃除するだけなので、次回以降は 差分の取得だけで済みます。永続的な作業ディレクトリを持てる環境向けです。

func NewCLI

func NewCLI(localPath string, opts ...Option) (*CLI, error)

NewCLI は、localPath を作業ディレクトリとする CLI を生成します。

func (*CLI) CheckoutHead added in v1.2.0

func (c *CLI) CheckoutHead(ctx context.Context, head string) (string, error)

CheckoutHead は、head を作業ツリーへ強制チェックアウトし、そのパスを返します。 review.WorkspaceProvider の実装です。

チェックアウト後に未追跡ファイルも削除します。作業ディレクトリは実行をまたいで 再利用されるため、前回の実行が Close まで到達せず落ちていた場合の残骸が、head の 内容としてレビュアーに読まれるのを防ぎます。

func (*CLI) Close

func (c *CLI) Close(ctx context.Context) error

Close は、基準参照へ強制的に戻したうえで未追跡ファイルを削除します。 作業ディレクトリ自体は次回の実行で再利用するため残します。

★ 掃除を先に、フェッチを後に行います。後始末の先頭にネットワーク I/O を置くと、 レビュー末尾で通信が落ちていたり締切を使い切っていたりしたときに、 **作業ツリーが head のまま・未追跡ファイルも残ったまま**次回へ持ち越されます。 フェッチは次回の参照解決を新しく保つための best-effort なので、失敗しても 後始末そのものは成立させます。

func (*CLI) Diff

func (c *CLI) Diff(ctx context.Context, base, head string) (string, error)

Diff は base と head の 3 点比較差分を返します。

func (*CLI) Prepare

func (c *CLI) Prepare(ctx context.Context, repoURL string) error

Prepare は、リポジトリをクローン(既にあればそのまま利用)し、リモートの最新を取得します。

type Factory

type Factory struct {
	// contains filtered or unexported fields
}

Factory は、Request ごとに作業ディレクトリを決めて Source を開く review.DiffSourceFactory です。

作業ディレクトリは root/<リポジトリURL由来の名前> です。同じリポジトリからは常に同じ パスが得られるため、CLI 実装はチェックアウトを再利用できます。

同じリポジトリの同時実行について

**既定の命名は URL だけから決まるため、同じリポジトリのレビューを同時に走らせると 同じ作業ディレクトリを共有します。** 本パッケージは排他を行いません。共有されると:

  • GoGit: 先に終わった側の Close が、まだ実行中の側の作業ディレクトリごと削除します。
  • CLI: 一方が読んでいる最中にもう一方が別ブランチへ checkout するため、 **エラーにならずに別ブランチの内容をレビューします**(気付きにくい壊れ方です)。

同一プロセスで同じリポジトリを並行にレビューする場合は、WithDirNamer で実行ごとに 異なる名前を返してください(例: RepoDirName の結果へ実行 ID を足す)。 チェックアウトの再利用は諦めることになりますが、使い捨ての環境では元々効きません。

func NewCLIFactory

func NewCLIFactory(root string, opts ...Option) (*Factory, error)

NewCLIFactory は、CLI を開く Factory を生成します。

func NewGoGitFactory

func NewGoGitFactory(root string, opts ...Option) (*Factory, error)

NewGoGitFactory は、GoGit を開く Factory を生成します。

func (*Factory) Open

func (f *Factory) Open(ctx context.Context, req review.Request) (review.DiffSource, error)

Open は、Request に対応する作業ディレクトリで Source を準備して返します。

type GoGit

type GoGit struct {
	// contains filtered or unexported fields
}

GoGit は、go-git による review.DiffSource 実装です。

git バイナリを必要としません。Close で作業ディレクトリごと削除するため、実行のたびに クローンし直す使い捨ての環境に向きます。

単一の実行(Prepare → Diff → Close)で使う前提で、並行利用は想定していません。

func NewGoGit

func NewGoGit(localPath string, opts ...Option) (*GoGit, error)

NewGoGit は、localPath を作業ディレクトリとする GoGit を生成します。

func (*GoGit) CheckoutHead added in v1.2.0

func (g *GoGit) CheckoutHead(ctx context.Context, head string) (string, error)

CheckoutHead は、head を作業ツリーへ強制チェックアウトし、そのパスを返します。 review.WorkspaceProvider の実装です。

go-git のチェックアウトは context を受け取れないため、ctx は取り消しには効かず ログにだけ使います(シグネチャはポート側の統一です)。

func (*GoGit) Close

func (g *GoGit) Close(ctx context.Context) error

Close は作業ディレクトリを削除します。

func (*GoGit) Diff

func (g *GoGit) Diff(ctx context.Context, base, head string) (string, error)

Diff は base と head のマージベースから head までの差分を返します。

func (*GoGit) Prepare

func (g *GoGit) Prepare(ctx context.Context, repoURL string) error

Prepare は、リポジトリをクローン(既にあればオープン)し、リモートの最新を取得します。

type Option

type Option func(*settings) error

Option はアダプターおよび Factory の任意設定です。

生成時にだけ適用し、以降アダプターの設定は変わりません。セッターで後から書き換え られると、実行中に設定が変わりうる状態になります。検証が必要な値を扱えるよう error を返す形にしています。

func WithBase

func WithBase(ref string) Option

WithBase は、後始末の際に戻る基準参照を設定します(CLI 実装が使用します)。 Factory 経由で利用する場合は Request.Base が自動的に設定されます。

func WithContextLines

func WithContextLines(n int) Option

WithContextLines は、差分に含める前後の行数を設定します(CLI 実装のみ有効)。 負の値はエラーになります。

func WithDirNamer

func WithDirNamer(fn func(repoURL string) string) Option

WithDirNamer は、リポジトリURLから作業ディレクトリ名を決める関数を差し替えます (Factory のみ有効)。

func WithLogger

func WithLogger(logger *slog.Logger) Option

WithLogger は、アダプターが使うロガーを差し替えます。

func WithSSHKey

func WithSSHKey(path string) Option

WithSSHKey は、SSH 認証に使う秘密鍵のパスを設定します。 未設定の場合、SSH 形式のリポジトリURLに対する認証は行われません。

type Source

type Source interface {
	review.DiffSource
	// Prepare は、リポジトリをクローン(または既存を利用)してリモートの最新を取得します。
	Prepare(ctx context.Context, repoURL string) error
}

Source は、本パッケージのアダプターが満たす形です。 review.DiffSource に、リポジトリを使える状態にする Prepare を加えたものです。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL