git

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Jun 8, 2025 License: MIT Imports: 9 Imported by: 0

Documentation

Overview

internal/git/client.go

internal/git/config.go

Package git provides a high-level client for interacting with Git repositories programmatically from Go applications. It abstracts the direct execution of 'git' command-line operations, offering a more Go-idiomatic API.

The primary entry point for using this package is the GitClient type, which is instantiated via the NewClient function. The client requires a working directory to determine the repository context and can be configured using GitClientConfig.

Key features include:

  • Repository context detection (finding .git and top-level directories).
  • Execution of common Git commands (status, commit, add, branch, etc.) through structured methods.
  • Abstraction over command execution, allowing for custom executors (primarily for testing).
  • Integration with structured logging via the slog package.

Usage Example:

// Assume globalLogger is an initialized *slog.Logger
ctx := context.Background()
workDir, _ := os.Getwd()

gitCfg := git.GitClientConfig{
	Logger: globalLogger,
	// Other configurations can be set here
}

client, err := git.NewClient(ctx, workDir, gitCfg)
if err != nil {
	log.Fatalf("Failed to create Git client: %v", err)
}

branch, err := client.GetCurrentBranchName(ctx)
if err != nil {
	log.Printf("Error getting branch: %v", err)
} else {
	log.Printf("Current branch: %s", branch)
}

Error Handling:

Methods on the GitClient typically return an error as their last argument if an operation fails. Errors can originate from underlying git command failures, invalid input, or issues with the repository state. It's important for callers to check these errors.

Logging:

The GitClient uses an slog.Logger instance provided via GitClientConfig. This allows for consistent, structured logging of its operations, which can be directed to various outputs (e.g., console, files, AI-consumable streams) by configuring the logger's handlers at the application level.

Testing:

The GitClient is designed with testability in mind. The GitClientConfig.Executor field allows injecting a mock 'executor' interface, enabling unit tests for client methods without relying on an actual 'git' executable or a live repository.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func TruncateString

func TruncateString(s string, maxLen int) string

TruncateString helper can be removed if not used, or kept if useful elsewhere. For now, keeping it as it was in the provided file.

Types

type GitClient

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

GitClient provides methods for interacting with a Git repository.

func NewClient

func NewClient(ctx context.Context, workDir string, config GitClientConfig) (*GitClient, error)

NewClient creates and initializes a new GitClient. The GitClientConfig's Executor field should be pre-populated, or validateAndSetDefaults will create a default OSCommandExecutor.

func (*GitClient) AddAll

func (c *GitClient) AddAll(ctx context.Context) error

func (*GitClient) Commit

func (c *GitClient) Commit(ctx context.Context, message string) error

func (*GitClient) CreateAndSwitchBranch

func (c *GitClient) CreateAndSwitchBranch(ctx context.Context, newBranchName string, baseBranch string) error

func (*GitClient) GetCurrentBranchName

func (c *GitClient) GetCurrentBranchName(ctx context.Context) (string, error)

func (*GitClient) GetDiffCached

func (c *GitClient) GetDiffCached(ctx context.Context) (string, string, error)

func (*GitClient) GetDiffUnstaged

func (c *GitClient) GetDiffUnstaged(ctx context.Context) (string, string, error)

func (*GitClient) GetStatusShort

func (c *GitClient) GetStatusShort(ctx context.Context) (string, string, error)

func (*GitClient) GitDir

func (c *GitClient) GitDir() string

func (*GitClient) HasStagedChanges

func (c *GitClient) HasStagedChanges(ctx context.Context) (bool, error)

func (*GitClient) IsBranchAhead

func (c *GitClient) IsBranchAhead(ctx context.Context) (bool, error)

func (*GitClient) IsWorkingDirClean

func (c *GitClient) IsWorkingDirClean(ctx context.Context) (bool, error)

func (*GitClient) ListTrackedAndCachedFiles

func (c *GitClient) ListTrackedAndCachedFiles(ctx context.Context) (string, string, error)

func (*GitClient) ListUntrackedFiles

func (c *GitClient) ListUntrackedFiles(ctx context.Context) (string, string, error)

func (*GitClient) LocalBranchExists

func (c *GitClient) LocalBranchExists(ctx context.Context, branchName string) (bool, error)

func (*GitClient) Logger

func (c *GitClient) Logger() *slog.Logger

func (*GitClient) MainBranchName

func (c *GitClient) MainBranchName() string

func (*GitClient) Path

func (c *GitClient) Path() string

func (*GitClient) PullRebase

func (c *GitClient) PullRebase(ctx context.Context, branch string) error

func (*GitClient) Push

func (c *GitClient) Push(ctx context.Context, branch string) error

func (*GitClient) PushAndSetUpstream

func (c *GitClient) PushAndSetUpstream(ctx context.Context, branchName string) error

func (*GitClient) RemoteName

func (c *GitClient) RemoteName() string

func (*GitClient) SwitchBranch

func (c *GitClient) SwitchBranch(ctx context.Context, branchName string) error

type GitClientConfig

type GitClientConfig struct {
	GitExecutable         string
	DefaultRemoteName     string               // Will be set by cmd layer from LoadedAppConfig
	DefaultMainBranchName string               // Will be set by cmd layer from LoadedAppConfig
	Logger                *slog.Logger         // Logger for GitClient's own operations
	Executor              exec.CommandExecutor // Use the new CommandExecutor interface from internal/exec
}

Jump to

Keyboard shortcuts

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