gitx

package
v0.53.0 Latest Latest
Warning

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

Go to latest
Published: Nov 3, 2026 License: MIT Imports: 9 Imported by: 0

Documentation

Overview

Package gitx is the binary's one door to git: reads mirror the shell-outs bin/f10-load-project.sh makes, the semantics oracle, so the two stay comparable. Everything goes through Exec, a variable so a test can answer git without a checkout. No go-git.

Index

Constants

This section is empty.

Variables

View Source
var Exec = func(ctx context.Context, dir string, args ...string) (string, error) {
	cmd := exec.CommandContext(ctx, "git", args...)
	cmd.Dir = dir

	var stderr strings.Builder

	cmd.Stderr = &stderr

	out, err := cmd.Output()
	if err != nil {
		if exit, ok := errors.AsType[*exec.ExitError](err); ok && ctx.Err() == nil {
			return "", &ExitError{
				Args:   args,
				Code:   exit.ExitCode(),
				Stdout: strings.TrimSpace(string(out)),
				Stderr: strings.TrimSpace(stderr.String()),
			}
		}

		if msg := strings.TrimSpace(stderr.String()); msg != "" {
			return "", fmt.Errorf("git %s: %s", args[0], msg)
		}

		return "", fmt.Errorf("git %s: %w", args[0], err)
	}

	return strings.TrimSpace(string(out)), nil
}

Exec runs git with args in dir and returns trimmed stdout. A non-zero exit is an *ExitError carrying git's own stderr, which names the cause better than any wrapper could, and the code, which Read needs.

Functions

func AddWorktree

func AddWorktree(ctx context.Context, dir, path, branch, base string, create bool) error

AddWorktree checks branch out at path. With create, the branch is made from base - git's HEAD when base is "" - and must not exist yet; otherwise it must.

func CommitTree added in v0.42.0

func CommitTree(ctx context.Context, dir, tree string, parents []string, message ...string) (string, error)

CommitTree writes a commit of tree on parents with a message of one paragraph per part, and returns its sha. No ref moves.

func Config added in v0.46.0

func Config(ctx context.Context, dir, key string) (string, error)

Config is one local config value; absent is "" with no error.

func CurrentBranch

func CurrentBranch(ctx context.Context, dir string) string

CurrentBranch is the branch dir has checked out, or "" when detached.

func DeleteBranch

func DeleteBranch(ctx context.Context, dir, branch string) error

DeleteBranch deletes the local branch whether or not git sees it as merged: a squash or rebase merge leaves no trace git recognises, so the caller's proof is the host's. The branch's config section goes with it.

func DeleteRemoteRef added in v0.33.0

func DeleteRemoteRef(ctx context.Context, dir, branch string) error

DeleteRemoteRef drops the local copy of origin's branch, which a branch deleted through the host's API leaves behind until a pruning fetch. git deletes a ref that is not there without complaint.

func Fetch added in v0.35.0

func Fetch(ctx context.Context, dir string) error

Fetch updates every remote-tracking branch from origin.

func FetchCommit added in v0.48.0

func FetchCommit(ctx context.Context, dir, sha string) error

FetchCommit brings one commit over from origin by sha: a request's head after its branch was deleted there, which GitHub and GitLab still serve.

func FetchInto

func FetchInto(ctx context.Context, dir, branch string) error

FetchInto updates local branch from origin's branch of the same name without touching the checkout: git fast-forwards a branch that is not checked out and refuses anything else.

func FetchRef added in v0.48.0

func FetchRef(ctx context.Context, dir, refspec string) error

FetchRef fetches one ref from origin into FETCH_HEAD: a closed request's head, which no branch holds once its branch is deleted.

func IsAncestor

func IsAncestor(ctx context.Context, dir, commit, ref string) (bool, error)

IsAncestor reports whether commit is reachable from ref: git answers with exit 0 or 1. An unknown object is a no too, since a recorded sha may name a commit squashed away; anything else is an error.

func MergeBase added in v0.49.0

func MergeBase(ctx context.Context, dir, a, b string) (string, error)

MergeBase is the best common ancestor of a and b, or "" when they share none.

func MergeTree added in v0.42.0

func MergeTree(ctx context.Context, dir, base, head string) (string, error)

MergeTree is the tree of head merged into base, built in memory as MergesCleanly tries it; a conflict is an error.

func MergesCleanly added in v0.33.0

func MergesCleanly(ctx context.Context, dir, base, head string) (bool, error)

MergesCleanly tries the merge in memory, nothing checked out or written. git exits 1 both for a conflict (on stdout) and for a ref it cannot merge (on stderr), which is an error. Not --quiet: git 2.56 exits 0 with it.

func Out

func Out(ctx context.Context, dir string, args ...string) string

Out runs git and returns trimmed stdout, or "" on any error. It cannot tell "not there" from "git failed", so it is for display only: a read that decides what f10 does next goes through Read.

func PullFF

func PullFF(ctx context.Context, dir string) error

PullFF fast-forwards the checked-out branch from its upstream, and fails rather than merge when it cannot.

func Push added in v0.33.0

func Push(ctx context.Context, dir, branch, lease string) error

Push sends HEAD to origin's branch. A lease (the sha origin had when the caller read it) forces the push only while origin still has it, which a rebased branch needs; "" pushes a fast-forward and nothing else.

func Read added in v0.46.0

func Read(ctx context.Context, dir string, args ...string) (string, bool, error)

Read runs a quiet git read: exit 0 is the value, exit 1 absent with no error, anything else the error. A form whose "not there" exits 128 (a rev-parse --verify without -q) reads absence as an error, which halts.

func Ref added in v0.46.0

func Ref(ctx context.Context, dir, ref string) (string, error)

Ref is the sha ref names, "" with no error when there is no such ref.

func Refs

func Refs(ctx context.Context, dir string, patterns ...string) ([]string, error)

Refs lists the refs matching for-each-ref patterns as branch names, `refs/heads/` and `refs/remotes/` stripped. The full refname is asked for since git shortens to `heads/x` when a tag shares the name.

func RemoteBranchExists

func RemoteBranchExists(ctx context.Context, dir, branch string) (bool, error)

RemoteBranchExists asks origin whether it still has branch, which is the one git read here that reaches the network.

func RemoteBranches added in v0.45.0

func RemoteBranches(ctx context.Context, dir string) (map[string]string, error)

RemoteBranches is every branch origin has, name to tip sha, in one network read. A checkout with no origin has none.

func RemoveWorktree

func RemoveWorktree(ctx context.Context, dir, path string) error

RemoveWorktree removes the checkout at path. A dirty tree makes git refuse, which callers rule out first.

func Resolved added in v0.46.0

func Resolved(p string) string

Resolved is the path with symlinks resolved. A component that does not exist - a removed or never-created path - keeps its name below the longest prefix that does, so two spellings of one place still compare.

func SamePath added in v0.46.0

func SamePath(a, b string) bool

SamePath compares two worktree paths with symlinks resolved where they exist.

func SetConfig

func SetConfig(ctx context.Context, dir, key, value string) error

SetConfig writes one local config entry. Local config never leaves the machine, which makes it the place for a per-branch fact in stealth mode.

func Status

func Status(ctx context.Context, dir string) ([]string, error)

Status lists `status --porcelain`'s lines, empty for a clean tree. Ignored files are not listed, so an excluded .f10/ never counts.

func Switch added in v0.35.0

func Switch(ctx context.Context, dir, branch string) error

Switch checks out branch in dir. A dirty tree can make git refuse, which callers rule out first.

func TrackBranch added in v0.35.0

func TrackBranch(ctx context.Context, dir, branch string, force bool) error

TrackBranch creates local branch tracking origin's of the same name, so a pull or push in its worktree needs no upstream set. force moves an existing branch there, which git refuses while a worktree has it checked out.

func UnknownObject added in v0.48.0

func UnknownObject(err error) bool

UnknownObject reports git refusing a sha the clone does not have.

func UnsetConfig

func UnsetConfig(ctx context.Context, dir, key string) error

UnsetConfig removes one entry from the repository's local config.

func UpdateRef added in v0.42.0

func UpdateRef(ctx context.Context, dir, ref, sha, old string) error

UpdateRef moves ref to sha while it still points at old.

Types

type Cherry added in v0.48.0

type Cherry struct {
	SHA, Subject string
}

A Cherry is a commit whose patch another ref lacks, as `git cherry` lists it.

func Unlanded added in v0.48.0

func Unlanded(ctx context.Context, dir, upstream, head, limit string) ([]Cherry, error)

Unlanded lists the commits on head beyond limit whose patch upstream lacks, oldest first. `git cherry` matches by patch id, so a change that landed by squash or rebase is found, and skips merge commits; a head behind limit has none. A limit the clone lacks is an UnknownObject error.

type ConfigEntry

type ConfigEntry struct {
	Key   string
	Value string
}

A ConfigEntry is one key and its value as `config --get-regexp` lists them.

func ConfigEntries

func ConfigEntries(ctx context.Context, dir, pattern string) ([]ConfigEntry, error)

ConfigEntries lists the local config entries whose key matches pattern, in git's order. No match is an empty list, not an error: git exits 1 for it.

type Conflict added in v0.47.0

type Conflict struct {
	Path   string
	Stages [4]string
}

A Conflict is one path a merge would conflict on, with the blob each stage brought (1 the merge base, 2 base's side, 3 head's side, "" where a side lacks the path); two on a path are the same only when their blobs are.

func Conflicts added in v0.47.0

func Conflicts(ctx context.Context, dir, base, head string) ([]Conflict, error)

Conflicts is what head conflicts on in base, sorted by path, tried in memory as MergesCleanly does; nil is a clean merge. git exits 1 with a stage line per conflicted path on stdout, and on stderr for a ref it cannot merge, which is an error.

func (Conflict) Key added in v0.47.0

func (c Conflict) Key() string

Key tells this conflict from another on the same path.

type ExitError added in v0.46.0

type ExitError struct {
	Args   []string
	Code   int
	Stdout string
	Stderr string
}

An ExitError is git having run and exited non-zero. Stdout is what git printed before exiting, for the reads whose exit 1 carries an answer (merge-tree names the conflicting files that way).

func (*ExitError) Error added in v0.46.0

func (e *ExitError) Error() string

type Worktree

type Worktree struct {
	Path   string
	Branch string // short name; "" when detached or bare
}

A Worktree is one checkout git knows about.

func Worktrees

func Worktrees(ctx context.Context, dir string) ([]Worktree, error)

Worktrees lists every checkout of the repo dir belongs to, the main one first, as `git worktree list --porcelain` reports them.

Jump to

Keyboard shortcuts

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