Help us shape the future of Go! Take the 2026 Go Developer Survey

git

package
v0.33.2 Latest Latest
Warning

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

Go to latest
Published: Oct 22, 2026 License: BSD-2-Clause Imports: 24 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrConflictResolutionFailed = stderrors.New("conflict resolution failed")

ErrConflictResolutionFailed is returned by Pull when the ConflictResolver returns an error. The merge is aborted before returning so the repo is left in a clean state. Callers detect this via errors.Is(err, ErrConflictResolutionFailed).

View Source
var ErrFileExists = stderrors.New("file already exists")

ErrFileExists is returned when a create-only write targets a path that is already occupied. Callers distinguish "already there" (a benign no-op for idempotent publishers) from a genuine write failure via errors.Is.

View Source
var ErrInvalidPath = stderrors.New("invalid path")

ErrInvalidPath is returned when the requested path fails validation.

View Source
var ErrInvalidRefName = stderrors.New("invalid claim ref name")

ErrInvalidRefName is returned when a claim key or expected sha is not a safe, well-formed ref name.

View Source
var ErrNoRemote = stderrors.New("no origin remote configured")

ErrNoRemote is returned when a claim ref operation needs the origin but the repository has no remote configured.

View Source
var ErrNotFound = stderrors.New("file not found")

ErrNotFound is returned when a requested file does not exist in the repository.

View Source
var ErrRefConflict = stderrors.New("claim ref conflict")

ErrRefConflict is returned when the origin's compare-and-swap rejects a claim ref write because another writer won the race.

View Source
var ErrRepoUnrecoverable = stderrors.New("repo state unrecoverable")

ErrRepoUnrecoverable is returned by Pull when the repository is in a state that cannot be automatically healed (e.g., git rebase --abort fails, or refs/remotes/origin/HEAD is missing for detached-HEAD recovery). Callers detect this via errors.Is(err, ErrRepoUnrecoverable).

Functions

func IsObjectID added in v0.33.2

func IsObjectID(sha string) bool

IsObjectID reports whether sha is a full-length lowercase hex object id (40 hex for SHA-1, 64 hex for SHA-256).

func ValidateClaimKey added in v0.33.2

func ValidateClaimKey(ctx context.Context, key string) error

ValidateClaimKey rejects any key that is not a safe refs/claims/ ref name. The key is the full path below refs/, e.g. "claims/task/t-42".

Types

type ClaimOrigin added in v0.33.2

type ClaimOrigin interface {
	ListRefs(ctx context.Context, pattern string) ([]RemoteRef, error)
	FetchCommits(ctx context.Context, shas []string) error
	ReadCommitMessage(ctx context.Context, sha string) ([]byte, error)
}

ClaimOrigin abstracts the origin-contacting git operations used by claim-ref listing. The production implementation is gitOrigin; tests inject a fake.

type ClaimRef added in v0.33.2

type ClaimRef struct {
	Ref        string `json:"ref"`
	SHA        string `json:"sha"`
	Cluster    string `json:"cluster"`
	TaskID     string `json:"task_id"`
	LeaseUntil string `json:"lease_until"`
}

ClaimRef is one claim ref as read live from the origin. The JSON field set is the HTTP response contract: exactly these five keys, never a nonce.

type ClaimRefRequest added in v0.33.2

type ClaimRefRequest struct {
	ExpectedSHA string `json:"expected_sha"`
	Cluster     string `json:"cluster"`
	TaskID      string `json:"task_id"`
	LeaseUntil  string `json:"lease_until"`
}

ClaimRefRequest is the create/renew request. ExpectedSHA empty means the ref must not exist.

type ConflictResolver added in v0.20.0

type ConflictResolver interface {
	Resolve(ctx context.Context, conflictedPaths []string) error
}

ConflictResolver is called by the puller when git merge produces unresolvable conflicts. Resolve receives the list of conflicted file paths as reported by git merge output. It must stage each path (git add) before returning nil so the puller can commit the merge. On error the puller runs git merge --abort and returns ErrConflictResolutionFailed.

func NewMarkerResolver added in v0.20.0

func NewMarkerResolver(repoPath string) ConflictResolver

NewMarkerResolver returns a ConflictResolver that preserves git's standard conflict markers. It stages each conflicted file as-is: the <<<<<<< / ======= / >>>>>>> markers written by git's three-way merge are left intact in the committed file. The next human or agent edit resolves them naturally.

func NewYAMLMergeResolver added in v0.21.0

func NewYAMLMergeResolver(repoPath string, m metrics.Metrics) ConflictResolver

NewYAMLMergeResolver returns a ConflictResolver that deep-merges YAML frontmatter in conflicted markdown files. For each conflicted path it:

  1. Reads the working-tree file (still containing git's three-way merge markers).
  2. Extracts the "ours" and "theirs" sides of each conflict region.
  3. Parses the YAML frontmatter on both sides; deep-merges keys (theirs wins on overlap).
  4. Combines bodies per the rules in the spec (theirs if non-empty, else ours; both differ → "ours\n\ntheirs").
  5. Writes the merged file back and runs `git add -- <path>`.

On any failure (YAML parse error, missing frontmatter delimiter pair on either side, disk write failure, git add failure) it increments the corresponding failure-category counter, emits a Warningf log line naming the path, and returns ErrConflictResolutionFailed. The caller (the puller) runs `git merge --abort` and surfaces the sentinel.

type Git

type Git interface {
	WriteFile(ctx context.Context, path string, content []byte) error
	// WriteFileIfAbsent writes content to path only when no file exists there
	// yet. It returns ErrFileExists (via errors.Is) when path is occupied, and
	// performs no repository modification in that case.
	WriteFileIfAbsent(ctx context.Context, path string, content []byte) error
	DeleteFile(ctx context.Context, path string) error
	ReadFile(ctx context.Context, path string) ([]byte, error)
	ListFiles(ctx context.Context, pattern string) ([]string, error)
	Pull(ctx context.Context) error
	Status(ctx context.Context) (Status, error)
	Clone(ctx context.Context, remoteURL RemoteURL) error
	ConfigureUser(ctx context.Context, name string, email string) error
	ConfigurePackMemory(ctx context.Context) error
	Init(ctx context.Context) error
	// ListClaimRefs returns the claim refs under refs/<prefix>, read live from the
	// origin. All listed commits are fetched in one batched git invocation; when
	// that fetch fails, each commit is fetched on its own. An entry is dropped
	// with one WARN only when a re-list shows its ref vanished or moved; a fetch
	// failure for a ref that still points at the listed sha is returned as an
	// error.
	ListClaimRefs(ctx context.Context, prefix string) ([]ClaimRef, error)
	// PutClaimRef creates or renews refs/<key> with the origin's compare-and-swap.
	// It returns the new commit sha. A lease mismatch returns ErrRefConflict.
	PutClaimRef(ctx context.Context, key string, request ClaimRefRequest) (string, error)
	// DeleteClaimRef deletes refs/<key> with the origin's compare-and-swap.
	// A lease mismatch or an absent ref returns ErrRefConflict.
	DeleteClaimRef(ctx context.Context, key string, expectedSHA string) error
}

Git abstracts all git shell operations on a local repository.

func New

func New(
	repoPath string,
	m metrics.Metrics,
	currentDateTimeGetter libtime.CurrentDateTimeGetter,
	sshKeyPath SSHKeyPath,
	resolver ConflictResolver,
) Git

New returns a Git implementation backed by the system git binary for the given repository path.

type RebaseConflictError added in v0.19.2

type RebaseConflictError struct {
	Path string // conflicted file path, from "CONFLICT (content): Merge conflict in <path>"
}

RebaseConflictError is returned by Pull when git rebase encounters a content conflict. The repo is left in its conflicted state for human inspection. git rebase --abort is NEVER invoked automatically.

func (*RebaseConflictError) Error added in v0.19.2

func (e *RebaseConflictError) Error() string

type RemoteRef added in v0.33.2

type RemoteRef struct {
	SHA string
	Ref string
}

RemoteRef is one ref advertised by the origin.

type RemoteURL added in v0.9.0

type RemoteURL string

RemoteURL is the URL of a remote git repository.

type SSHKeyPath added in v0.8.0

type SSHKeyPath string

SSHKeyPath is the path to an SSH private key used for git operations.

type Status

type Status struct {
	// Clean is true when the working tree has no uncommitted changes.
	Clean bool
	// NoPushPending is true when there are no commits ahead of the remote.
	NoPushPending bool
}

Status represents the current state of the git working tree.

Jump to

Keyboard shortcuts

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