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 ¶
- func TruncateString(s string, maxLen int) string
- type GitClient
- func (c *GitClient) AddAll(ctx context.Context) error
- func (c *GitClient) Commit(ctx context.Context, message string) error
- func (c *GitClient) CreateAndSwitchBranch(ctx context.Context, newBranchName string, baseBranch string) error
- func (c *GitClient) GetCurrentBranchName(ctx context.Context) (string, error)
- func (c *GitClient) GetDiffCached(ctx context.Context) (string, string, error)
- func (c *GitClient) GetDiffUnstaged(ctx context.Context) (string, string, error)
- func (c *GitClient) GetStatusShort(ctx context.Context) (string, string, error)
- func (c *GitClient) GitDir() string
- func (c *GitClient) HasStagedChanges(ctx context.Context) (bool, error)
- func (c *GitClient) IsBranchAhead(ctx context.Context) (bool, error)
- func (c *GitClient) IsWorkingDirClean(ctx context.Context) (bool, error)
- func (c *GitClient) ListTrackedAndCachedFiles(ctx context.Context) (string, string, error)
- func (c *GitClient) ListUntrackedFiles(ctx context.Context) (string, string, error)
- func (c *GitClient) LocalBranchExists(ctx context.Context, branchName string) (bool, error)
- func (c *GitClient) Logger() *slog.Logger
- func (c *GitClient) MainBranchName() string
- func (c *GitClient) Path() string
- func (c *GitClient) PullRebase(ctx context.Context, branch string) error
- func (c *GitClient) Push(ctx context.Context, branch string) error
- func (c *GitClient) PushAndSetUpstream(ctx context.Context, branchName string) error
- func (c *GitClient) RemoteName() string
- func (c *GitClient) SwitchBranch(ctx context.Context, branchName string) error
- type GitClientConfig
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func TruncateString ¶
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 ¶
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) CreateAndSwitchBranch ¶
func (*GitClient) GetCurrentBranchName ¶
func (*GitClient) GetDiffCached ¶
func (*GitClient) GetDiffUnstaged ¶
func (*GitClient) GetStatusShort ¶
func (*GitClient) HasStagedChanges ¶
func (*GitClient) IsBranchAhead ¶
func (*GitClient) IsWorkingDirClean ¶
func (*GitClient) ListTrackedAndCachedFiles ¶
func (*GitClient) ListUntrackedFiles ¶
func (*GitClient) LocalBranchExists ¶
func (*GitClient) MainBranchName ¶
func (*GitClient) PullRebase ¶
func (*GitClient) PushAndSetUpstream ¶
func (*GitClient) RemoteName ¶
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
}